//19004133PhamThiHanhNguyen
#include <WiFi.h>
#include "PubSubClient.h"
#include "DHTesp.h"
#include "DHT.h"
#include<LiquidCrystal_I2C.h>
#include <HTTPClient.h>
#include "ArduinoJson.h"
#include <RTClib.h>
const char * MQTTServer = "broker.emqx.io";
const char * MQTT_Topic = "Nghia123";
//kết nối Thingspeak
String UrlThingspeak = "https://api.thingspeak.com/update?api_key=CRJFSDYM8IGMJGGU";
String httpGETRequest(const char* Url);
// LiquidCrystal_I2C lcd (0x27,20,4);
const char * MQTT_ID = "";
int Port = 1883;
String stMessage;
//kết nối wifi
WiFiClient espClient;
PubSubClient client(espClient);
// cảm biến nhiệt độ độ ẩm
const int DHT_PIN = 15;
DHTesp dhtSensor;
#define DHTTYPE DHT22
DHT dht(DHT_PIN, DHTTYPE);
RTC_DS1307 rtc;
int ch = 0;
int cm = 0;
int pos = 0;
LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27, 20, 4);
#define LDR_PIN 4
#define LED 5 // màu xanh dương _ ánh sáng
#define LED_ndda 19 // màu xanh lá cây _ nhiệt độ & độ ẩm
#define LED_dad 23 // màu tím
#define LED_cd 12 // màu đỏ _ chuyển động
#define LED_tg 34 // màu vàng_Thời gian
float a[10];
float b[10];
float TBT(float t, float a[]) {
float tong=0;
for(int i=0;i<9;i++)
a[i]=a[i+1];
a[9]=t;
for(int i=0;i<10;i++)
tong+=a[i];
return tong/10;
}
#define BUZZER_PIN 18
//cảm biến độ ẩm đát
#define AOUT_PIN 36 //Chân ESP32 GIOP36 (ADC0) nối với chân AOUT của cảm biến độ ẩm
// #define THRESHOLD 10 // THAY ĐỔI NGƯỠNG CỦA BẠN TẠI ĐÂY
void WIFIConnect() {
Serial.println("Connecting to SSID: Wokwi-GUEST");
WiFi.begin("Wokwi-GUEST", "");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("WiFi connected");
Serial.print(", IP address: ");
Serial.println(WiFi.localIP());
}
void MQTT_Reconnect() {
while (!client.connected()) {
if (client.connect(MQTT_ID)) {
Serial.print("MQTT Topic: ");
Serial.print(MQTT_Topic);
Serial.print(" connected");
client.subscribe(MQTT_Topic);
Serial.println("");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void callback(char* topic, byte* message, unsigned int length) {
Serial.print("Message arrived on topic: ");
Serial.println(topic);
Serial.print("Message: ");
String stMessage;
for (int i = 0; i < length; i++) {
Serial.print((char)message[i]);
stMessage += (char)message[i];
}
Serial.println();
StaticJsonDocument<400> doc;
deserializeJson(doc,stMessage);
String ndc= doc["nd"];
String dac= doc["da"];
String dadc= doc["dad"];
String asc= doc["as"];
String cdc= doc["cd"];
String tg= doc["tg"];
if(ndc == "Nhiet do cao" || dac == "Do am cao" ){
digitalWrite(LED_ndda, HIGH);
}else{
digitalWrite(LED_ndda, LOW);
}
if(dadc == "Do am dat cao" ){
digitalWrite(LED_dad, LOW);
}else{
digitalWrite(LED_dad, HIGH);
}
if (cdc== "Co nguoi") {
digitalWrite(LED_cd, HIGH);
}
else {
digitalWrite(LED_cd, LOW);
}
if (tg == "thoi gian") {
digitalWrite(LED_tg, HIGH);
}
else {
digitalWrite(LED_tg, LOW);
}
}
void setup() {
Serial.begin(115200);
WIFIConnect();
client.setServer(MQTTServer, Port);
client.setCallback(callback);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
LCD.init();
LCD.backlight();
pinMode(LDR_PIN, INPUT);
pinMode(LED, OUTPUT);
pinMode(LED_ndda, OUTPUT);
pinMode(LED_dad, OUTPUT);
pinMode(LED_cd, OUTPUT);
pinMode(LED_tg, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
Wire.begin();
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
}
void loop() {
delay(10);
if (!client.connected()) {
MQTT_Reconnect();
}
client.loop();
TempAndHumidity data = dhtSensor.getTempAndHumidity();
float t = data.temperature;
float h = data.humidity;
float ndtb = TBT(t,a);
float datb = TBT(h,b);
String cd = String(digitalRead(2));
int dad = analogRead(AOUT_PIN); // read the analog value from sensor
String ndc = t > 30 ? "Nhiet do cao":"An Toan";
String dac = h > 80 ? "Do am cao":"An Toan";
String dadc = dad > 1500 ? "Do am dat cao":"An Toan";
int number = cd.toInt();
String cdc = number > 0?"Co nguoi":"Khong nguoi";
String as = String(digitalRead(4)); // as thấp dưới 500 thì là 1, as sáng cao trên 500 thì là 0
// Serial.println(as);
String nd = String(t);
String da = String(h) ;
LCD.setCursor(0, 0);
LCD.print("nd:");
LCD.print(nd);
LCD.setCursor(0, 1);
LCD.print("dad:");
LCD.print(dad);
LCD.setCursor(0, 2);
LCD.print("Ttb:");
LCD.print(ndtb);
DateTime now = rtc.now();
//06:00 (6 PM)
if (now.hour() == 18 && now.minute() == 00 && now.second() == 0) {
digitalWrite(LED_tg, HIGH); // bật led
Serial.println("LED turned on");
}
//06:00 (6 AM)
if (now.hour() == 6 && now.minute() == 00 && now.second() == 0) {
digitalWrite(LED_tg, LOW); // Tắt led
Serial.println("LED turned off");
}
// Update LCD display
LCD.setCursor(0,3);
LCD.print("Time: ");
LCD.setCursor(6, 3);
LCD.print((now.hour() < 10 ? "0" : ""));
LCD.print(now.hour());
LCD.print(":");
LCD.setCursor(9, 3);
LCD.print((now.minute() < 10 ? "0" : ""));
LCD.print(now.minute());
ch= now.hour();
cm= now.minute();
LCD.setCursor(10, 0);
LCD.print("da:");
LCD.print(da);
LCD.setCursor(10, 1);
LCD.print("cd:");
LCD.print(cd);
LCD.setCursor(10, 2);
LCD.print("Htb:");
LCD.print(datb);
// LCD.setCursor(10, 3);
// LCD.print("as:");
// LCD.print(as);
tone(BUZZER_PIN, t > 40 ?31:0);
String input ="{\"nd\":\"" + String(nd)+ "\",\"dad\":\"" + String(dad) + "\",\"as\":\"" + String(as) + "\",\"cd\":\"" + String(cd) + "\",\"da\":\"" + String(da) + "\"}";
// String input ="{\"nd\":\"" + String(nd)+ "\",\"cd\":\"" + String(cd)+ "\",\"dad\":\"" + String(dad)+ "\",\"da\":\"" + String(da) +"\",\"d\":\"" + digitalRead(LED) + "\"}";
// client.publish("{tên subscribe}",{chuỗi gửi đi});
Serial.println(input);
client.publish("ESPGUIDI",String(input).c_str());
// // gửi dữ liệu qua python thổng qua MQTT r gửi qua mysql
String python =String(nd)+ "|" + String(da) + "|"+ String(dad) + "|" + String(as) + "|" + String(cd) ;
// client.publish("{tên subscribe}",{chuỗi gửi đi});
Serial.println(python);
client.publish("MYSQLPYTHON",String(python).c_str());
// gửi dữu liệu lên thingspeak thông qua http
String Url = UrlThingspeak +"&field1=" + String(nd)+ "&field2=" + String(da)+ "&field3=" + String(dad);
httpGETRequest(Url.c_str());
Serial.println(Url);
if (digitalRead(LDR_PIN) == LOW) {
digitalWrite(LED, LOW);
}
else {
digitalWrite(LED, HIGH);
}
if(ndc == "Nhiet do cao" || dac == "Do am cao" ){
digitalWrite(LED_ndda, HIGH);
}else{
digitalWrite(LED_ndda, LOW);
}
if(dadc == "Do am dat cao" ){
digitalWrite(LED_dad, LOW);
}else{
digitalWrite(LED_dad, HIGH);
}
if (cdc== "Co nguoi") {
digitalWrite(LED_cd, HIGH);
}
else {
digitalWrite(LED_cd, LOW);
}
}
String httpGETRequest(const char* Url)
{
HTTPClient http;
http.begin(Url);
int responseCode = http.GET();
String responseBody = "{}";
if(responseCode > 0)
{
Serial.print("responseCode:");
Serial.println(responseCode);
responseBody = http.getString();
}
else
{
Serial.print("Error Code: ");
Serial.println(responseCode);
}
http.end();
return responseBody;
}