#Integrantes
#Cerrillo Cano Hugo Emmanuel
#Navarro Basurto Gabriela del Goretti
#Saldaña Ramirez Julio Cesar
#Objetivo
#Implementar un sensor ultrasonico y detectar la distancia de un objeto y mostrar el resultado en una pantalla oled
#Asi mismo un sensor PIR que mediante una interrupcion ejecute un bloque de codigo el cual interrumpa el programa y
#muestre un icono que indica que se ha detectado un movimiento,tambien se implementaron 2 zumadores uno activo y uno pasivo
#el cual el objetivo es que uno de los zumbadores detectara con base ah la distancia del objetivo sonara con mas frecuencia
#cuando dicho objeto esta mas cerca y mientras mas se a leje este zonara menos,cuando haya una interupcion el otro zumabdor,
#mandara una melodia con la cual sonara dicha melodia, y asi viceversa cuando haya algun cambio entre el detecto de movimiento
#y el sensor ah distancia.
#Librerias necesarias
from hcsr04 import HCSR04
from time import sleep
import machine
import ssd1306
import hcsr04
import time
from machine import Pin
from machine import PWM
#matriz del logotipo de ITL en hexadecimal
LOGOTIPO = [
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x7f, 0x25, 0xff, 0xdf, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x7f, 0x97, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x7f, 0xd7, 0xf7, 0x9f, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x7f, 0xff, 0x8f, 0x5f, 0xfd, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x7f, 0xff, 0xef, 0x17, 0xbb, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x7f, 0xff, 0xef, 0xbb, 0xe7, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x7f, 0xf0, 0x03, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x7f, 0x83, 0xf0, 0x7f, 0xf3, 0xfe, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x7e, 0x3f, 0xff, 0x1f, 0xf3, 0xfe, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x78, 0xef, 0xff, 0xc7, 0xeb, 0x79, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x73, 0xef, 0xf7, 0xf3, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x67, 0xff, 0xe7, 0xf9, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x4f, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x1f, 0xff, 0xff, 0xf2, 0x7f, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x3f, 0xff, 0xff, 0xe5, 0x3f, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x7f, 0xff, 0xf1, 0xfd, 0x3f, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x7f, 0xff, 0x80, 0xff, 0x1f, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0xf7, 0xfa, 0x00, 0xff, 0x8f, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0xff, 0xf8, 0x00, 0xff, 0x8f, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x01, 0xff, 0xf0, 0x00, 0xf7, 0xef, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x01, 0xff, 0xf0, 0x00, 0x7f, 0xe7, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x03, 0xff, 0xf0, 0x00, 0x1f, 0x37, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x03, 0xff, 0xf0, 0x00, 0x1f, 0xf7, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x03, 0xfb, 0x00, 0x00, 0x1f, 0xf3, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x03, 0xff, 0xc0, 0x00, 0x1f, 0xf1, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x03, 0xff, 0x80, 0x00, 0x1f, 0xf0, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x03, 0xff, 0x00, 0x00, 0x0f, 0xf0, 0x7f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x03, 0xff, 0x00, 0x00, 0x1f, 0xf0, 0x7f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x03, 0xff, 0x00, 0x00, 0x1f, 0xf0, 0x3f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x03, 0xff, 0x00, 0x00, 0x1f, 0xf0, 0x3f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x3b, 0xff, 0x00, 0x00, 0x1f, 0xf2, 0x3f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x7b, 0xff, 0x00, 0x00, 0x01, 0xf7, 0xbf, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x6b, 0xff, 0x00, 0x00, 0x00, 0xf5, 0xbf, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x01, 0xff, 0x00, 0x00, 0x00, 0xe8, 0xbf, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x15, 0xff, 0x00, 0x00, 0x00, 0xe8, 0x3f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x22, 0xff, 0x00, 0x00, 0x00, 0xc8, 0x7f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x02, 0xff, 0x80, 0x00, 0x01, 0xd1, 0x7f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x01, 0x7f, 0x3f, 0xfc, 0xe7, 0xb0, 0x7f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x01, 0x3f, 0x7f, 0xff, 0xf7, 0xa2, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x08, 0xbf, 0xff, 0xff, 0xf3, 0x44, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0xdf, 0xff, 0xff, 0xfe, 0xc5, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x01, 0x6f, 0xff, 0xff, 0xfd, 0x8b, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x33, 0xff, 0xff, 0xf3, 0x03, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x39, 0xff, 0xff, 0xe6, 0x07, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0xbe, 0x7f, 0xff, 0x9e, 0x0d, 0x9b, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x7b, 0x8f, 0xfc, 0x38, 0x5f, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x18, 0xe0, 0x01, 0xc4, 0x3f, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x54, 0x1f, 0xf8, 0x26, 0x7f, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x64, 0x40, 0xc0, 0x39, 0xed, 0xcd, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x79, 0x00, 0x00, 0x67, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x7e, 0x30, 0x0b, 0x9f, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x7f, 0xc1, 0x70, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
]
#Matriz del icono que se mostrara en la interrupción del PIR
marciano=[
[0,0,1,0,0,0,1,0,0],
[0,0,1,0,0,0,1,0,0],
[0,1,1,1,1,1,1,1,0],
[1,1,0,0,1,0,0,1,1],
[1,1,1,1,1,1,1,1,1],
[1,0,1,0,0,0,1,0,1],
[1,0,1,1,1,1,1,0,1],
[0,0,1,1,0,1,1,0,0],
[0,1,1,1,0,1,1,1,0],
]
#Variable que servira como control para el PIR
Motion_Detected = False
#Variable que contiene el sensor PIR conectado al pin 34
PIR_Interrupt= Pin(34, Pin.IN)
# Inicializa el bus I2C usando pines específicos para SCL y SDA.
i2c = machine.SoftI2C(scl=machine.Pin(22), sda=machine.Pin(21))
# Configura el pin 22 como salida.
pin = machine.Pin(22, machine.Pin.OUT)
# Establece el valor del pin en 0 (LOW).
pin.value(0)
# Cambia el valor del pin a 1 (HIGH).
pin.value(1)
#Variables que definen el tamaño de la pantalla oled
oled_ancho = 128
oled_alto= 64
#creacion del objeto de la pantalla oled generado con las dimennsiones y el objeto i2c
oled = ssd1306.SSD1306_I2C(oled_ancho, oled_alto, i2c)
# Configuración del pin PWM para el zumbador activo
zumbador_activo = PWM(Pin(26))
#zumbador_activo = Pin(26)
#pwm = PWM(pin)
# Configurar el pin de salida para el zumbador pasivo
zumbador_pasivo = machine.Pin(14, machine.Pin.OUT)
# Definir las frecuencias de las notas
notas = {
"C4": 262,
"D4": 294,
"E4": 330,
"F4": 349,
"G4": 392,
"A4": 440,
"B4": 494,
"C5": 523,
"D5": 587,
"E5": 659,
"F5": 698,
"G5": 784
}
#Funcion para mostrar información necesaria de forma incial en la pantalla oled
def muestraInformacionInicial():
#Textos en la pantalla OLED en las posiciones dadas
oled.text('Hugo', 0, 0)
oled.text('Goretti', 0, 9)
oled.text('Julio', 0, 20)
# Actualiza y muestra el contenido en la pantalla OLED
oled.show()
sleep(1) #retardo de 1 segundo
#icono del tec
oled.fill(0) #Limpiamos pantalla oled
#Ciclo para mostrar el icono de ITL
for y, row in enumerate(LOGOTIPO):
for x in range(0, len(row)):
byte = row[x]
# se extrae cada bit y se dibujara cada píxel correspondiente
for bit in range(0, 8):
oled.pixel(x * 8 + bit, y, byte & (1 << (7 - bit))) # se extrae el bit más significativo
# actualizamos la pantalla OLED
oled.show()
sleep(1) #Retardo de 1 segundo
#Objetivo en pantalla oled
oled.fill(0) #limpiamos pantalla oled
#mandamos texto a la pantalla oled en diferentes posiciones de la pantalla oled
oled.text('Objetivo:', 0, 0)
oled.text('Mostrar la dist-', 0, 9)
oled.text('ancia de un objeto', 0, 20)
oled.show()#actualizamos pantalla oled
sleep(1)#retardo de 1 segundo
#Funcion para mandar dibujar un icono, en este caso se usara en conjunto con la funcion de interrupcion implementada
#del sensor PIR
def dibujarIconos(icon):
oled.init_display() #reincia la pantalla oled
# Dibujar el logotipo en la pantalla OLED
for y, fila in enumerate(icon):
for x, c in enumerate(fila):
oled.pixel(x*7,y*7,c) # Dibuja cada pixel del ícono
oled.show() # Muestra el ícono en la pantalla OLED
#funcion que contiene la interrupcion del sensor PIR
def handle_interrupt(Pin):
global Motion_Detected # Declaramos que estamos utilizando la variable global Motion_Detected
print ('Entre')#Texto de control para saber que entro a la interrupcion
Motion_Detected = True#variable necesaria para salir del ciclo despues que la interrupcion termine
# Detener el zumbador del sensor ultrasónico
zumbador_activo.duty(0)
while True:
if Motion_Detected:
print('Movimiento detectado!') #Detecto moviemiento
dibujarIconos(marciano) #Dibuja el icono de un marcianito, esto de forma de interrupcion visual
sleep(1)#Retardo de 1 seg
print('Se detuvo el movimiento!')#Texto que incdica que el movimiento termino
Motion_Detected = False #Cambiamos la variable booleana para salir del ciclo y indicar que termino la interrupcion
# Función para reproducir una nota en el zumbador pasivo
def tocar_nota(frecuencia, duracion):
# Calcula el periodo de la frecuencia
periodo = 512 / frecuencia
# Calcula el número de ciclos
ciclos = int(duracion * 1000 / periodo)
for i in range(ciclos):
zumbador_pasivo.on()# Enciende el zumbador
time.sleep_us(int(periodo * 500)) # Tiempo encendido
zumbador_pasivo.off()# Apaga el zumbador
time.sleep_us(int(periodo * 500)) # Tiempo apagado
#Notas y duraciones de la canción "Super Mario Bros. - Mundo 1"
melodia = [
("E5", 0.4), ("E5", 0.4), ("E5", 0.4), ("C5", 0.4),
("E5", 0.4), ("G5", 0.4), ("G4", 0.4), ("E4", 0.4),
("E4", 0.4), ("E4", 0.4), ("C5", 0.4), ("E5", 0.4),
("G5", 0.4), ("G4", 0.4), ("E4", 0.4), ("E4", 0.4),
("E5", 0.4), ("E5", 0.4), ("E5", 0.4), ("C5", 0.4),
("E5", 0.4), ("G5", 0.4), ("G4", 0.4), ("E4", 0.4),
]
# Reproducir la melodía
for nota, duracion in melodia:
tocar_nota(notas[nota], duracion)# Llama a la funció
time.sleep(0.05) # Pausa entre notas
else:
print('voy a salir') #Texto de control que indica que saldra de la interrupción
break#Salimos de la interrupción
#Declaramos la interrupcion para el sensor PIR en la cual le indicamos que ejecutara la funcion llamada "handle_interrupt"
PIR_Interrupt.irq(trigger=Pin.IRQ_RISING, handler=handle_interrupt)
#variable que contiene nuestro sensor ultrasonico en los cuales defininimos en que pines conectamos el sensor al esp32
sensor = hcsr04.HCSR04(trigger_pin=5, echo_pin=18, echo_timeout_us=10000)
#Mandamos llamar la funcion que nos da información importante relevante al inicio del programa (Nombre de integrantes, logo ITL)
muestraInformacionInicial()
# Función para ajustar el beep del zumbador según la distancia
def ajustar_beep(distancia):
if Motion_Detected:
zumbador_activo.duty(0) # Apagar zumbador ultrasónico si hay movimiento
else:
if distancia <= 10:
frecuencia = 1000 # Frecuencia más alta para distancias cercanas
duracion = 0.1
elif distancia <= 20:
frecuencia = 900
duracion = 0.2
elif distancia <= 30:
frecuencia = 800
duracion = 0.3
elif distancia < 40:
frecuencia = 700
duracion = 0.4
elif distancia < 50:
frecuencia = 600
duracion = 0.5
elif distancia < 60:
frecuencia = 500
duracion = 0.6
else:
frecuencia = 512 # Frecuencia más baja para distancias lejanas
duracion = 0.6
zumbador_activo.freq(frecuencia)# Establece la frecuencia del zumbador activo
zumbador_activo.duty(512)# Configura el ciclo de trabajo
time.sleep(duracion)# Espera durante el tiempo especificado (duracion)
zumbador_activo.duty(0)# Apaga el zumbador estableciendo el ciclo de trabajo a 0
time.sleep(duracion)# Espera nuevamente durante el tiempo especificado (duracion)
#Ciclo principal
while True:
distance = sensor.distance_cm() #variable que guarda la distancia leida en el sensor ultrasonico en cm
if distance == 250:#condicional para mandar error si llega a 250
print ('Ha marcado 250, hay un error')#Mensaje de error
oled.fill(0) #limpiamos la pantalla oled
#escribimos texto de error en la pantalla oled
oled.text('He llegado', 0, 0)
oled.text('a 250',0,9)
oled.text('error', 0, 20)
#Actualizamos la pantalla oled
oled.show()
else:
print('Distance:', distance, 'cm') #escribimos en consola la distancia detectada por el sensor ultrasonico
oled.fill(0) #limpiamos la pantalla oled
#Escribimos en la pantalla oled la distancia detectada por el sensor ultrasonico
oled.text('Distancia', 0, 0)
oled.text(str(distance),0,9)
#actualizamos la pantalla oled
oled.show()
# Ajustar el beep según la distancia
ajustar_beep(distance)
#retardo de 0.5 segundos
sleep(.1)