#include <WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"
const int LED01 = 25;
//SENSOR DE TEMPERATURA DHT22
#define DHTTYPE DHT22 //modelo do sensor - DHT22
#define DHTPIN 5 //pino do sensor
DHT dht(DHTPIN, DHTTYPE); //variavel para leitura
int temperatura;
int atrasoTemp = 2500; //tempo do delay para chamar novamente a função de medir temperatura
unsigned long tempoAnteriorTemp = 0; //variável para delay usando millis
//BROKER MQTT
const char* mqtt_server = "broker.hivemq.com"; //servidor mqtt
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0; //unsigned long = inteiro de 32 bits sem sinal
#define MSG_BUFFER_SIZE (50)
char msg[MSG_BUFFER_SIZE];
void conectarBroker() {
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
if (!client.connected()) {
Serial.print("Conectando ao servidor MQTT...");
String clientId = "";
clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println("Conectado");
client.subscribe("cps/tranca"); //inscrição no tópico para receber mensagens
//client.subscribe("");
}
}
}
void reconectarBroker() {
if (!client.connected()) {
conectarBroker();
}
client.loop();
}
void callback(char* topic, byte* payload, unsigned int lenght) {
if ((char)payload[0] == 'a') {
digitalWrite(LED01, LOW);
}
if ((char)payload[0] == 'A') {
digitalWrite(LED01, HIGH);
}
}
//MEDIR TEMPERATURA
void medirTemperatura() {
if (millis() > (tempoAnteriorTemp + atrasoTemp)) {
tempoAnteriorTemp = millis();
temperatura = dht.readTemperature(); //lê temperatura no dht22
Serial.print("Temperatura: ");
Serial.print(temperatura);
Serial.println(F("°C"));
sprintf(msg, "%i", temperatura); //monta string
client.publish("cps/usuario", msg);//publica a mensagem no broker mqtt no tópico: m35ef/temp
//umidade
int umidade = dht.readHumidity();
sprintf(msg, "%i", umidade);
client.publish("cps/id", msg);
Serial.print("Umidade: ");
Serial.print(umidade);
Serial.println(F("%"));
}
}
void setup() {
Serial.begin(9600);
dht.begin();
Serial.print("Conectando-se ao Wi-Fi");
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println(" Conectado!");
pinMode(LED01, OUTPUT);
conectarBroker();
}
void loop() {
reconectarBroker();
medirTemperatura();
}