#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHTesp.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include "RTClib.h"
#include <ESP32Servo.h>
const int servoPin = 26;
Servo servo;
const int TIM_PIN = 35;
const int ledDA = 2;
const int ledND = 4;
const int DHT_PIN = 23;
RTC_DS1307 rtc;
int val = 0;
DHTesp dhtSensor;
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 20, 4);
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqttServer = "broker.emqx.io";
const int mqttPort = 1883;
const char* mqttUser = "mqtt-explorer-d8b89a15";
const char* mqttPassword = "123456";
WiFiClient espClient;
PubSubClient client(espClient);
void reconnect();
void setup() {
Serial.begin(115200);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
lcd.begin(20, 4);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
pinMode(ledDA, OUTPUT);
pinMode(ledND, OUTPUT);
servo.attach(servoPin, 500, 2400);
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
abort();
}
if (! rtc.isrunning()) {
Serial.println("RTC is NOT running, let's set the time!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
Serial.print("Connecting to WiFi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println(" Connected!");
client.setServer(mqttServer, mqttPort);
}
void DHT22() {
int pos = 0;
TempAndHumidity data = dhtSensor.getTempAndHumidity();
lcd.setCursor(0, 0);
lcd.print("ND: ");
lcd.setCursor(3,0);
lcd.print(data.temperature);
byte image01[8] = {B01110, B10001, B10001, B01110, B00000, B00000, B00000, B00000};
lcd.createChar(0, image01);
lcd.setCursor(9, 0);
lcd.write(byte(0));
lcd.setCursor(10,0);
lcd.print("C");
// Publish nhiệt độ lên MQTT
float nhietdo = dhtSensor.getTemperature();
if (client.publish("nhietdo", String(nhietdo).c_str())) {
Serial.println("Publishing to nhietdo: " + String(nhietdo));
} else {
Serial.println("Publishing to nhietdo failed");
reconnect();
}
lcd.setCursor(0, 1);
lcd.print("DA: ");
lcd.setCursor(3,1);
lcd.print(data.humidity);
lcd.setCursor(10,1);
lcd.print("%");
// Publish độ ẩm lên MQTT
float doam = dhtSensor.getHumidity();
if (client.publish("doam", String(doam).c_str())) {
Serial.println("Publishing to doam: " + String(doam));
} else {
Serial.println("Publishing to doam failed");
reconnect();
}
if (nhietdo > 13 && nhietdo < 35) {
lcd.setCursor(12,0);
lcd.print(" ");
delay(2000);
digitalWrite(ledND, LOW);
} else if (nhietdo < 13) {
lcd.setCursor(12,0);
lcd.print("ND thap");
delay(2000);
digitalWrite(ledND, HIGH);
} else if (nhietdo >= 35 && nhietdo <= 60) {
lcd.setCursor(12,0);
lcd.print("ND cao");
delay(2000);
digitalWrite(ledND, HIGH);
} else if (nhietdo > 60) {
lcd.setCursor(12,0);
lcd.print("CHAY !");
delay(3000);
digitalWrite(7, HIGH);
digitalWrite(ledND, HIGH);
for (pos = 0; pos <= 90; pos += 1) {
servo.write(pos);
delay(15);
}
for (pos = 90; pos <= 180; pos += 1) {
servo.write(pos);
delay(15);
}
for (pos = 180; pos <= 270; pos += 1) {
servo.write(pos);
delay(15);
}
for (pos = 270; pos <= 360; pos += 1) {
servo.write(pos);
delay(0);
}
}
// Kiểm tra điều kiện độ ẩm
if (doam < 40) {
lcd.setCursor(12,1);
lcd.print("DA thap ");
delay(2000);
digitalWrite(ledDA, HIGH);
} else if (doam >= 40 && doam <= 60) {
lcd.setCursor(12,1);
lcd.print(" ");
delay(2000);
digitalWrite(ledDA, LOW);
} else if (doam > 60) {
lcd.setCursor(12,1);
lcd.print("DA cao ");
delay(2000);
digitalWrite(ledDA, HIGH);
}
}
void RTC() {
DateTime time = rtc.now();
String timestampString = String(time.timestamp(DateTime::TIMESTAMP_FULL));
const char* timestampChar = timestampString.c_str();
if (client.publish("rtc", timestampChar)) {
Serial.print("Publishing RTC: ");
Serial.println(timestampChar);
} else {
Serial.println("Publishing to RTC failed");
reconnect();
}
}
void TIM() {
int analogValue = analogRead(TIM_PIN);
float voltage = analogValue / 4096. * 5;
float resistance = 2000 * voltage / (1 - voltage / 5);
float lux = pow(50 * 1e3 * pow(10, 0.7) / resistance, (1 / 0.7));
int nhiptim = lux;
lcd.setCursor(0, 2);
lcd.print("Nhip Tim: ");
lcd.setCursor(10,2);
lcd.print(lux);
// Publish Nhịp tim lên MQTT
if (client.publish("nhiptim", String(nhiptim).c_str())) {
Serial.println("Publishing to nhiptim: " + String(nhiptim));
} else {
Serial.println("Publishing to nhiptim failed");
reconnect();
}
Serial.println("------------------------------");
}
void loop() {
DHT22();
RTC();
TIM();
if (!client.connected()) {
Serial.println("MQTT not connected. Attempting to reconnect...");
reconnect();
}
delay(1000);
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect("ESP32Client")) {
Serial.println("Connected to MQTT broker");
} else {
Serial.print("Failed, rc=");
Serial.print(client.state());
Serial.println(" Retrying in 5 seconds...");
delay(5000);
}
}
}
Nhịp tim