Loading...

SHT31 leer datos y configurar

Pablo Durán
Comparte el post:

De este modelo de sensor vamos a utilizar dos. Uno para medir la temperatura y humedad del ambiente donde estarán puesto todos los sensores atmosférigos y otro que pondremos juntos a los sensores de gas MQ para que podamos calibrarlos con los datos que nos proporciona este sensor.

Se escogió este sensor después de haber usado un sensor DHT11 y un DHT22 los cuales fallaron pasados unos meses aun siendo de primeras marcas por ello me decanté por uno que sea totalmente diferente.

Datos técnicos

El sensor SHT31 es un sensor digital con comunicación I2C que mide la tempera y humedad del ambiente. Utiliza una alimentación de 3.3V.
  • Temperatura: Tiene una precisión de ±0.3ºC y mide con dos decimales. El rango de lectura es entre los 0 y 100ºC
  • Humedad: Tiene una precisión de ±2% y mide con dos decimales. El rango de lectura es entre los 0 y 100%
  • Ruta I2C: La ruta predeterminada del chip es la 0x44 y la alternativa es la 0x45.

Cableado

El sensor sht31 que dispone de 6 pines de los cuales usaremos los siguientes pines:

  • Pin VIN: se conecta a un pin 3.3V de la Raspberry Pi.
  • pin GND: se conecta a cualquier pin GND de la Raspberry Pi.
  • Pin SCL: se conecta al pin SCL (GPIO 8) de la Raspberry Pi.
  • Pin SDA: se conecta al pin SDA (GPIO 9) de la Raspberry Pi.
  • Pin ADR: Solo se conecta en uno de los dos sensores para cambiar el canal de información del sensor al 0x45. Conectar a un pin 3.3V de la Raspberry Pi.

Quedando de el cableado de la siguiente forma:

Cableado del sensor sht31

Si prefieres verlo en su esquema te la dejo justo aquí.

Esquema del sensor sht31

Funcionamiento

Es necesario importar las librerías logging, busio, board y adafruit_sht31d para la lectura y aviso de errores en este sensor.

Se le pasa al constructor de clase (Sht31) la ruta del sensor que vamos a usar. Este realizará la conexión en la ruta indicada y guardará los datos de temperatura y humedad en la clase para devolverlos a la clase principal cuando este se los pida.

El sensor hace una lectura única. Esto quiere decir que solo se recogen valores cuando se llama al constructor y por lo tanto solo se lee el valor cuando el programa va a enviar los datos al servidor en vez de hacer una lectura continua y hacer una media.

Devolverá los dos parámetros sin decimales y en formato String para poder trabajar mejor con ellos posteriormente. En el caso de error de lectura tanto temperatura como humedad devolverán como valor -100.

Diagrama del sensor sht31

Código

Para el código vamos a tener una carpeta en la que vamos a poner todas las clases que creemos de los sensores y otra en la que vamos a tener todos los scripts que validan que el sensor funciona correctamente. Esta senguda carpeta no es necesaria tenerla si no se quiere para el funcionamiento normal del programa pero es muy últil cuando se quiere probar si un sensor que datos recoge.

Test

Este es el código de python para hacer un test al sensor SHT31.

# sht31.py
import board
import busio
import adafruit_sht31d
i2c = busio.I2C(board.SCL, board.SDA)
sensor = adafruit_sht31d.SHT31D(i2c, 0x45)

print('Humidity: {0}%'.format(sensor.relative_humidity))
print('Temperature: {0}C'.format(sensor.temperature))

Para hacer la prueba de lectura abrimos un terminal, nos situamos en la ruta en la que hayamos guardado el código de arriba y ejecutamos python3 sht31.py saliente lo siguiente por consola:

pi@raspberrypi:~/Meteo/test $ python3 sht31.py 
Humidity: 59.430838483253225%
Temperature: 21.419089036392762C

Clase

El sensor tiene que funcionar de forma conjunta con el resto de sensores que vamos a programar por lo que es necesario que creemos un archivo por sensor para que el programa sea modular. La clase que vamos a crear para el sensor SHT31 es la siguiente:

import board
import busio
import adafruit_sht31d
import logging


class Sht31:
    '''Lee todos los datos del sensor SHT31'''

    def __init__(self, address):

        try:

            i2c = busio.I2C(board.SCL, board.SDA)

            sensor = adafruit_sht31d.SHT31D(i2c, address)

            self.humedad = sensor.relative_humidity
            self.temperatura = sensor.temperature

        # Recoge el error de lectura del canal SDA
        except (ValueError, OSError):
            logging.error('El sensor SHT31 ha dejado de funcionar.')
            self.humedad = -100
            self.temperatura = -100

    def get_humedad(self):
        '''Devuelve la humedad en % sin decimales en String. Es necesario
        crear un constructor Sht31(address) para actualizar los datos'''

        return str(round(self.humedad))

    def get_temperatura(self):
        '''Devuelve la temperatura en ºC sin decimales en String. Es necesario
        crear un constructor Sht31(address) para actualizar los datos'''

        return str(round(self.temperatura))