Hardware used:
Wemos D1
4 channel low level relay board
12 volt buck converter to 5 volts.
I have no issues triggering all of my relays manually, and i have built multiple identical modules that reproduce the same problem so I'm under the impression that it is my code. the HTML button will not trigger relay 2, but it says its working in the serial monitor. All of the button's behaviors are weird as well
Also, I need to add switches to trigger 3 of these relays and only have the fourth relay activated by the web page. How do I add that bit of code in a manor that will update the web page when a physical button is pressed?
I'm sure I'm missing something obvious but i just cant figure it out, any help would be greatly appreciated.
/*
Wemos D1 (esp8266 web server)
4 channel low trigger relay
to be added: 3 push buttons, the 4th relay is only conrtolled via server
Relay 2 does not funtion
*/
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#ifndef STASSID
#define STASSID "****"
#define STAPSK "****"
#endif
const char *ssid = STASSID;
const char *password = STAPSK;
ESP8266WebServer server(80);
static const uint8_t D1 = 5;
static const uint8_t D2 = 4;
static const uint8_t D3 = 0;
static const uint8_t D4 = 2;
uint8_t relay1Pin = D1;
bool relay1Status = LOW;
uint8_t relay2Pin = D2;
bool relay2Status = LOW;
uint8_t relay3Pin = D3;
bool relay3Status = LOW;
uint8_t relay4Pin = D4;
bool relay4Status = LOW;
void setup() {
Serial.begin(115200);//initialize the serial monitor
Serial.println("Arrow Visual Management System");
pinMode(relay1Pin, OUTPUT);
pinMode(relay2Pin, OUTPUT);
pinMode(relay3Pin, OUTPUT);
pinMode(relay4Pin, OUTPUT);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println("");
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: http://");
Serial.println(WiFi.localIP());
if (MDNS.begin("arrowvms")) {
Serial.println("MDNS responder started");
Serial.println("access via http://arrowvms");
}
server.on("/", handle_OnConnect);
server.on("/relay1On", handle_relay1On);
server.on("/relay1Off", handle_relay1Off);
server.on("/relay2On", handle_relay2On);
server.on("/relay2Off", handle_relay2Off);
server.on("/relay3On", handle_relay3On);
server.on("/relay3Off", handle_relay3Off);
server.on("/relay4On", handle_relay4On);
server.on("/relay4Off", handle_relay4Off);
server.onNotFound(handle_NotFound);
server.begin();
Serial.println("HTTP server started");
}
void loop() {
server.handleClient();
MDNS.update();
if(relay1Status)
{digitalWrite(relay1Pin, LOW);}
else
{digitalWrite(relay1Pin, HIGH);}
if(relay2Status)
{digitalWrite(relay2Pin, LOW);}
else
{digitalWrite(relay3Pin, HIGH);}
if(relay3Status)
{digitalWrite(relay3Pin, LOW);}
else
{digitalWrite(relay3Pin, HIGH);}
if(relay4Status)
{digitalWrite(relay4Pin, LOW);}
else
{digitalWrite(relay4Pin, HIGH);}
}
void handle_OnConnect() {
relay1Status = HIGH;
relay2Status = HIGH;
relay3Status = HIGH;
relay4Status = HIGH;
Serial.println("GPIO5 Status: OFF | GPIO16 Status: OFF | GPIO0 Status: OFF | GPIO2 Status: OFF");
server.send(200, "text/html", SendHTML(relay1Status, relay2Status, relay3Status, relay4Status));
}
void handle_relay1On() {
relay1Status = LOW;
Serial.println("GPIO5 Status: ON");
server.send(200, "text/html", SendHTML(true, relay2Status, relay3Status, relay4Status));
}
void handle_relay1Off() {
relay1Status = HIGH;
Serial.println("GPIO5 Status: OFF");
server.send(200, "text/html", SendHTML(false, relay2Status, relay3Status, relay4Status));
}
void handle_relay2On() {
relay2Status = LOW;
Serial.println("GPIO4 Status: ON");
server.send(200, "text/html", SendHTML(relay1Status, true, relay3Status, relay4Status));
}
void handle_relay2Off() {
relay2Status = HIGH;
Serial.println("GPIO4 Status: OFF");
server.send(200, "text/html", SendHTML(relay1Status, false, relay3Status, relay4Status));
}
void handle_relay3On() {
relay3Status = LOW;
Serial.println("GPIO0 Status: ON");
server.send(200, "text/html", SendHTML(relay1Status, relay2Status, true, relay4Status));
}
void handle_relay3Off() {
relay3Status = HIGH;
Serial.println("GPIO0 Status: OFF");
server.send(200, "text/html", SendHTML(relay1Status, relay2Status, false, relay4Status));
}
void handle_relay4On() {
relay4Status = LOW;
Serial.println("GPIO2 Status: ON");
server.send(200, "text/html", SendHTML(relay1Status, relay2Status, relay3Status, true));
}
void handle_relay4Off() {
relay4Status = HIGH;
Serial.println("GPIO2 Status: OFF");
server.send(200, "text/html", SendHTML(relay1Status, relay2Status, relay3Status, false));
}
void handle_NotFound(){
server.send(404, "text/plain", "Not found");
}
String SendHTML(uint8_t relay1Status, uint8_t relay2Status, uint8_t relay3Status, uint8_t relay4Status){
String ptr = "<!DOCTYPE html> <html>\n";
ptr +="<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n";
ptr +="<title>Relay Control</title>\n";
ptr +="<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\n";
ptr +="body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;} h3 {color: #444444;margin-bottom: 50px;}\n";
ptr +=".button {display: block;width: 80px;background-color: #1abc9c;border: none;color: white;padding: 13px 30px;text-decoration: none;font-size: 25px;margin: 0px auto 35px;cursor: pointer;border-radius: 4px;}\n";
ptr +=".button-on {background-color: #1abc9c;}\n";
ptr +=".button-on:active {background-color: #16a085;}\n";
ptr +=".button-off {background-color: #34495e;}\n";
ptr +=".button-off:active {background-color: #2c3e50;}\n";
ptr +="p {font-size: 14px;color: #888;margin-bottom: 10px;}\n";
ptr +="</style>\n";
ptr +="</head>\n";
ptr +="<body>\n";
ptr +="<h1>ESP8266 Web Server</h1>\n";
if(relay1Status)
{ptr +="<p>Relay1 Status: ON</p><a class=\"button button-off\" href=\"/relay1Off\">OFF</a>\n";}
else
{ptr +="<p>Relay1 Status: OFF</p><a class=\"button button-on\" href=\"/relay1On\">ON</a>\n";}
if(relay2Status)
{ptr +="<p>Relay2 Status: ON</p><a class=\"button button-off\" href=\"/relay2Off\">OFF</a>\n";}
else
{ptr +="<p>Relay2 Status: OFF</p><a class=\"button button-on\" href=\"/relay2On\">ON</a>\n";}
if(relay3Status)
{ptr +="<p>Relay3 Status: ON</p><a class=\"button button-off\" href=\"/relay3Off\">OFF</a>\n";}
else
{ptr +="<p>Relay3 Status: OFF</p><a class=\"button button-on\" href=\"/relay3On\">ON</a>\n";}
if(relay4Status)
{ptr +="<p>Relay4 Status: ON</p><a class=\"button button-off\" href=\"/relay4Off\">OFF</a>\n";}
else
{ptr +="<p>Relay4 Status: OFF</p><a class=\"button button-on\" href=\"/relay4On\">ON</a>\n";}
ptr +="</body>\n";
ptr +="</html>\n";
return ptr;
}
