from machine import Pin, I2C, PWM, ADC
from time import sleep
import dht
from neopixel import NeoPixel
from i2c_lcd import I2cLcd
from hcsr04 import HCSR04
from servo import Servo
from luces import Luces
# Instancia de objetos a utilizar, con la declaración de sus pines
button = Pin(2, Pin.IN, Pin.PULL_UP)
sensor = dht.DHT22(Pin(15))
pixeles = Luces(pin=0, num_pixels=3) # Crear instancia de Luces
Ultra = HCSR04(13, 12, 10000)
# Instancia del buzzer y del potenciómetro
Buzzer = PWM(Pin(18), freq=1000, duty=0) # Buzzer apagado inicialmente
potenciometro = ADC(Pin(14))
# Instancia del servomotor
servo_pin = Pin(4)
my_servo = Servo(servo_pin)
# Instancia de la clase Volumen
Address_LCD = 0x27 # Dirección de pantalla LCD.
i2c = I2C(scl=Pin(22), sda=Pin(21), freq=400000) # Configuración del bus I2C con pines de conexión y frecuencia
lcd = I2cLcd(i2c, Address_LCD, 2, 16) # Número de filas y columnas de la pantalla utilizada.
estado = 0 # Inicializar estado de botón
# Procedimiento para desplazar el texto de izquierda a derecha
def scroll_text(lcd, text, row, delay=0.3):
display_text = text + ' ' * 16 # Añadir espacios en blanco al final
for i in range(len(display_text) - 15): # Ajustar el rango para evitar errores
lcd.move_to(0, row)
lcd.putstr(display_text[i:i + 16]) # Mostrar una porción del texto
sleep(delay)
# Texto a desplazar
text_to_scroll = "Scan"
# Procedimiento para encender alarma sonora tres veces
def SubrutinaAlarma():
for _ in range(3): # Repetir la alarma 3 veces
Buzzer.duty(512) # Encender el buzzer
sleep(0.5) # Mantener encendido por 0.5 segundos
Buzzer.duty(0) # Apagar el buzzer
sleep(0.5) # Mantener apagado por 0.5 segundos
def leer_temperatura():
sensor.measure()
temp = sensor.temperature()
return temp
def leer_humedad():
sensor.measure()
hum = sensor.humidity()
return hum
DEBOUNCE_TIME = 0.01 # Tiempo en segundos
while True:
if not button.value(): # Si el botón está presionado (valor bajo)
sleep(DEBOUNCE_TIME) # Esperar a que el rebote se estabilice
if not button.value(): # Verificar si el botón sigue presionado
estado = (estado + 1) % 4 # Alternar entre 0, 1, 2, 3
while not button.value(): # Espera hasta que se suelte el botón
pass
sleep(0.5) # Pausa para evitar rebotes adicionales
distance = Ultra.distance_cm() # Función que calcula distancia
# Condición que activa alarma
if distance <= 100:
# Objetos detectados a 100 cm o menos
SubrutinaAlarma() # Alarma intermitente
lcd.move_to(2, 1) # Mover el cursor a la segunda fila
lcd.putstr("Alerta " + str(distance) + " cm") # Aviso de objeto aproximándose
my_servo.write_angle(90) # Mover el servo a 90 grados
# Encender y apagar los neopixels en rojo de manera consecutiva
pixeles.parpadear((255, 0, 0))
print("Embarcacion aproximandose...")
# Código que se ejecuta cuando no se detecta nada (0-100)
else:
# No hay objetos cercanos
lcd.clear() # Limpiar la pantalla antes de mostrar el nuevo texto
Buzzer.duty(0) # Apagar el buzzer
# Encender y apagar los neopixels en verde de manera consecutiva
pixeles.parpadear((0, 255, 0))
# Movimiento continuo del servomotor
for angle in range(0, 181, 1): # De 0 a 180 grados giro a la derecha
my_servo.write_angle(angle)
sleep(0.01) # Ajusta el tiempo para que el movimiento sea suave
for angle in range(180, -1, -1): # De 180 a 0 grados giro a la izquierda
my_servo.write_angle(angle)
sleep(0.01) # Ajusta el tiempo para que el movimiento sea suave
print("\nNo hay embarcaciones detectadas")
# Visualizar medidas detectadas por radar
if estado == 1:
# Medir la distancia y mostrarla en la pantalla LCD
distance = Ultra.distance_cm()
lcd.clear() # Limpiar la pantalla antes de mostrar el nuevo texto
lcd.move_to(2, 1) # Mover el cursor a la segunda fila
lcd.putstr("Dist "+ str(distance) + " cm") # Mostrar la distancia con un decimal
# Conocer condiciones meteorologicas de navegación
elif estado == 2:
temp = leer_temperatura()
hum = leer_humedad()
lcd.clear() # Limpiar la pantalla antes de mostrar el nuevo texto
lcd.move_to(3, 0) # Mover el cursor a la segunda fila
lcd.putstr("Temp: "+ str(temp))
lcd.move_to(3, 1) # Mover el cursor a la segunda fila
lcd.putstr("Hum: "+ str(hum))
print("---- Evaluando clima ----")
# Volver a estado inicial de escaneo.
else:
# Desplazar texto en la LCD desde la primera fila
scroll_text(lcd, text_to_scroll, 0) # Muestra texto de escaneo
sleep(0.5) # Pausa de un segundo entre cada lectura