#include <WiFi.h>
#include "time.h"
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>
#include "ThingSpeak.h"
// --- Configuración WiFi ---
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// --- Configuración ThingSpeak ---
unsigned long myChannelNumber = 3281865; // REEMPLAZAR con tu ID de canal
const char * myWriteAPIKey = "9T1WNJOVD8YSN4U8"; // REEMPLAZAR con tu API Key
// --- Configuración NTP ---
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = -18000;
const int daylightOffset_sec = 0;
// --- Hardware ---
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
#define BUZZER_PIN 5
#define BTN_HORA 19
#define BTN_MODO 18
#define BTN_MIN 17
// --- Variables Globales ---
int alHoras = 7, alMinutos = 0;
bool modoAlarma = false;
float temperatura, humedad;
unsigned long ultimaActualizacionTS = 0;
const unsigned long intervaloTS = 20000; // ThingSpeak acepta datos cada 15-20 seg
WiFiClient client;
void setup() {
Serial.begin(115200);
pinMode(BTN_HORA, INPUT_PULLUP);
pinMode(BTN_MODO, INPUT_PULLUP);
pinMode(BTN_MIN, INPUT_PULLUP);
pinMode(BUZZER_PIN, OUTPUT);
dht.begin();
if(!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { for(;;); }
oled.clearDisplay();
oled.setTextSize(1);
oled.setTextColor(WHITE);
oled.setCursor(0,0);
oled.print("Iniciando...");
oled.display();
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
ThingSpeak.begin(client);
oled.clearDisplay();
}
void loop() {
struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
Serial.println("Error al obtener la hora");
}
// --- Lectura de Sensores ---
temperatura = dht.readTemperature();
humedad = dht.readHumidity();
// --- Lógica del Buzzer (Alarma > 40 grados) ---
if (temperatura >= 40.0) {
digitalWrite(BUZZER_PIN, HIGH);
} else {
digitalWrite(BUZZER_PIN, LOW);
}
// --- Lógica de Botones ---
if (digitalRead(BTN_MODO) == LOW) {
modoAlarma = !modoAlarma;
delay(250);
while(digitalRead(BTN_MODO) == LOW);
}
if (modoAlarma) {
if (digitalRead(BTN_HORA) == LOW) { alHoras = (alHoras + 1) % 24; delay(200); }
if (digitalRead(BTN_MIN) == LOW) { alMinutos = (alMinutos + 1) % 60; delay(200); }
}
// --- Enviar a ThingSpeak ---
if (millis() - ultimaActualizacionTS > intervaloTS) {
ThingSpeak.setField(1, temperatura);
ThingSpeak.setField(2, humedad);
int x = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
if(x == 200) Serial.println("Canal actualizado en ThingSpeak");
ultimaActualizacionTS = millis();
}
// --- Interfaz OLED ---
oled.clearDisplay();
oled.setTextSize(1);
oled.setCursor(0,0);
if(modoAlarma) {
oled.print("CONFIG. ALARMA");
oled.setTextSize(3);
oled.setCursor(15, 25);
if(alHoras < 10) oled.print("0");
oled.print(alHoras); oled.print(":");
if(alMinutos < 10) oled.print("0");
oled.print(alMinutos);
} else {
oled.print("HORA ACTUAL");
oled.setTextSize(3);
oled.setCursor(10, 15);
if(timeinfo.tm_hour < 10) oled.print("0");
oled.print(timeinfo.tm_hour); oled.print(":");
if(timeinfo.tm_min < 10) oled.print("0");
oled.print(timeinfo.tm_min);
oled.setTextSize(1);
oled.setCursor(105, 30);
if(timeinfo.tm_sec < 10) oled.print("0");
oled.print(timeinfo.tm_sec);
// Datos en la parte inferior
oled.setCursor(0, 50);
oled.print("T:"); oled.print(temperatura, 1); oled.print("C ");
oled.print("H:"); oled.print(humedad, 0); oled.print("%");
}
oled.display();
delay(100);
}