#include <WiFi.h>
#include <PubSubClient.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#include <DHT.h>
// WiFi related
const char* ssid = "Wokwi-GUEST";
const char* password = " ";
// MQTT related
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;
const unsigned long MSG_INTERVAL = 10000; // minimum interval between messages
//const unsigned long MSG_INTERVAL = 5000*60; // minimum interval between messages
const char* mqtt_server = "broker.mqtt-dashboard.com";
const int MQTT_PORT = 1883;
const char* MQTT_DEVICE_TOPIC = "cefet/biblioteca/esp32_03";
const char* MQTT_NODE_TOPIC = "cefet/biblioteca/esp32_03/dht22";
const char* MQTT_TIMESTAMP_TOPIC = "cefet/biblioteca/esp32_03/dht22/timestamp";
const char* MQTT_TEMPERATURE_TOPIC = "cefet/biblioteca/esp32_03/dht22/temperature";
const char* MQTT_HUMIDITY_TOPIC = "cefet/biblioteca/esp32_03 /dht22/humidity";
const boolean MQTT_RETAINED = true;
String mqtt_msg;
// NTP network time protocol related
const int UTC_OFFSET = -3*3600; // Brasilia UTC time offset
const long NTP_UPDATE_INTERVAL = 3600*1000;
WiFiUDP ntp_UDP;
NTPClient time_client(ntp_UDP, "south-america.pool.ntp.org", UTC_OFFSET, NTP_UPDATE_INTERVAL);
//String timestamp;
const int BUILTIN_LED = 2;
// DHT sensor related
const uint8_t DHT_PIN = 5;
//const uint8_t VCC_PIN = 18;
// const uint8_t GND_PIN = 19;
DHT dht(DHT_PIN, DHT22);
float temperature;
float humidity;
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
randomSeed(micros());
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
String getTimestamp(unsigned long epoch_time) {
//Get a time structure
struct tm *ptm = gmtime ((time_t *)&epoch_time);
char string_buffer[20];
//Print complete date:
sprintf_P(string_buffer, PSTR("%4d-%02d-%02dT%d:%02d:%02d"), ptm->tm_year+1900, ptm->tm_mon+1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec);
String current_timestamp = String(string_buffer);
return current_timestamp;
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Create a random client ID
String clientId = "ESP8266Client-";
clientId += String(random(0xffff), HEX);
// Attempt to connect
if (client.connect(clientId.c_str())) {
Serial.println("connected");
// Once connected, publish attributes
// Device attributes
client.publish((String(MQTT_DEVICE_TOPIC)+"/$homie").c_str(), (uint8_t *)"3.0.0", 5, MQTT_RETAINED);
client.publish((String(MQTT_DEVICE_TOPIC)+"/$name").c_str(), (uint8_t *)"Casa", 14, MQTT_RETAINED);
client.publish((String(MQTT_DEVICE_TOPIC)+"/$state").c_str(), (uint8_t *)"ready", 5, MQTT_RETAINED);
client.publish((String(MQTT_DEVICE_TOPIC)+"/$nodes").c_str(), (uint8_t *)"dht22", 5, MQTT_RETAINED);
client.publish((String(MQTT_DEVICE_TOPIC)+"/$implementation").c_str(), (uint8_t *)"esp32", 7, MQTT_RETAINED);
// Node DHT22 attributes
client.publish((String(MQTT_NODE_TOPIC)+"/$name").c_str(), (uint8_t *)"Temperature and Humidity sensor", 12, MQTT_RETAINED);
mqtt_msg = "AM2302 DHT22";
client.publish((String(MQTT_NODE_TOPIC)+"/$type").c_str(), (uint8_t *)mqtt_msg.c_str(), mqtt_msg.length(), MQTT_RETAINED);
mqtt_msg = "timestamp,temperature,humidity";
client.publish((String(MQTT_NODE_TOPIC)+"/$properties").c_str(), (uint8_t *)mqtt_msg.c_str(), mqtt_msg.length(), MQTT_RETAINED);
// DHT22 properties attributes
// Timestamp
mqtt_msg = "Timestamp of sampled data";
client.publish((String(MQTT_TIMESTAMP_TOPIC)+"/$name").c_str(), (uint8_t *)mqtt_msg.c_str(), mqtt_msg.length(), MQTT_RETAINED);
mqtt_msg = "DateTime";
client.publish((String(MQTT_TIMESTAMP_TOPIC)+"/$datatype").c_str(), (uint8_t *)mqtt_msg.c_str(), mqtt_msg.length(), MQTT_RETAINED);
// Temperature
mqtt_msg = "Ambient Temperature";
client.publish((String(MQTT_TIMESTAMP_TOPIC)+"/$name").c_str(), (uint8_t *)mqtt_msg.c_str(), mqtt_msg.length(), MQTT_RETAINED);
mqtt_msg = "Float";
client.publish((String(MQTT_TIMESTAMP_TOPIC)+"/$datatype").c_str(), (uint8_t *)mqtt_msg.c_str(), mqtt_msg.length(), MQTT_RETAINED);
mqtt_msg = "C";
client.publish((String(MQTT_TIMESTAMP_TOPIC)+"/$unit").c_str(), (uint8_t *)mqtt_msg.c_str(), mqtt_msg.length(), MQTT_RETAINED);
// Humidity
mqtt_msg = "Ambient Relative Humidity";
client.publish((String(MQTT_TIMESTAMP_TOPIC)+"/$name").c_str(), (uint8_t *)mqtt_msg.c_str(), mqtt_msg.length(), MQTT_RETAINED);
mqtt_msg = "Percent";
client.publish((String(MQTT_TIMESTAMP_TOPIC)+"/$datatype").c_str(), (uint8_t *)mqtt_msg.c_str(), mqtt_msg.length(), MQTT_RETAINED);
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void setup() {
pinMode(BUILTIN_LED, OUTPUT); // Initialize the BUILTIN_LED pin as an output
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, MQTT_PORT);
time_client.begin();
// DHT22
//pinMode(VCC_PIN, OUTPUT);
//pinMode(GND_PIN, OUTPUT);
//digitalWrite(VCC_PIN, HIGH);
//digitalWrite(GND_PIN, LOW);
pinMode(DHT_PIN, INPUT);
dht.begin();
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
unsigned long now = millis();
if (now - lastMsg > MSG_INTERVAL) {
lastMsg = now;
time_client.update();
// Publish timestamp, temperature and humidity
digitalWrite(BUILTIN_LED, HIGH); // acende o LED
mqtt_msg = getTimestamp(time_client.getEpochTime());
client.publish(MQTT_TIMESTAMP_TOPIC, (uint8_t *)mqtt_msg.c_str(), mqtt_msg.length(), MQTT_RETAINED);
mqtt_msg = dht.readTemperature();
client.publish(MQTT_TEMPERATURE_TOPIC, (uint8_t *)mqtt_msg.c_str(), mqtt_msg.length(), MQTT_RETAINED);
mqtt_msg = dht.readHumidity();
client.publish(MQTT_HUMIDITY_TOPIC, (uint8_t *)mqtt_msg.c_str(), mqtt_msg.length(), MQTT_RETAINED);
digitalWrite(BUILTIN_LED, LOW); // apaga o LED
}
}