#include <WiFi.h>
#include <time.h>
// Pines del SRF05
#define TRIG_PIN 5
#define ECHO_PIN 18
// Configuración de tiempo
const unsigned long interval = 20 * 60 * 1000; // 20 minutos en milisegundos
unsigned long previousMillis = 0;
// Configuración Wi-Fi para obtener hora (opcional si deseas NTP)
const char* ssid = "Tu_SSID";
const char* password = "Tu_Contraseña";
// Variables para manejar la hora
struct tm timeinfo;
void setup() {
Serial.begin(115200);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
// Conexión Wi-Fi para sincronizar hora
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConectado a Wi-Fi");
// Configurar reloj RTC vía NTP
configTime(-3 * 3600, 0, "pool.ntp.org"); // UTC-3 para Uruguay
while (!getLocalTime(&timeinfo)) {
Serial.println("Sincronizando tiempo...");
delay(1000);
}
Serial.println("Tiempo sincronizado");
}
float readDistance() {
// Envía un pulso
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// Lee el pulso de retorno
long duration = pulseIn(ECHO_PIN, HIGH);
// Calcula la distancia en cm
float distance = (duration * 0.034) / 2;
return distance;
}
void reportStatus(float distance) {
if (distance <= 9.3) {
Serial.println("Estado: ¡Crítico! Contenedor casi desbordado.");
} else if (distance <= 10.8) {
Serial.println("Estado: ¡Lleno! El contenedor necesita vaciarse.");
} else if (distance <= 18.8) {
Serial.println("Estado: Media carga. Aún hay espacio.");
} else {
Serial.println("Estado: Vacío o casi vacío.");
}
}
bool isInWorkingHours() {
if (!getLocalTime(&timeinfo)) {
Serial.println("No se pudo obtener la hora.");
return false;
}
int currentHour = timeinfo.tm_hour; // Hora actual
return currentHour >= 8 && currentHour <= 23; // Entre 8:00 AM y 11:00 PM
}
void loop() {
unsigned long currentMillis = millis();
if (isInWorkingHours() && (currentMillis - previousMillis >= interval)) {
previousMillis = currentMillis;
float distance = readDistance();
Serial.println("Lectura de distancia: " + String(distance) + " cm");
reportStatus(distance);
}
delay(1000); // Pequeño retraso para evitar consumo excesivo
}