from machine import Pin, I2C,PWM,ADC
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
# Aggiunto setup potenziometro
pot = ADC(26) # Potenziometro su GPIO26 (ADC0)
# Configurazione range temperatura
TEMP_MIN = 25 # Temperatura minima impostabile
TEMP_MAX = 35 # Temperatura massima impostabile
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):
soglia = leggi_soglia_temperatura()
if temperatura > soglia:
led_allarme.value(1)
suona_allarme()
return True
else:
led_allarme.value(0)
buzzer.duty_u16(0)
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:
soglia = leggi_soglia_temperatura()
allarme = controlla_temperatura(temp)
lcd.clear()
lcd.move_to(0, 0)
lcd.putstr(f"T:{temp}C S:{soglia}C") # Mostra temperatura e soglia
lcd.move_to(0, 1)
lcd.putstr(f"Umid:{umid}%")
if allarme:
lcd.move_to(15, 0)
lcd.putstr("!")
else:
lcd.clear()
lcd.putstr("Errore Sensore")
led_allarme.value(0)
# 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
def leggi_soglia_temperatura():
"""Legge il potenziometro e converte il valore in temperatura"""
val = pot.read_u16() # Legge valore (0-65535)
# Mappa il valore del potenziometro al range di temperatura
temperatura = TEMP_MIN + (val / 65535) * (TEMP_MAX - TEMP_MIN)
return round(temperatura, 1)
def mostra_soglia():
"""Mostra la soglia di temperatura corrente"""
soglia = leggi_soglia_temperatura()
lcd.clear()
lcd.move_to(0, 0)
lcd.putstr("Soglia Temp:")
lcd.move_to(0, 1)
lcd.putstr(f"{soglia}C")
return soglia
# 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)