#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHTesp.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include "RTClib.h"
//
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);
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() {
TempAndHumidity data = dhtSensor.getTempAndHumidity();
lcd.setCursor(0, 0);
lcd.print("Nhiet Do: ");
lcd.print(data.temperature);
// 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("Do am: ");
lcd.print(data.humidity);
// 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();
}
}
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.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