#include <WiFi.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "DHTesp.h"
#include "ThingSpeak.h"
LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27, 16, 2);
DHTesp dhtSensor;
WiFiClient client;
#define NTP_SERVER "pool.ntp.org"
#define UTC_OFFSET -5
#define UTC_OFFSET_DST 0
const int DHT_PIN = 15;
const int LED_PIN = 13;
const int ALARM_PIN = 12; // Pin para la alarma
const char* WIFI_NAME = "Wokwi-GUEST";
const char* WIFI_PASSWORD = "";
const int myChannelNumber = 2288829 ;
const char* myApiKey = "E7Y5UCMRQW84KYZY";
const char* server = "api.thingspeak.com";
void spinner() {
static int8_t counter = 0;
const char* glyphs = "\xa1\xa5\xdb";
LCD.setCursor(15, 1);
LCD.print(glyphs[counter++]);
if (counter == strlen(glyphs)) {
counter = 0;
}
}
void printLocalTime() {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
LCD.setCursor(0, 1);
LCD.println("Connection Err");
return;
}
LCD.setCursor(8, 0);
LCD.println(&timeinfo, "%H:%M:%S");
LCD.setCursor(0, 1);
LCD.println(&timeinfo, "%d/%m/%Y %Z");
}
void setup() {
Serial.begin(115200);
LCD.init();
LCD.backlight();
LCD.setCursor(0, 0);
LCD.print("Connecting to ");
LCD.setCursor(0, 1);
LCD.print("WiFi ");
WiFi.begin(WIFI_NAME, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(250);
spinner();
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
pinMode(LED_PIN, OUTPUT);
pinMode(ALARM_PIN, OUTPUT);
ledcSetup(0, 3000, 8); // Canal 0, frecuencia de 3000 Hz, resolución de 8 bits
ledcAttachPin(ALARM_PIN, 0); // Asocia el canal 0 con el pin de alarma// Configura el pin de la alarma como salida
WiFi.mode(WIFI_STA);
ThingSpeak.begin(client);
LCD.clear();
LCD.setCursor(0, 0);
LCD.println("Online");
LCD.setCursor(0, 1);
LCD.println("Updating time...");
configTime(UTC_OFFSET * 3600, UTC_OFFSET_DST, NTP_SERVER);
}
void loop() {
TempAndHumidity data = dhtSensor.getTempAndHumidity();
// Comprueba si la temperatura excede el valor máximo (por ejemplo, 35°C)
// Comprueba si la humedad está fuera del rango deseado (por ejemplo, <40% o >70%)
if (data.temperature > 35 || data.humidity < 40 || data.humidity > 70) {
ThingSpeak.setField(1, data.temperature);
ThingSpeak.setField(2, data.humidity);
// Enciende el LED y genera el tono cuando cualquiera de las condiciones se cumple
digitalWrite(LED_PIN, HIGH);
digitalWrite(ALARM_PIN, HIGH);
ledcWrite(0, 128);
} else {
// Si no se cumple ninguna condición, establece los campos 1 y 2 en 0
ThingSpeak.setField(1, 0);
ThingSpeak.setField(2, 0);
// Apaga la alarma, el LED y el tono
digitalWrite(LED_PIN, LOW);
digitalWrite(ALARM_PIN, LOW);
ledcWrite(0, 0);
}
// Envía los datos solo si se cumple alguna de las condiciones anteriores
if (data.temperature > 35 || data.humidity < 40 || data.humidity > 70) {
int x = ThingSpeak.writeFields(myChannelNumber, myApiKey);
Serial.println("Temp: " + String(data.temperature, 2) + "°C");
Serial.println("Humidity: " + String(data.humidity, 1) + "%");
if (x == 200) {
Serial.println("Data pushed successfully");
} else {
Serial.println("Push error" + String(x));
}
} else {
// Si no se cumple ninguna condición, no se envían datos
Serial.println("Conditions not met, data not sent");
}
Serial.println("---");
printLocalTime();
delay(5000);
}