#include <DHT.h>
#include <PubSubClient.h>
#include <WiFi.h>
//#include <LiquidCrystal_I2C.h> not for now
//Relay
const int relay=26;
//wifi connection
const char *ssid = "Wokwi-GUEST";
const char *pass = "";
//mqtt protocol declaration
const char *mqtt_server = "broker.emqx.io";
const char* mqtt_username= "emqx";
const char* mqtt_password = "public";
const int mqtt_port = 1883;
//topic declaration for IOT MQTT Panel
const char* tmp = "emqx/tempnecro";
const char* hum = "emqx/humnecro";
const char* led = "emqx/lednecro";
// DHT22 Declaration
#define DHTPIN 15
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
//milis declaration
long now = millis();
long lastMeasure = 0; //initial value
// WiFi & client publish declaraiton
WiFiClient espClient;
PubSubClient client(espClient);
//Callback function (call the topic)
void callback(char * topic, byte * payload, unsigned int length){
Serial.print("Message arrived in topic");
Serial.println(topic);
Serial.print(". Message: ");
String messageTemp;
for(int i= 0;i < length;i++){
Serial.print((char) payload[i]);
messageTemp += (char)payload[i];
}
Serial.println();
}
//WiFi connection function
void wifiConn() {
//connecting to a wifi network
WiFi.begin(ssid, pass);
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Still trying to connect to wifi...");
}
Serial.println("Connected");
//connecting to a mqtt server
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback); //calling callback parameter
// connecting process
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_username, mqtt_password)){
Serial.println("Public EMQX MQTT broker connected");
} else{
Serial.print("failed with state");
Serial.print(client.state());
delay(2000);
}
}
}
void setup(){
// Set software serial baud to 9600;
Serial.begin(9600);
pinMode(relay, OUTPUT);
// calling wifiConn function
wifiConn();
//start and initialize dht object
dht.begin();
}
void loop() {
// Repeat sending sensor data
client.loop();
/*untuk menjalankan waktu internal waktu internal setiap milli seconds pada esp32 secara
independent.
ketika millis di baca maka millis akan terus menghitung waktu walau pun esp32 nya sedang
menjalankan prorgram 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;
} else{
//client publish
client.publish(hum, String(h).c_str());
client.publish(tmp, String(t).c_str());
//client.publish(led, String(relay).c_str())
Serial.print(F("Humidity: "));
Serial.print(h);
Serial.print(F("% temperature: "));
Serial.print(t);
Serial.print(" C ");
boolean z;
if((t > 28)&&(h > 60)){
digitalWrite(relay, HIGH);
int z = 1;
Serial.println("Relay ON");
client.publish(led, String(z).c_str());
} else {
digitalWrite(relay, LOW);
int z = 0;
Serial.print("Relay : OFF");
client.publish(led, String(z).c_str());
}
}
}
}