#include <Arduino.h>
#ifdef ESP8266
#include <ESP8266WiFi.h>
#endif
#ifdef ESP32
#include <WiFi.h>
#endif
// Adiciona as bibliotecas para conexão com o Sinric
#include "SinricPro.h"
#include "SinricProTemperaturesensor.h"
// Biblioteca para o sensor DHT
#include "DHTesp.h"
// Dados de conexão WiFi
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASS ""
// Dados de conexão ao Sinric
#define APP_KEY "97ebaad2-426f-4209-834e-2e2de4ce4178"
#define APP_SECRET "0d6f6b45-b93d-4932-98de-d90ba4e37d77-62679736-23d2-4e0f-94f1-a65860990f52"
#define TEMP_SENSOR_ID "665e2e83888aa7f7a233272a"
// Intervalo de entre leituras -> 10000ms = 10s
#define EVENT_WAIT_TIME 10000
// Velocidade de comunicação Serial
#define BAUD_RATE 115200
// Define pino onde o sensorDHT está conectado
#define DHT_PIN 13
DHTesp dhtSensor; // Sensor DHT
bool deviceIsOn; // Estado do sensor de temperatura
float temperature; // Temperatura atual
float humidity; // Umidade atual
float lastTemperature; // Temperatura anterior
float lastHumidity; // Umidade anterior
unsigned long lastEvent = (-EVENT_WAIT_TIME); // Última mudança
// Função que lê e envia a temperatura e umidade ao Sinric
void handleTemperaturesensor()
{
// Caso o sensor esteja desconectado, sai da função.
if (deviceIsOn == false) return;
// Obtém horário atual da medição.
unsigned long actualMillis = millis();
// Se a última medição ocorreu antes do limite estabelecido (60s) sai da função
if (actualMillis - lastEvent < EVENT_WAIT_TIME) return;
// Obtém a temperatura e umidade do sensor
TempAndHumidity data = dhtSensor.getTempAndHumidity();
temperature = data.temperature;
humidity = data.humidity;
// Se ocorreu algum erro na leitura, imprime mensagem e sai da função
if (isnan(temperature))
{
Serial.printf("Falha na leitura do sensor DHT!\n");
return;
}
// Se não houve alteração na temperatura não faz nada e sai da função.
if (temperature == lastTemperature || humidity == lastHumidity) return;
// Envia a temperatura e a umidade para o dispositivo no Sinric.
SinricProTemperaturesensor &mySensor = SinricPro[TEMP_SENSOR_ID];
bool success = mySensor.sendTemperatureEvent(temperature, humidity);
// Se enviou com sucesso, imprime valores
if (success)
{
Serial.printf("Temperatura: %.2f Celsius\tUmidade: %.2f%%\n", temperature, humidity);
}
// Se ocorreu falha no envio, imprime erro.
else
{
Serial.printf("Algo deu errado! Não foi possível enviar a temperatura para o servidor!\n");
}
lastTemperature = temperature; // salve a temperatura atual
lastHumidity = humidity; // salve a umidade atual atual
lastEvent = actualMillis; // salve o horario atual
}
// Função que informa se o dispositivo (DHT) está ligado.
bool onPowerState(const String &deviceId, bool &state)
{
Serial.printf("Dispositivo %s está %s (via SinricPro) \r\n", deviceId.c_str(), state ? "ligado" : "desligado");
deviceIsOn = state;
return true;
}
// Conecta ao WiFi
void setupWiFi()
{
Serial.printf("\r\n[Wifi]: Conectando");
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) {
Serial.printf(".");
delay(250);
}
IPAddress localIP = WiFi.localIP();
Serial.printf("Conectado!\n[WiFi]: Endereço IP: %d.%d.%d.%d\r\n", localIP[0], localIP[1], localIP[2], localIP[3]);
}
// Configura conexão ao Sinric
void setupSinricPro()
{
// Adiciona sensor ao Sinric
SinricProTemperaturesensor &mySensor = SinricPro[TEMP_SENSOR_ID];
mySensor.onPowerState(onPowerState);
Serial.printf("Conectando ao SinricPro\r\n");
// Configura Sinric
SinricPro.onConnected([]() {
Serial.printf("Conectado ao SinricPro\r\n");
});
SinricPro.onDisconnected([]() {
Serial.printf("Desconectado do SinricPro\r\n");
});
// Conecta ao Sinric
SinricPro.begin(APP_KEY, APP_SECRET);
SinricPro.restoreDeviceStates(true);
}
// Função Setup
void setup()
{
Serial.begin(BAUD_RATE);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
setupWiFi();
setupSinricPro();
}
// Função Loop
void loop()
{
SinricPro.handle();
handleTemperaturesensor();
}