#include <WiFi.h> //biblioteca para esp32
#include <PubSubClient.h> //biblioteca para funções do protocolo Pub-Sub
const char* ssid = "Wokwi-GUEST"; //string com nome da rede onde o esp vai se conectar
const char* password = ""; //string com a senha da rede. Deixar em branco caso a rede seja aberta
const char* mqttServer = "broker.hivemq.com"; //string com a url do Broker que vai receber e transmitir as mensagens
const int mqttPort = 1883; //inteiro com o número da porta utilizada na conexão
const char* mqttUser = ""; //string com nome de usuário no Broker, quando for necessário
const char* mqttPassword = ""; //string com senha do Broker, quando necessário
const char* topico_teste = "cps/m3ef/hgjh"; //tópico a ser assinado
const char* topico_teste2 = "cps/m3ef/tttt";
WiFiClient espClient; //criação do objeto espClient do tipo WiFiClient
PubSubClient client(espClient);
char mensagem[30];
const int LedR = 19;
const int RELE = 4;
int sinalPot;
#include "DHTesp.h"
const int DHT_PIN = 15;
DHTesp dhtSensor;
float temp;
float temp_anterior;
void setup() {
Serial.begin(115200);
pinMode(19, OUTPUT);
pinMode(RELE, INPUT);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
WiFi.begin(ssid, password,6); //inicia a conexão WiFi com a rede
while (WiFi.status() != WL_CONNECTED) //verifica se a conexão ainda não estabilizou
{
delay(500); //espera 500 ms
Serial.println("Iniciando conexao com a rede WiFi.."); //"printa" na tela a frase entre aspas
}
Serial.println("Conectado na rede WiFi!"); //quando sai do laço, print a frase entre aspas
client.setCallback(callback); //configura o Callback do cliente a partir do callback passado como parâmetro
}
void loop() {
temp = 0;
temp_anterior = 0;
for(int i=0;i<100;i++){
temp = dhtSensor.getTemperature();
}
Serial.println(temp , temp_anterior);
if(temp!=temp_anterior){
Serial.println("Temp: " + String(temp, 2) + "°C");
temp_anterior = temp;
}
if(temp >= 40){
piscaled(LedR);
}
if(temp>37.8){
digitalWrite(RELE, LOW);
}
if(temp<37.4){
digitalWrite(RELE, HIGH);
}
Serial.println("---");
delay(2000); // Wait for a new reading from the sensor (DHT22 has ~0.5Hz sample rate)
if(!client.connected()){
reconectabroker(); //chama função de conexão ao Broker
}
//Para checar a rotina de callback
client.loop();
Serial.print("Medida do Pot:");
Serial.println(sinalPot);
//Envia a mensagem ao broker
client.publish(topico_teste2, mensagem);
Serial.println("Mensagem enviada com sucesso...");
delay(5000);
}
void piscaled(int pisca){
digitalWrite(pisca, HIGH);
delay(1000);
digitalWrite(pisca,LOW);
delay(1000);
}
void reconectabroker()
{
//Conexao ao broker MQTT
client.setServer(mqttServer, mqttPort);
while (!client.connected())
{
Serial.println("Conectando ao broker MQTT...");
if (client.connect("", mqttUser, mqttPassword ))
{
Serial.println("Conectado ao broker!");
client.subscribe(topico_teste); //assina o esp32 no tópico topico_teste definido no inicio do programa
}
else
{
Serial.print("Falha na conexao ao broker - Estado: ");
Serial.print(client.state());
delay(4000);
}
}
}//definição da funçao de callback.
void callback(char* topic, byte* message, unsigned int length) {
Serial.println("Chegou mensagem no topico: ");
Serial.print(topic);
Serial.print(". Mensagem: ");
String messageTemp;
for (int i = 0; i < length; i++) { //escreve mensagem caractere por caractere
Serial.print((char)message[i]);
messageTemp += (char)message[i];
}
Serial.println();
if (String(topic) == topico_teste) {
Serial.print("Trocando o estado do Relé para: ");
if(messageTemp == "on"){
Serial.println("Ligado");
digitalWrite(RELE, HIGH);
}
else if(messageTemp == "off"){
Serial.println("Desligado");
digitalWrite(RELE, LOW);
}else{}
}
}