139 lines
3.1 KiB
C++
139 lines
3.1 KiB
C++
#include <ESP8266WiFi.h>
|
|
#include <WiFiClient.h>
|
|
#include <ESP8266WebServer.h>
|
|
#include <RCSwitch.h>
|
|
#include <WiFiUdp.h>
|
|
#include <ArduinoJson.h>
|
|
#include "secrets.h"
|
|
|
|
ESP8266WebServer server(80);
|
|
bool still_pressed = false;
|
|
bool relay_active = false;
|
|
|
|
void setup() {
|
|
WiFi.mode(WIFI_STA);
|
|
|
|
pinMode(12, OUTPUT); // relay
|
|
pinMode(13, OUTPUT); // button
|
|
pinMode(0, INPUT); // led
|
|
|
|
// setup serial and network
|
|
Serial.begin(115200);
|
|
WiFi.begin(ssid, password);
|
|
|
|
Serial.println("Serial interface initialized");
|
|
Serial.print("Connecting to wifi ");
|
|
Serial.print(ssid);
|
|
|
|
// Wait for connection
|
|
while (WiFi.status() != WL_CONNECTED) {
|
|
digitalWrite(13, !digitalRead(13));
|
|
delay(500);
|
|
Serial.print(".");
|
|
}
|
|
|
|
// serial output of connection details
|
|
Serial.println("");
|
|
Serial.print("Connected to ");
|
|
Serial.println(ssid);
|
|
Serial.print("IP address: ");
|
|
Serial.println(WiFi.localIP());
|
|
|
|
// create HTTP server
|
|
server.on("/", handleMainpage);
|
|
server.on("/relay", handleRelay);
|
|
|
|
server.begin();
|
|
Serial.println("HTTP server started");
|
|
}
|
|
|
|
void loop() {
|
|
if(!digitalRead(0)) {
|
|
setRelay(!digitalRead(12));
|
|
delay(500); // give the user time to release the button
|
|
|
|
if(!digitalRead(0)) {
|
|
still_pressed = true;
|
|
} else {
|
|
still_pressed = false;
|
|
}
|
|
}
|
|
|
|
if (still_pressed) {
|
|
software_reset();
|
|
}
|
|
|
|
server.handleClient();
|
|
}
|
|
|
|
void software_reset() {
|
|
wdt_enable(WDTO_15MS);
|
|
while(1) {};
|
|
}
|
|
|
|
void handleMainpage() {
|
|
server.send(200, "text/html", "<html><a href=\"https://git.geekify.de/sqozz/switcheroo\">https://git.geekify.de/sqozz/switcheroo</a></html>");
|
|
}
|
|
|
|
void handleRelay() {
|
|
String data = server.arg("plain");
|
|
String result;
|
|
|
|
Serial.println("relay endpoint requested");
|
|
|
|
if (data != "") {
|
|
Serial.println("change request");
|
|
StaticJsonBuffer<200> newBuffer;
|
|
JsonObject& json = newBuffer.parseObject(data);
|
|
|
|
if (json["active"] == "true") {
|
|
Serial.println("on");
|
|
result = setRelay(true);
|
|
} else if (json["active"] == "false") {
|
|
Serial.println("off");
|
|
result = setRelay(false);
|
|
}
|
|
} else {
|
|
Serial.println("status requested");
|
|
result = generateStatusJson();
|
|
}
|
|
server.send(200, "text/json", result);
|
|
|
|
Serial.println("");
|
|
Serial.println("");
|
|
}
|
|
|
|
String setRelay(bool req_status) {
|
|
Serial.print("Old status: ");
|
|
Serial.println(relay_active);
|
|
Serial.print("New status: ");
|
|
Serial.println(req_status);
|
|
|
|
|
|
digitalWrite(12, req_status); // set relay
|
|
bool old_status = relay_active;
|
|
relay_active = digitalRead(12);
|
|
digitalWrite(13, !relay_active); // set LED to the physical relay status
|
|
|
|
Serial.println("");
|
|
Serial.println("");
|
|
|
|
return generateChangeJson(old_status, req_status, relay_active);
|
|
}
|
|
|
|
String generateChangeJson(bool old_status, bool req_status, bool new_status) {
|
|
String status = "";
|
|
bool success = (req_status == new_status);
|
|
if (success) {
|
|
status = ", \"status\" : { \"old\" : " + String(old_status) + ", \"new\" : " + String(new_status) + ", \"req\": " + String(req_status) + " }";
|
|
}
|
|
String retJson = "{ \"success\" : " + String(success) + status + " }";
|
|
|
|
return retJson;
|
|
}
|
|
|
|
String generateStatusJson() {
|
|
String status = "{ \"status\" : " + String(relay_active) + " }";
|
|
return status;
|
|
}
|