#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <WiFi.h>
#include "PubSubClient.h"
#include <LiquidCrystal_I2C.h>
#include "ThingSpeak.h"
#define DHTPIN 23 // Chân GPIO kết nối với DHT22
#define DHTTYPE DHT22 // Loại cảm biến DHT22
DHT dht(DHTPIN, DHTTYPE);
float mang[5];
LiquidCrystal_I2C lcd(0x27, 20, 4); // Địa chỉ I2C và kích thước của LCD
int lcdBacklightPin = 21; // Chân GPIO kết nối đến đèn nền của LCD
bool lcdBacklightOn = true; // Trạng thái đèn nền của LCD
int pirPin = 13; // Chân GPIO kết nối đến PIR motion sensor
bool pirState = false; // Trạng thái của PIR motion sensor
int buzzerPin = 27; // Chân GPIO kết nối đến buzzer
int leddo = 19;
int ledluc = 25;
int ledcam = 32;
int ledlam = 18;
const char * MQTTServer = "broker.hivemq.com";
const char * MQTT_Topic = "VLUTE/LED";
const char * MQTT_ID = "2ffe15ee-87f5-4fd7-9e7f-9a391a87e03f";
int Port = 1883;
WiFiClient espClient;
PubSubClient client(espClient);
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.print(stMessage);
}
void setup() {
Serial.begin(9600);
WIFIConnect();
client.setServer(MQTTServer, Port);
client.setCallback(callback);
dht.begin(); //dht22
lcd.init(); // man hinh
lcd.backlight(); // man hinh
pinMode(pirPin, INPUT); // Hồng ngoại
pinMode(buzzerPin, OUTPUT); // loa
pinMode(leddo, OUTPUT); // den
pinMode(ledcam, OUTPUT); // den
pinMode(ledlam, OUTPUT);// den
pinMode(ledluc, OUTPUT);//den
}
// Bật Led
void batleddo(){
digitalWrite(leddo, HIGH);
}
void batledluc(){
digitalWrite(ledluc, HIGH);
}
void batledcam(){
digitalWrite(ledcam, HIGH);
}
void batledlam(){
digitalWrite(ledlam, HIGH);
}
// Tắt Led
void tatleddo(){
digitalWrite(leddo, LOW);
}
void tatledluc(){
digitalWrite(ledluc, LOW);
}
void tatledcam(){
digitalWrite(ledcam, LOW);
}
void tatledlam(){
digitalWrite(ledlam, LOW);
}
// Bật/Tắt Loa
void batloa(){
digitalWrite(buzzerPin, HIGH);
}
void tatloa(){
digitalWrite(buzzerPin, LOW);
}
void loop() {
// Đọc nhiệt độ và độ ẩm từ DHT22
float t = dht.readTemperature();
float h = dht.readHumidity();
lcd.setCursor(0, 0);
lcd.print(" Nhiet Do: " + String(t, 1) + "\xDF"+"C ");
delay(1000);
lcd.setCursor(0, 1);
lcd.print(" Do Am: " + String(h, 1) + "% ");
delay(1000);
// Thông báo nhiệt độ
if (t > 37){
lcd.setCursor(0, 0);
lcd.print(" NHIET DO DANG CAO");
batleddo();
} else if (t < 20) {
lcd.setCursor(0, 0);
lcd.print(" NHIET DO DANG THAP");
batleddo();
} else {
lcd.setCursor(0, 0);
lcd.print("NHIET DO BINH THUONG");
tatleddo();
}
delay(1000);
// Thông báo Độ ẩm
if (h > 37 ){
lcd.setCursor(0, 1);
lcd.print(" DO AM DANG CAO");
batledlam();
} else if (h < 20) {
lcd.setCursor(0, 1);
lcd.print(" DO AM DANG THAP");
batledlam();
} else {
lcd.setCursor(0, 1);
lcd.print("DO AM BINH THUONG");
tatledlam();
}
delay(1000);
// Đọc giá trị từ PIR motion sensor
pirState = digitalRead(pirPin);
if (pirState > 0 ){
batloa();
batledcam();
delay(1000);
batledluc();
lcd.setCursor(0, 2);
lcd.print(" PIR: PHAT HIEN");
Serial.print(pirState);
}
else {
tatloa();
tatledcam();
tatledluc();
lcd.setCursor(0, 2);
lcd.print(" PIR: KHONG CO");
Serial.print(pirState);
}
delay(1000);
npublish();
if (!client.connected()) {
MQTT_Reconnect();
}
client.loop();
}
void npublish(){
float t = dht.readTemperature();
float h = dht.readHumidity();
pirState = digitalRead(pirPin);
String send = "{\"Nhietdo\":\""+String(t)+"\",\"Doam\":\""+String(h)+"\",\"HongNgoai\":\""+String(pirState)+"\"}";
client.publish("VLUTE/LED",String(send).c_str());
delay(1000);
}