top of page
MESUREM L'AMBIENT. BME280
BME280_1.jpg

El BME280 és un sensor digital que llegeix la pressió de l'aire, la temperatura i la humitat.

Amb les seves mesures també podem estimar l'altitud (la pressió canvia amb l'altitud).

L'hem comprat aqui

especificacions.png
BME280_2.jpg

Els pins s'han de soldar.

Presteu atenció i seguiu aquests passos per fer-ho.

Pautes de connexió

El BM·280 es comunica amb el microcontrolador mitjançant el protocol de comunicació I2C.

I2C (Inter Integrated Circuit) utilitza un bus de comunicació que transmet la informació de diversos dispositius a través de només dues línies: una per les dades (SDA) i l’altre pel senyal del rellotge (SDL).

En el bus cada dispositiu té una adreça, que permet accedir a ell de manera individual (el bus I2C admet fins a 128 dispositius)

i2c.png
BMEconnexio.png

Els pins I2C de l'ESP32:

GPIO 22 (SCL, rellotge)

GPIO 21 (SDA, dades)

Per si necessitem saber l'adreça I2C del nostre dispositiu:

Pautes de programació

Per treballar amb I2C haurem d'importar la classe SoftI2C del mòdul machine i crear objectes I2C definint quin és el pin SCL i SDA que utilitzem.

Per treballar amb el BME280 cal una llibreria (mòdul) que no forma part de la biblioteca estàndard de MicroPython.

Copieu el codi del programa bme280_float.py d'aquest repositori GitHub en un nou programa a Thonny. Deseu aquest fitxer dins la carpeta lib del vostre dispositiu, amb el nom bme280.py

Proposta de codi de prova

A més d'importar la llibreria bme280, cal importar la classe SoftI2C de la llibreria machine, que permet treballar amb el protocol I2C, i la classe Pin per definir els pins I2C del dispositiu.

La llibreria descarregada considera l'adreça I2C per defecte del sensor: 0x76. Si calgués canviar-la, fem-ho en definir l'objecte bme al programa. 

from machine import SoftI2C, Pin                                        # la classe SoftI2C permet treballar amb l'I2C
from time import sleep                                                         
import bme280                                                                       # llibreria desada a la carpeta lib del dispositiu   

                                                                 

i2c = SoftI2C(scl=Pin(22), sda=Pin(21), freq=400000)      # configuració de l'objecte i2c: els pins i la freqüència de treball

bme = bme280.BME280(i2c=i2c)                                         # configuració de l'objecte bme280, que he anomenat bme

# bme280: bme = bme280.BME280 (i2c=i2c, adress = adreça I2C)         #si l'adreça I2C del sensor no és 0x76

while True:                                                                               # mostra a la consola els valors mesurats pel sensor
     print (bme.values)                                                            
     sleep(1)

El resultat a la consola:

BME280_consola1.png

La instrucció values() retorna una llista de tres elements, amb la seva unitat de mesura i tot.

Si volem només els valors numèrics hem d'utilitzar el mètode read_compensated_data ()

while True:
    valors= bme.read_compensated_data ()
    print(valors)
    sleep(1)

I si només volem recuperar un valor o tots tres però amb un altre format:

while True:

    valors= bme.read_compensated_data ()

    print(valors[0])

    print(valors[1])

    print(valors[2])

    sleep(1)

I si no necessitem tanta precissió, podem recuperar els valors com a nombres enters:

print (int (valors[0]) )

Fet com una funció (per quan pugem al núbol):

from machine import SoftI2C, Pin                                           # la classe SoftI2C permet treballar amb l'I2C
from time import sleep
import bme280

i2c = SoftI2C (scl=Pin(22),  sda=Pin(21),  freq=400000)       # configuració de l'objecte i2c: els pins i la freqüència de treball
bme = bme280.BME280 (i2c=i2c)                                            # configuració de l'objecte bme280, que he anomenat bme

 

def lectures():
    valors = bme.read_compensated_data()
    global temp, pres, hum  # per poder exportar el seu valor fora de la funció cal definir-les primer com globals
    temp = valors[0]
    pres = valors[1]
    hum = valors[2]

while True:
    lectures()
    print (temp)
    print (pres)
    print (hum)
    print ('===================')         # per separar la visualització de les lectures
    sleep (1)

def lectures():   

    valors = bme.values

    global temp, pres, hum  

    temp = valors [0]   

    pres = valors [1]   

    hum = valors [2]

ALTRES PARÀMETRES AMBIENTALS

A partir de les dades d'humitat, temperatura i pressió és possible calcular altres variables d'interès, com ara el Punt de rosada (Dew point) i l' Altitud.

La nostra llibreria té unes funcions definides que, a partir dels valors mesurats, calcula:

El punt de rosada es defineix com el valor al qual ha de baixar la temperatura de l'aire perquè el vapor d'aigua que conté comenci a condensar-se en rosada, boirina o gebre.

Per obtenir-lo, només hem de llegir la propietat dew_point de l'objecte creat per al sensor.

L' altitud es calcula a partir de la pressió: com que la pressió de l'aire disminueix a mesura que augmenta l'altitud, podem calcular-la comparant la pressió actual amb un valor de referència, normalment l'alçada sobre el nivell del mar. El valor de referència que utilitza la llibreria és la propietat sealevel i podem carregar qualsevol valor o el de la pressió al nivell del mar que és de 101.325 Pascals (si no el canviem, aquest és valor que té per defecte). L'altitud calculada pot llegir-se en el domini altitude .

while True:
    print ("Pressio de referencia: ", bme.sealevel, " Pa a nivell del mar")
    print ("La meva altitud: ", bme.altitude, " m sobre el nivell del mar"
    print ("Punt de rosada: ", bme.dew_point, " C")
    sleep(10)

BME280_consola2.PNG

Temperatura de xafugor

Revisa l'article de la wikipedia per calcular com es calcula la Temperatura de xafogor (Heat index)  en ºF i com passar-la a ºC sabent que depen de la humitat relativa i de la temperatura del bulb sec.

2) Fes el muntatge experimental.

3) Fes el programa amb el Thonny IDE ( Pista: Es poden escriure variables i assignar-les un valor constant ja sigui enter o decimal, així simplifiques els càlculs).

4) Afegeix un dispositiu que avisi quan estàs en perill de mort si no tornes a la frescor de la ombra.

EL PROBLEMA DE LES PAUSES BLOQUEJANTS

Tech Explorations

 

from machine import SoftI2C, Pin, Timer

import bme280_float as bme280

 

i2c = SoftI2C(scl=Pin(22), sda=Pin(4), freq=400000)

bme = bme280.BME280( i2c=i2c,

mode=bme280.BME280_OSAMPLE_8,

address=bme280.BME280_I2CADDR ) # Works ok with explicit settings

#bme = bme280.BME280(i2c=i2c) # Also works ok, defaults.

 

def read_sensor_isr(event):

print(bme.values)

print("")

print("Temp: ", bme.values[0], ", Pressure: ", bme.values[1], ", Humidity: ", bme.values[2])

 

blink_timer = Timer(1)

blink_timer.init(period=1000, mode=Timer.PERIODIC, callback=read_sensor_isr)

Referències
bottom of page