#include "DHTesp.h"
#include <PubSubClient.h>
#include <WiFi.h>
#include <LiquidCrystal.h>
int relay = 4;
const int DHT_PIN = 15;
LiquidCrystal lcd(19, 23, 27, 26, 25, 33);
DHTesp dhtSensor;
const char* ssid = "Wokwi-GUEST";
const char* password = "";
//***Set server***
const char* mqttServer = "broker.mqtt-dashboard.com";
int port = 1883;
WiFiClient espClient;
PubSubClient client(espClient);
void wifiConnect() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" Connected!");
}
void mqttReconnect() {
while(!client.connected()) {
Serial.println("Attemping MQTT connection...");
//***Change "123456789" by your student id***
if(client.connect("20127569")) {
Serial.println("connected");
//***Subscribe all topic you need***
client.subscribe("20127569/Temperature");
client.subscribe("20127569/Humidity");
client.subscribe("20127569/button");
}
else {
Serial.println("try again in 5 seconds");
delay(5000);
}
}
}
void setup() {
pinMode(relay, OUTPUT);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
lcd.begin(16, 2);
Serial.begin(9600);
Serial.print("Connecting to WiFi");
pinMode(15, OUTPUT);
wifiConnect();
client.setServer(mqttServer, port);
client.setCallback(callback);
}
//MQTT Receiver
void callback(char* topic, byte* message, unsigned int length) {
Serial.println(topic);
String strMsg;
for(int i=0; i<length; i++) {
strMsg += (char)message[i];
}
Serial.println(strMsg);
// Nếu button được bấm thì bơm sẽ chạy 5 giây
if(strMsg == "true"){
lcd.clear();
digitalWrite(relay, HIGH);
lcd.print("ON");
delay(5000);
}
}
void loop() {
TempAndHumidity data = dhtSensor.getTempAndHumidity();
String temperature = String(data.temperature, 2);
String humidity = String(data.humidity, 1);
char t[50],h[50];
// từ string sang char[]
for(int i = 0;i<temperature.length();++i){
t[i] = temperature[i];
}
for(int i = 0;i<humidity.length();++i){
h[i] = humidity[i];
}
//Serial.println(t);
//Serial.println(h);
if(!client.connected()) {
mqttReconnect();
}
client.loop();
// Quyết định bật/tắt bơm nước
if(t[0] != '-' ){
lcd.clear();
digitalWrite(relay, HIGH);
lcd.print("ON");
}
else{
lcd.clear();
digitalWrite(relay, LOW);
lcd.print("OFF");
}
//***Change code to publish to MQTT Server***
// Truyền thông tin sang Node-RED
client.publish("20127569/Temperature", t);
client.publish("20127569/Humidity", h);
delay(5000);
}