#include <DHT.h>
#include <WiFi.h>
#include "PubSubClient.h"
#include <LiquidCrystal_I2C.h>
// #include <AccelStepper.h>
// #include <PID_v1_bc.h>
// #include <ESP32Servo.h>
// #include <SPI.h>
#include "RTClib.h"
#include <HTTPClient.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
RTC_DS1307 rtc;
DHT dht(4, DHT22);
float temperature ;
float humidity;
float duration_us, distance_cm;
#define TRIG_PIN 2
#define ECHO_PIN 15
const int anhsang = 34;
const int chuyendong = 23;
const int doamdat = 35;
const int mua = 32;
int led_cd = 5;
int coi_cd =26;
const char * MQTTServer = "broker.hivemq.com";
const char *MQTT_ID = "ESP32_Client";
int Port = 1883;
const char* mqtt_topic_temperature = "nth/temperature";
const char* mqtt_topic_humidity = "nth/humidity";
const char* mqtt_topic_distance = "nth/distance";
const char* mqtt_topic_light = "nth/light";
const char* mqtt_topic_soil = "nth/soil";
const char* mqtt_topic_rain = "nth/rain";
const char* mqtt_topic_pir = "nth/pir";
const char* mqtt_topic_btn_den = "nth/den";
const char* mqtt_topic_btn_coi = "nth/coi";
const char* mqtt_topic_btn_servo1_kc = "nth/servo1_kc";
const char* mqtt_topic_btn_servo2_mua = "nth/servo2_mua";
const char* mqtt_topic_r_nhietdo = "nth/r_nhietdo_nhan";
const char* mqtt_topic_r_doam = "nth/r_doam_nhan";
const char* mqtt_topic_r_anhsang = "nth/r_anhsang_nhan";
const char* mqtt_topic_thoigian1 = "nth/thoigian1";
const char* mqtt_topic_thoigian2 = "nth/thoigian2";
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()) {
Serial.print("Attempting MQTT connection...");
// Tạo kết nối MQTT
if (client.connect(MQTT_ID)) {
Serial.println("connected");
client.subscribe(mqtt_topic_r_nhietdo);
client.subscribe(mqtt_topic_r_doam);
client.subscribe(mqtt_topic_r_anhsang);
client.subscribe(mqtt_topic_thoigian1);
client.subscribe(mqtt_topic_thoigian2);
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Đợi 5 giây trước khi thử kết nối lại
// delay(5000);
}
}
}
void setup(){
WIFIConnect();
client.setServer(MQTTServer, Port);
// client.setCallback(callback);
Serial.begin(9600);
lcd.init();
lcd.backlight();
//==============ultrasonic==========
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
//=============chuyen dong==========
pinMode(chuyendong, INPUT);
pinMode(led_cd,OUTPUT);
pinMode(coi_cd,OUTPUT);
//==============anh sang============
pinMode(anhsang, INPUT);
//==============do am dat===========
pinMode(doamdat, INPUT);
//=================mua==============
pinMode(mua, INPUT);
//==============DS1307==============
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
if (!rtc.isrunning()) {
Serial.println("RTC is NOT running, let's set the time!");
}
}
void loop(){
if (!client.connected()) {
MQTT_Reconnect();
}
client.loop();
//=============ds1307===============
DateTime now = rtc.now();
// Display on LCD
lcd.clear();
lcd.setCursor(5, 0);
lcd.print((now.day() < 10 ? "0" : "") + String(now.day(), DEC));
lcd.print('/');
lcd.print((now.month() < 10 ? "0" : "") + String(now.month(), DEC));
lcd.print('/');
lcd.print(now.year(), DEC);
lcd.setCursor(5, 1);
lcd.print((now.hour() < 10 ? "0" : "") + String(now.hour(), DEC));
lcd.print(':');
lcd.print((now.minute() < 10 ? "0" : "") + String(now.minute(), DEC));
lcd.print(':');
lcd.print((now.second() < 10 ? "0" : "") + String(now.second(), DEC));
delay(1000);
//===============dht=================
temperature = dht.readTemperature();
humidity = dht.readHumidity();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("ND: ");
lcd.setCursor(5,0);
lcd.print(temperature);
lcd.setCursor(0,1);
lcd.print("DA: ");
lcd.setCursor(5,1);
lcd.print(humidity);
if (temperature >= 35 && humidity <= 50) {
} else {
}
//=============ultrasonic==========
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration_us = pulseIn(ECHO_PIN, HIGH);
float distance_cm = 0.034 * (duration_us / 2);
lcd.setCursor(0,2);
lcd.print("KC: ");
lcd.setCursor(5,2);
lcd.print(distance_cm);
if (distance_cm > 200) {
} else if (distance_cm < 150) {
}
//==================ldr====================
int gt_anhsang = analogRead(anhsang);
// Chuyển đổi giá trị analog sang điện áp (V)
float voltage = gt_anhsang / 4063.0 * 5.0;
// Tính toán điện trở của LDR
float resistance = 2000 * voltage / (1 - voltage / 5.0);
// Công thức tính độ sáng (lux) từ điện trở của LDR
const float GAMMA = 0.7;
const float RL10 = 50.0;
float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
lcd.setCursor(0,3);
lcd.print("AS: ");
lcd.setCursor(5,3);
lcd.print(lux);
delay(1000);
//========================do am dat========================
int16_t i = analogRead(doamdat);
String msg = i > 767 ? "UOC" : i < 256 ? "KHO" : "OK";
lcd.clear();
lcd.print("DA DAT: ");
lcd.print(msg);
lcd.setCursor(1,1);
lcd.print(i);
delay(500);
//===========================rain=======================
int gt_mua = analogRead(mua);
String tt_mua ="";
if(gt_mua >500){
// servo2.write(180);
tt_mua="Trời mưa";
}
else{
// servo2.write(0);
tt_mua="Trời nắng";
}
lcd.setCursor(0, 2);
lcd.print("MUA: ");
lcd.setCursor(6,2);
lcd.print(gt_mua);
Serial.println(tt_mua);
//======================pir chuyển động=====================
int tt_chuyendong = digitalRead(chuyendong);
lcd.setCursor(0, 3);
lcd.print("chuyen dong: ");
lcd.setCursor(15,3);
lcd.print(tt_chuyendong);
Serial.println(tt_chuyendong);
if(tt_chuyendong==1)
{
tone(coi_cd, 1000);
digitalWrite(led_cd,HIGH);
}else
{
noTone(coi_cd);
digitalWrite(led_cd,LOW );
}
delay(500);
//Gửi nhiệt độ & độ ẩm lên MQTT Borker
String a = String(temperature);
String b = String(humidity);
String c = String(distance_cm);
String d = String(lux);
String e = String(tt_chuyendong);
String f = String(i);
String g = String(gt_mua);
client.publish("nth/temperature", a.c_str());
client.publish("nth/humidity", b.c_str());
client.publish("nth/distance", c.c_str());
client.publish("nth/light", d.c_str());
client.publish("nth/pir", e.c_str());
client.publish("nth/soil", f.c_str());
client.publish("nth/rain", g.c_str());
}