esp8266-ws2801d/src/relais.cpp

94 lines
2.0 KiB
C++

#include <WiFiUdp.h>
#include <Arduino.h>
#include "relais.h"
WiFiUDP relaisUDP;
uint32_t relais_off_timestamp;
#define RELAIS_PIN 5
#define RELAIS_UDP_PORT 2800
void relais_setup(void)
{
Serial.println("Relais: Setting up pin.");
digitalWrite(RELAIS_PIN, LOW);
pinMode(RELAIS_PIN, OUTPUT);
Serial.print("Relais: Starting UDP server on port ");
Serial.println(RELAIS_UDP_PORT);
if(!relaisUDP.begin(RELAIS_UDP_PORT)) {
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)
{
Serial.print("Relais: Received packet of size ");
Serial.println(packetSize);
Serial.print("From ");
IPAddress remoteIp = relaisUDP.remoteIP();
Serial.print(remoteIp);
Serial.print(", port ");
Serial.println(relaisUDP.remotePort());
if(packetSize == 1) {
int len = relaisUDP.read(&databyte,1);
switch(databyte) {
case 0: // switch relais off
Serial.println("Relais: force switch off.");
relais_off_timestamp = 0;
answer = 0;
break;
case 1: // switch relais on
Serial.println("Relais: force switch on (1 hour).");
relais_off_timestamp = now + 3600000;
answer = 1;
break;
default: // unknown code -> error
Serial.println("Relais: wrong code.");
answer = 0xFF;
break;
}
} else { // wrong length
Serial.println("Relais: wrong packet length.");
answer = 0xFF;
}
// send a reply, to the IP address and port that sent us the packet we received
relaisUDP.beginPacket(relaisUDP.remoteIP(), relaisUDP.remotePort());
relaisUDP.write(answer);
relaisUDP.endPacket();
}
}