#include "DHTesp.h"
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
//WiFi
const char *ssid = "Wokwi-GUEST";
const char *pass = "";
// MQTT broker
const char *mqtt_server = "broker.emqx.io";
const int mqtt_port = 1883;
const char *mqtt_usn = "emqx";
const char *mqtt_pass = "public";
// DHT22 Topic
const char* temperatureTopic = "emqx/suhuiv";
const char* humidityTopic = "emqx/humdiv";
// DHT 22 Declaration
#define DHTPIN 25
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
DHTesp dhtSensor;
LiquidCrystal_I2C lcd(0x27, 16, 2);
//variable for storing the pushbutton status
long now = millis();
long lastMeasure = 0;
// WiFi & Client Publish Declaration
WiFiClient espClient;
PubSubClient client(espClient);
// Topic Calling
void callback(char *topic, byte *payload, unsigned int length){
Serial.print("Message arrived in topic: ");
Serial.println(topic);
Serial.print("Message:");
for (int i = 0; i < length; i++) {
Serial.print((char) payload[i]);
}
Serial.println();
}
void setup() {
dhtSensor.setup(25, DHTesp::DHT22);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
//delay(500);
delay(1000);
Serial.println("Connecting to WiFi..");
}
Serial.println("Connected to the Wi-Fi network");
//Connecting to a mqtt server
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
//Connecting Proccess
while (!client.connected()) {
String client_id = "esp32-client-";
client_id += String(WiFi.macAddress());
Serial.printf("The client %s connects to the public MQTT broker\n", client_id.c_str());
//WiFi Condition
if (client.connect(client_id.c_str(), mqtt_usn, mqtt_pass)) {
Serial.println("Public EMQX MQTT broker connected");
} else {
Serial.print("failed with state ");
Serial.print(client.state());
delay(2000);
}
}
//Starting DHT11 scanning
dht.begin();
lcd.init();
lcd.backlight();
}
void loop() {
TempAndHumidity data = dhtSensor.getTempAndHumidity();
lcd.setCursor(0,0);
lcd.print("temperature: ");
lcd.print(String(data.temperature, 2));
lcd.print(" C");
lcd.setCursor(0,1);
lcd.print("humadity: ");
lcd.print(String(data.humidity, 1));
lcd.print(" %");
delay(2000);
client.loop();
//untuk menjalankan waktu internal setiap milli seconds pada ESP32 secara independent..
//ketika millis di baca maka millis akan terus menghitung waktu walau pun ESP32 nya sedang menjalan kan program yang lain
now = millis();
//Scanning Process
if(now - lastMeasure > 2000){
lastMeasure = now;
float h = dht.readHumidity();
float t = dht.readTemperature();
float hic = dht.computeHeatIndex(t, h, false);
//Check if any reads failed and exit early (to try again(;
if(isnan(h) || isnan(t)){
Serial.println("Failed to read from DHT sensor!");
return;
}
client.publish(humidityTopic, String(h).c_str());
client.publish(temperatureTopic, String(t).c_str());
Serial.print(F("Humidity: "));
Serial.print(h);
Serial.print(F("% Temperature: "));
Serial.print(t);
Serial.println(" *C ");
}
delay(1000);
}