diff --git a/src/main.cpp b/src/main.cpp index 05b9ef4..3cde599 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -111,7 +111,9 @@ void loop() fader_loop++; } - ws2801_udp_loop(); + if(ws2801_udp_loop()) { + relais_heartbeat(); + } relais_loop(); } diff --git a/src/relais.cpp b/src/relais.cpp index 8c57f4c..0d73911 100644 --- a/src/relais.cpp +++ b/src/relais.cpp @@ -4,6 +4,7 @@ #include "relais.h" WiFiUDP relaisUDP; +uint32_t relais_off_timestamp; #define RELAIS_PIN 5 @@ -23,14 +24,30 @@ void relais_setup(void) Serial.println("Relais: UDP server start FAILED!"); } + relais_off_timestamp = 0; + Serial.println("Relais setup done"); } +void relais_heartbeat(void) +{ + relais_off_timestamp = millis() + 600000; // keep on for 10 more minutes +} + void relais_loop(void) { unsigned char databyte; unsigned char answer; + // update the relais pin state + uint32_t now = millis(); + + if(now < relais_off_timestamp) { + digitalWrite(RELAIS_PIN, HIGH); + } else { + digitalWrite(RELAIS_PIN, LOW); + } + int packetSize = relaisUDP.parsePacket(); if(packetSize) { @@ -47,14 +64,14 @@ void relais_loop(void) switch(databyte) { case 0: // switch relais off - Serial.println("Relais: switch off."); - digitalWrite(RELAIS_PIN, LOW); + Serial.println("Relais: force switch off."); + relais_off_timestamp = 0; answer = 0; break; case 1: // switch relais on - Serial.println("Relais: switch on."); - digitalWrite(RELAIS_PIN, HIGH); + Serial.println("Relais: force switch on (1 hour)."); + relais_off_timestamp = now + 3600000; answer = 1; break; diff --git a/src/relais.h b/src/relais.h index 8fdcc91..07025ee 100644 --- a/src/relais.h +++ b/src/relais.h @@ -2,6 +2,7 @@ #define RELAIS_H void relais_setup(void); +void relais_heartbeat(void); void relais_loop(void); #endif // RELAIS_H diff --git a/src/ws2801_udp.cpp b/src/ws2801_udp.cpp index 59e3b95..ae49a9e 100644 --- a/src/ws2801_udp.cpp +++ b/src/ws2801_udp.cpp @@ -32,7 +32,7 @@ void ws2801_udp_setup(void) Serial.println("WS2801UDP setup done"); } -void ws2801_udp_loop(void) +bool ws2801_udp_loop(void) { byte cmd[WS2801_CMD_LEN]; byte action, module, r, g, b; @@ -86,5 +86,9 @@ void ws2801_udp_loop(void) ws2801UDP.write("OK\n"); */ ws2801UDP.endPacket(); + + return true; // processed a packet + } else { + return false; } } diff --git a/src/ws2801_udp.h b/src/ws2801_udp.h index 6c009ae..97e42aa 100644 --- a/src/ws2801_udp.h +++ b/src/ws2801_udp.h @@ -2,6 +2,6 @@ #define WS2801_UDP_H void ws2801_udp_setup(void); -void ws2801_udp_loop(void); +bool ws2801_udp_loop(void); #endif // WS2801_UDP_H