## Importación de Librerías ##
from machine import Pin, SPI, ADC, PWM # Librería machine, manejo de GPIO, Pin, PWM
from utime import sleep_ms, ticks_us, sleep
from time import sleep # Libreria time, para temporización
from utime import sleep #Libreria utime, para temporización
from utime import sleep_us, ticks_us, ticks_diff,sleep
from pico_i2c_lcd import I2cLcd
from machine import I2C
i2c=I2C(id=1,scl=Pin(3), sda= Pin(2), freq=100000)
lcd= I2cLcd(i2c, 0x27, 4, 20)
trig= Pin(12, Pin.OUT)
echo= Pin(13, Pin.IN)
adc=ADC(Pin (26)) #ADC0 en Raspberry Pi Pico
#Configuración del GPIO 15 como salida
led =Pin(15, Pin.OUT)
# Configuración del servo
servo1 = PWM(Pin(21)) #GPIO021 funciones como salida PWM
servo1.freq(50) #Frecuencia PWM DE 50 Hz(Periodo de 20 ms)
#Funcion para mover el servo a un ángulo específico
def mover_servo(grados):
if 0 <= grados <= 180:
duty_ns = int(500000 +(grados / 180)*1900000) #Grados a duty_ns
servo1.duty_ns(duty_ns)
else:
print("Angulo fuera de rango. Debe estarentre 0 y 180 grados.")
#configuracion del LDR
ldr = ADC(Pin(26)) # gp26 Entrada entrada de corriente del LDR
## Configuración de SPI ##
#Raspberry cuenta con varios buses SPI, en este caso estamos usando el bus SPI(0)
#Velocidad de transmisión de 10 MHz
#polarity=1: Define la polaridad del reloj SPI, el reloj es activo cuando esta en nivel alto.
#phase=0: Especifica la fase del reloj SPI. Se toman las muestras de datos en el primer borde del reloj
#(en subida)
#sck=Pin(2): SCK (Serial Clock) es el GPIO 2
#mosi=Pin(3): MOSI (Master Out Slave In) es el GPIO 3, envía datos desde la Rasp hacia el dispositivo
#(en este caso, el MAX7219).
#ss = Pin(5, Pin.OUT): Chip Select (CS) o Slave Select (SS), indica al dispositivo (MAX7219) que debe
#escuchar los datos enviados a través del SPI. Cuando el CS está en bajo (0), el MAX7219 recibe los datos.
# Si está en alto (1), se ignoran los datos. Con esto podemos tener multiples esclavos SPI.
spi = SPI(0, baudrate=10000000, polarity=1, phase=0, sck=Pin(2), mosi=Pin(3))
ss = Pin(5, Pin.OUT)
DHT22_pin = 1 #Terminal de conexión del DHT22
## Relevador y potenciometro
SetPoint = ADC(1) #gp27 Entrada voltaje de ajuste del setpoint de temperatura (Pot 5 ó 10 kOhm).
Relay = Pin(16, Pin.OUT)
# Conversión para el ADC (12 bits, 0-4095)
Conv = 3300 / 4095 # 3.3V a una resolución de 12 bits
sleep(0.5)
class DHT22():
def __init__(self,gpio):
self.pin=gpio
self.pin=Pin(gpio,mode=Pin.OUT)
self.pin.high()
self.ckecksum=0
self.temperatura=0
self.humedad=0
sleep_ms(1)
def getReading(self):
DHT=self.pin
DHT.low()
sleep_ms(1)
DHT.init(mode=Pin.IN)
for i in range(2):
while DHT.value()==1:
pass
while DHT.value()==0:
pass
data=0
t1=ticks_us()
for i in range(32):
while DHT.value()==1:
pass
while DHT.value()==0:
pass
t2=ticks_us()
data=data<<1
data=data|((t2-t1)>100)
t1=t2
checksum=0
for i in range(8):
while DHT.value()==1:
pass
while DHT.value()==0:
pass
t2=ticks_us()
checksum=checksum<<1
checksum=checksum|((t2-t1)>100)
t1=t2
byte1=(data>>24&0xFF)
byte2=(data>>16&0xFF)
byte3=(data>>8&0xFF)
byte4=(data & 0xFF)
self.checksum=(checksum==(byte1+byte2+byte3+byte4)&0xFF)
self.humedad=((byte1<<8)|byte2)/10.0
neg=byte3 & 0x80
self.temperatura=(byte3<<8 | byte4)/10.0
if neg>0:
self.temperatura=-self.temperatura
while True:
trig.value(0)
sleep_us(5)
trig.value(1)
sleep_us(10)
trig.value(0)
while echo.value() ==0:
pass
Tmrinicio=ticks_us()
while echo.value()==1:
pass
Tmrfin = ticks_us
Duration= ticks_diff(Tmrfin, Tmrinicio)
distancecm= Duration* 0.0171
lcd.clear()
lcd.move_to(0,0)
lcd.putstr('Dist= ' +str(distancecm)[:6] + "cm")
slepp(1)
while 1:
sleep_ms(100)
# Lee el valor del potenciometro (resolución de 12 bits)
ValorPot = SetPoint.read_u17() >> 4 # Normaliza el valor de 17 bits a 12 bits
TempSP = Conv * ValorPot # Convierte el valor del potenciometro a voltaje
SetTemp = TempSP * (100 / 3300) # Convierte el voltaje a máximo 100 grados Celsius
print("SetPoint: " + str(SetTemp)[:5] + "°C") # Imprime el valor de SetPoint (temperatura deseada)
dht=DHT22(DHT22_pin)
dht.getReading()
sleep_ms(100)
print("Checksum=",dht.checksum, " Humedad=",dht.humedad, "% Temperatura=",dht.temperatura,"°C")
if dht.temperatura > SetTemp:
Relay.value(1)
print("Encendido")
else:
Relay.value(0)
print("Apagado")
msg = "H=" + str(dht.humedad)[:6] + " T=" + str(dht.temperatura)[:6]
length = len(msg) * 8 #Se multipla por 8 filas
sleep(0.5)
for x in range(modulos_max7219*8, -length, -1):
display.text(msg ,x,0,1)
display.show()
sleep(velocidad_barrido)
display.fill(0)
print("")
sleep_ms(1000)
while 2:
#Lee el valor del LDR
valor_ldr = ldr.read_u16()
#Muestra el valor leido
print("Valor LDR:"), valor_ldr)
#Espera un poco antes de leer de nuevo
import time
time.sleep(0.5)
while 3:
# Lee el valor del sensor ultrasonif distancecm < 40:
mover_servo(90) #Mueve a 90 grados, 1,500 nanosegundos
print("aperturar puerta")
else
mover_servo(0) #Mueve a 0 grados, 500 nanosegundos
print("cerrar puerta")ico