#include <Arduino.h>
#include <TM1637Display.h>
#include <WiFi.h>
#include <HTTPClient.h>
// =======================
// MÓDULO: Configuración WiFi
// =======================
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* serverName = "http://127.0.0.1:8000/api/semaforo/";
// =======================
// MÓDULO: Definición de pines
// =======================
#define BTN 6 // Botón peatonal
// Pantallas
#define CLK1 32
#define DIO1 33
TM1637Display displayAlbania(CLK1, DIO1);
#define CLK2 0
#define DIO2 16
TM1637Display displayUribia(CLK2, DIO2);
// Sensores HC-SR04
#define TRIG_URIBIA 14
#define ECHO_URIBIA 27
#define TRIG_ALBANIA 13
#define ECHO_ALBANIA 12
// Semáforos principales
int rojo_principal1 = 2;
int amarillo_principal1 = 4;
int verde_principal1 = 5;
int rojo_principal2 = 21;
int amarillo_principal2 = 19;
int verde_principal2 = 18;
// Semáforos secundarios
int rojo_uribia = 26;
int amarillo_uribia = 15;
int verde_uribia = 17;
int rojo_albania = 22;
int amarillo_albania = 23;
int verde_albania = 25;
// =======================
// MÓDULO: Variables globales
// =======================
long distancia_uribia;
long distancia_albania;
// =======================
// MÓDULO: Sensores
// =======================
long medirDistancia(int trigPin, int echoPin) {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duracion = pulseIn(echoPin, HIGH, 20000);
long distancia = duracion * 0.034 / 2;
return distancia;
}
// =======================
// MÓDULO: Setup inicial
// =======================
void setup() {
pinMode(BTN, INPUT_PULLUP);
// Configuración de semáforos principales
pinMode(rojo_principal1, OUTPUT);
pinMode(amarillo_principal1, OUTPUT);
pinMode(verde_principal1, OUTPUT);
pinMode(rojo_principal2, OUTPUT);
pinMode(amarillo_principal2, OUTPUT);
pinMode(verde_principal2, OUTPUT);
// Configuración de semáforos secundarios
pinMode(rojo_uribia, OUTPUT);
pinMode(amarillo_uribia, OUTPUT);
pinMode(verde_uribia, OUTPUT);
pinMode(rojo_albania, OUTPUT);
pinMode(amarillo_albania, OUTPUT);
pinMode(verde_albania, OUTPUT);
// Configuración de sensores
pinMode(TRIG_URIBIA, OUTPUT);
pinMode(ECHO_URIBIA, INPUT);
pinMode(TRIG_ALBANIA, OUTPUT);
pinMode(ECHO_ALBANIA, INPUT);
// Configuración de pantallas
displayAlbania.setBrightness(0x0f);
displayUribia.setBrightness(0x0f);
Serial.begin(115200);
// Conexión WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Conectado a WiFi");
// Mensaje inicial
Serial.println("=======================================");
Serial.println(" SISTEMA IoT DE SEMAFORO INTELIGENTE ");
Serial.println(" PARA LA GESTIÓN DEL FLUJO ");
Serial.println(" VEHICULAR - MAICAO ");
Serial.println("=======================================");
}
// =======================
// MÓDULO: Actuadores
// =======================
// Semáforo principal en verde fijo
void verdeFijoPrincipal() {
digitalWrite(verde_principal1, HIGH);
digitalWrite(verde_principal2, HIGH);
digitalWrite(rojo_uribia, HIGH);
digitalWrite(rojo_albania, HIGH);
digitalWrite(amarillo_principal1, LOW);
digitalWrite(amarillo_principal2, LOW);
digitalWrite(amarillo_uribia, LOW);
digitalWrite(amarillo_albania, LOW);
delay(2000);
}
// Ciclo de Uribia con conteo
void cicloUribia() {
digitalWrite(verde_principal1, LOW);
digitalWrite(verde_principal2, LOW);
digitalWrite(amarillo_principal1, HIGH);
digitalWrite(amarillo_principal2, HIGH);
delay(2000);
digitalWrite(amarillo_principal1, LOW);
digitalWrite(amarillo_principal2, LOW);
digitalWrite(rojo_principal1, HIGH);
digitalWrite(rojo_principal2, HIGH);
digitalWrite(rojo_uribia, LOW);
digitalWrite(verde_uribia, HIGH);
for (int t = 10; t >= 0; t--) {
displayUribia.showNumberDec(t, true);
delay(1000);
}
digitalWrite(verde_uribia, LOW);
digitalWrite(rojo_uribia, HIGH);
digitalWrite(rojo_principal1, LOW);
digitalWrite(rojo_principal2, LOW);
}
// Ciclo de Albania con conteo
void cicloAlbania() {
digitalWrite(verde_principal1, LOW);
digitalWrite(verde_principal2, LOW);
digitalWrite(amarillo_principal1, HIGH);
digitalWrite(amarillo_principal2, HIGH);
delay(2000);
digitalWrite(amarillo_principal1, LOW);
digitalWrite(amarillo_principal2, LOW);
digitalWrite(rojo_principal1, HIGH);
digitalWrite(rojo_principal2, HIGH);
digitalWrite(rojo_albania, LOW);
digitalWrite(verde_albania, HIGH);
for (int t = 10; t >= 0; t--) {
displayAlbania.showNumberDec(t, true);
delay(1000);
}
digitalWrite(verde_albania, LOW);
digitalWrite(rojo_albania, HIGH);
digitalWrite(rojo_principal1, LOW);
digitalWrite(rojo_principal2, LOW);
}
// Modo peatonal con conteo
void modoPeatonal() {
digitalWrite(rojo_principal1, HIGH);
digitalWrite(rojo_principal2, HIGH);
digitalWrite(rojo_uribia, HIGH);
digitalWrite(rojo_albania, HIGH);
for (int t = 10; t >= 0; t--) {
displayAlbania.showNumberDec(t, true);
displayUribia.showNumberDec(t, true);
delay(1000);
}
digitalWrite(rojo_principal1, LOW);
digitalWrite(rojo_principal2, LOW);
digitalWrite(rojo_uribia, LOW);
digitalWrite(rojo_albania, LOW);
}
// =======================
// MÓDULO: Loop principal
// =======================
void loop() {
distancia_uribia = medirDistancia(TRIG_URIBIA, ECHO_URIBIA);
distancia_albania = medirDistancia(TRIG_ALBANIA, ECHO_ALBANIA);
if (digitalRead(BTN) == LOW) {
Serial.println("Modo peatonal activado");
modoPeatonal();
}
else if (distancia_albania > 0 && distancia_albania < 100) {
// Apenas se detecta
Serial.print("{\"evento\":\"Vehículo detectado\",\"timestamp\":");
Serial.print(millis());
Serial.println("}");
cicloAlbania();
// Al terminar el ciclo
Serial.print("{\"semaforo\":\"Albania\",\"timestamp\":");
Serial.print(millis());
Serial.println("}");
}
else if (distancia_uribia > 0 && distancia_uribia < 100) {
// Apenas se detecta
Serial.print("{\"evento\":\"Vehículo detectado\",\"timestamp\":");
Serial.print(millis());
Serial.println("}");
cicloUribia();
// Al terminar el ciclo
Serial.print("{\"semaforo\":\"Uribia\",\"timestamp\":");
Serial.print(millis());
Serial.println("}");
}
else {
verdeFijoPrincipal();
}
}
SEMAFORO ALBANIA
SEMAFORO RIOHACHA
SEMAFORO URIBIA
SEMAFORO MAICAO