#include <WiFi.h>
#include <DHTesp.h>
#include <PubSubClient.h>
#include <string.h>
#include <string>
#include <LiquidCrystal_I2C.h>
using namespace std;
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char *mqttServer = "broker.hivemq.com";
int port = 1883;
// Giá trị ánh sáng (đơn vị đo: lux - lumen per square metre)
char lux[7];
// Photoresistor pin
int photoPin = 35;
// Leds pin
int ledPin0 = 26, ledPin1 = 27, ledPin2 = 14, ledPin3 = 12;
// Led relay
int ledRelay = 2;
DHTesp dhtSensor;
WiFiClient espClient;
PubSubClient client(espClient);
// LCD
LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27,16,2);
//Thoi gian bat dau, ket thuc (trong khoang thoi gian ko co ai bat tat thu cong)
float startTime , endTime;
//trang thai mach
int state = 0; // 0 : mach tu dong, 1: mach thu cong
//====send to phone==============
void sendRequestPhone(char* host,int port ,char * request,float a,float b) {
WiFiClient client;
while(!client.connect(host, port)) {
Serial.println("connection fail");
delay(1000);
}
client.print(String("GET ") + String(request)+"?value1="+String(a) +"&value2="+String(b)+ " HTTP/1.1\r\n"
+ "Host: " + host + "\r\n"
+ "Connection: close\r\n\r\n");
delay(500);
while(client.available()) {
String line = client.readStringUntil('\r');
Serial.print(line);
}
}
//============sendrequest======================
void sendRequest(char* host,int port ,char * request,float a,float b) {
WiFiClient client;
while(!client.connect(host, port)) {
Serial.println("connection fail");
delay(1000);
}
client.print(String("GET ") + String(request)+String(a) +"&field2="+String(b)+ " HTTP/1.1\r\n"
+ "Host: " + host + "\r\n"
+ "Connection: close\r\n\r\n");
delay(500);
while(client.available()) {
String line = client.readStringUntil('\r');
Serial.print(line);
}
}
//============wifi=============
void wifiConnect() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" Connected!");
}
//============mqtt==============
void mqttReconnect()
{
while (!client.connected())
{
Serial.println("Attemping MQTT connection...");
String clientId = "ESP32Client-";clientId += String(random(0xffff), HEX);
if(client.connect(clientId.c_str()))
{
Serial.println("connected");
//***Subscribe all topic you need***
// Topic chế độ hệ thống (tự động/thủ công)
client.subscribe("sys/switchweb");
// Topic bật/tắt đèn trên website
client.subscribe("sys/switchwokwi");
// Topic nhận thông báo từ ifttt
client.subscribe("sys/notifi");
}
else
{
Serial.println("try again in 5 seconds");
delay(5000);
}
}
}
//=================callback==============
void callback(char *topic, byte *message, unsigned int length)
{
Serial.println("Wokwi received from topic: ");
Serial.println(topic);
String strMsg;
for (int i = 0; i < length; i++)
{
strMsg += (char)message[i];
}
Serial.println(strMsg);
state =1;
startTime = millis();
// Trạng thái hệ thống
if (strMsg == "On")
{
digitalWrite(ledRelay, HIGH);
client.publish("sys/notifi","Da bat den");
}
// Bật/tắt đèn thủ công
else if(strMsg == "Off")
{
digitalWrite(ledRelay, LOW);
client.publish("sys/notifi","Da tat den");
}
}
void setup() {
Serial.begin(115200);
Serial.print("Connecting to WiFi");
wifiConnect();
client.setServer(mqttServer, port);
client.setCallback(callback);
client.subscribe("sys/switchweb");
pinMode(ledRelay, OUTPUT);
LCD.init();
LCD.backlight();
dhtSensor.setup(15,DHTesp::DHT22);
}
void loop()
{
if(!client.connected())
{
mqttReconnect();
}
client.loop();
char* hosthinkspeak = "api.thingspeak.com";
int porthinkspeak = 80;
char* requesthingspeak = "/update?api_key=7M5K7HORGJGO16ST&field1=";
char* hostIfttt = "maker.ifttt.com";
int portIfttt = 80;
char* requestIfttt = "/trigger/thong bao khan/with/key/nK5ZHCNM066lagYzDdV-D-RAOh7_0t-hTLaix0Y6c3y";
TempAndHumidity data = dhtSensor.getTempAndHumidity();
float tem=data.temperature;
float hum=data.humidity;
Serial.println(tem);
sendRequest(hosthinkspeak,porthinkspeak,requesthingspeak,tem,hum);
switch (state)
{
// Hệ thống chạy tự động
case 0:
{
const float GAMMA = 0.7;
const float RL10 = 50;
// Convert the analog value into lux value:
float analogValue = analogRead(photoPin) * (float)1023 / 4095;
float voltage = analogValue / 1024. * 5;
float resistance = 2000 * voltage / (1 - voltage / 5);
int luxI = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
Serial.println(luxI);
if (luxI <= 100)
{
digitalWrite(ledRelay, HIGH);
client.publish("sys/switchwokwi","On");
}
else
{
digitalWrite(ledRelay, LOW);
client.publish("sys/switchwokwi","Off");
}
}
case 1:
{
if(millis() - startTime > 60000)
{
state = 0;
}
}
}
if(tem > 50){
sendRequestPhone(hostIfttt,portIfttt,requestIfttt,tem,hum);
}
LCD.setCursor(0,0);
LCD.print("Tempature:" + String(tem, 1) + " ");
LCD.setCursor(0,1);
LCD.print("Humidity:" + String(hum, 0));
delay(5000);
}