#include <OneWire.h>
#include <DallasTemperature.h>
// bibliotecas de wifi e da conexão MQTT
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
//Wifi
const char* ssid = "WIFI_DEV_CONVIDADO"; // Nome da rede WiFi que deseja se conectar
const char* password = "aula0411"; // Senha da rede WiFi que deseja se conectar
const char* mqtt_server = "ef221ffa9a1c45ba9f94570aae0aeb9e.s1.eu.hivemq.cloud";
const int mqtt_port = 8883; // Porta TLS para MQTT
// Configuração de WiFi e MQTT
WiFiClientSecure espClient; // Usa WiFiClientSecure para TLS
PubSubClient client(espClient);
int tempPin = 13;
int buzzer = 15;
int ledVermelho = 4;
int ledAmarelo = 5;
int ledVerde = 18;
float temperatura = 0;
OneWire oneWire(tempPin);
DallasTemperature sensors(&oneWire);
void setup() {
Serial.begin(9600);
pinMode(ledVermelho, OUTPUT);
pinMode(ledVerde, OUTPUT);
pinMode(ledAmarelo, OUTPUT);
pinMode(buzzer, OUTPUT);
//Configura Wifi
setup_wifi();
// Habilita a verificação de certificado do servidor (opcional)
espClient.setInsecure(); // Se você não tem o certificado, use setInsecure(); caso contrário, use espClient.setCACert()
//Inicia servidor MQTT
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
xTaskCreate(
AcenderLeds, // Nome da função que define a tarefa
"Tarefa Aceder Leds", // Nome da tarefa (para fins de depuração)
1000, // Tamanho da pilha em palavras
NULL, // Parâmetro passado para a tarefa
1, // Prioridade da tarefa
NULL // Handle da tarefa (não utilizado aqui)
);
}
void loop() {
//Verificando se o MQTT está conectado
if (!client.connected()) {
reconnect();
}
client.loop();
//Publicando a temperatura no MQTT
char tempStr[8];
dtostrf(temperatura, 1, 2, tempStr); // Converte para string com 2 casas decimais
client.publish("projeto/thermoguard/Temperatura", tempStr);
Serial.println("Gravando MQTT");
delay(20000);
}
// Definição da função para a tarefa
void AcenderLeds(void *pvParameters) {
while (true) {
Serial.println("Executando Tarefa AcenderLeds");
sensors.requestTemperatures();
temperatura = sensors.getTempCByIndex(0);
Serial.print("Temperatura: ");
Serial.println(temperatura);
if (temperatura >= 70) {
digitalWrite(ledVermelho, HIGH);
digitalWrite(ledVerde, LOW);
digitalWrite(ledAmarelo, LOW);
tocarMusica();
} else if (temperatura < 30) {
digitalWrite(ledVermelho, LOW);
digitalWrite(ledVerde,HIGH);
digitalWrite(ledAmarelo, LOW);
noTone(buzzer);
} else {
digitalWrite(ledVermelho, LOW);
digitalWrite(ledVerde, LOW);
digitalWrite(ledAmarelo, HIGH);
tocarMusicaDuasVezes();
}
vTaskDelay(2000 / portTICK_PERIOD_MS); // Aguarda 1 segundo
}
}
void tocarMusica() {
tone(buzzer, 1000);
}
void tocarMusicaDuasVezes() {
for (int i = 0; i < 2; i++) {
tone(buzzer, 1000);
delay(200);
noTone(buzzer);
delay(200);
}
}
void setup_wifi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Conectando ao WiFi..");
}
Serial.println("Conectado");
Serial.print("Endereço de IP: ");
Serial.println(WiFi.localIP());
}
void reconnect() {
while (!client.connected()) {
Serial.print("Conectando ao MQTT...");
if (client.connect("ESP32Client", "douglascamata", "TesteMQTT123")) {
Serial.println("Conectado");
client.subscribe("projeto/thermoguard/Temperatura");
} else {
Serial.print("Erro:");
Serial.print(client.state());
Serial.println(" reconectando em 5 segundos");
delay(5000);
}
}
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.println(topic);
// Converte o payload para uma string para comparação
String payloadStr = "";
for (int i = 0; i < length; i++) {
payloadStr += (char)payload[i];
}
// Imprime o payload completo
Serial.println(payloadStr);
}