Here's a code that works. With this I'm using two buttons one is a standby mode button and the other is a relay on/off button, the relay is also triggered by a dht11 temperature sensor. It's on a esp8266 board and uses a webserver to change both buttons and also displays the temperature and humidity. When the relay is triggered it sends me an email telling me. Also if the relay is triggered by the button it only turns it on for 40 seconds will be longer after I'm finished. This project is to turn on a fan when the temperature is above a set temperature. I've figured out how to make the text on the web page larger and I'd like some help moving it to the center of the page. I can't seem to figure it out.
#include <Arduino.h>
#include <EMailSender.h>
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <DHT.h>
#define BUTTON_PIN D4 // The Arduino UNO R4 pin connected to the button
#define BUTTON_PIN2 D3
#define RELAY_PIN D2 // The Arduino UNO R4 pin connected to the LED
const byte ledPin1 = D1;
const byte ledPin2 = D5;
const byte ledPin3 = D6;
const char* ssid = "xxxxxxxx";
const char* password = "xxxxxxxx";
uint8_t connection_state = 0;
uint16_t reconnect_interval = 10000;
ESP8266WebServer server(80); // Web server on port 80
byte lastButtonState = LOW;
byte lastButtonState2 = LOW;
byte relayState = LOW;
byte standByState = LOW;
byte temperatureState;
byte temperatureStateChange;
byte tempF;
byte hum;
boolean standByMode;
boolean relayStateChange;
boolean buttonStateChange;
boolean buttonChanged;
boolean buttonOn;
boolean sensorTrigger;
boolean buttonTrigger;
boolean buttonTimer;
boolean sendmail;
int m = 0;
int relay_state = LOW;
const byte DHT_SENSOR_PIN = D7; // The ESP8266 pin D7 connected to DHT11 sensor
#define DHT_SENSOR_TYPE DHT11
DHT dht_sensor(DHT_SENSOR_PIN, DHT_SENSOR_TYPE);
int ledCounter = 0;
char *myStrings[] = {"The button was triggered", "The temperature is at or above 75", "The temperature is at or below 74"};
unsigned long debounceDuration = 100; // millis
unsigned long lastTimeButtonStateChanged = 0;
unsigned long lastTimeButtonStateChanged2 = 0;
unsigned long tempRead = 0;
unsigned long relayOnTime = 0;
EMailSender emailSend("xxxxxxxxxx", "xxxxxxxx");
uint8_t WiFiConnect(const char* nSSID = nullptr, const char* nPassword = nullptr)
{
static uint16_t attempt = 0;
Serial.print("Connecting to ");
if (nSSID) {
WiFi.begin(nSSID, nPassword);
Serial.println(nSSID);
}
uint8_t i = 0;
while (WiFi.status() != WL_CONNECTED && i++ < 50) {
delay(200);
Serial.print(".");
}
++attempt;
Serial.println("");
if (i == 51) {
Serial.print("Connection: TIMEOUT on attempt: ");
Serial.println(attempt);
if (attempt % 2 == 0)
Serial.println("Check if access point available or SSID and Password\r\n");
return false;
}
Serial.println("Connection: ESTABLISHED");
Serial.print("Got IP address: ");
Serial.println(WiFi.localIP());
return true;
}
void Awaits() {
uint32_t ts = millis();
while (!connection_state) {
delay(50);
if (millis() > (ts + reconnect_interval) && !connection_state) {
connection_state = WiFiConnect();
ts = millis();
}
}
}
String getHTML() {
String html = "<!DOCTYPE HTML>";
html += "<html>";
html += "<head>";
html += "<link rel='icon' href='data:,'>";
html += "<span style=font-size:4em>";
html += "</head>";
html += "<p>Temperature F: <span style='color: red;'>";
html += (tempF);
html += "<html>";
html += "<head>";
html += "<link rel='icon' href='data:,'>";
html += "</head>";
html += "<p>Humidity: <span style='color: red;'>";
html += (hum);
html += "<html>";
html += "<head>";
html += "<link rel='icon' href='data:,'>";
html += "</head>";
html += "<p>Relay State: <span style='color: red;'>";
if (relayState == HIGH)
html += ("On");
else
html += ("Off");
html += "</span></p>";
html += "<a href='/standby/on'>Turn Off Standby Mode</a>";
html += "<br><br>";
html += "<a href='/standby/off'>Turn On Standby Mode</a>";
html += "<br><br>";
html += "<a href='/relayis/on'>Turn relay ON</a>";
html += "<br><br>";
html += "<a href='/relayis/off'>Turn relay OFF</a>";
html += "</html>";
return html;
}
void setup() {
Serial.begin(9600); // initialize serial
pinMode(BUTTON_PIN, INPUT_PULLUP); // set arduino pin to input pull-up mode
pinMode(BUTTON_PIN2, INPUT_PULLUP);
pinMode(RELAY_PIN, OUTPUT); // set arduino pin to output mode
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
standByMode = true;
ledCounter = 1;
relayStateChange = false;
buttonStateChange = false;
buttonChanged = false;
buttonOn = false;
sensorTrigger = false;
buttonTrigger = false;
sendmail = false;
temperatureStateChange = 0;
dht_sensor.begin(); // initialize the DHT sensor
connection_state = WiFiConnect(ssid, password);
if (!connection_state) // if not connected to WIFI
Awaits();
// home page
server.on("/", HTTP_GET, []() {
Serial.println("ESP8266 Web Server: New request received:");
Serial.println("GET /");
server.send(200, "text/html", getHTML());
});
// Route to control the Relay
server.on("/standby/on", HTTP_GET, []() {
Serial.println("ESP8266 Web Server: New request received:");
Serial.println("GET /standby/on");
standByState = HIGH;
buttonStateChange = true;
server.send(200, "text/html", getHTML());
});
server.on("/standby/off", HTTP_GET, []() {
Serial.println("ESP8266 Web Server: New request received:");
Serial.println("GET /standby/off");
standByState = LOW;
buttonStateChange = true;
server.send(200, "text/html", getHTML());
});
server.on("/relayis/on", HTTP_GET, []() {
Serial.println("ESP8266 Web Server: New request received:");
Serial.println("GET /relayis/on");
relayState = HIGH;
buttonChanged = true;
relayStateChange = true;
buttonOn = true;
relayOnTime = millis();
server.send(200, "text/html", getHTML());
});
server.on("/relayis/off", HTTP_GET, []() {
Serial.println("ESP8266 Web Server: New request received:");
Serial.println("GET /relayis/off");
relayState = LOW;
buttonStateChange = true;
relayStateChange = true;
server.send(200, "text/html", getHTML());
});
// Start the server
server.begin();
}
void loop() {
button();
standby();
led();
relay();
temperature();
email();
server.handleClient();
}
void button() {
int buttonState = digitalRead(BUTTON_PIN); // read new state
int buttonState2 = digitalRead(BUTTON_PIN2);
if (millis() - lastTimeButtonStateChanged >= debounceDuration) {
if (buttonState != lastButtonState) {
lastTimeButtonStateChanged = millis();
lastButtonState = buttonState;
if ((buttonState == LOW) && (standByMode == false) && (sensorTrigger == false)) {
relayStateChange = true;
buttonChanged = true;
m = 0;
sendmail = true;
relayOnTime = millis();
relayState = (relayState == HIGH) ? LOW : HIGH;
Serial.print("relayStateState");
Serial.println(relayState);
}
if (relayState == HIGH) {
buttonOn = true;
Serial.print("buttonOn");
Serial.print(buttonOn);
relayOnTime = millis();
}
}
}
if (millis() - lastTimeButtonStateChanged2 >= debounceDuration) {
if (buttonState2 != lastButtonState2) {
lastTimeButtonStateChanged2 = millis();
lastButtonState2 = buttonState2;
if (buttonState2 == LOW) {
buttonStateChange = true;
standByState = (standByState == HIGH) ? LOW : HIGH;
Serial.print("standByState");
Serial.println(standByState);
}
}
}
if ((buttonOn == true) && (buttonChanged == true)) {
buttonTrigger = true;
buttonChanged = false;
buttonTimer = true;
Serial.print("buttonTrigger");
Serial.println(buttonTrigger);
}
if (buttonTimer == true) {
if (millis() - relayOnTime >= 40000) {
relayState = LOW;
buttonOn = false;
buttonTimer = false;
Serial.print("buttonTimer");
Serial.println(buttonTimer);
buttonChanged = true;
relayStateChange = true;
}
} else if ((buttonOn == false) && (buttonChanged == true)) {
buttonTrigger = false;
buttonChanged = false;
Serial.print("buttonTrigger2");
Serial.println(buttonTrigger);
}
}
void standby() {
if ((standByState == HIGH) && (buttonStateChange == true)) {
standByMode = false;
buttonStateChange = false;
ledCounter = 2;
Serial.print("ledCounter not in standby mode");
Serial.println(ledCounter);
}
if ((standByState == LOW) && (buttonStateChange == true)) {
standByMode = true;
buttonStateChange = false;
ledCounter = 1;
temperatureStateChange = 0;
sensorTrigger = false;
buttonTrigger = false;
Serial.print("ledCounter in standy mode");
Serial.println(ledCounter);
}
if (standByMode == true) {
digitalWrite(RELAY_PIN, LOW);
}
}
void led() {
if (ledCounter == 1) {
digitalWrite(ledPin3, HIGH);
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin1, LOW);
ledCounter = 0;
}
if (ledCounter == 2) {
digitalWrite(ledPin3, LOW);
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin1, LOW);
ledCounter = 0;
}
if (ledCounter == 3) {
digitalWrite(ledPin3, LOW);
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin1, HIGH);
ledCounter = 0;
}
}
void relay() {
if ((relayState == HIGH) && (relayStateChange == true)) {
digitalWrite(RELAY_PIN, HIGH);
relayStateChange = false;
ledCounter = 3;
Serial.print("ledCounter relay on");
Serial.println(ledCounter);
Serial.println("Relay state changed");
Serial.println("Relay On");
}
if ((relayState == LOW) && (relayStateChange == true)) {
digitalWrite(RELAY_PIN, LOW);
relayStateChange = false;
ledCounter = 2;
Serial.print("ledCounter relay off");
Serial.println(ledCounter);
Serial.println("Relay state changed");
Serial.println("Relay Off");
}
}
void temperature() {
if (standByMode == false) {
if (millis() - tempRead >= 30000) {
tempRead = millis();
// read humidity
float humi = dht_sensor.readHumidity();
// read temperature in Celsius
float temperature_C = dht_sensor.readTemperature();
// read temperature in Fahrenheit
float temperature_F = dht_sensor.readTemperature(true);
tempF = temperature_F;
hum = humi;
// check whether the reading is successful or not
if (isnan(temperature_C) || isnan(temperature_F) || isnan(humi)) {
Serial.println("Failed to read from DHT sensor!");
} else {
Serial.print("Humidity: ");
Serial.print(humi);
Serial.print("%");
Serial.print(" | ");
Serial.print("Temperature: ");
Serial.print(temperature_C);
Serial.print("°C ~ ");
Serial.print(temperature_F);
Serial.println("°F");
Serial.print("buttonChanged");
Serial.println(buttonChanged);
Serial.print("buttonOn");
Serial.println(buttonOn);
Serial.print("sensorTrigger");
Serial.println(sensorTrigger);
Serial.print("relayState");
Serial.println(relayState);
}
if (temperature_F >= 75) {
temperatureState = 1;
Serial.print("temperatureState");
Serial.println(temperatureState);
} else if (temperature_F <= 74){
temperatureState = 2;
Serial.print("temperatureState");
Serial.println(temperatureState);
}
if ((temperatureState != temperatureStateChange)) {
if ((temperature_F >= 75) && (buttonTrigger == false)) {
sensorTrigger = true;
relayState = HIGH;
relayStateChange = true;
m = 1;
sendmail = true;
temperatureStateChange = temperatureState;
Serial.print("relayStateChange");
Serial.println(relayStateChange);
}
if ((temperature_F <= 74) && (buttonTrigger == false)) {
sensorTrigger = false;
relayState = LOW;
relayStateChange = true;
m = 2;
sendmail = true;
temperatureStateChange = temperatureState;
Serial.print("relayStateChange2");
Serial.println(relayStateChange);
}
}
}
}
}
void email() {
if ((sendmail == true) && (relayStateChange == false)){
EMailSender::EMailMessage message;
message.subject = "from esp";
message.message = (myStrings[m]);
EMailSender::Response resp = emailSend.send("xxxxxxxxxx", message);
sendmail = false;
Serial.println("Sending status: ");
Serial.println(resp.status);
Serial.println(resp.code);
Serial.println(resp.desc);
}
}