// arduino built in led: int LEDPIN = 13; // connect yellow sensor wire to this pin: int SENSORPIN = 2; // output pin: HIGH-Z if no water flowing, 0V is water flowing int OUTPUTPIN = 3; // the water is considered flowing if pulses arrive at // most within this number of microseconds: unsigned long MAXFLOWPERIOD = 200000; // after water has started flowing, wait this number of // microseconds before asserting the output pin: unsigned long STARTUPDELAY = 1000000; unsigned long lastFlowSensorToggleTime = 0; boolean lastFlowSensorToggleTimeValid = false; int lastSensorPinState; long lastSensorPeriodMicroSeconds = -1; boolean waterFlowStartArmed=false; unsigned long waterFlowStartTime=0; boolean waterFlowingForSomeTime=false; void setup() { // initialize the digital pin as an output. pinMode(LEDPIN, OUTPUT); pinMode(OUTPUTPIN, INPUT); pinMode(SENSORPIN, INPUT_PULLUP); delay(1); lastSensorPinState=digitalRead(SENSORPIN); } void checkSensorPin() { unsigned long now=micros(); int sensorPinState=digitalRead(SENSORPIN); if(sensorPinState != lastSensorPinState) { // sensor activity lastSensorPinState = sensorPinState; if(lastFlowSensorToggleTimeValid) { lastSensorPeriodMicroSeconds = now - lastFlowSensorToggleTime; } lastFlowSensorToggleTime = now; lastFlowSensorToggleTimeValid = true; } else { if(lastFlowSensorToggleTimeValid) { unsigned long delta = now - lastFlowSensorToggleTime; if(delta > 1000000) { lastFlowSensorToggleTimeValid = false; lastSensorPeriodMicroSeconds = -1; } } } } long getSensorPeriodMicroSeconds() { long result = lastSensorPeriodMicroSeconds; if(result >= 0) { unsigned long now=micros(); long currentperiod = now - lastFlowSensorToggleTime; if(result < currentperiod) result = currentperiod; } return result; } boolean isWaterFlowingNow() { long sensorperiod = getSensorPeriodMicroSeconds(); boolean waterFlowing = ( (sensorperiod >= 0) && (sensorperiod <= MAXFLOWPERIOD) ); return waterFlowing; } void checkWaterFlowing() { if(isWaterFlowingNow()) { if(!waterFlowingForSomeTime) { unsigned long now=micros(); if(waterFlowStartArmed) { unsigned long delta=now - waterFlowStartTime; if(delta > STARTUPDELAY) { waterFlowingForSomeTime = true; waterFlowStartArmed = false; } } else { waterFlowStartTime=now; waterFlowStartArmed = true; } } } else { waterFlowingForSomeTime=false; waterFlowStartArmed=false; } } boolean isWaterFlowingForSomeTime() { return waterFlowingForSomeTime; } void loop() { checkSensorPin(); checkWaterFlowing(); boolean waterFlowing = isWaterFlowingForSomeTime(); digitalWrite(LEDPIN, waterFlowing? HIGH:LOW); if(waterFlowing) { pinMode(OUTPUTPIN, OUTPUT); digitalWrite(OUTPUTPIN, LOW); } else { pinMode(OUTPUTPIN, INPUT); } }