#include <PubSubClient.h>
#include <WiFi.h>
#include "DHTesp.h"
#define LED_BUILTIN 2
const int DHT_PIN = 15;
WiFiClient espClient; // we are using this to initiate the pubsubclient library
PubSubClient mqttClient(espClient);
DHTesp dhtSensor;
// publish method only accepts character arrays
char tempAr[6];
void setup() {
Serial.begin(115200);
setupWifi();
setupMqtt();
dhtSensor.setup(DHT_PIN, DHTesp::DHT22); // initiate temp sensor
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW); // at the beginning
}
void loop() {
// check if we are connected to mqtt client
if(!mqttClient.connected()){
connectToBroker();
}
// see if there are any incoming msgs or publish values etc.
mqttClient.loop();
updateTemperature();
Serial.println(tempAr);
mqttClient.publish("esp32/entc-test-temp", tempAr);
delay(1000);
}
void setupWifi() {
Serial.println();
Serial.print("Connecting to WiFi");
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(5000);
Serial.print(".");
}
Serial.println(" ");
Serial.println("WiFi Connected");
Serial.println("IP address: ");
Serial.print(WiFi.localIP());
}
void setupMqtt() {
mqttClient.setServer("test.mosquitto.org", 1883);
mqttClient.setCallback(recieveCallback); // whenever a msg is recieved, this function will be called
}
void connectToBroker(){
while (!mqttClient.connected()){
Serial.println("Attempting MQTT Connection...");
// mqttClient.connect("ESP32-12343345") // we can put a random id here if there is not authentication. but if there is, we need to put that unique id
// if that is true --> it is connected to a server successfully
if (mqttClient.connect("ESP32-12343345")){
Serial.println("connected");
// best place to subscribe to a topic is also this
mqttClient.subscribe("esp32/entc-led-toggle");
} else {
Serial.println("failed");
Serial.println(mqttClient.state());
delay(5000);
}
}
}
void updateTemperature(){
TempAndHumidity data = dhtSensor.getTempAndHumidity();
String(data.temperature,2).toCharArray(tempAr, 6); // convert to string with 2 decomal places and convert to a char array
}
void recieveCallback(char* topic, byte* payload, unsigned int length){
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
char payloadCharAr[length];
for(int i = 0; i < length; i++){
Serial.print((char)payload[i]);
payloadCharAr[i] = (char)payload[i];
}
Serial.println();
// when msg is recieved, toggle the LED
// check if the topic is "entc-led-toggle"
if (strcmp(topic, "esp32/entc-led-toggle") == 0) {
if(payloadCharAr[0] == '1'){
digitalWrite(LED_BUILTIN, HIGH);
} else {
digitalWrite(LED_BUILTIN, LOW);
}
}
}