/*
Exemplo composto com : https://github.com/mathworks/thingspeak-arduino
https://github.com/adafruit/DHT-sensor-library/tree/master
Gráfico dos dados: https://thingspeak.mathworks.com/channels/451231/charts/4?bgcolor=%23ffffff&color=%23d62020&dynamic=true&results=60&type=line&update=15
*/
#include "parametros.h"
#include <WiFi.h>
#include <ThingSpeak.h>
#include <DHT.h>
#include <DHT_U.h>
#include <HTTPClient.h>
#include <Arduino_JSON.h>
#define CERTO 5
#define ATENCAO 10
#define ALARME 15
String httpGETRequest(const char* serverName);
void updateThingSpeak(float valor, int campo);
float getAPITemperature();
float getSensorTemperature();
int vermelho = 6;
int amarelo = 7;
int verde = 8;
const char* apiURL = "http://api.openweathermap.org/data/2.5/weather?lat=-5.81&lon=-35.26&units=metric&appid=3489c35b15d5becad35f4461edd7c361";
char rede[] = REDE;
char senha[] = SENHA;
DHT_Unified dht(DHTPIN, DHTTYPE);
WiFiClient client; //Inicializacao do cliente ThinkSpeak
bool is_wifi_connected() {
return WiFi.status() == WL_CONNECTED;
}
void setup() {
pinMode(vermelho, OUTPUT);
pinMode(amarelo, OUTPUT);
pinMode(verde, OUTPUT);
digitalWrite(vermelho, LOW);
digitalWrite(amarelo, LOW);
digitalWrite(verde, LOW);
Serial1.begin(115200);
Serial1.println("Exemplo de Comparacao de Temperaturas");
Serial1.println("-------------------------------");
WiFi.mode(WIFI_STA); // https://randomnerdtutorials.com/esp32-useful-wi-fi-functions-arduino/
WiFi.begin(rede, senha); // Iniciando a conexao
Serial1.print("Conectando...");
while (!is_wifi_connected()) {
delay(500);
Serial1.print(".");
delay(500);
}
// connection established
Serial1.println("");
Serial1.print("Conexão estabelecida com a rede: ");
Serial1.println(WiFi.SSID());
// print IP Address
Serial1.print("IP atribuído: ");
Serial1.println(WiFi.localIP());
dht.begin();//Inicializando sensor de temperatura
sensor_t sensor;
ThingSpeak.begin(client); // Inicializando ThingSpeak
}
void loop() {
float tempAPI;
float tempSensor;
float diferenca;
do { // Refazendo a leitura caso algo de errado
tempAPI = getAPITemperature();
//Serial1.println(tempAPI);
tempSensor = getSensorTemperature();
//Serial1.println(tempSensor);
} while (tempAPI == -100 || tempSensor == -100);
diferenca = abs(tempAPI - tempSensor);
if (diferenca <= CERTO) {
ThingSpeak.setStatus("Tudo Certo!!");
digitalWrite(vermelho, LOW);
digitalWrite(amarelo, LOW);
digitalWrite(verde, HIGH);
} else if (diferenca > CERTO && diferenca <= ATENCAO) {
ThingSpeak.setStatus("Atencao!!");
digitalWrite(vermelho, LOW);
digitalWrite(amarelo, HIGH);
digitalWrite(verde, LOW);
} else if (diferenca > ALARME) {
ThingSpeak.setStatus("ALARME!!");
digitalWrite(vermelho, HIGH);
digitalWrite(amarelo, LOW);
digitalWrite(verde, LOW);
}
//Atualizando o ThinkSpeak
Serial1.print("Enviando Dados: ");
updateThingSpeak(tempSensor, tempAPI, diferenca);
delay(15000);//esperando 15s para realizar uma nova escrita
}
float getSensorTemperature() {
sensors_event_t event;
dht.temperature().getEvent(&event);
float temperatura = -100;
// Para cada parametro ele tenta realizar a leitura, caso nao consiga ele da erro
if (isnan(event.temperature)) {
Serial1.println(F("Error reading temperature!"));
}
else { // Se a leitura do sensor for com sucesso atualiza a variável
//Serial1.print(F("Temperature: "));
//Serial1.print(event.temperature);
//Serial1.println(F("°C"));
temperatura = (float)event.temperature;
}
return temperatura;
}
float getAPITemperature(){
String resultado = httpGETRequest(apiURL);
// Serial1.println(resultado);
// Serial1.println();
JSONVar myObject = JSON.parse(resultado);
if (JSON.typeof(myObject) == "undefined") {
Serial.println("Parsing input failed!");
return -100;
}
Serial1.print("Temperatura em ");
Serial1.print(myObject["name"]);
Serial1.print(" eh de ");
Serial1.print(myObject["main"]["temp"]);
Serial1.println(" °C");
return JSON.stringify(myObject["main"]["temp"]).toFloat();
}
String httpGETRequest(const char* serverName) {
HTTPClient http;
// Your IP address with path or Domain name with URL path
http.begin(serverName);
// Send HTTP POST request
int httpResponseCode = http.GET();
String payload = "{}";
if (httpResponseCode > 0) {
Serial1.print("Codigo HTTP de resposta: ");
Serial1.println(httpResponseCode);
payload = http.getString();
}
else {
Serial1.print("Error code: ");
Serial1.println(httpResponseCode);
}
// Free resources
http.end();
return payload;
}
void updateThingSpeak(float valor1, float valor2, float valor3){
ThingSpeak.setField(1, valor1);
ThingSpeak.setField(2, valor2);
ThingSpeak.setField(3, valor3);
// Serial1.print("Enviando dados para o ThingSpeak:\n\tTemperatura: ");
// Serial1.println(valor);
int x = ThingSpeak.writeFields(SECRET_CH_ID_COUNTER, SECRET_WRITE_APIKEY);
if(x == 200){
Serial1.println("Canal atualizado com sucesso.");
}
else{
Serial1.println("Houve um problema ao atualizar o canal. Codigo de erro HTTP " + String(x));
}
}