#include <WiFi.h>
#include "ThingSpeak.h"
// Pines
#define BTN_ENTRADA 15
#define BTN_SALIDA 4
#define BUZZER 18
// WiFi
const char* WIFI_NAME = "Wokwi-GUEST";
const char* WIFI_PASSWORD = "";
// ThingSpeak
const int myChannelNumber = 3328765;
const char* myApiKey = "UHHADB31SOYIN6E8";
WiFiClient client;
// Variables
int contador = 0;
int totalEntradas = 0;
int totalSalidas = 0;
// Estados
int estadoEntrada = HIGH;
int estadoSalida = HIGH;
int ultimoEstadoEntrada = HIGH;
int ultimoEstadoSalida = HIGH;
// Tiempos debounce
unsigned long ultimoCambioEntrada = 0;
unsigned long ultimoCambioSalida = 0;
int debounceDelay = 50; // 50 ms
// ThingSpeak
unsigned long ultimoEnvio = 0;
int intervaloEnvio = 15000;
void setup() {
Serial.begin(115200);
pinMode(BTN_ENTRADA, INPUT_PULLUP);
pinMode(BTN_SALIDA, INPUT_PULLUP);
pinMode(BUZZER, OUTPUT);
WiFi.begin(WIFI_NAME, WIFI_PASSWORD);
Serial.print("Conectando a WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConectado!");
ThingSpeak.begin(client);
}
void loop() {
unsigned long tiempoActual = millis();
int lecturaEntrada = digitalRead(BTN_ENTRADA);
int lecturaSalida = digitalRead(BTN_SALIDA);
// ===== DEBOUNCE ENTRADA =====
if (lecturaEntrada != ultimoEstadoEntrada) {
ultimoCambioEntrada = tiempoActual;
}
if ((tiempoActual - ultimoCambioEntrada) > debounceDelay) {
if (lecturaEntrada != estadoEntrada) {
estadoEntrada = lecturaEntrada;
if (estadoEntrada == LOW) {
contador++;
totalEntradas++;
Serial.println("Camion ENTRANDO");
Serial.println("Total dentro: " + String(contador));
tone(BUZZER, 1000);
delay(150);
noTone(BUZZER);
}
}
}
ultimoEstadoEntrada = lecturaEntrada;
// ===== DEBOUNCE SALIDA =====
if (lecturaSalida != ultimoEstadoSalida) {
ultimoCambioSalida = tiempoActual;
}
if ((tiempoActual - ultimoCambioSalida) > debounceDelay) {
if (lecturaSalida != estadoSalida) {
estadoSalida = lecturaSalida;
if (estadoSalida == LOW) {
if (contador > 0) {
contador--;
totalSalidas++;
Serial.println("Camion SALIENDO");
} else {
Serial.println("No hay camiones para sacar");
}
Serial.println("Total dentro: " + String(contador));
tone(BUZZER, 500);
delay(150);
noTone(BUZZER);
}
}
}
ultimoEstadoSalida = lecturaSalida;
// ===== ENVÍO =====
if (tiempoActual - ultimoEnvio > intervaloEnvio) {
ThingSpeak.setField(1, totalEntradas);
ThingSpeak.setField(2, totalSalidas);
ThingSpeak.setField(3, contador);
int x = ThingSpeak.writeFields(myChannelNumber, myApiKey);
if (x == 200) {
Serial.println("Datos enviados a ThingSpeak");
} else {
Serial.println("Error envio: " + String(x));
}
ultimoEnvio = tiempoActual;
}
delay(10);
}