====== Senzor HTU21D - teplota a vlhkost ====== ===== Parametry senzoru ===== * 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 [[https://dratek.cz/arduino/52399-i2c-senzor-teploty-a-vlhkosti-gy-213v-htu21d.html|tento senzor]]. Přidávám odkaz na [[https://cdn-shop.adafruit.com/datasheets/1899_HTU21D.pdf|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. [[https://learn.sparkfun.com/tutorials/htu21d-humidity-sensor-hookup-guide|Tato dokumentace]] je pro Adafruit a jsou tam poznámky, které zatím neumím potvrdit, ale mohou později posloužit. Například: 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. -SDA = A4 (use inline 10k resistor if your board is 5V) -SCL = A5 (use inline 10k resistor if your board is 5V) ==== Zapojení senzoru ==== {{:it:iot:pasted:20230928-181216.png?400}} zdroj: https://www.instructables.com/Detect-Temperature-and-Humidity-With-Raspberry-Pi-/ ==== 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 [[https://www.instructables.com/Detect-Temperature-and-Humidity-With-Raspberry-Pi-/|podle návodu]] a stáhnout a zkompilovat program v C pro přístup k senzoru. V Githubu je vidět více [[https://github.com/leon-anavi/rpi-examples.git|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 [[https://olegkutkov.me/2018/02/21/htu21d-raspberry-pi/|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: * https://learn.adafruit.com/micropython-hardware-i2c-devices/i2c-main * https://github.com/Kleity/HTU21D-Micropython-ESP32 * https://github.com/flrrth/pico-htu21d/tree/main * https://docs.micropython.org/en/latest/develop/gettingstarted.html#source-control-with-git * https://learn.sparkfun.com/tutorials/htu21d-humidity-sensor-hookup-guide ==== Instalace knihoven pro Python (Circuitpython) na Raspberry Pi ==== Narazil jsem na [[https://learn.adafruit.com/adafruit-htu21d-f-temperature-humidity-sensor/python-circuitpython|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 [[https://circuitpython.org/downloads|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)