#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 = 12;
Servo servo;
int redPin = 27;
int greenPin = 26;
int bluePin = 25;
int pos = 0;
const int TIM_PIN = 35;
const int ledDA = 2;
const int ledND = 4;
const int ledNT = 5;
const int ledAS = 18;
const int DHT_PIN = 23;
const int AS_PIN = 32;
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();
bool subscribed = false;
void setup()
{
Serial.begin(115200);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
lcd.begin(20, 4);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
servo.attach(servoPin, 500, 2400);
pinMode(ledDA, OUTPUT);
pinMode(ledND, OUTPUT);
pinMode(ledNT, OUTPUT);
pinMode(ledAS, OUTPUT);
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, 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!");
subscribed = false;
client.setServer(mqttServer, mqttPort);
client.setCallback(callback);
}
void callback(char *topic, byte *message, unsigned int length) {
Serial.print("Message arrived on topic: ");
Serial.println(topic);
// Convert byte array to a string
String messageStr;
for (int i = 0; i < length; i++) {
messageStr += (char)message[i];
}
// Convert string to integer
int brightness = messageStr.toInt();
// Map the brightness value from the range 0-10 to the range 0-255
int mappedBrightness = map(brightness, 0, 5, 0, 255);
// Set the LED brightness for green color
analogWrite(greenPin, mappedBrightness);
// Turn off red and blue LEDs
analogWrite(redPin, 0);
analogWrite(bluePin, 0);
}
void DHT22() {
TempAndHumidity data = dhtSensor.getTempAndHumidity();
int pos = 0;
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();
}
// Kiểm tra điều kiện nhiệt độ
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 !!");
for (pos = 0; pos <= 360; pos ++) {
servo.write(pos);
delay(15);
}
for (pos = 360; pos <= 0; pos --) {
servo.write(pos);
delay(15);
}
delay(2000);
digitalWrite(7, HIGH);
digitalWrite(ledND, HIGH);
}
// 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.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("------------------------------");
//Kiểm tra điều kiện Nhịp tim
if (nhiptim < 100){
digitalWrite(ledNT, HIGH);
} else if (nhiptim >= 100 && nhiptim <=1000){
digitalWrite(ledNT, LOW);
} else if (nhiptim >1000){
digitalWrite(ledNT, HIGH);
}
}
void ANHSANG() {
int analogValue = analogRead(AS_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 anhsang = lux;
lcd.setCursor(0, 3);
lcd.print("Anh sang: ");
lcd.print(lux);
// Publish Ánh sáng lên MQTT
if (client.publish("anhsang", String(anhsang).c_str())) {
Serial.println("Publishing to anhsang: " + String(anhsang));
} else {
Serial.println("Publishing to anhsang failed");
reconnect();
}
Serial.println("------------------------------");
//Kiểm tra điều kiện Ánh sáng
if (anhsang < 100){
digitalWrite(ledAS, HIGH);
} else if (anhsang >= 100 && anhsang <=1000){
digitalWrite(ledAS, LOW);
} else if (anhsang >1000){
digitalWrite(ledAS, HIGH);
}
}
void loop()
{
DHT22();
RTC();
TIM();
ANHSANG();
if (!client.connected())
{
reconnect();
client.subscribe("rgb");
}
client.loop();
if (client.connected() && !subscribed) {
client.subscribe("rgb");
subscribed = true;
}
client.subscribe("rgb");
delay(100);
}
void reconnect()
{
while (!client.connected())
{
Serial.print("Attempting MQTT connection...");
if (client.connect("ESP32Client"))
{
Serial.println("Connected to MQTT broker");
client.subscribe("rgb");
}
else
{
Serial.print("Failed, rc=");
Serial.print(client.state());
Serial.println(" Retrying in 5 seconds...");
delay(5000);
}
}
}Nhịp tim
Ánh sáng