from machine import Pin, I2C,PWM
from lcd_api import LcdApi
from pico_i2c_lcd import I2cLcd
from dht import DHT22
from hcsr04 import HCSR04 # Aggiunto import HCSR04
import random
import time
# Setup componenti
i2c = I2C(0, sda=Pin(4), scl=Pin(5), freq=400000)
lcd = I2cLcd(i2c, 0x27, 2, 16)
# Aggiunto setup DHT11
dht = DHT22(Pin(16)) # DHT11 su GPIO16
# Aggiunto setup sensore ultrasuoni (trigger=Pin 22, echo=Pin 21)
sonar = HCSR04(trigger_pin=22, echo_pin=21)
# Aggiunto setup LED
led_allarme = Pin(15, Pin.OUT) # LED su GPIO15
SOGLIA_TEMPERATURA = 28 # Soglia in gradi Celsius
# Aggiunto setup buzzer
buzzer = PWM(Pin(6)) # Buzzer su GPIO6
buzzer.duty_u16(0) # Spento inizialmente
def inizializza_display():
# Pulisci il display
lcd.clear()
# Mostra il titolo sulla prima riga
lcd.move_to(0, 0)
lcd.putstr("Monitor Ambiente")
# Mostra il messaggio di inizializzazione sulla seconda riga
lcd.move_to(0, 1)
lcd.putstr("Inizializzazione")
time.sleep(1)
lcd.clear()
# Aggiunge punti di sospensione animati
for _ in range(3):
lcd.putstr(".")
time.sleep(0.5)
print("Display inizializzato con successo!")
# Nuova funzione per leggere DHT11
def leggi_temperatura_umidita():
dht.measure()
return dht.temperature(), dht.humidity()
def controlla_temperatura(temperatura):
if temperatura > SOGLIA_TEMPERATURA:
led_allarme.value(1) # Accende il LED
suona_allarme() # Attiva il buzzer
return True
else:
led_allarme.value(0) # Spegne il LED
buzzer.duty_u16(0) # Assicura che il buzzer sia spento
return False
# Nuova funzione per mostrare i dati
def mostra_dati_ambiente():
temp, umid = leggi_temperatura_umidita()
if temp is not None and umid is not None:
# Controlla la temperatura e gestisce il LED
allarme = controlla_temperatura(temp)
lcd.clear()
lcd.move_to(0, 0)
lcd.putstr("Temp:" + str(temp)+"C")
lcd.move_to(0, 1)
lcd.putstr("Umid:" + str(umid) +"%")
# Aggiunge indicatore di allarme sul display
if allarme:
lcd.move_to(15, 0) # Ultima posizione della prima riga
lcd.putstr("!") # Simbolo di allarme
else:
lcd.clear()
lcd.putstr("Errore Sensore")
led_allarme.value(0) # Spegne il LED in caso di errore
# Nuova funzione per leggere la distanza
def leggi_distanza():
distanza = sonar.measure_distance_cm()
return round(distanza, 1) # Arrotonda a 1 decimale
# Nuova funzione per mostrare la distanza
def mostra_distanza():
distanza = leggi_distanza()
if distanza is not None:
lcd.clear()
lcd.move_to(0, 0)
lcd.putstr(f"Distanza:")
lcd.move_to(0, 1)
lcd.putstr(f"{distanza} cm")
else:
lcd.clear()
lcd.putstr("Errore Sonar")
def suona_allarme():
buzzer.freq(1000) # Frequenza 1kHz
buzzer.duty_u16(32768) # Volume al 50%
time.sleep(0.2) # Suona per 0.2 secondi
buzzer.duty_u16(0) # Spegne il buzzer
time.sleep(0.2) # Pausa di 0.2 secondi
# Inizializzazione
inizializza_display()
led_allarme.value(0)
buzzer.duty_u16(0)
# Loop principale
while True:
mostra_dati_ambiente()
time.sleep(2)
mostra_distanza()
time.sleep(2)