from machine import Pin, I2C, time_pulse_us
from time import sleep
from ssd1306 import SSD1306_I2C
from ds1307 import DS1307
# Configuración de pines para la OLED y RTC
i2c = I2C(0, sda=Pin(0), scl=Pin(1), freq=400000) # I2C para OLED
rtc_i2c = I2C(1, sda=Pin(10), scl=Pin(11), freq=400000) # I2C para DS1307
oled = SSD1306_I2C(128, 64, i2c)
rtc = DS1307(rtc_i2c)
# 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)
# Variables globales
contador_personas = 0
# Función para medir distancia
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
# Actualización de la pantalla OLED
def oled_update():
oled.fill(0) # Limpiar pantalla
hora_actual = rtc.datetime() # Leer hora del RTC
hora = "{:02}:{:02}:{:02}".format(hora_actual[4], hora_actual[5], hora_actual[6]) # Formato de hora
oled.text("Reloj: " + hora, 0, 0)
oled.text("Personas:", 0, 20)
oled.text(str(contador_personas), 70, 20)
oled.show()
# Programa principal
def main():
global contador_personas
print("Sistema iniciado")
print("Esperando detección de personas...")
oled_update()
while True:
# Sensor de entrada 1
distancia_entrada = medir_distancia(TRIG_ENTRADA, ECHO_ENTRADA)
if 0 < distancia_entrada < 100:
contador_personas += 1
print(">>> Persona detectada entrando (sensor 1)")
print(f"Contador actual: {contador_personas}")
oled_update()
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("<<< Persona detectada saliendo (sensor 1)")
print(f"Contador actual: {contador_personas}")
oled_update()
else:
print("!!! Advertencia: No hay más personas, pero el sensor de salida detectó algo.")
sleep(1)
# Sensor de entrada 2
distancia_entrada_2 = medir_distancia(TRIG_ENTRADA_2, ECHO_ENTRADA_2)
if 0 < distancia_entrada_2 < 100:
contador_personas += 1
print(">>> Persona detectada entrando (sensor 2)")
print(f"Contador actual: {contador_personas}")
oled_update()
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("<<< Persona detectada saliendo (sensor 2)")
print(f"Contador actual: {contador_personas}")
oled_update()
else:
print("!!! Advertencia: No hay más personas, pero el sensor de salida detectó algo.")
sleep(1)
# Actualizar OLED periódicamente
oled_update()
sleep(1)
if __name__ == "__main__":
main()