#ifndef _PUMP_H_ #define _PUMP_H_ #include "wifi_functions.h" const int pin_relais[]=PIN_RELAIS; unsigned long valveOffTime[VALVECOUNT]; //array with millis when to turn off valve. 0->off, >0 -> turn valveid index off at this millis. Index offset by 1! uint8_t srdata=0; unsigned long relaisOffTime[RELAISCOUNT]; //array with millis when to turn off valve. 0->off, >0 -> turn valveid index off at this millis. Index offset by 1! void srEnableValve(int valveid); void srDisableValve(int valveid); void srOutputOff(); bool enableValve(int valveid,unsigned long duration); bool enableRelais(int relaisid,unsigned long duration); void shiftOutSlow(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val); #define MICROS_SHIFTDELAY 50 #define MICROS_SHIFT_LATCH 200 void pump_setup() { pinMode(PIN_SERIAL_LATCH, OUTPUT); pinMode(PIN_SERIAL_CLOCK, OUTPUT); pinMode(PIN_SERIAL_DATA, OUTPUT); for (uint8_t i=0;i=valveOffTime[i]) { //time to turn off valveOffTime[i]=0; srDisableValve(i+1); } } for (uint8_t i=0;i=relaisOffTime[i]) { //time to turn off relaisOffTime[i]=0; digitalWrite(pin_relais[i],HIGH); //active low } } } bool enableValve(int valveid,unsigned long duration) { //duration in ms if (valveid>=1 && valveid<=VALVECOUNT) { valveOffTime[valveid-1]=millis()+duration; srEnableValve(valveid); return true; }else{ return false; } } void srOutputOff() { srdata=0; digitalWrite(PIN_SERIAL_LATCH, LOW); shiftOutSlow(PIN_SERIAL_DATA, PIN_SERIAL_CLOCK, MSBFIRST, srdata); digitalWrite(PIN_SERIAL_LATCH, HIGH); } void srEnableValve(int valveid) { if (valveid>=1 && valveid<=VALVECOUNT) { srdata|= 1<<(valveid-1); digitalWrite(PIN_SERIAL_LATCH, LOW); shiftOutSlow(PIN_SERIAL_DATA, PIN_SERIAL_CLOCK, MSBFIRST, srdata); digitalWrite(PIN_SERIAL_LATCH, HIGH); } Serial.print("enabled. srdata="); Serial.print(srdata); Serial.println(); } void srDisableValve(int valveid) { if (valveid>=1 && valveid<=VALVECOUNT) { srdata&= ~(1<<(valveid-1)); digitalWrite(PIN_SERIAL_LATCH, LOW); shiftOutSlow(PIN_SERIAL_DATA, PIN_SERIAL_CLOCK, MSBFIRST, srdata); digitalWrite(PIN_SERIAL_LATCH, HIGH); } Serial.print("disabled. srdata="); Serial.print(srdata); Serial.println(); } void shiftOutSlow(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val) { uint8_t i; for (i = 0; i < 8; i++) { if (bitOrder == LSBFIRST) digitalWrite(dataPin, !!(val & (1 << i))); else digitalWrite(dataPin, !!(val & (1 << (7 - i)))); delayMicroseconds(MICROS_SHIFTDELAY); digitalWrite(clockPin, HIGH); delayMicroseconds(MICROS_SHIFTDELAY); digitalWrite(clockPin, LOW); } } bool enableRelais(int relaisid,unsigned long duration) { //duration in ms if (relaisid>=1 && relaisid<=VALVECOUNT) { relaisOffTime[relaisid-1]=millis()+duration; digitalWrite(pin_relais[relaisid-1],LOW); //active low return true; }else{ return false; } } #endif