/* NovaGuard Firmware V1 ESP32 + DHT22 + MQ2 + Sensor de agua + Buzzer + HTTP Worker/Firestore Uso: - Sensor temperatura/humedad: DHT22 - Sensor gas/humo: MQ2 en entrada analógica - Sensor agua: analógico o módulo rain/water level - Buzzer local para alarma - Envío JSON a Cloudflare Worker / backend Ajustar: - WIFI_SSID / WIFI_PASS - ENDPOINT - CLIENTE_ID / EQUIPO_ID - Umbrales luego de pruebas reales */ #include #include #include #define PIN_DHT 4 #define PIN_MQ2 34 #define PIN_AGUA 32 #define PIN_BUZZER 25 #define DHTTYPE DHT22 DHT dht(PIN_DHT, DHTTYPE); const char* WIFI_SSID = "TU_WIFI"; const char* WIFI_PASS = "TU_PASSWORD"; const char* ENDPOINT = "https://tu-worker-novaguard.workers.dev/ingest"; const char* CLIENTE_ID = "cliente_demo"; const char* EQUIPO_ID = "esp32_demo_001"; const char* UBICACION = "Sala tecnica"; const int UMBRAL_MQ2 = 1800; const int UMBRAL_AGUA = 1600; unsigned long lastSend = 0; const unsigned long SEND_INTERVAL = 15000; void conectarWiFi(){ if(WiFi.status() == WL_CONNECTED) return; Serial.print("Conectando WiFi"); WiFi.begin(WIFI_SSID, WIFI_PASS); unsigned long start = millis(); while(WiFi.status() != WL_CONNECTED && millis() - start < 15000){ delay(500); Serial.print("."); } Serial.println(); if(WiFi.status() == WL_CONNECTED){ Serial.print("WiFi OK · IP: "); Serial.println(WiFi.localIP()); }else{ Serial.println("WiFi NO conectado"); } } void enviarJSON(String payload){ if(WiFi.status() != WL_CONNECTED){ conectarWiFi(); if(WiFi.status() != WL_CONNECTED) return; } HTTPClient http; http.begin(ENDPOINT); http.addHeader("Content-Type", "application/json"); int code = http.POST(payload); Serial.print("HTTP: "); Serial.println(code); if(code > 0){ Serial.println(http.getString()); } http.end(); } void setup(){ Serial.begin(115200); delay(800); pinMode(PIN_BUZZER, OUTPUT); digitalWrite(PIN_BUZZER, LOW); dht.begin(); conectarWiFi(); Serial.println("NovaGuard ESP32 DHT22 + MQ2 + Agua listo"); } void loop(){ float temp = dht.readTemperature(); float hum = dht.readHumidity(); int mq2 = analogRead(PIN_MQ2); int agua = analogRead(PIN_AGUA); bool alarmaGas = mq2 > UMBRAL_MQ2; bool alarmaAgua = agua > UMBRAL_AGUA; bool alarma = alarmaGas || alarmaAgua; digitalWrite(PIN_BUZZER, alarma ? HIGH : LOW); String payload = "{"; payload += "\"cliente_id\":\"" + String(CLIENTE_ID) + "\","; payload += "\"equipo_id\":\"" + String(EQUIPO_ID) + "\","; payload += "\"ubicacion\":\"" + String(UBICACION) + "\","; payload += "\"tipo\":\"DHT22_MQ2_AGUA\","; payload += "\"temp\":" + String(temp) + ","; payload += "\"hum\":" + String(hum) + ","; payload += "\"mq2\":" + String(mq2) + ","; payload += "\"agua\":" + String(agua) + ","; payload += "\"alarma_gas\":" + String(alarmaGas ? "true" : "false") + ","; payload += "\"alarma_agua\":" + String(alarmaAgua ? "true" : "false") + ","; payload += "\"alarma\":" + String(alarma ? "true" : "false"); payload += "}"; Serial.println(payload); if(millis() - lastSend > SEND_INTERVAL){ lastSend = millis(); enviarJSON(payload); } delay(1000); }