import dht
import machine
import time
from time import sleep_ms, ticks_ms
from machine import I2C, Pin
from I2c_lcd import I2cLcd
# Configura el pin de dades del sensor d'humitat (GPIO 4, per exemple)
pin_dades = machine.Pin(4)
sensor = dht.DHT22(pin_dades)
rele1 = machine.Pin(14, machine.Pin.OUT) #Conexió dels pins amb el relay
rele2 = machine.Pin(27, machine.Pin.OUT) #Conexió dels pins amb el relay
llindar_temp = 20.0 #Limit per des/activar el relay
llindar_wet = 50.0 #Limit per des/activar el relay
historial = [] #Llista per fer l'historial de dades recollides
direccio_lcd = 0x27
i2c = I2C(scl=Pin(22), sda=Pin(21), freq=400000)
# connect scl to GPIO 22, sda to GPIO 21
lcd = I2cLcd(i2c, direccio_lcd, 2, 16)
def calcul_mitjana(dades): #Funció per calcular la mitjana entre totes les dades recollides
suma = 0
for dada in dades:
suma += dada
return suma / len(dades)
def calcul_maxim(dades): #Funció per calcular el máxim entre totes les dades recollides
maxim = dades[0]
for dada in dades:
if dada > maxim:
maxim = dada
return maxim
def calcul_minim(dades): #Funció per calcular el minim entre totes les dades recollides
minim = dades[0]
for dada in dades:
if dada < minim:
minim = dada
return minim
while True:
sensor.measure() # Realitza la mesura
temperatura = sensor.temperature()
humitat = sensor.humidity()
temps_inici = time.time()
historial.append((temps_inici, temperatura, humitat)) #Afegeix els següents valors a la llista "historial"
print(f"Temperatura: {temperatura}º") #Mostra el valor de la temperatura actual
print(f"Humitat: {humitat}%") #Mostra el valor de la humitat actual
if len(historial) == 60: #Si la quantitat de valors de la llista "historial" arriba a 60...
historial.clear() #Reinicia l'historial
print("[MÀQUINA] Reiniciant l'Historial!")
if len(historial) > 0 and len(historial) % 12 == 0: #Quan a la llista "historial" afegeix 12 valors, mostra la mitjana, el minim i el màxim dels 12 valors afegits a la llista
histoTemp = [i[1] for i in historial] #De la posició 1 (temperatura) de la llista "historial", per a cada valor.
histoHumi = [i[2] for i in historial] #De la posició 2 (humitat) de la llista "historial", per a cada valor.
tempMitjana = calcul_mitjana(histoTemp) #El calcul de la mitjana del historial de temperatura
tempMax = calcul_maxim(histoTemp) #El calcul del máxim del historial de temperatura
tempMin = calcul_minim(histoTemp) #El calcul del mínim del historial de temperatura
humiMitjana = calcul_mitjana(histoHumi) #El calcul de la mitjana del historial de humitat
humiMax = calcul_maxim(histoHumi) #El calcul del máxim del historial de humitat
humiMin = calcul_minim(histoHumi) #El calcul del mínim del historial de humitat
print(f"Temperatura mitjana: {tempMitjana}º")
print(f"Temperatura màxima: {tempMax}º")
print(f"Temperatura mínima: {tempMin}º")
print(f"Humitat mitjana: {humiMitjana}%")
print(f"Humitat màxima: {humiMax}%")
print(f"Humitat mínima: {humiMin}%")
lcd.move_to(0,0) #Escriu a la matriu 0,0 (primera linia de la pantalla)
lcd.putstr(f"Temp M: {tempMitjana}C") #Mostra la temperatura mitjana a la pantalla
time.sleep(2) #Canvia als 2 segons
lcd.move_to(0,0) #Escriu a la matriu 0,0 (primera linia de la pantalla)
lcd.putstr(f"Humi M: {humiMitjana}%") #Mostra la humitat mitjana a la pantalla
time.sleep(2) #Canvia als 2 segons
lcd.move_to(0,1) #Escriu a la matriu 0,0 (primera linia de la pantalla)
lcd.putstr(f"Relay1 On: {llindar_temp}C") #Mostra la temperatura mitjana a la pantalla
time.sleep(2) #Canvia als 2 segons
lcd.move_to(0,1) #Escriu a la matriu 0,0 (primera linia de la pantalla)
lcd.putstr(f"Relay2 On: {llindar_wet}%") #Mostra la humitat mitjana a la pantalla
time.sleep(2) #Canvia als 2 segons
lcd.clear() #Després dels 2 segons del time.sleep, esborra tot el que hi ha escrit a la pantalla LCD
if tempMitjana < llindar_temp: #Si el valor de la mitjana de temperatura es menor al limit de "llindar_temps", activa el relay
rele1.value(1) #Activa el relay
lcd.move_to(0,0) #Escriu a la matriu 0,1 (segona linia de la pantalla)
lcd.putstr("Relay1 ActiU") #Escriu a la pantalla que el relay esta actiu
time.sleep(2) #Canvia als 2 segons
else: #Si el valor de la mitjana de temperatura es major al limit de "llindar_temperatura", desactiva el relay
rele1.value(0) #Desactiva el relay
lcd.move_to(0,0) #Escriu a la matriu 0,1 (segona linia de la pantalla)
lcd.putstr("Relay1 Inactiu") #Escriu a la pantalla que el relay esta inactiu
time.sleep(2) #Canvia als 2 segons
if humiMitjana < llindar_wet: #Si el valor de la mitjana de humitat es menor al limit de "llindar_wet", activa el relay
rele2.value(1) #Activa el relay
lcd.move_to(0,1) #Escriu a la matriu 0,1 (segona linia de la pantalla)
lcd.putstr("Relay2 Actiu") #Escriu a la pantalla que el relay esta actiu
time.sleep(2) #Canvia als 2 segons
lcd.clear() #Després dels 2 segons del time.sleep, esborra tot el que hi ha escrit a la pantalla LCD
else: #Si el valor de la mitjana de humitat es major al limit de "llindar_wet", desactiva el relay
rele2.value(0) #Desactiva el relay
lcd.move_to(0,1) #Escriu a la matriu 0,1 (segona linia de la pantalla)
lcd.putstr("Relay2 Inactiu") #Escriu a la pantalla que el relay esta inactiu
time.sleep(2) #Canvia als 2 segons
lcd.clear() #Després dels 2 segons del time.sleep, esborra tot el que hi ha escrit a la pantalla LCD
time.sleep(1)