#include <SPI.h>
#include <Ethernet.h>
#include <ThingSpeak.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Configuración de Red
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(10, 10, 0, 2);
EthernetClient client;
// Configuración ThingSpeak
unsigned long myChannelNumber = 3337611;
const char * myWriteAPIKey = "F2FPP3HASQI4T3M3";
// Hardware
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int PIR_PIN = 2;
const int LED_PIN = 3;
const int TRIG_PIN = 12;
const int ECHO_PIN = 13;
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
pinMode(PIR_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
Ethernet.begin(mac, ip);
ThingSpeak.begin(client); // Iniciar ThingSpeak
lcd.print("Conectando IoT..");
delay(1500);
lcd.clear();
}
void loop() {
// 1. Leer Sensores
int presencia = digitalRead(PIR_PIN);
digitalWrite(LED_PIN, presencia);
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duracion = pulseIn(ECHO_PIN, HIGH);
float distancia = duracion * 0.034 / 2;
float altura_max = 400.0;
if (distancia > altura_max) distancia = altura_max;
float litros = 10000.0 * (1.0 - (distancia / altura_max));
// 2. Mostrar en Pantalla local (I2C)
lcd.setCursor(0, 0);
lcd.print("Nivel: ");
lcd.print((int)litros);
lcd.print(" L ");
lcd.setCursor(0, 1);
lcd.print(presencia ? "Luz: ENCENDIDA " : "Luz: APAGADA ");
// Enviar a ThingSpeak (Cada 20 segundos para estar seguros)
static unsigned long lastTime = 0;
if (millis() - lastTime > 20000) {
if (client.connect("api.thingspeak.com", 80)) {
// Construir la cadena de datos
String data = "field1=" + String(litros) + "&field2=" + String(presencia);
client.print("POST /update HTTP/1.1\n");
client.print("Host: api.thingspeak.com\n");
client.print("Connection: close\n");
client.print("X-THINGSPEAKAPIKEY: F2FPP3HASQI4T3M3\n"); // Tu llave de escritura
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: " + String(data.length()) + "\n\n");
client.print(data);
Serial.println("¡Datos enviados con éxito!");
client.stop();
} else {
Serial.println("Error de conexión al servidor");
}
lastTime = millis();
}
delay(200);
}