/*Bibliotecas que vou preicisar*/
#include "DHT.h"
#include "WiFi.h"
#include <PubSubClient.h>
// Definindo Topicos (caso peça pada mudar o lamp apenas mudar o numero)
#define TOPICO_SUBSCRIBE "/TEF/hosp600/cmd" //serve para o mkkt escutar
#define TOPICO_PUBLISH "/TEF/hosp600/attrs" //serve para enviar informação para o broke
#define TOPICO_PUBLISH_3 "/TEF/hosp600/attrs/h" //topico de umidade
#define TOPICO_PUBLISH_4 "/TEF/hosp600/attrs/t" //topico de temperatura
#define ID_MQTT "fiware_600" //id mqtt (para identificação de sessão)
// WIFI
const char* SSID = "Wokwi-GUEST"; //nome da rede WI-FI(obs: caso ele fale para mudar o nome e a senha so mudar oq esta dentro do "")
const char* PASSWORD = ""; // Senha da rede WI-FI
// MQTT
const char* BROKER_MQTT = "46.17.108.113"; //URL que tinha sido definido pelo professor n mudar
int BROKER_PORT = 1883; // Porta do sth commet
// Saídas Leds
int D4 = 4; // Led builtin do ESP32 (led na placa)
// Variáveis e objetos globais (PubSubClient.h)
WiFiClient espClient; // Cria o objeto espClient
PubSubClient MQTT(espClient); // Instancia o Cliente MQTT passando o objeto espClient
char EstadoSaida = '0'; // Variável que armazena o estado atual da saída
// Definição de função
void initSerial(); //Função do serial (aonde ve os dados)
void initWiFi(); //Função do wifi
void initMQTT(); //Função do MQTT
void reconectWiFi(); //função de tentar reconectar o Wifi
void mqtt_callback(char* topic, byte* payload, unsigned int length); //Função para enviar informação dos topicos criados
void VerificaConexoesWiFIEMQTT(void); //Função de Verificar a conexão entre o Wife e MQTT
void InitOutput(void); //Função do Output no 0 (desligado)
// DHT22
#define DHTPIN 2 //colocar o numero do pino em que conectou o sensor (dht22)
#define DHTTYPE DHT22 //Definindo que é o DHT22 e n o 11
DHT dht(DHTPIN, DHTTYPE);
//colocar independentemente do que o professor pedir nos sensor
void setup() {
InitOutput(); //iniciando output
initSerial(); //iniciando o serial
initWiFi(); //iniciando o wifi
initMQTT(); //iniciando o MQTT
delay(5000); //Colocando um deley quando iniciar
Serial.println(F("DHT22 teste!")); //teste do serial
}
void initSerial()
{
Serial.begin(115200); //Serve para falar a velocidade em que computador e o servidao vao se falar (o numero dentro do () é o tempo em bits)
}
// Função de iniciar o wifi e de se conectar com a rede e qual a mensagem ira mostrar
void initWiFi()
{
delay(10); //tempo de inicialização
//Mensagens no Serial
Serial.println("----- Conexão WI-FI -----");
Serial.print("Conectando-se na rede: ");
Serial.println(SSID); //Nome da Rede que ele vai se conectar que foi definido la em cima no wifi
Serial.println("Aguarde...");
reconectWiFi();
}
// Função: Inicializa parâmetros de conexão MQTT(endereço do broker, porta e seta função de callback)
void initMQTT()
{
MQTT.setServer(BROKER_MQTT, BROKER_PORT); //informa qual broker e porta deve ser conectado
MQTT.setCallback(mqtt_callback); //atribui função de callback (função chamada quando qualquer informação de um dos tópicos subescritos chega)
}
// Função: Função de callback: Chamada toda vez que uma informação de um dos tópicos subescritos chega
void mqtt_callback(char* topic, byte* payload, unsigned int length)
{
String msg;
//obtem a string do payload recebido
for(int i = 0; i < length; i++)
{
char c = (char)payload[i];
msg += c;
}
Serial.print("- Mensagem recebida: ");
Serial.println(msg);
// Toma ação dependendo da string recebida:
// Verifica se deve colocar nivel alto de tensão na saída D0:
if (msg.equals("hosp600@on|"))
{
digitalWrite(D4, HIGH);
EstadoSaida = '1';
}
//Verifica se deve colocar nivel alto de tensão na saída D0:
if (msg.equals("hosp600@off|"))
{
digitalWrite(D4, LOW);
EstadoSaida = '0';
}
}
//Função: inicializa o output em nível lógico baixo
void InitOutput(void)
{
//IMPORTANTE: o Led já contido na placa é acionado com lógica invertida (ou seja,
//enviar HIGH para o output faz o Led apagar / enviar LOW faz o Led acender)
pinMode(D4, OUTPUT);
digitalWrite(D4, HIGH);
boolean toggle = false;
for(int i = 0; i <= 10; i++)
{
toggle = !toggle;
digitalWrite(D4,toggle);
delay(200);
}
digitalWrite(D4, LOW);
}
//Função: reconecta-se ao broker MQTT (caso ainda não esteja conectado ou em caso de a conexão cair)
// em caso de sucesso na conexão ou reconexão, o subscribe dos tópicos é refeito.
void reconnectMQTT()
{
while (!MQTT.connected())
{
Serial.print("* Tentando se conectar ao Broker MQTT: ");
Serial.println(BROKER_MQTT);
if (MQTT.connect(ID_MQTT))
{
Serial.println("Conectado com sucesso ao broker MQTT!");
MQTT.subscribe(TOPICO_SUBSCRIBE);
}
else
{
Serial.println("Falha ao reconectar no broker.");
Serial.println("Havera nova tentatica de conexao em 2s");
delay(2000);
}
}
}
void reconectWiFi()
{
//se já está conectado a rede WI-FI, nada é feito.
//Caso contrário, são efetuadas tentativas de conexão
if (WiFi.status() == WL_CONNECTED)
return;
WiFi.begin(SSID, PASSWORD); // Conecta na rede WI-FI
while (WiFi.status() != WL_CONNECTED)
{
delay(100);
Serial.print(".");
}
Serial.println();
Serial.print("Conectado com sucesso na rede ");
Serial.print(SSID);
Serial.println("IP obtido: ");
Serial.println(WiFi.localIP());
}
//Função: verifica o estado das conexões WiFI e ao broker MQTT.
// Em caso de desconexão (qualquer uma das duas), a conexão
// é refeita.
void VerificaConexoesWiFIEMQTT(void)
{
if (!MQTT.connected())
reconnectMQTT(); //se não há conexão com o Broker, a conexão é refeita
reconectWiFi(); //se não há conexão com o WiFI, a conexão é refeita
}
//Função: envia ao Broker o estado atual do output
void EnviaEstadoOutputMQTT(void)
{
if (EstadoSaida == '1')
{
MQTT.publish(TOPICO_PUBLISH, "s|on");
Serial.println("- Led Ligado");
}
if (EstadoSaida == '0')
{
MQTT.publish(TOPICO_PUBLISH, "s|off");
Serial.println("- Led Desligado");
}
Serial.println("- Estado do LED onboard enviado ao broker!");
delay(1000);
}
//ate aqui n mudar nada
void loop() {
//verifica a conecxao n mudar
char msgBuffer[4];
//garante funcionamento das conexões WiFi e ao broker MQTT
VerificaConexoesWiFIEMQTT();
//envia o status de todos os outputs para o Broker no protocolo esperado
EnviaEstadoOutputMQTT();
//ate aqui
// Leitura do sensor DHT11 temperatura e humidade
float humidity = dht.readHumidity(); //criando a variavel de humidade
float temperature = dht.readTemperature(); //criando a variavel de temperatura
if (isnan(humidity) || isnan(temperature))
{
Serial.println(F("Falha leitura do sensor DHT-22!"));
}
//chamando as variaveis
Serial.print(F("Umidade: "));
Serial.print(humidity);
Serial.print(F("% Temperatura: "));
Serial.print(temperature);
Serial.println(F("°C "));
//Publicação tópico MQTT Umidade
dtostrf(humidity, 4, 1, msgBuffer);
MQTT.publish(TOPICO_PUBLISH_3,msgBuffer);
//Publicação tópico MQTT Temperatura
dtostrf(temperature, 4, 1, msgBuffer);
MQTT.publish(TOPICO_PUBLISH_4,msgBuffer);
//para manter a comunicação
//keep-alive da comunicação com broker MQTT
MQTT.loop();
}