#define BLYNK_TEMPLATE_ID "TMPLfrC_S4Un"
#define BLYNK_TEMPLATE_NAME "Quickstart Template"
#define BLYNK_AUTH_TOKEN "KAz_lDwglhD5qP5LFBRk7jSDjaBs8jlL"
// Your WiFi credentials.
// Set password to "" for open networks.
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
//#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <Preferences.h>
#include "DHTesp.h"
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
Preferences pref;
// define the GPIO connected with Relays and switches
#define RelayPin1 5 //D5
#define RelayPin2 18 //D18
#define RelayPin3 19 //D19
#define RelayPin4 4 //D4
#define SwitchPin1 13 //D13
#define SwitchPin2 12 //D12
#define SwitchPin3 14 //D14
#define SwitchPin4 26 //D26
#define wifiLed 2 //D2
#define DHTPIN 15 //D15 pin connected with DHT
//Change the virtual pins according yours
#define VPIN_BUTTON_1 V1
#define VPIN_BUTTON_2 V2
#define VPIN_BUTTON_3 V3
#define VPIN_BUTTON_4 V4
#define VPIN_BUTTON_C V0
// Uncomment whatever type you're using!
#define DHTTYPE DHT22 // DHT 122
// Relay State
bool toggleState_1 = LOW; //Define integer to remember the toggle state for relay 1
bool toggleState_2 = LOW; //Define integer to remember the toggle state for relay 2
bool toggleState_3 = LOW; //Define integer to remember the toggle state for relay 3
bool toggleState_4 = LOW; //Define integer to remember the toggle state for relay 4
// Switch State
bool SwitchState_1 = LOW;
bool SwitchState_2 = LOW;
bool SwitchState_3 = LOW;
bool SwitchState_4 = LOW;
BlynkTimer timer;
int val = 0,va5, ge, t =15 ;
float tmp,hum = 0;
int wifiFlag = 0;
int ledPin = 33;
int inputPin = 27;
int pirState,k;
int v = 0;
//temp symbol
byte t1[8]={B00000, B00001, B00010, B00100, B00100, B00100, B00100, B00111,};
byte t2[8]={B00111, B00111, B00111, B01111,B11111, B11111, B01111, B00011,};
byte t3[8]={B00000, B10000, B01011, B00100, B00111, B00100, B00111, B11100,};
byte t4[8]={B11111, B11100, B11100, B11110,B11111, B11111, B11110, B11000,};
//humidity symbol
byte hum1[8]={B00000, B00001, B00011, B00011,B00111, B01111, B01111, B11111,};
byte hum2[8]={B11111, B11111, B11111, B01111,B00011, B00000, B00000, B00000,};
byte hum3[8]={B00000, B10000, B11000, B11000, B11100, B11110, B11110, B11111,};
byte hum4[8]={B11111, B11111, B11111, B11110, B11100, B00000, B00000, B00000,};
//Home Symbol
byte house1[8]={B00000, B00001, B00011, B00011, B00111, B01111, B01111, B11111,};
byte house2[8]={B11111, B11111, B11100, B11100, B11100, B11100, B11100, B11100,};
byte house3[8]={B00000, B10010, B11010, B11010, B11110, B11110, B11110, B11111,};
byte house4[8]={B11111, B11111, B11111, B10001, B10001, B10001, B11111, B11111,};
byte d[8] = { 0b00011,0b00011,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000 };
byte Lck[] = { B01110, B10001, B10001, B11111, B11011, B11011, B11111, B00000 };
DHTesp temps;
// When App button is pushed - switch the state
BLYNK_WRITE(VPIN_BUTTON_1) {
toggleState_1 = param.asInt();
digitalWrite(RelayPin1, !toggleState_1);
pref.putBool("Relay1", toggleState_1);
}
BLYNK_WRITE(VPIN_BUTTON_2) {
toggleState_2 = param.asInt();
digitalWrite(RelayPin2, !toggleState_2);
pref.putBool("Relay2", toggleState_2);
}
BLYNK_WRITE(VPIN_BUTTON_3) {
toggleState_3 = param.asInt();
digitalWrite(RelayPin3, !toggleState_3);
pref.putBool("Relay3", toggleState_3);
}
BLYNK_WRITE(VPIN_BUTTON_4) {
toggleState_4 = param.asInt();
digitalWrite(RelayPin4, !toggleState_4);
pref.putBool("Relay4", toggleState_4);
}
BLYNK_WRITE(V5) {
pirState = param.asInt();
if(pirState == 0){
digitalWrite(ledPin, LOW);
k = 1;
ge = 0;
}
else {
digitalWrite(ledPin, HIGH);
k= 0;
ge = 1;
}
}
BLYNK_WRITE(VPIN_BUTTON_C) {
all_SwitchOff();
}
void myTimer()
{
Blynk.virtualWrite(V7,tmp);
Blynk.virtualWrite(V6,hum);
}
void checkBlynkStatus() { // called every 3 seconds by SimpleTimer
bool isconnected = Blynk.connected();
if (isconnected == false) {
wifiFlag = 1;
digitalWrite(wifiLed, LOW);
Serial.println("Blynk Not Connected");
}
if (isconnected == true) {
wifiFlag = 0;
digitalWrite(wifiLed, HIGH);
Serial.println("Blynk Connected");
}
}
BLYNK_CONNECTED() {
// update the latest state to the server
Blynk.virtualWrite(VPIN_BUTTON_1, toggleState_1);
Blynk.virtualWrite(VPIN_BUTTON_2, toggleState_2);
Blynk.virtualWrite(VPIN_BUTTON_3, toggleState_3);
Blynk.virtualWrite(VPIN_BUTTON_4, toggleState_4);
}
void manual_control()
{
if (digitalRead(SwitchPin1) == LOW && SwitchState_1 == LOW) {
digitalWrite(RelayPin1, LOW);
toggleState_1 = HIGH;
SwitchState_1 = HIGH;
pref.putBool("Relay1", toggleState_1);
Blynk.virtualWrite(VPIN_BUTTON_1, toggleState_1);
Serial.println("Switch-1 on");
}
if (digitalRead(SwitchPin1) == HIGH && SwitchState_1 == HIGH) {
digitalWrite(RelayPin1, HIGH);
toggleState_1 = LOW;
SwitchState_1 = LOW;
pref.putBool("Relay1", toggleState_1);
Blynk.virtualWrite(VPIN_BUTTON_1, toggleState_1);
Serial.println("Switch-1 off");
}
if (digitalRead(SwitchPin2) == LOW && SwitchState_2 == LOW) {
digitalWrite(RelayPin2, LOW);
toggleState_2 = HIGH;
SwitchState_2 = HIGH;
pref.putBool("Relay2", toggleState_2);
Blynk.virtualWrite(VPIN_BUTTON_2, toggleState_2);
Serial.println("Switch-2 on");
}
if (digitalRead(SwitchPin2) == HIGH && SwitchState_2 == HIGH) {
digitalWrite(RelayPin2, HIGH);
toggleState_2 = LOW;
SwitchState_2 = LOW;
pref.putBool("Relay2", toggleState_2);
Blynk.virtualWrite(VPIN_BUTTON_2, toggleState_2);
Serial.println("Switch-2 off");
}
if (digitalRead(SwitchPin3) == LOW && SwitchState_3 == LOW) {
digitalWrite(RelayPin3, LOW);
toggleState_3 = HIGH;
SwitchState_3 = HIGH;
pref.putBool("Relay3", toggleState_3);
Blynk.virtualWrite(VPIN_BUTTON_3, toggleState_3);
Serial.println("Switch-3 on");
}
if (digitalRead(SwitchPin3) == HIGH && SwitchState_3 == HIGH) {
digitalWrite(RelayPin3, HIGH);
toggleState_3 = LOW;
SwitchState_3 = LOW;
pref.putBool("Relay3", toggleState_3);
Blynk.virtualWrite(VPIN_BUTTON_3, toggleState_3);
Serial.println("Switch-3 off");
}
if (digitalRead(SwitchPin4) == LOW && SwitchState_4 == LOW) {
digitalWrite(RelayPin4, LOW);
toggleState_4 = HIGH;
SwitchState_4 = HIGH;
pref.putBool("Relay4", toggleState_4);
Blynk.virtualWrite(VPIN_BUTTON_4, toggleState_4);
Serial.println("Switch-4 on");
}
if (digitalRead(SwitchPin4) == HIGH && SwitchState_4 == HIGH) {
digitalWrite(RelayPin4, HIGH);
toggleState_4 = LOW;
SwitchState_4 = LOW;
pref.putBool("Relay4", toggleState_4);
Blynk.virtualWrite(VPIN_BUTTON_4, toggleState_4);
Serial.println("Switch-4 off");
}
}
void all_SwitchOff() {
toggleState_1 = 0; digitalWrite(RelayPin1, HIGH); pref.putBool("Relay1", toggleState_1); Blynk.virtualWrite(VPIN_BUTTON_1, toggleState_1); delay(100);
toggleState_2 = 0; digitalWrite(RelayPin2, HIGH); pref.putBool("Relay2", toggleState_2); Blynk.virtualWrite(VPIN_BUTTON_2, toggleState_2); delay(100);
toggleState_3 = 0; digitalWrite(RelayPin3, HIGH); pref.putBool("Relay3", toggleState_3); Blynk.virtualWrite(VPIN_BUTTON_3, toggleState_3); delay(100);
toggleState_4 = 0; digitalWrite(RelayPin4, HIGH); pref.putBool("Relay4", toggleState_4); Blynk.virtualWrite(VPIN_BUTTON_4, toggleState_4); delay(100);
Blynk.virtualWrite(V7,tmp);
Blynk.virtualWrite(V6,hum);
}
void getRelayState()
{
//Serial.println("reading data from NVS");
toggleState_1 = pref.getBool("Relay1", 0);
digitalWrite(RelayPin1, !toggleState_1);
Blynk.virtualWrite(VPIN_BUTTON_1, toggleState_1);
delay(200);
toggleState_2 = pref.getBool("Relay2", 0);
digitalWrite(RelayPin2, !toggleState_2);
Blynk.virtualWrite(VPIN_BUTTON_2, toggleState_2);
delay(200);
toggleState_3 = pref.getBool("Relay3", 0);
digitalWrite(RelayPin3, !toggleState_3);
Blynk.virtualWrite(VPIN_BUTTON_3, toggleState_3);
delay(200);
toggleState_4 = pref.getBool("Relay4", 0);
digitalWrite(RelayPin4, !toggleState_4);
Blynk.virtualWrite(VPIN_BUTTON_4, toggleState_4);
delay(200);
}
void setup()
{
Serial.begin(115200);;
//Open namespace in read-write mode
pref.begin("Relay_State", false);
pinMode(RelayPin1, OUTPUT);
pinMode(RelayPin2, OUTPUT);
pinMode(RelayPin3, OUTPUT);
pinMode(RelayPin4, OUTPUT);
pinMode(wifiLed, OUTPUT);
pinMode(SwitchPin1, INPUT_PULLUP);
pinMode(SwitchPin2, INPUT_PULLUP);
pinMode(SwitchPin3, INPUT_PULLUP);
pinMode(SwitchPin4, INPUT_PULLUP);
temps.setup(t, DHTesp::DHT22);
pinMode(ledPin, OUTPUT);
pinMode(inputPin, INPUT_PULLUP);
lcd.init();
lcd.backlight();
//During Starting all Relays should TURN OFF
digitalWrite(RelayPin1, !toggleState_1);
digitalWrite(RelayPin2, !toggleState_2);
digitalWrite(RelayPin3, !toggleState_3);
digitalWrite(RelayPin4, !toggleState_4);
digitalWrite(wifiLed, LOW);
lcd.setCursor(0,0);
lcd.print("EPI POLYTECHNIQUE");
lcd.setCursor(8,1);
lcd.print("2023");
lcd.setCursor(0,2);
lcd.print("--------------------");
lcd.setCursor(9,3);
lcd.print("- 4 EM A");
delay(3000);
lcd.clear();
lcd.createChar(6, Lck);
lcd.createChar(1,house1);
lcd.createChar(2,house2);
lcd.createChar(3,house3);
lcd.createChar(4,house4);
lcd.setCursor(1,2);
lcd.write(1);
lcd.setCursor(1,3);
lcd.write(2);
lcd.setCursor(2,2);
lcd.write(3);
lcd.setCursor(2,3);
lcd.write(4);
lcd.setCursor(17,2);
lcd.write(1);
lcd.setCursor(17,3);
lcd.write(2);
lcd.setCursor(18,2);
lcd.write(3);
lcd.setCursor(18,3);
lcd.write(4);
lcd.setCursor(19,0);
lcd.write(6);
lcd.setCursor(9,0);
lcd.print("connected-");
lcd.setCursor(2,1);
lcd.print("maison intelligente ");
lcd.setCursor(6,2);
lcd.print("USING IOT");
delay(3000);
Blynk.virtualWrite(V7, pirState);
timer.setInterval(1000L, myTimer);
WiFi.begin(ssid, pass);
timer.setInterval(2000L, checkBlynkStatus); // check if Blynk server is connected every 2 seconds
Blynk.config(auth);
delay(1000);
getRelayState(); //fetch data from NVS Flash Memory
// delay(1000);
}
void loop()
{
Blynk.run();
timer.run(); // Initiates SimpleTimer
manual_control();
val = digitalRead(23);
if(val == 1)
{
digitalWrite(2,va5);
}
else{
digitalWrite(2,LOW);
}
TempAndHumidity x = temps.getTempAndHumidity();
tmp = x.temperature;
hum = x.humidity;
v = digitalRead(inputPin);
if (v == HIGH) {
if (k == 1) {
digitalWrite(ledPin, LOW);
k = 0 ;
ge = 0;
}
else if (k == 0) {
digitalWrite(ledPin, HIGH);
k = 1;
ge = 1;
}
}
if (RelayPin1 == 1){
lcd.clear();
lcd.setCursor(19,0);
lcd.write(6);
lcd.setCursor(0, 1);
lcd.print("SW_1= ");
lcd.print("ON ");
}
else{
lcd.clear();
lcd.setCursor(19,0);
lcd.write(6);
lcd.setCursor(0, 1);
lcd.print("SW_1= ");
lcd.print("OFF");
}
if (RelayPin2 == 1){
lcd.setCursor(11, 1);
lcd.print("SW_2= ");
lcd.print("ON ");
}
else{
lcd.setCursor(11, 1);
lcd.print("SW_2= ");
lcd.print("OFF");
}
if (RelayPin3 == 1){
lcd.setCursor(0, 2);
lcd.print("SW_3= ");
lcd.print("ON ");
}
else{
lcd.setCursor(0, 2);
lcd.print("SW_3= ");
lcd.print("OFF");
}
if (RelayPin4 == 1){
lcd.setCursor(11, 2);
lcd.print("SW_4= ");
lcd.print("ON ");
}
else{
lcd.setCursor(11, 2);
lcd.print("SW_4= ");
lcd.print("OFF");
}
if (va5 == 1){
lcd.setCursor(0, 3);
lcd.print("OD_L= ");
lcd.print("ON ");
}
else{
lcd.setCursor(0, 3);
lcd.print("OD_L= ");
lcd.print("OFF");
}
lcd.clear();
lcd.createChar(1,t1);
lcd.createChar(2,t2);
lcd.createChar(3,t3);
lcd.createChar(4,t4);
lcd.createChar(5, d);
lcd.createChar(6, Lck);
lcd.setCursor(19,0);
lcd.write(6);
lcd.setCursor(1,1);
lcd.write(1);
lcd.setCursor(1,2);
lcd.write(2);
lcd.setCursor(2,1);
lcd.write(3);
lcd.setCursor(2,2);
lcd.write(4);
lcd.setCursor(4,1);
lcd.print("Temperature :");
lcd.setCursor(7,2);
lcd.print(tmp);
lcd.setCursor(11,2);
lcd.write(5);
lcd.setCursor(12,2);
lcd.print("C");
delay(750);
lcd.clear();
lcd.createChar(1,hum1);
lcd.createChar(2,hum2);
lcd.createChar(3,hum3);
lcd.createChar(4,hum4);
lcd.setCursor(19,0);
lcd.write(6);
lcd.setCursor(3,1);
lcd.write(1);
lcd.setCursor(3,2);
lcd.write(2);
lcd.setCursor(4,1);
lcd.write(3);
lcd.setCursor(4,2);
lcd.write(4);
lcd.setCursor(6,1);
lcd.print("Humidity :");
lcd.setCursor(7,2);
lcd.print(hum);
lcd.setCursor(12,2);
lcd.print("%");
delay(750);
}