Senzor HTU21D - teplota a vlhkost

  • komunikuje skrze I2C
  • senzor teploty a vlhkosti
  • má integrované 4,7k pull up rezistory, takže není třeba přidávat rezistory k pinům na Raspberry PI
  • Tento I2C digitální vlhkoměr má perfektní přesnost ± 2 % při rozsahu 5 % až 95 % RH
  • Teplotu tento modul měří s přesností ± 1 ° C v širokém rozsahu od -30 ~ 90 °C.
  • Integrovaný stabilizátor na 3.3V I2C úroveň je samozřejmostí. Umožní Vám to bezpečně používat modul s jakýmkoliv mikrořadičem s 3,3V nebo 5V logikou.

Konkrétně jsem koupil tento senzor.

Přidávám odkaz na podrobnější datasheet k senzoru.

Rozhodl jsem se senzor vyzkoušet na Raspberry Pi. Použil jsem 3,3 V logiku. Tato dokumentace je pro Adafruit a jsou tam poznámky, které zatím neumím potvrdit, ale mohou později posloužit. Například:

Warning

This breakout board has built in 4.7k pull up resistors for I2C communications. If you're hooking up multiple I2C devices on the same bus, you may want to disable these resistors.

Warning

-SDA = A4 (use inline 10k resistor if your board is 5V)
-SCL = A5 (use inline 10k resistor if your board is 5V)

Nejprve aktivovat směrnici I2C.

raspi-config

Dále nainstalovat i2ctools:

apt install i2ctools
root@rpi:# i2cdetect -l                                       
i2c-1   i2c             bcm2835 (i2c@7e804000)                  I2C adapter
i2c-2   i2c             bcm2835 (i2c@7e805000)                  I2C adapter
root@rpi# i2cdetect -y 1             
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

Krok za krokem je to rozepsáno zde: https://www.instructables.com/Detect-Temperature-and-Humidity-With-Raspberry-Pi-/

Jednou z variant je postupovat podle návodu a stáhnout a zkompilovat program v C pro přístup k senzoru. V Githubu je vidět více senzorů v repozitáři - může sloužit pro inspiraci na další senzory. Nicméně při kompilaci jsem zjsitil, že využívá zastaralou knihovnu Wiringpi a měl jsem problém při kompilaci.

Poté jsem našel tento návod] a [[https://github.com/olegkutkov/allsky/tree/master/src/utils/htu21d|tady zdrojový kód.

git clone https://github.com/olegkutkov/allsky
cd allsky/src/utils/htu21d/
make
./read_htu21d

Kvůli tomu, že budu kód přenášet i na zařízení s Micropythonem, chtěl jsem si vytvořit vývojové prostředí pro Micropython.

apt-get install build-essential libreadline-dev libffi-dev git
git clone https://github.com/micropython/micropython.git
cd micropython/mpy-cross
make
cd ../ports/unix
make submodules
make
./build-standard/micropython
./build-standard/micropython cesta_k_vasemu_programu.py

Tak jsem sice nainstaloval Micropython, nicméně ukazuje se, že Micropython pro platformu UNIX nemá hardwarovou podporu, jako je I2C.

>>> import machine
>>> dir(machine)
['__class__', '__name__', '__dict__', 'PinBase', 'Signal', 'idle', 'mem16', 'mem32', 'mem8', 'time_pulse_us']                                                                                                     

Tudy tedy cesta nepovede a Micropython bude dávat opravdu smysl pro použití pouze na Espressobin a podobné mikropočítače:

Narazil jsem na tento článek o Circuitpython a mém senzoru. Když jsem zkoumal rozdíly mezi MicroPython a CircuitPython, tak jsem se dopátral, že MicroPython je odnoží MicroPythonu, který byl vytvořen firmou Adafruit s cílem vytvořit verzi Pythonu speciálně pro jejich řadu desek a s důrazem na výuku a snadnou obsluhu.

Na oficiální stránkách Circuitpython jsem našel podporu pro různé desky, ale schází mi tam Raspberry pi 1 až 3 a Espruino8266.

Nicméně když jsem četl dál, tak jsem se dočetl, že by mělo jít nainstalovat Adafruit_Blinka knihovna, která poskytuje CircuitPython podporu do Pythonu. Což by znamenalo, že bych mohl nainstalovat knihovny na Raspberry Pi a jednoduše používat senzor. Tak jsem to vyzkoušel.

apt install python3-pip
apt install python3-dev python3-setuptools python3-venv
pip3 install adafruit-circuitpython-htu21d

A opravdu, pak stačilo spustit jednoduchý kód a senzor funguje:

# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
# SPDX-License-Identifier: MIT
 
import time
import board
from adafruit_htu21d import HTU21D
 
# Create sensor object, communicating over the board's default I2C bus
i2c = board.I2C()  # uses board.SCL and board.SDA
# i2c = board.STEMMA_I2C()  # For using the built-in STEMMA QT connector on a microcontroller
sensor = HTU21D(i2c)
 
 
while True:
    print("\nTemperature: %0.1f C" % sensor.temperature)
    print("Humidity: %0.1f %%" % sensor.relative_humidity)
    time.sleep(2)

A tady je ještě repozitář od Adafruit - knihovna, kterou jsem instaloval pomocí pip3 - https://github.com/adafruit/Adafruit_CircuitPython_HTU21D/tree/main.

Posílání dat přes MQTT

pip3 install paho-mqtt

Musím počítat s tím, že mám self signed certifikát a tak musím přidat k TLS tuto část kódu: cert_reqs=ssl.CERT_NONE

import time
import board
import ssl
from adafruit_htu21d import HTU21D
 
# Create sensor object, communicating over the board's default I2C bus
i2c = board.I2C()  # uses board.SCL and board.SDA
# i2c = board.STEMMA_I2C()  # For using the built-in STEMMA QT connector on a microcontroller
sensor = HTU21D(i2c)
 
import json
import paho.mqtt.client as mqtt
 
CLIENT_NAME = "rpi_htu21d"
BROKER_ADDR = '192.168.1.120'
USER        = 'uzivatel'
PASSWORD    = 'supertajneheslo'
MQTT_TOPIC  = 'hajany/sensor/htu21d'
 
 
CA_CERT = "ca.crt"
CLIENT_CERT = "client.crt"
CLIENT_KEY = "client.key"
 
def on_connect(client, userdata, flags, rc):
    if rc == 0:
        print("Connected to MQTT broker!")
    else:
        print(f"Failed to connect, return code {rc}")
 
 
 
def connect_and_subscribe():
	client = mqtt.Client(CLIENT_NAME)
	client.on_connect = on_connect
	client.username_pw_set(USER, PASSWORD)
 
    # Setting TLS with the provided certificates and key
 
	client.tls_set(ca_certs=CA_CERT, certfile=CLIENT_CERT, keyfile=CLIENT_KEY, cert_reqs=ssl.CERT_NONE, tls_version=mqtt.ssl.PROTOCOL_TLSv1_2)
	client.connect(BROKER_ADDR, 8883, 60)  # Note: Using port 8883 for MQTT over SSL
	return client
 
 
def is_connected(client):
    try:
        client.publish("connection_test", "test", qos=1)
        return True
    except:
        return False
 
client = connect_and_subscribe()
 
while True:
	temperature = round(sensor.temperature,2)
	humidity = round(sensor.relative_humidity,2)
	data = {
		'temperature': temperature,
		'humidity': humidity
	}
 
	print(f"\nTemperature: {temperature:.1f} C")
	print(f"Humidity: {humidity:.1f} %")
 
	if not is_connected(client):
		client = connect_and_subscribe()
 
	try:
		client.publish(MQTT_TOPIC, json.dumps(data))
	except:
		print("Failed to send data. Reconnecting...")
		client = connect_and_subscribe()
 
	time.sleep(5)
  • it/iot/senzor-htu21d.txt
  • Poslední úprava: 2023/09/29 00:56
  • autor: Petr Nosek