relay with delay feature
-
Hi everyone I have been reading and am struggling getting a grip with this situation.
I have
3 Binary switches - need to be read 2-4 times daily
2 Soil Moisture sensors - need to be read 4 times daily
1 relay - needs to work on demandThe issue I have right now is that my 3 binary switches and 2 moisture sensors are susceptible to electrolysis and the current read settings erode my terminals in less than 2 weeks.
I would like to put a wait/delay/whatever command to only cue those reading to happen 2-4 times a day, this should really extend the life of my cheap sensors!
What would be the best way to implement this in my code? Currently I have zero gateway sleep commands/delay/etc.
Below is the void loop and incoming message commands
void loop() { debouncer.update(); // Get the update value int value1 = debouncer.read(); int value2 = debouncer.read(); int value3 = debouncer.read(); int soilValue1 = analogRead(ANALOG_INPUT_SOIL_SENSOR1); int soilValue2 = analogRead(ANALOG_INPUT_SOIL_SENSOR2); value1 = digitalRead(BUTTON_PIN1); value2 = digitalRead(BUTTON_PIN2); value3 = digitalRead(BUTTON_PIN3); if (value1 != oldValue1) { // Send in the new value gw.send(msg1.set(value1==HIGH ? 1 : 0)); oldValue1 = value1; } if (value2 != oldValue2) { // Send in the new value gw.send(msg2.set(value2==HIGH ? 1 : 0)); oldValue2 = value2; } if (value3 != oldValue3) { // Send in the new value gw.send(msg3.set(value3==HIGH ? 1 : 0)); oldValue3 = value3; } if (soilValue1 != lastSoilValue1) { Serial.println(soilValue1); gw.send(msg4.set(constrain(map(soilValue1, 1023, 250, 0, 100),0,100))); lastSoilValue1 = soilValue1; } if (soilValue2 != lastSoilValue2) { Serial.println(soilValue2); gw.send(msg5.set(constrain(map(soilValue2, 1023, 250, 0, 100),0,100))); lastSoilValue2 = soilValue2; } // Alway process incoming messages whenever possible gw.process(); } void incomingMessage(const MyMessage &message) { // We only expect one type of message from controller. But we better check anyway. if (message.type==V_LIGHT) { // Change relay state digitalWrite(message.sensor-1+RELAY_1, message.getBool()?RELAY_ON:RELAY_OFF); // Store state in eeprom gw.saveState(message.sensor, message.getBool()); // Write some debug info Serial.print("Incoming change for sensor:"); Serial.print(message.sensor); Serial.print(", New status: "); Serial.println(message.getBool()); } }``` -
I'm currently at work and cannot look to deep into your sketch. But a debouncer can only be used on one pin. You have to declare a debouncer for each digital input you want to debounce. And read the input like in the following snippet.
debouncer2.update(); int value2 = debouncer2.read(); debouncer3.update(); int value3 = debouncer3.update();You can also delete these lines. Because you're reading the values from the debouncer:
value1 = digitalRead(BUTTON_PIN1); value2 = digitalRead(BUTTON_PIN2); value3 = digitalRead(BUTTON_PIN3); -
I use something like this
unsigned long nextEvent; void setup() { nextEvent = millis() + ( 5 * 60 + 1000); // 5 hours } void loop() { if ( nextEvent <= millis() ) { // do reading nextEvent = millis() + ( 5 * 60 + 1000); // 5 hours } gw.wait( 500 ); // or whatever you want. }But that's just the algorithm
-
yea this code is messy, I am reworking it today. Any insight on the best way to delay those commands without impacting the relay?
I would implement some way of knowing time passed. Either by sleeping or waiting for a set time. Then each time the loop runs after wake-up, or similar, increment a counter. Define a variable setting the number the counter should have reached when you want to read the sensors. Then implement a function per sensor or sensor type. Call the functions in a conditional statement, checking the counter, in the main loop.
Check the sensebender micro sketch for example of a counter. That sketch sleeps the sensebender for 1 min in the end of each loop, default settting, so that way you know that at least 1 min has passed for each loop run. Each loop run it increments the counter, so +1 for the counter means +1 min, more or less.
edit
@TheoL beat me to it, with code example, even. =)
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login