#include <WiFi.h>
#include "ThingSpeak.h"
#include "secrets.h"
#include <DHTesp.h>
#include <tuple>
#define buzzer 2
#define red 12
#define green 13
#define yellow 14
#define white 5
#define DHT_PIN 15
unsigned long lastChangeTime = 0; // Milisegundos desde el último cambio
unsigned long myChannelNumber = SECRET_CH_ID;
const char * myWriteAPIKey = SECRET_WRITE_APIKEY;
char ssid[] = SECRET_SSID; // your network SSID (name)
char pass[] = SECRET_PASS; // your network password
WiFiClient client;
DHTesp dhtSensor;
void sendData (int temp, int hum) {
ThingSpeak.setField(1, temp);
ThingSpeak.setField(2, hum);
int httpCode = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
if (httpCode == 200) {
Serial.println("Channel write successful.");
}
else {
Serial.println("Problem writing to channel. HTTP error code " + String(httpCode));
}
}
void sendCritico (int temp, int hum) {
ThingSpeak.setField(1, temp);
ThingSpeak.setField(2, hum);
int httpCode = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
if (httpCode == 200) {
Serial.println("Channel write successful.");
}
else {
Serial.println("Problem writing to channel. HTTP error code " + String(httpCode));
}
}
std::tuple<float, float> handleResponse()
{
TempAndHumidity data = dhtSensor.getTempAndHumidity();
float temperature = (data.temperature);
float humidity = (data.humidity);
return std::make_tuple(temperature, humidity);
}
//Initialize the LCD display
void setup() {
// Debug console
Serial.begin(115200);
pinMode(buzzer, OUTPUT);
pinMode(green, OUTPUT);
pinMode(red, OUTPUT);
pinMode(yellow, OUTPUT);
pinMode(white, OUTPUT);
delay(100);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22); // 11 es físico
WiFi.mode(WIFI_STA);
ThingSpeak.begin(client);
lastChangeTime = millis(); // Reiniciar el tiempo del último cambio
}
void loop() {
int interval = 120000;
TempAndHumidity data = dhtSensor.getTempAndHumidity();
float humidity = (data.humidity);
float temperature = (data.temperature);
int value1 = temperature;
int value2 = humidity;
Serial.println(value1);
value1 = map(value1, 0, 4095, 0, 100);
//4095 = 100
//2047 = 50
Serial.println("Valor del Map1: ");
Serial.println(value1);
Serial.println(value2);
value2 = map(value2, 0, 4095, 0, 100);
//4095 = 100
//2047 = 50
Serial.println("Valor del Map2: ");
Serial.println(value2);
//Humidity conditions
if (value2 < 40){
digitalWrite(white, HIGH);
}
if (value2 >= 40 && value2 <= 70){
digitalWrite(white, HIGH);
delay(2000);
digitalWrite(white, LOW);
delay(2000);
digitalWrite(white, HIGH);
delay(2000);
}
if (value2 > 70){
digitalWrite(white, LOW);
}
//Temp conditions
if (value1 <= 28){
digitalWrite(red, LOW);
digitalWrite(green, HIGH);
digitalWrite(yellow, LOW);
}
if (value1 > 28 && value1 <= 35){
digitalWrite(red, HIGH);
digitalWrite(green, HIGH);
digitalWrite(yellow, LOW);
}
if (value1 > 35){
digitalWrite(red, HIGH);
digitalWrite(green, LOW);
digitalWrite(yellow, LOW);
}
//Ahorro Energético
if (millis() - lastChangeTime > interval) {
digitalWrite(red, LOW);
digitalWrite(green, LOW);
digitalWrite(yellow, LOW);
digitalWrite(white, LOW);
} // Verificar tiempo transcurrido para ahorro
//Modo Crítico
if (value2 < 20 && value1 > 40){
sendCritico(temp,hum);
digitalWrite(buzzer, HIGH);
tone(buzzer, 100);
digitalWrite(white, HIGH);
digitalWrite(red, HIGH);
delay(1000);
digitalWrite(white, LOW);
digitalWrite(red, LOW);
delay(1000);
digitalWrite(white, HIGH);
digitalWrite(red, HIGH);
delay(1000);
} else{
digitalWrite(buzzer, LOW);
}
//Thingspeak
// Connect or reconnect to WiFi
if (WiFi.status() != WL_CONNECTED) {
Serial.print("Attempting to connect to SSID: ");
Serial.println(SECRET_SSID);
while (WiFi.status() != WL_CONNECTED) {
WiFi.begin(ssid, pass); // Connect to WPA/WPA2 network. Change this line if using open or WEP network
Serial.print(".");
delay(5000);
}
Serial.println("\nConnected.");
}
auto [temp, hum] = handleResponse();
sendData(temp,hum);
}