from machine import Pin, I2C,ADC, PWM
from HC1SR04 import HCSR04
from time import sleep,time
from images import (logo)
from ssd1306 import SSD1306_I2C
import framebuf
import dht
# Asignación de terminales al canal I2C
# --> Canal, Terminal Reloj, Terminal Datos)
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
oled_width = 128 # Ancho de la pantalla
oled_height = 64 # Alto de la pantalla
#Creacion de onjetos
oled = SSD1306_I2C(oled_width, oled_height, i2c) # Creación de un objeto del tipo 'pantalla OLED'
dht22 = dht.DHT22(Pin(19)) # Creación de un objeto
# Configuración de los pines de los botones con PULL_DOWN
Boton_1 = Pin(14, Pin.IN, Pin.PULL_DOWN)
Boton_2 = Pin(12, Pin.IN, Pin.PULL_DOWN)
Boton_3 = Pin(13, Pin.IN, Pin.PULL_DOWN)
#Pines de salida de los leds
led_azul = Pin(15,Pin.OUT)
led_rojo = Pin(23,Pin.OUT)
led_verde = Pin(4,Pin.OUT)
#Primer menu
menu_principal = ["LedsOn","Sensores","ServoMotor","GraficaVx","GraficaHy"]
menu_principal_seleccion = 0
#Primer submenu
sub_menu_1 = ["LedAzul","LedRojo","LedVerde","Salir"]
sub_menu1_seleccion = 0
#Segundo submenu
sub_menu_2 = ["Humedad","Ultrasonico","Pir","Salir"]
sub_menu2_seleccion = 0
#Images
buffer = bytearray(logo)
fb = framebuf.FrameBuffer(buffer,oled_width,oled_height,framebuf.MONO_HLSB)
#Sensores
pir = Pin(34, Pin.IN, Pin.PULL_DOWN)
sensor=HCSR04(trigger_pin=5, echo_pin=18, echo_timeout_us=400000)
#servo motor
pot_pin = Pin(34)
servo_pin = Pin(2)
adc = ADC(pot_pin)
pwm = PWM(servo_pin)
pwm.freq(50)
# Actualizar la pantalla cada vez que se cambia de opción
#------------------------------------------------------------------
def menu_principal_muestra():
oled.fill(0)
oled.text("Main Menu:", 30, 0)
for i, opcion in enumerate(menu_principal):
if i == menu_principal_seleccion:
oled.text(">>" + opcion, 0, 15 + i * 10)
else:
oled.text(opcion, 0, 15 + i * 10)
oled.show()
#------------------------------------------------------------------
#Mover cursor en la pantalla principal
def desp_menu(desplazamiento_menu):
global menu_principal_seleccion
if desplazamiento_menu == "up":
if menu_principal_seleccion > 0:
menu_principal_seleccion = menu_principal_seleccion - 1
elif desplazamiento_menu == "down":
if menu_principal_seleccion < 4:
menu_principal_seleccion += 1
sleep(0.000001)
#------------------------------------------------------------------
#Sub menu numero 1
def sub_menu_muestra_1():
global sub_menu1_seleccion
led_estado1 = False
led_estado2 = False
led_estado3 = False
sleep(0.000001)
#########
while True:
oled.fill(0)
oled.text("Submenu:", 30, 0)
for i, option in enumerate(sub_menu_1):
if i == sub_menu1_seleccion:
oled.text(">>" + option, 0, 20 + i * 10)
else:
oled.text(option, 0, 20 + i * 10)
oled.show()
if Boton_1.value():
desp_sub_menu_1("up")
if Boton_2.value():
desp_sub_menu_1("down")
######## ya esta explicado
if Boton_3.value() and not led_estado1 and sub_menu1_seleccion == 0:
led_azul.on()
led_estado1 = True
sleep(0.0000001)
else:
if Boton_3.value() and led_estado1 and sub_menu1_seleccion == 0:
led_azul.off()
led_estado1 = False
sleep(0.0000001)
if Boton_3.value() and not led_estado2 and sub_menu1_seleccion == 1:
led_rojo.on()
led_estado2 = True
sleep(0.0000001)
else:
if Boton_3.value() and led_estado2 and sub_menu1_seleccion == 1:
led_rojo.off()
led_estado2 = False
sleep(0.0000001)
if Boton_3.value() and not led_estado3 and sub_menu1_seleccion == 2:
led_verde.on()
led_estado3 = True
sleep(0.0000001)
else:
if Boton_3.value() and led_estado3 and sub_menu1_seleccion == 2:
led_verde.off()
led_estado3 = False
sleep(0.0000001)
if Boton_3.value() and sub_menu1_seleccion == 3:
sleep(0.0000001)
break
#-------------------------------------------------------------------
#Mover cursor en la pantalla del submenu 1
def desp_sub_menu_1(desplazamiento_menu):
global sub_menu1_seleccion
if desplazamiento_menu == "up":
if sub_menu1_seleccion > 0:
sub_menu1_seleccion -= 1
elif desplazamiento_menu == "down":
if sub_menu1_seleccion < 3:
sub_menu1_seleccion += 1
#-------------------------------------------------------------------
#Sub menu numero 2
def sub_menu_muestra_2():
global sub_menu2_seleccion
sleep(0.3)
while True:
oled.fill(0)
oled.text("Submenu:", 30, 0)
for i, option in enumerate(sub_menu_2):
if i == sub_menu2_seleccion:
oled.text(">>" + option, 0, 20 + i * 10)
else:
oled.text(option, 0, 20 + i * 10)
oled.show()
if Boton_1.value():
desp_sub_menu_2("up")
if Boton_2.value():
desp_sub_menu_2("down") # ya esta explicado en anteriores codigos
if Boton_3.value() and sub_menu2_seleccion == 0:
sensor_humedad()
if Boton_3.value() and sub_menu2_seleccion == 1:
sensor_ultrasonico()
if Boton_3.value() and sub_menu2_seleccion == 2:
sensor_pir()
if Boton_3.value() and sub_menu2_seleccion == 3:
sleep(0.2)
break
#-------------------------------------------------------------------
#Mover cursor en la pantalla del submenu 2
def desp_sub_menu_2(desplazamiento_menu_2):
global sub_menu2_seleccion
if desplazamiento_menu_2 == "up":
if sub_menu2_seleccion > 0:
sub_menu2_seleccion -= 1
elif desplazamiento_menu_2 == "down":
if sub_menu2_seleccion < 3:
sub_menu2_seleccion += 1
#-------------------------------------------------------------------
#Sensor de humedad
def sensor_humedad():
dht22.measure()
oled.fill(0)
oled.text("Temp:"+str(dht22.temperature()),0,17)
oled.text("Hum:"+str(dht22.humidity()),0,32)
oled.show()
sleep(5)
#------------------------------------------------------------------
def sensor_ultrasonico():
distancia=sensor.distance_cm()
oled.fill(0)
oled.text("Distancia:"+str(int(distancia)),0,32)
oled.show()
sleep(5)
#------------------------------------------------------------------
def sensor_pir(tiempo_desvanecimiento=50):
tiempo_inicio = time() # tiempo de inicio de la detección de movimiento
while True:
if pir.value() == 1:
oled.fill(0)
oled.text("Movimiento dectetado", 0, 32)
oled.show()
else:
oled.fill(0)
oled.text("Sin movimiento", 0, 32)
oled.show()
# Si ha pasado el tiempo de desvanecimiento, salimos del bucle
if time() - tiempo_inicio > tiempo_desvanecimiento:
break
sleep(1) # Esperar un segundo antes de verificar nuevamente
#------------------------------------------------------------------
#Sub menu numero 3
def sub_menu_muestra_3(tiempo_desvanecimiento=30):
tiempo_inicio = time()
while True:
oled.fill(0)
potenciometro = int(adc.read_u16()*180/65535)
oled.text("Angulo: "+str(potenciometro), 0, 32)
ton = (potenciometro+45)*100000/9
pwm.duty_ns(int(ton))
sleep(0.5)
oled.show()
if time() - tiempo_inicio > tiempo_desvanecimiento:
break
#------------------------------------------------------------------
#Sub menu numero 4
def sub_menu_muestra_4():
x_position = 0
repeticion = 0
# Bucle principal
while True:
# Desplazar la imagen
oled.fill(0) # Limpiar la pantalla
oled.blit(fb, x_position, 0) # Dibujar la imagen en la nueva posición
oled.show()
# Actualizar la posición para el próximo frame
x_position += 3
# Verificar si se alcanzó el final de la pantalla
if x_position > 128:
x_position = -120 # Reiniciar la posición al inicio
repeticion +=1
if repeticion == 2:
break
#------------------------------------------------------------------
#Sub menu numero 5
def sub_menu_muestra_5():
y_position = 0
repeticion = 0
# Bucle principal
while True:
# Desplazar la imagen
oled.fill(0) # Limpiar la pantalla
oled.blit(fb, 8 , y_position ) # Dibujar la imagen en la nueva posición
oled.show()
# Actualizar la posición para el próximo frame
y_position += 3
# Verificar si se alcanzó el final de la pantalla
if y_position > 64:
y_position = -80 # Reiniciar la posición al inicio
repeticion +=1
if repeticion == 2:
break
#------------------------------------------------------------------
#Sensor ultrasonico
# Motor
# ImagenVer
#ImagenHor
#Bucle principal de todo el menu
while True:
menu_principal_muestra()
if Boton_1.value():
desp_menu("up")
if Boton_2.value():
desp_menu("down")
if Boton_3.value() and menu_principal_seleccion == 0:
sub_menu_muestra_1()
if Boton_3.value() and menu_principal_seleccion == 1:
sub_menu_muestra_2()
if Boton_3.value() and menu_principal_seleccion == 2:
sub_menu_muestra_3()
if Boton_3.value() and menu_principal_seleccion == 3:
sub_menu_muestra_4()
if Boton_3.value() and menu_principal_seleccion == 4:
sub_menu_muestra_5()