In diesem Kapitel werden angesprochen
- Auslesen einer Sensor-Adresse bei 1-Wire Betrieb
- DS18B20-Modul (Temperatur, 1-Wire Bus)
- DHT11-Modul (Temperatur, Feuchtigkeit)
- LM34 und TMP36 Sensor (Temperatur) mit Steckbrettaufbau
Module sind immer herstellerspezifisch aufgebaut und können sich deshalb - bei gleicher
Namensbelegung - voneinander unterscheiden. Vor dem Aufbau einer Schaltung ist das Studium der zugehörigen Datenblätter deshalb unerlässlich.
Etwas Theorie vorweg
Ein 1-Wire Bus beschreibt eine serielle bidirektionale Schnittstelle (entwickelt von der Fa. Dallas Semiconductor Corp. -> Analog
Devices -> Maxim), die mit nur einem Draht, mit einer Datenader (DQ), auskommt, die als Stromversorgung, aber auch als Sende- und Empfangsleitung genutzt wird. Das gilt allerdings nur für 1-Wire
Objekte, die über eine eigene Stromversorgung verfügen. Hinzu kommt noch eine Masse-Verbindung, deshalb ist der Begriff 1-Wire etwas irreführend.
Das in den folgenden Übungen benutzte DS18B20-Modul (s. Abb. 1) verfügt über keine eigene Stromversorgung. Der Sensor
DS18B20 wird über zwei Leitungen (VCC und GND) mit Strom versorgt. Die dritte Leitung (1-Wire) dient als Datenleitung.
Über einen Pull-up Widerstand zwischen Datenleitung und VCC (hier: 4k7 bei 5V Betriebsspannung) wird die Datenleitung auf HIGH gezogen und so die
Störanfälligkeit verringert. Als Richtwert gilt, dass mindestens 1mA durch den Pull-up Widerstand fließen soll. Die Datenübertragung erfolgt asynchron (ohne Übertragung eines
Taktsignals).
Jeder 1-Wire Sensor besitzt eine einzigartige 64-Bit ROM Adresse über die er über den Datenbus angesprochen werden kann. In Übung 1 wird gezeigt, wie
sich die Adresse eines 1-Wire-Sensors (hier: eines DS18B20) auslesen und im Terminalfenster darstellen lässt.
Übung 1 - Auslesen einer 1-Wire-Adresse
1 - Pflichtenheft oder Was soll die Schaltung können?
- Die Adresse eines DS18B20 Sensors des gleichnamigen Moduls wird ausgelesen und im
Terminalfenster angezeigt.
2 - Material
- Arduino- oder Arduino kompatibles Board (Ard-Board)
- Steckbrett und Steckdraht (Ma-Ma)
- DS18B20 Modul
- Arduino IDE und Visuino auf dem Rechner bereits installiert
3 - Anschlussbelegung - DS18B20-Modul -> Ard-Board
- G -> GND
- R -> 3,3V ... 5V -> +5V wg. des Vorwiderstands von 4k7 Ohm
- Y -> D2
Abb. 1
Auf dem DS18B20-Modul ist eine LED und ein 4k7 Pull-up Vorwiderstand für das Bussignal bereits vorhanden. Die LED leuchtet bei Datenabruf
kurz auf.
Abb. 2
Schaltungsaufbau DS18B20 Modul und Ard-Board. Der gelbe Steckdraht ist mit D2 auf dem Ard-Board verbunden; die Spannungsversorgung erfolgt über die Steckdrähte grün
(+5V) und blau (GND).
4 - Objektanordnung
Schritt 1 - Ard-Board festlegen
Starte das Programm Visuino und wähle in der Kopfzeile des Arduino-Blocks über das Werkzeug-Icon ganz rechts das eingesetzte Ard-Board
aus.
Schritt 2 - Objekte auswählen
Gib in Filtersuche "ds18b" ein, wähle das Objekt "MAXIM 1 Wire Thermometer" (s. Abb. 3) und ziehe es in die Arbeitsfläche.
Abb. 3 - Filtersuche in der Komponentenpalette
Schritt 3 - Objekte verbinden
Verbinde in der Arbeitsfläche die entsprechenden Elemente des Arduino-Blocks mit dem Objekt Thermometer1 (s. Abb. 4):
- Thermometer1 OneWire -> Digital Digital[2]
- Thermometer1 Address -> Serial Serial[0]
- Speicher das Programm ab.
Schritt 4 - Display Elemente und Eigenschaften des DS18B20-Moduls festlegen
- Keine Veränderungen nötig.
Abb. 4 - Visuino Blockschaltung
Schritt 5 - Kompilieren und Hochladen des Programmcodes
-
Öffne unten rechts durch Anklicken des roten Buttons das Arbeitsmenü, klicke den Reiter "Build" und anschließend den Button "Compile/Build and
Upload" an. Wenn kein Fehler aufgetreten ist, wird das Programm nach kurzer Zeit in den Controller geladen sein und eine Adresse im Terminalfenster der Arduino IDE ausgegeben (s. Abb.
5). Viel Spaß beim Experimentieren!
Terminalausgabe in der Arduino IDE
Abb. 5 - Ausgabe der 64-Bit ROM Adresse (8 Byte hexadezimal codiert) eines 1-Wire Sensors (DS18B20) im Terminalfenster der Arduino IDE.
Übung 2 - Temperatur messen mit einem DS18B20 Modul (1-Wire)
1 - Pflichtenheft oder Was soll die Schaltung können?
- Mit einem DS18B20 Modul wird die Temperatur ermittelt und auf einem 4-zeiligen LCD I2C Display
ausgegeben.
2 - Material
- wie in Übung 1 plus 4-zeiliges LCD I2C Display
3 - Anschlussbelegung - DS18B20-Modul -> Ard-Board
Anschlussbelegung - LCD I2C Display -> Ard-Board
- GND -> GND
- VCC -> +5V
- SDA -> SDA
- SCL -> SCL
4 - Objektanordnung
Schritt 1 - Ard-Board festlegen
Starte das Programm Visuino und wähle in der Kopfzeile des Arduino-Blocks über das Werkzeug-Icon ganz rechts das eingesetzte Ard-Board aus. Bei mir,
wie gehabt, ein Arduino UNO WiFi Rev2.
Schritt 2 - Objekte auswählen
- Gib in Filtersuche "LCD" ein, wähle das Objekt "LCD I2C" (s. Abb. 3) und ziehe es in die
Arbeitsfläche.
- Gib in Filtersuche "ds18" ein, wähle das Objekt "Maxim 1-Wire Thermometer" und ziehe es in die Arbeitsfläche (s. Abb.
3).
Schritt 3 - Objekte verbinden
Verbinde in der Arbeitsfläche die entsprechenden Einheiten des Ard-Blocks mit den Objekten LCD1 und Thermometer1 (s. Abb.
5):
- Thermometer1 OneWire -> Digital Digital[2] Ard-Block
- Thermometer1 Out-> In TextField2 LiquidCrystalDisplay1
- LCD1 Out -> In Serial[0](9600) Ard-Block
- Speicher das Programm ab.
Abb. 5 - Blockaufbau mit einem DS18B20 Modul und einem 4-zeiligen LCD I2C Display
Elemente eintragen im
LiquidChristalDisplay1
- Öffne mit einem Doppelklick im Objekt LCD1 das Fenster Elements.
- Mit einem Doppelklick auf TextField im rechten Fenster kopiere TextField1 ins rechte Fenster.
Wiederhole diesen Vorgang noch zweimal.
- Verfahre genauso mit CustomCharacterField (1x) und DefineCustomCharacter (1x) (s. Abb.
6).
Abb. 6 - Eintragungen im Fenster Elements.
- Öffne mit einem Klick im Objekt LCD1 das Fenster Eigenschaften und dort
Elements und DefineCustomCharacter1. Klicke rechts in das Feld Pattern und öffne den Pixel-Editor (s. Abb. 7).
Abb. 7 - Pixel Editor
Das Sonderzeichen "Grad" kann hier definiert werden, indem man den Cursor an die Stelle führt, wo ein Pixel gesetzt werden soll und anschließend die Leertaste
drückt.
Beendet wird die Sitzung mit OK-
Schritt 4 - Eigenschaften der Module LCD und DS18B20 festlegen
- Im Fenster Eigenschaften des DS18B20-Moduls lassen sich folgende Einstellungen vornehmen (s.
Abb. 8)..
Abb. 8 - Fenster Eigenschaften des DS18B20 Moduls
Es lassen sich sowohl Grenzwerttemperaturen (Alarm Low, Alarm High) als auch die Angabe in Fahrenheit oder Grad Celsius festlegen.
Die maximale Auflösung des ADC beträgt 12 Bit (Voreinstellung), sie lässt sich ebenfalls verändern.
- Im Fenster Eigenschaften des LCD1-Moduls lassen sich Einstellungen für alle eingetragenen
Elemente vornehmen (s. Abb. 9). Versuche selbst eine Lösung zu finden für eine Darstellung auf dem LCD, wie sie Abb. 10 zeigt.
Abb. 9 - Fenster Eigenschaften für den LCD1 Block
Hier erscheinen alle eingetragenen Elemente. Ein Klick auf das blaue Quadrat öffnet das Eigenschaftsfenster des Elements.
Abb. 10 - Eine mögliche Darstellung der Temperatur auf einem LCD. Das Sonderzeichen "Grad" oder "°" erscheint vor dem C.
Übung 3 - Temperatur messen mit einem DHT11-Modul
1 - Pflichtenheft oder Was soll die Schaltung können?
- Mit einem DHT11-Modul wird die Temperatur ermittelt und auf einem 4-zeiligen LCD I2C Display
angezeigt. Zusätzlich kann in einer weiteren Übung auch die Messung der Feuchtigkeit hinzugenommen werden (wird hier nicht gezeigt).
2 - Material
- Arduino- oder Arduino kompatibles Board (Ard-Board)
- Steckbrett und Steckdraht (Ma-Ma)
- DHT11-Modul
- Arduino IDE und Visuino auf dem Rechner bereits installiert
3 - Anschlussbelegung - DHT11-Modul (s. Abb. 11) -> Ard-Board
- GND -> GND
- +5V -> 5V
- Data -> D2
Anschlussbelegung - LCD I2C Display -> Ard-Board
- GND -> GND
- VCC -> +5V
- SDA -> SDA
- SCL -> SCL
Abb. 11 - Anschlussbelegung eines DHT11 Moduls
4 - Objektanordnung
Schritt 1 - Ard-Board festlegen
Starte das Programm Visuino und wähle in der Kopfzeile des Arduino-Blocks über das Werkzeug-Icon ganz rechts das eingesetzte Ard-Board aus. Bei mir,
wie gehabt, ein Arduino UNO WiFi Rev2.
Schritt 2 - Objekte auswählen
- Gib in Filtersuche "LCD" ein, wähle das Objekt "LCD I2C" (s. Abb. 3) und ziehe es in die
Arbeitsfläche.
- Gib in Filtersuche "dht11" ein, wähle das Objekt "Humidity and Thermometer ..." und ziehe es in die
Arbeitsfläche.
Schritt 3 - Objekte verbinden
Verbinde in der Arbeitsfläche die entsprechenden Punkte des Ard-Blocks mit den Objekten LCD1 und HumidityThermometer1 (s. Abb.
12):
- HumidityThermometer1 Temperature -> In TextField1 LCD1-Block
- HumidityThermometer1 Humidity(%) -> In TextField2 LCD1-Block
- HumidityThermometer1 Sensor -> Digital Digital[2] Ard-Block
- LCD1 Out -> In I2C I2C-Channels Ard-Block
- Speicher das Programm ab.
Abb. 12 - Objektanordnung von LCD I2C mit DHT11 Modul und Ard-Board
Schritt 4 - Eigenschaften der Module LCD und DHT11 festlegen
- Im Fenster Eigenschaften des DHT11-Moduls kann von °C (Voreinstellung) auf Fahrenheit
umgeschaltet werden..
- Ähnlich wie in Schritt 4 der Übung 2 lassen sich die Eigenschaften der Elemente des Objekts LCD
verändern. Ggf. sollte dort noch einmal nachgeschaut werden.
- Die LCD-Ausgabe kann wie in Abb. 10 gestaltet sein oder - als kleine Übung - wie in Abb. 13, mit Angabe von Temperatur und rel.
Feuchte(%).
Ausgabe der Messwerte auf einem LCD
Abb. 13 - Temperatur und relative Feuchte in % gemessen mit einem DHT11; Ausgabe auf einem 4-zeiligen
LCD.
Übung 4 und 5 - Temperatur messen mit einem LM34 und TMP36 GZ
Etwas Theorie vorweg
Bei der LM34/35-Serie handelt es sich um Präzisions-Temperatursensoren mit integrierten
Schaltkreisen, deren Ausgangsspannung linear proportional zur Fahrenheit-Temperatur ist.
Eigenschaften (Auszug aus dem Datenblatt des LM34)
Linearer Skalierungsfaktor: +10,0 mV/°F
Genauigkeit : 1,0 °F (bei +23 °C)
Messbereich : -50°F ... +300°F
Stromaufnahme : < 90 μA
Eigenschaften (Auszug aus dem Datenblatt des TMP36)
Linearer Skalierungsfaktor: +10,0 mV/°C
Genauigkeit : +/-1,0 °C (bei +25 °C)
Messbereich : -40°C ... +125°C
Stromaufnahme : < 50 μA
Bevor die Temperatur in Celsius angeben werden kann, muss zunächst die analoge Ausgangsspannung UF bestimmt werden. Es gilt:
- UF verhält sich zu 5V wie URohwert zu 1024 (wg. 10-Bit
ADC)
Die Ausgangsspannung UF errechnet sich bei einer Referenzspannung von 5V dann über die Gleichung:
- UF = URohwert * 5/1024 V oder UF =
URohwert * 488.28125 mV (1)
- Bei meinen Versuchen betrug die Referenzspannung 4,77V, deshalb ändert sich der Faktor in (1) bei meinen Berechnungen auf
465,82031.
Der Wert von UF in der Einheit mV gibt gleichzeitig die Temperatur in °F bei einem LM34 an, wenn man ihn mit 100 multipliziert.
Mithilfe der Gleichung
- UC = (UF - 32) * 0,556 (2)
lässt sich der Temperaturwert UF auf einen Wert in °C umrechnen.
Mit einer einfachen Analogmessung am Data-Pin eines spannungsversorgten LM34 lässt sich sofort die Temperatur in °F bzw. bei einem
TMP36 in °C ablesen. Angezeigt sind im Bild links etwa 0,72V oder 720 mV bei einem LM34.
10mV entsprechen 1°F (s. Datenblatt);
720 mV entsprechen 72 °F oder 22 °C.
1 - Pflichtenheft oder Was soll die Schaltung können?
- Mit einem LM34 werden die Rohdaten aufgenommen, dann in Grad Fahrenheit und schließlich in Grad Ceslsius umgerechnet
und die jeweiligen Ergebnisse auf einem 4-zeiligen LCD I2C Display angezeigt.
- Der LM34 und der TMP36 sind pinkompatibel. Tausche sie
aus. Die Anpassung der Blöcke mit ihren Elementen und Eigenschaften (wird hier nicht mehr gezeigt) müssen selbst durchgeführt werden.
2 - Material
- siehe Übung 3; statt DHT11 wird zuerst ein LM34 genommen. Wenn das Ergebnis aus dem Pflichtenheft erreicht wurde, kann der LM34
gegen einen TMP36 ausgetauscht und die entsprechenden Blöcke mit ihren Eigenschaften unter Visuino angepasst werden.
3 - Anschlussbelegung - LM34 bzw. TMP36 (s. Abb. 14) ->
Ard-Board
- GND -> GND
- +5V -> 5V
- Data -> A0
Anschlussbelegung - LCD I2C Display -> Ard-Board
Abb. 14 - Pinbelegung LM34 DZ. Der Sensor ist pinkompatibel mit einem TMP36.
4 - Objektanordnung
Schritt 1 - Ard-Board festlegen
Starte das Programm Visuino und wähle in der Kopfzeile des Arduino-Blocks über das Werkzeug-Icon ganz rechts das eingesetzte Ard-Board aus. Bei mir,
wie gehabt, ein Arduino UNO WiFi Rev2.
Schritt 2 - Objekte auswählen
- Gib in Filtersuche "LCD" ein, wähle das Objekt "LCD I2C" (s. Abb. 3) und ziehe es in die
Arbeitsfläche.
Schritt 3 - Objekte verbinden
Verbinde in der Arbeitsfläche die entsprechenden Elemente des Ard-Blocks mit dem Objekt LCD1 (s. Abb. 15). Füge vorher in LCD1 die Elemente
TextField1 und AnalogField1 ein:
- LCD1 Out -> In I2C I2C-Channels Ard-Block
- Speicher das Programm ab.
Abb. 15 - Visuino Objektanordnung für die Rohdatenausgabe eines LM34 bzw. TMP36 GZ auf einem LCD I2C Display
Schritt 4 - Eigenschaften der Elemente im Fenster Eigenschaften festlegen
Abb. 16a - Visuino LCD I2C Properties Elements TextField1 für Rohdatenausgabe LM34
- AnalogField1.Einstellungen
Abb. 16b - Visuino LCD I2C Properties Elements AnalogField1 für Rohdatenausgabe LM34
Ausgabe der Rohdaten auf einem LCD I2C
Abb. 17 - LCD I2C Ausgabe der Rohdaten eines LM34. Angezeigt wird eine Zahl ; sie entspricht einem Spannungswert zwischen 0V und 5V, ermittelt über einen 10-Bit
ADC.
Rohdaten in °F umrechnen
Dazu muss die Blockschaltung aus Abb. 15 um einen Baustein erweitert werden, der den Rohwert mit einem festen Zahlenwert 488.28125 (s. Formel (1)) vor der Ausgabe auf dem LCD
multipliziert.
- Gib in Filtersuche "multiply" ein, wähle aus dem Fenster "analog" das Objekt "Multiply Analog By Value" (s. Abb. 18) und
ziehe es in die Arbeitsfläche.
Abb. 18
Filtersuche in der Komponentenpalette mit "Analog" und dem Objekt "Multiply Analog By Value".
- Ergänze die Objektanordnung (s. Abb. 15) wie in Abb. 19 gezeigt und gib im Fenster Eigenschaften des Objektes
MultiplyByValue im Feld Value den Wert 488.28125 ein. Speichere das Programm ab.
Abb. 19 - Das Objekt MultiplyByValue1 wird zusätzlich eingefügt.
Datenausgabe auf einem LCD I2C
Abb. 20 - LCD I2C Ausgabe der Rohdaten eines LM34 und die Temperatur in Grad Fahrenheit.
- Zur Darstellung der Temperatur in °C wird Formel (2) benutzt. Dazu muss der Block AddValue1 in die Blockstruktur eingefügt (s. Abb. 22) und
die Eigenschaft entsprechend Formel (2) eingetragen werden.
- Es müssen weitere Elemente in den Block LCD1 eingetragen und im Fenster Eigenschaften des Objektes LCD1 entsprechend
angepasst werden (s. Abb. 22).
- Nach Abspeichern der Objektanordnung und Starten des Programms werden auf dem LCD I2C die Rohdatenmesswerte und die daraus errechnete Temperatur angezeigt (s.
Abb. 21):
Abb. 21 - Aus den Rohdaten wird die Temperatur in °C errechnet und auf einem 4-zeiligen LCD I2C dargestellt.
Abb. 22 - Objektanordnung zur Berechnung der Temperatur in °C mit einem LM34 bzw. TMP 36GZ, dargestellt auf einem LCD I2C 4-zeilig.
Anpassung des Visuino Programms für einen TMP36 Sensor
Nachdem das Pflichtenheft für einen LM34 erfüllt wurde, wird der LM34 gegen einen pinkompatiblen TMP36 getauscht.
Die Anpassung der Blöcke und Elemente mit ihren Eigenschaften (s. Abb. 23 - 25) erfolgt nach den gleichen Methoden, wie in den vorherigen Übungen bereits gezeigt. Das Ergebnis mit einem
TMP36 könnte auf einem LCD I2C dann so aussehen (s. Abb. 26):
Abb. 23
Eintragungen im Fenster Elements von LCD1
Abb. 24
Eintragungen in Properties Elements TextField1 und TextField2 von LCD1
Abb. 25
Eintragungen in Properties Elements AnalogField1 und AnalogField2 von LCD1.
Abb. 26
Mögliche Darstellung für einen TMP36 Sensor auf einem LCD I2C.