Senzor HTU21D - teplota a vlhkost
Parametry senzoru
- komunikuje skrze I2C
- senzor teploty a vlhkosti
- destička 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.
Instalace na Raspberry Pi
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)
Zapojení senzoru
Aktivace I2C na Raspberry PI
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-/
Program v C
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
Instalace Micropython na Raspberry Pi 1
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:
Instalace knihoven pro Python (Circuitpython) na Raspberry Pi
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)