// Referência:
// https://medium.com/engineering-iot/connecting-esp32-to-hivemq-for-real-time-iot-data-streaming-with-mqtt-8813f48cb1a4
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <time.h>
#include "PubSubClient.h"
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
#define wifi_ssid "Wokwi-GUEST"
#define wifi_senha ""
#define NTP_SERVER "pool.ntp.org"
#define UTC_OFFSET 0
#define UTC_OFFSET_DST 0
const char *mqtt_servidor = "ac15cc038fc44e1d89ea8ff01708c3bd.s1.eu.hivemq.cloud";
const int mqtt_porta = 8883;
const char *mqtt_usuario = "hivemq.webclient.1763425147712";
const char *mqtt_senha = "L4v#lKDrQ08<1S&gEo,m";
static const char *root_ca PROGMEM = R"EOF(
-----BEGIN CERTIFICATE-----
MIIEAzCCAuugAwIBAgIUBY1hlCGvdj4NhBXkZ/uLUZNILAwwDQYJKoZIhvcNAQEL
BQAwgZAxCzAJBgNVBAYTAkdCMRcwFQYDVQQIDA5Vbml0ZWQgS2luZ2RvbTEOMAwG
A1UEBwwFRGVyYnkxEjAQBgNVBAoMCU1vc3F1aXR0bzELMAkGA1UECwwCQ0ExFjAU
BgNVBAMMDW1vc3F1aXR0by5vcmcxHzAdBgkqhkiG9w0BCQEWEHJvZ2VyQGF0Y2hv
by5vcmcwHhcNMjAwNjA5MTEwNjM5WhcNMzAwNjA3MTEwNjM5WjCBkDELMAkGA1UE
BhMCR0IxFzAVBgNVBAgMDlVuaXRlZCBLaW5nZG9tMQ4wDAYDVQQHDAVEZXJieTES
MBAGA1UECgwJTW9zcXVpdHRvMQswCQYDVQQLDAJDQTEWMBQGA1UEAwwNbW9zcXVp
dHRvLm9yZzEfMB0GCSqGSIb3DQEJARYQcm9nZXJAYXRjaG9vLm9yZzCCASIwDQYJ
KoZIhvcNAQEBBQADggEPADCCAQoCggEBAME0HKmIzfTOwkKLT3THHe+ObdizamPg
UZmD64Tf3zJdNeYGYn4CEXbyP6fy3tWc8S2boW6dzrH8SdFf9uo320GJA9B7U1FW
Te3xda/Lm3JFfaHjkWw7jBwcauQZjpGINHapHRlpiCZsquAthOgxW9SgDgYlGzEA
s06pkEFiMw+qDfLo/sxFKB6vQlFekMeCymjLCbNwPJyqyhFmPWwio/PDMruBTzPH
3cioBnrJWKXc3OjXdLGFJOfj7pP0j/dr2LH72eSvv3PQQFl90CZPFhrCUcRHSSxo
E6yjGOdnz7f6PveLIB574kQORwt8ePn0yidrTC1ictikED3nHYhMUOUCAwEAAaNT
MFEwHQYDVR0OBBYEFPVV6xBUFPiGKDyo5V3+Hbh4N9YSMB8GA1UdIwQYMBaAFPVV
6xBUFPiGKDyo5V3+Hbh4N9YSMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL
BQADggEBAGa9kS21N70ThM6/Hj9D7mbVxKLBjVWe2TPsGfbl3rEDfZ+OKRZ2j6AC
6r7jb4TZO3dzF2p6dgbrlU71Y/4K0TdzIjRj3cQ3KSm41JvUQ0hZ/c04iGDg/xWf
+pp58nfPAYwuerruPNWmlStWAXf0UTqRtg4hQDWBuUFDJTuWuuBvEXudz74eh/wK
sMwfu1HFvjy5Z0iMDU8PUDepjVolOCue9ashlS4EB5IECdSR2TItnAIiIwimx839
LdUdRudafMu5T5Xma182OC0/u/xRlEm+tvKGGmfFcN0piqVl8OrSPBgIlb+1IKJE
m/XriWr/Cq4h/JfB7NTsezVslgkBaoU=
-----END CERTIFICATE-----
)EOF";
#define topico_temp "dhtclaudio/temperatura"
#define topico_umid "dhtclaudio/umidade"
WiFiClientSecure clienteEsp;
PubSubClient cliente(clienteEsp);
void setup() {
Serial.begin(9600);
dht.begin();
setup_wifi();
setDateTime();
//clienteEsp.setInsecure();
clienteEsp.setCACert(root_ca);
cliente.setServer(mqtt_servidor, mqtt_porta);
delay(2000);
}
void setDateTime() {
configTime(UTC_OFFSET, UTC_OFFSET_DST, NTP_SERVER);
printLocalTime();
}
void printLocalTime(){
struct tm timeinfo;
if(!getLocalTime(&timeinfo)) {
Serial.println("Failed to obtain time");
}
//Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
time_t tt = time(NULL);
struct tm data = *gmtime(&tt);
char data_formatada[64];
strftime(data_formatada, 64, "%d/%m/%Y %H:%M:%S", &data);
Serial.println(data_formatada);
}
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Conectando a ");
Serial.println(wifi_ssid);
WiFi.begin(wifi_ssid, wifi_senha);
int tentar = 0;
while (WiFi.status() != WL_CONNECTED && tentar < 40) {
delay(500);
Serial.print(".");
tentar++;
}
if (WiFi.status() != WL_CONNECTED) {
Serial.println("\nFalha na conexão ao Wi-Fi");
while (1) {
delay(1000);
}
}
Serial.println("\nConectado. IP: ");
Serial.println(WiFi.localIP());
}
void loop() {
float h = dht.readHumidity();
float t = dht.readTemperature();
Serial.print("Umidade: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperatura: ");
Serial.print(t);
Serial.print(" °C\n");
while (!cliente.connected()) {
if (cliente.connect("Claudio-ESP32", mqtt_usuario, mqtt_senha)) {
Serial.println("MQTT: Conectado");
}
else {
Serial.print("Erro MQTT: ");
Serial.println(cliente.state());
delay(2000);
}
}
Serial.print("MQTT: Enviando...");
cliente.publish(topico_temp, String(t).c_str(), true);
cliente.publish(topico_umid, String(h).c_str(), true);
cliente.disconnect();
Serial.println("Concluído.");
delay(120000); // 2 minutos
}