from machine import Pin, I2C, time_pulse_us
from time import sleep
from ds1307 import DS1307 # Asegúrate de tener la librería DS1307 en tu sistema
from ssd1306 import SSD1306_I2C # Asegúrate de tener la librería SSD1306
import lcd # Asegúrate de tener la librería LCD instalada
# Configuración de pines para sensores ultrasónicos
TRIG_ENTRADA = Pin(2, Pin.OUT)
ECHO_ENTRADA = Pin(3, Pin.IN)
TRIG_SALIDA = Pin(4, Pin.OUT)
ECHO_SALIDA = Pin(5, Pin.IN)
TRIG_ENTRADA_2 = Pin(6, Pin.OUT)
ECHO_ENTRADA_2 = Pin(7, Pin.IN)
TRIG_SALIDA_2 = Pin(8, Pin.OUT)
ECHO_SALIDA_2 = Pin(9, Pin.IN)
# Configuración del I2C para el RTC y la pantalla OLED
i2c_rtc = I2C(1, sda=Pin(10), scl=Pin(11), freq=400000) # RTC DS1307
rtc = DS1307(i2c_rtc) # Inicializar el RTC DS1307
i2c_oled = I2C(0, sda=Pin(0), scl=Pin(1), freq=400000) # Pantalla OLED
oled = SSD1306_I2C(128, 64, i2c_oled) # Inicializar pantalla OLED 128x64
# Configuración de la pantalla LCD1602 (conexión paralela)
rs = Pin(14, Pin.OUT)
en = Pin(15, Pin.OUT)
d4 = Pin(16, Pin.OUT)
d5 = Pin(17, Pin.OUT)
d6 = Pin(18, Pin.OUT)
d7 = Pin(19, Pin.OUT)
lcd = lcd.LCD(rs, en, d4, d5, d6, d7)
# Variables globales
contador_personas = 0
MAX_PERSONAS = 10 # Establecer el máximo de personas
# Función para medir la distancia con los sensores ultrasónicos
def medir_distancia(TRIG, ECHO):
TRIG.low()
sleep(0.02)
TRIG.high()
sleep(0.00001)
TRIG.low()
duracion = time_pulse_us(ECHO, 1)
distancia = (duracion * 0.0343) / 2
return distancia
# Función para mostrar la hora y fecha actual en formato legible
def obtener_fecha_hora():
hora_actual = rtc.datetime()
year, month, day, weekday, hour, minute, second, subsecond = hora_actual
return f"{day:02}/{month:02}/{year} {hour:02}:{minute:02}:{second:02}"
# Función para actualizar la pantalla OLED
def actualizar_oled():
oled.fill(0) # Limpiar la pantalla
oled.text("Contador Personas", 0, 0)
oled.text(f"Personas: {contador_personas}", 0, 20)
oled.text("Hora:", 0, 40)
oled.text(obtener_fecha_hora().split(" ")[1], 0, 50) # Solo la hora
oled.show()
# Función para actualizar la pantalla LCD
def actualizar_lcd():
lcd.clear() # Limpiar la pantalla LCD
lcd.move_to(0, 0)
lcd.putstr(f"Personas: {contador_personas}")
# Programa principal
def main():
global contador_personas
print("Sistema iniciado")
print("Esperando detección de personas...")
while True:
# Sensor de entrada 1
distancia_entrada = medir_distancia(TRIG_ENTRADA, ECHO_ENTRADA)
if 0 < distancia_entrada < 100:
if contador_personas < MAX_PERSONAS:
contador_personas += 1
print(f"{obtener_fecha_hora()} - >>> Persona detectada entrando (sensor 1) - Contador actual: {contador_personas}")
else:
print(f"{obtener_fecha_hora()} - !!! Advertencia: Límite de personas alcanzado.")
sleep(1)
# Sensor de salida 1
distancia_salida = medir_distancia(TRIG_SALIDA, ECHO_SALIDA)
if 0 < distancia_salida < 100:
if contador_personas > 0:
contador_personas -= 1
print(f"{obtener_fecha_hora()} - <<< Persona detectada saliendo (sensor 1) - Contador actual: {contador_personas}")
else:
print(f"{obtener_fecha_hora()} - !!! Advertencia: Sensor 1 de salida detectó algo, pero no hay personas registradas.")
sleep(1)
# Sensor de entrada 2
distancia_entrada_2 = medir_distancia(TRIG_ENTRADA_2, ECHO_ENTRADA_2)
if 0 < distancia_entrada_2 < 100:
if contador_personas < MAX_PERSONAS:
contador_personas += 1
print(f"{obtener_fecha_hora()} - >>> Persona detectada entrando (sensor 2) - Contador actual: {contador_personas}")
else:
print(f"{obtener_fecha_hora()} - !!! Advertencia: Límite de personas alcanzado.")
sleep(1)
# Sensor de salida 2
distancia_salida_2 = medir_distancia(TRIG_SALIDA_2, ECHO_SALIDA_2)
if 0 < distancia_salida_2 < 100:
if contador_personas > 0:
contador_personas -= 1
print(f"{obtener_fecha_hora()} - <<< Persona detectada saliendo (sensor 2) - Contador actual: {contador_personas}")
else:
print(f"{obtener_fecha_hora()} - !!! Advertencia: Sensor 2 de salida detectó algo, pero no hay personas registradas.")
sleep(1)
# Actualizar las pantallas OLED y LCD
actualizar_oled()
actualizar_lcd()
sleep(0.1)
if __name__ == "__main__":
main()