#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
#include <HTTPClient.h>
#include <WiFiClient.h>
#define DHTPIN 27 // DHT Sensor
#define DHTTYPE DHT22
DHT dht(DHTPIN,DHTTYPE);
float nhietdo = 0; // Declare temperature variable
float doam = 0;
String LED1_Value ="low";
const char* firebaseHost = "https://nhathongminhquy-default-rtdb.firebaseio.com/";
const char* firebaseSecret = "UCdVRI4qZze3mKXbUYy9vCW0hS8UWDTYcfHg5oNi";
const int pirSensorPin = 13;
const int Loa1 = 12;
const int Den1 = 14;
const int Den2 = 26;
const String correctPassword = "456";
const int lcdAddress = 0x27;
const int lcdCols = 16;
const int lcdRows = 2;
const byte ROW_NUM = 4;
const byte COLUMN_NUM = 4;
char keys[ROW_NUM][COLUMN_NUM] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte pin_rows[ROW_NUM] = {2, 4, 5, 18};
byte pin_column[COLUMN_NUM] = {19, 21, 22, 23};
Keypad keypad = Keypad(makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM);
LiquidCrystal_I2C lcd(lcdAddress, lcdCols, lcdRows);
String enteredPassword = "";
const char *MQTTServer = "broker.emqx.io";
const char *MQTT_Topic = "NhaThongMinh-20004165";
const char *MQTT_ID = "";
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("Nhận tin nhắn từ: ");
Serial.println(topic);
Serial.print("tin nhắn: ");
String stMessage;
for (int i = 0; i < length; i++) {
Serial.print((char)message[i]);
stMessage += (char)message[i];
}
Serial.println();
}
void setup() {
Serial.begin(115200);
WIFIConnect();
client.setServer(MQTTServer, Port);
client.setCallback(callback);
pinMode(pirSensorPin, INPUT);
pinMode(Loa1, OUTPUT);
pinMode(Den1, OUTPUT);
pinMode(Den2, OUTPUT);
String pirValue ;
lcd.begin(lcdCols, lcdRows);
lcd.setCursor(0, 0);
Wire.begin(33, 32);
lcd.begin(lcdCols, lcdRows);
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Nhap mat khau: ");
}
void loop() {
char key = keypad.getKey();
if (key) {
if (key == '#') {
if (enteredPassword == correctPassword) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Mo cua!");
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Sai mat khau");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Nhap mat khau:");
}
enteredPassword = "";
} else {
enteredPassword += key;
lcd.setCursor(0, 1);
lcd.print(String(enteredPassword.length() - 1, '*'));
}
}
delay(100);
Serial.println("Cảm biến DHT ... ");
dht.begin();
float nhietdo = dht.readTemperature();
float doam = dht.readHumidity();
if (isnan(nhietdo) || isnan(doam)) {
Serial.println("Đọc dữ liệu DHT sensor thất bại !!!!!!");
return;
}
if(nhietdo > 40 ){
digitalWrite(Den2, HIGH);
}
else{
digitalWrite(Den2, LOW);
}
Serial.print("Nhiệt độ: ");
Serial.print(nhietdo);
Serial.print("°C\t");
Serial.print("Độ ẩm: ");
Serial.print(doam);
Serial.println("%");
delay(2000);
//-------------------------------------------------------------//
String pirValue;
if (digitalRead(pirSensorPin) == HIGH) {
digitalWrite(Den1,HIGH); // turn LED on
LED1_Value="HIGH";
Serial.println("PIR_sensor:Phát hiện chuyển động");
pirValue = "Phát hiện chuyển động";
} else {
digitalWrite(Den1,LOW); // turn LED off
LED1_Value="LOW";
Serial.println("PIR_sensor: An Toàn");
pirValue = "Không có chuyển động";
}
if (!client.connected()) {
MQTT_Reconnect();
}
client.loop();
sendDataToFirebase(nhietdo, doam, pirValue);
Serial.println("-------------------------------------------------------------");
}
void sendDataToFirebase(float nhietdo, float doam, String pirValue) {
Serial.println("Dữ liệu gửi lên firebase :");
String sensorPath = "/sensorData.json";
String sensorFirebaseUrl = String(firebaseHost) + sensorPath + "?auth=" + String(firebaseSecret);
String sensorPayload = "{\"nhietdo\": " + String(nhietdo) + ", \"doam\": " + String(doam) +", \"pir\": \"" + pirValue + "\"}";
HTTPClient sensorHttp;
sensorHttp.begin(sensorFirebaseUrl);
sensorHttp.addHeader("Content-Type", "application/json");
int sensorHttpResponseCode = sensorHttp.PUT(sensorPayload);
if (sensorHttpResponseCode == HTTP_CODE_OK) {
Serial.println("- Cảm biến đã gửi");
} else {
Serial.print("Cảm biến eror. Mã lỗi:");
Serial.println(sensorHttpResponseCode);
}
sensorHttp.end();
}