Raspberry Pi Pico und das 35 in 1 Sensors Kit in MicroPython - Teil 3 - AZ-Delivery

Im ersten Teil dieser Blogreihe haben wir die GPIOs als Ausgang für LEDs, Buzzer und Relais kennengelernt. Im zweiten Teil ging es um die Programmierung der GPIOs als Eingang für Taster und Sensoren. Nun widmen wir uns den besonderen Sensoren, die an definierte elektronische Schnittstellen angeschlossen werden. Im Sensor-Kit enthalten sind die Temperatursensoren DHT11

und DS18B20. Bei der Gelegenheit behandeln wir dann den DHT22 gleich mit. Und schließlich betrachten wir noch das Bauteil, das aussieht und ggf. auch angewendet wird wie ein Potentiometer, aber keines ist: der Rotary Encoder bzw. wenig zutreffend auf Deutsch der Drehschalter, Drehencoder oder Drehwinkelcodierer.

Benötigte Teile (wie in Teil 1)

1

Raspberry Pi Pico oder Pico W

1

35 in 1 Sensor Kit

alt

16 in 1 Sensor Kit

1

Steckbrett/Breadboard oder Half-Breadboard

Jumperkabel, Taster/Button

Widerstände 220 bis 330 Ω, 1 kΩ, 4,7 kΩ, 10 kΩ

optional

weitere Sensoren oder Displays


Temperatursensor DS18B20

Beginnen wir mit dem Temperatursensor DS18B20, den es in verschiedenen Bauformen gibt. Die Urform ähnelt einem kleinen Transistor in einem schwarzen Gehäuse mit drei Beinchen. Im Sensor-Kit ist das Bauteil zusammen mit einer LED und dem Vorwiderstand auf einer kleinen Platine aufgelötet. Mein Favorit sind die wasserdichten, in einem Edelstahlgehäuse eingesetzten Sensoren mit einem ca. 1 m langen Kabel.


Alle werden gleich angeschlossen und in das Programm eingebunden. Man benötigt allerdings zwei MicroPython-Module, die unter dem Menüpunkt Werkzeuge/Verwalte Pakete … heruntergeladen werden: onewire und ds18b20.

Der Name Eindrahtbus (onewire) verwirrt etwas, weil das Bauteil schließlich drei Anschlüsse hat, aber zwei dienen der Spannungsversorgung mit 3,3V und GND. Das (meist) gelbe Kabel dient der Datenübertragung und wird an einen beliebigen GPIO-Pin angeschlossen. Das Signal ist weder digital (High oder Low) noch analog (Spannung zwischen 0 und 3,3V), sondern es handelt sich um ein Übertragungsprotokoll mit vielen Bits und Bytes, die man z.B. mit dem Logic Analyzer und dem dazugehörigen Programm anschauen kann. Die Auswertung erfolgt mit Hilfe der Module, so dass das Programmbeispiel sehr kurz ausfällt.

 from machine import Pin
 from onewire import OneWire
 from ds18x20 import DS18X20
 import utime as time
 
 
 one_wire_bus = Pin(13)     # beliebiger Pin, PULL_UP im Modul OneWire
 sensor_ds = DS18X20(OneWire(one_wire_bus))
 devices = sensor_ds.scan()
 
 
 while True:
     sensor_ds.convert_temp()
     time.sleep(1)
     # Sensoren abfragen
     for device in devices:
         print('   Sensor:', device)
         print('Temperatur:', sensor_ds.read_temp(device), '°C')
     print()
     time.sleep(5)


Zwei Anmerkungen: Erstens wird häufig beschrieben, dass der Signal-Pin über einen Pull-up-Widerstand von 4,7 kOhm mit Vcc verbunden werden soll. Das kann entfallen, weil hier der interne Pull-up-Widerstand für den gewählten Pin im Modul aktiviert wird. Zweitens kann man mehrere DS18B20 parallelschalten und den Temperaturwert über eine eindeutige Kennung dem jeweiligen Sensor zuordnen. Siehe hierzu das Programmbeispiel, bei dem insgesamt drei Sensoren angeschlossen sind.

Temperatursensor DHT11

Ebenfalls nur drei Pins hat der kombinierte Temperatur- und Luftfeuchtigkeitssensor DHT11. Auch hier soll der Signal-Pin über einen Pull-up-Widerstand von 10 kOhm mit Vcc verbunden werden. Dieser ist allerdings auf der kleinen Platine bereits eingelötet und somit hier verzichtbar. Zusätzlich kann man den internen Pull-up-Widerstand bei der Instanziierung des Sensors aktivieren:

from dht import DHT11
dht11_sensor = DHT11(Pin(13, Pin.IN, Pin.PULL_UP))

Oberes Bild: DHT11 auf Mini-Platine; die Zahl 34 bezieht sich auf den Abschnitt im eBook Sensor-Kit mit Arduino.
Unteres Bild: Installation des Pakets (Modul) dht für DHT11 und DHT22

from machine import Pin
import utime as time
from dht import DHT11

dht11_sensor = DHT11(Pin(13, Pin.IN, Pin.PULPP_UP))      #data pin = GP13
time.sleep(1)

while True:
   dht11_sensor.measure()
   t = dht11_sensor.temperature()
   rH = dht11_sensor.humidity()
   print("         Temperature: ", t, "°C")
   print("rel. Luftfeuchtigkeit: ", rH, "%")
   print()
   time.sleep(5)    #Sleep for five seconds

Temperatursensor DHT22 (nicht enthalten)

Nicht im Sensor-Kit, aber mit dem gleichen Python-Modul im Programm einzubinden, ist der Sensor DHT22. Äußerlich dem DHT11 sehr ähnlich, jedoch mit weißem Gehäuse und vier Pins, von denen allerdings einer nicht belegt ist.


Wie man in der Programm-Bibliothek (Modul dht.py) erkennen kann, ist der DHT22 genauer in der Auflösung. Temperatur und rel. Luftfeuchtigkeit werden jeweils in zwei Registern abgespeichert, anstatt in einem Register wie beim DHT11. Das führt zu Messergebnissen mit einer Kommastelle.

Bild: Ausschnitt aus dem Modul dht.py, Berechnung der rel. Luftfeuchtigkeit und der Temperatur

Hier eine Beispielprogramm zum DHT22:

from machine import Pin
import utime as time
from dht import DHT22


dht22_sensor = DHT22(Pin(13, Pin.IN, Pin.PULPP_UP))      #data pin = GP13
time.sleep(1)


while True:
   dht11_sensor.measure()
   t = dht22_sensor.temperature()
   rH = dh221_sensor.humidity()
   print("         Temperature: ", t, "°C")
   print("rel. Luftfeuchtigkeit: ", rH, "%")
   print()
   time.sleep(5)    #Sleep for five seconds

Ebenfalls den beiden genannten DHT 11 und 22 äußerlich ähnlich, jedoch mit einem schwarzen Gehäuse, ist der DHT 20. Dieser funktioniert mit einer I2C-Schnittstelle und benötigt eine andere Bibliothek, die man nicht in der Paketverwaltung unter Thonny findet, sondern auf Github: https://github.com/flrrth/pico-dht20.

Den DHT 20 haben wir bei Aufnahme in das Sortiment ausführlich getestet und in einem Blog beschrieben (mit Arduino-IDE und Logic Analyzer):

DHT20 - ein neuer Temperatur- und Luftfeuchtigkeitssensor

In einem weiteren Blog wird der DHT 20 am Raspberry Pi Pico W mit Micro Python verwendet:

Raspberry Pi Pico W mit BME280 und OLED in Thonny und MicroPython

Rotary Encoder (Drehgeber, Drehschalter)

Das letzte, noch nicht betrachtete Bauteil aus dem Sensor-Kit ist der Rotary Encoder

Drehgeber sind mechanische Geräte, die ein wenig wie Potentiometer aussehen und häufig an deren Stelle verwendet werden. Sie liefern jedoch keine analogen Werte, die einer bestimmten Position zugeordnet werden können und besitzen keine Endanschläge. Meist erkennt man sie daran, dass sie nach einer kleinen Drehung scheinbar einrasten, man kann jedoch mühelos weiterdrehen. Ich habe bei meinem Rotary Encoder 20 „Klicks“ bei einer Umdrehung gezählt, also 360°/20=18° von Einrastposition zu Einrastposition.

Innerhalb dieser 18°-Drehung passiert das, was zum gewünschten Effekt führt. In jeder der 20 Einrastpositionen liegt über die Pull-up-Widerstände von 10 kOhm die Spannung Vcc=3,3V an den Kontakten DT und CLK an. Dazwischen werden diese Kontakte unterschiedlich mit Masse verbunden, erst einer, dann beide, dann nur der andere. Aus dieser Abfolge wird nicht nur die Drehung an sich erkannt, sondern auch die Drehrichtung. Wie gut, dass es für die Erkennung und Auswertung Mikrocontroller und passende Programm-Bibliotheken für Arduino-IDE und MicroPython gibt.

Der Vollständigkeit halber: Wenn man den Rotary Encoder nicht dreht, sondern hineindrückt, wird der Kontakt SW gegen Ground geschaltet, also ein simpler Taster (Button), wie im zweiten Teil beschrieben. 

Hier nun der Link zur Programm-Bibliothek auf Github und ein Beispielprogramm:

https://github.com/miketeachman/micropython-rotary

# MIT License (MIT)
# Copyright (c) 2021 Mike Teachman
# https://opensource.org/licenses/MIT
# example for MicroPython rotary encoder


from rotary_irq_rp2 import RotaryIRQ
import time


r = RotaryIRQ(pin_num_clk=13,
             pin_num_dt=14,
             min_val=0,
             max_val=19,
             reverse=True,
             range_mode=RotaryIRQ.RANGE_WRAP)
val_old = r.value()


while True:
   val_new = r.value()


   if val_old != val_new:
       val_old = val_new
       print('result =', val_new)


   time.sleep_ms(50)

Damit haben wir alle Teile des 35 in 1 Sensor-Kits mit dem Raspberry Pi Pico unter MicroPython angewendet. Arduino-IDE-Anwender finden Erklärungen und Programmbeispiele in dem (m.E.) sehr guten eBook, das auf der Produktseite heruntergeladen werden kann.

In Verbindung mit den vorherigen Blog-Beiträgen zum Raspberry Pi Pico können Sie Ihre Messergebnisse auf einem kleinen LCD- oder OLED-Display anzeigen oder im heimischen WLAN bereitstellen. Viel Spaß bei Ihren Projekten, ich „stürze“ mich als nächstes auf den SD-Card-Reader, um meine Messergebnisse aufzuzeichnen.

Hier noch einmal unsere bisherigen Beiträge zum Thema Pico/Pico W:

Projekte für anfängerRaspberry pi

Lascia un commento

Tutti i commenti vengono moderati prima della pubblicazione