// Versión SOLO para Wokwi - Gateway sin ESP-NOW
// Para probar únicamente WiFi y formato ThingSpeak
#include <WiFi.h>
#include <HTTPClient.h>
// Configuración WiFi (usar credenciales de prueba para Wokwi)
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// ThingSpeak (usar API key de prueba)
const char* server = "http://api.thingspeak.com/update";
//String apiKey = "GMWHMVIP3H4LAU3R";// INA
String apiKey = "JD4HPVEET6PXBEFL";// yahoo
// Datos simulados de nodos
float nodeTemps[3] = {22.5, 24.1, 21.8};
float nodeHums[3] = {55.2, 58.7, 52.3};
int activeNodes = 3;
unsigned long lastSend = 0;
const long sendInterval = 15000; // Enviar cada 15 segundos
void setup() {
Serial.begin(115200);
Serial.println("=== Simulación Gateway en Wokwi ===");
// Conectar a WiFi
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.print("Conectando a WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi conectado");
Serial.print("IP: ");
Serial.println(WiFi.localIP());
Serial.println("ESP-NOW deshabilitado para Wokwi");
Serial.println("Usando datos simulados de nodos");
Serial.println();
}
void loop() {
// Simular recepción de datos cada 8 segundos
if (millis() % 8000 < 100) {
simulateNodeData();
}
// Enviar datos a ThingSpeak cada intervalo
if (millis() - lastSend >= sendInterval) {
sendToThingSpeak();
lastSend = millis();
}
delay(100);
}
void simulateNodeData() {
// Simular datos cambiantes de nodos
for (int i = 0; i < 3; i++) {
nodeTemps[i] += (random(-50, 50) / 100.0);
nodeHums[i] += (random(-100, 100) / 100.0);
}
Serial.println("--- Datos simulados recibidos ---");
for (int i = 0; i < 3; i++) {
Serial.print("Nodo ");
Serial.print(i);
Serial.print(": ");
Serial.print(nodeTemps[i]);
Serial.print("°C, ");
Serial.print(nodeHums[i]);
Serial.println("%");
}
Serial.println();
}
void sendToThingSpeak() {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
// Calcular promedios
float avgTemp = 0;
float avgHum = 0;
for (int i = 0; i < activeNodes; i++) {
avgTemp += nodeTemps[i];
avgHum += nodeHums[i];
}
avgTemp /= activeNodes;
avgHum /= activeNodes;
// Construir URL con datos
String url = String(server) + "?api_key=" + apiKey;
url += "&field1=" + String(avgTemp);
url += "&field2=" + String(avgHum);
url += "&field3=" + String(activeNodes);
url += "&field4=" + String(nodeTemps[0]);
url += "&field5=" + String(nodeTemps[1]);
url += "&field6=" + String(nodeTemps[2]);
Serial.println("--- Enviando a ThingSpeak ---");
Serial.println("URL: " + url);
http.begin(url);
int httpCode = http.GET();
if (httpCode > 0) {
Serial.print("Código HTTP: ");
Serial.println(httpCode);
String payload = http.getString();
Serial.println("Respuesta: " + payload);
} else {
Serial.print("Error en petición: ");
Serial.println(http.errorToString(httpCode));
}
http.end();
Serial.println();
} else {
Serial.println("WiFi desconectado");
}
}