Make Magazin 4/2016
S. 94
Anleitung
Aufmacherbild

Thermometer im Eigenbau

Hinter diesem analogen Ziffernblatt verbirgt sich ein vielseitiges Picaxe-Projekt zur Temperaturmessung. Statt Zeiger und Skala kann man auch ein LC-Display einsetzen. Und wer noch mehr machen möchte, baut daraus eine Uhr, einen Wecker oder ein Hygrometer.

Für komplexe Heimautomation sind die Picaxe-Chips eher nicht geeignet, weil sie zu wenig Rechenpower haben. Dafür lassen sich leicht eigene Sensorprojekte zusammenstecken und programmieren. Für ein Thermometer braucht man neben dem Chip und Temperatursensor nur einen Motor und eine Handvoll Bauteile, die in den meisten Bastelkellern rumliegen dürften. Mit wenig Aufwand entstehen auch andere nützliche Anzeigegeräte.

Temperatur auslesen

Für die Arbeit mit dem Picaxe bietet sich der Temperatursensor DS18B20 an. Er legt mit dem Befehl readtemp die in Grad Celsius gemessene Temperatur direkt in einem Byte im Speicher ab. Umständliche Berechnungen unter Berücksichtigung verschiedener Parameter, wie bei vielen anderen Sensoren notwendig, sind überflüssig. So lässt sich ganz einfach ein Thermometer bauen. Den Sensor gibt es in SMD- oder 3-Pin-Bauweise. Letzteren setzt man mit einem 4,7-Kiloohm-Widerstand auf eine kleinen Streifenleiterplatine oder ein Breadboard. Insgesamt drei Leitungen führen zum Entwicklungsboard: V+ an V, GND an G und data an Port C.4. Zunächst habe ich ein übersichtliches Programm aufgespielt, mit dem ich die Temperatur auslese.

Statt auf eine Lochstreifenplatine kann der Sensor auch auf ein Breadboard gesteckt oder direkt auf das Entwicklungsboard gelötet werden.

Listing 1

  1 symbol sensor = C.4
  2 symbol wert = b0
  3 
  4 main:
  5      readtemp sensor, wert
  6      sertxd ("Temperatur = ", #wert, " Grad Celsius" ,13)
  7      pause 5000
  8 goto main
Die Anschlüsse des 3-Pin-Sensors

Für die Ausgabe der Temperatur nutze ich den Befehl sertxd. Die Werte werden alle fünf Sekunden im Terminal angezeigt, das man unter PICAXE/Terminal aufruft. Dies funktioniert im Picaxe Windows-Editor und dem reduzierten Axepad für Mac OS X und Linux.

Zeiger und Skala bauen

Wer weiter ein Entwicklungsboard nutzt, braucht die 22-kOhm- und 10-kOhm-Widerstände, den 100-nF-Kondensator und den Audioanschluss nicht. Diese sind bereits auf dem Entwicklungsboard enthalten.

Unser Ziel ist aber ein vom PC unabhängiges Thermometer mit einer eigenen Skala. Ich habe alle Bauteile vom Programmieranschluss bis zum Temperatursensor auf eine kleine Platine (52 mm × 24 mm) gesetzt. Allein der Servo sitzt nicht auf der Platine, sondern ist an einer Plexiglasscheibe befestigt, die auf der Vorderseite die Temperaturskala trägt. Alternativ ist der Aufbau auf einem Steckbrett möglich (siehe Schaltplan).

Bei Verwendung einer Lochrasterplatine nicht vergessen, die Leiterbahnen unter dem IC-Sockel zu trennen!

Auf der Platine befindet sich unten rechts eine dreipolige Stiftleiste. Hier wird der Stecker der Servoleitung aufgesetzt. Bei dem von mir verwendeten Servo gilt folgende Zuordnung der Verbindungen: orange – pulse, rot – V+ und braun – GND. Der Jumper oben links dient als Ein-/Aus-Schalter. Weiterhin kann eine LED (am Pin C.1) als Einschaltanzeige in die Frontplatte eingesetzt werden. Die fertige Platine teste ich zunächst ohne Servo. Dazu übertrage ich das erste Listing erneut. Das Terminal zeigt die gemessenen Temperaturen an.

Der Servo

Nun geht es an den Servo. Im Modellbau werden mit den Steuerknüppeln der Fernsteuerungssender die Drehrichtung und der Drehwinkel der Servos bestimmt und damit die Modelle gelenkt oder bestimmte Funktionen ausgelöst. Der Drehbereich beträgt in der Regel 180 Grad. Innerhalb dieses Bereichs kann jede Position exakt angefahren und gehalten werden. Das Servo wird dazu mit Rechteckimpulsen mit einer Länge zwischen 0,75 und 2,25 Millisekunden versorgt, die alle 20 Millisekunden wiederholt werden.

Die Servoelektronik wandelt die Impulse in einen Spannungswert um und vergleicht ihn mit dem Spannungswert, den ein mit dem Servomotor mechanisch gekoppeltes Potenziometer einstellt. In einem Regelkreis werden Soll-Wert (vorgegebene Impulslänge) und Ist-Wert (Position des Motors und Potis) verglichen. Stimmen Soll und Ist nicht überein, wird entsprechend nachgeregelt.

Die Servos besitzen drei Anschlüsse – zwei für die Spannungsversorgung und eine Leitung für die Impulse. Wie das Schaltbild zeigt, ist die Impulsleitung (pulse) über einen Widerstand von 330 Ohm mit dem Picaxe-Pin C.2 verbunden. Häufig wird empfohlen, die Elektronik und den Servo aus getrennten Spannungsquellen zu versorgen, da einige Servos recht große Ströme ziehen und Störimpulse produzieren. Ich verzichte auf diese Maßnahme, da ich den Servo mit geringer Leistung verwende und er nur einen Zeiger bewegt. Sinnvoll ist der Elko (100 µF) an den Versorgungsanschlüssen. Da mit steigender Temperatur und zunehmender Impulsbreite der Zeiger weiter nach rechts ausschlagen soll, braucht man einen „rechtsdrehenden“ Servo.

Für die Picaxe-Controller gibt es zwei spezielle Servobefehle: Während der Befehl servo pin, pulse den gewählten Controller-Pin auf die Servo-Funktion vorbereitet und den Servo in die Startposition fährt, steuert der Befehl servopos pin, pulse den Servo in die gewünschte Position. Pulse ist eine Variable oder Konstante, die Werte zwischen 75 und 225 annehmen kann, entsprechend den Pulslängen 0,75 bis 2,25 Millisekunden. Die Impulslänge ergibt sich also aus dem pulse-Wert, multipliziert mit 0,01 Millisekunden.

Listing 2

  1 symbol pulse = w1
  2 servo C.2, 140
  3 
  4 main:
  5      pulse = 100
  6      servopos C.2, pulse
  7      pause 2000
  8      pulse = 140
  9      servopos C.2, pulse
 10      pause 2000
 11      pulse = 180
 12      servopos C.2, pulse
 13      pause 2000
 14 goto main

Die Skala

Eine Plexiglascheibe ist die Grundlage für die Skala. Als Erstes müssen an passender Stelle, abhängig von den Maßen des Servos, drei Löcher gebohrt werden: zwei für die Befestigung des Servos (2 mm Durchmesser) und eins für die Servoachse (6 mm Durchmesser). Die Skala habe ich mit dem Programm FrontDesigner gezeichnet. Eine kostenlose Alternative ist Inkscape. Der Winkel zwischen den Werten 0 und 40 Grad Celsius beträgt 90 Grad. Den Ausdruck auf Fotopapier habe ich aufgeklebt.

Hinter dem Thermometer verbergen sich das Picaxe-Board, der Servo und das Batteriepack.

Ein einfacher Zeiger ist schnell gezeichnet und ausgeschnitten. Er wird mit einer kleinen selbstschneidenden Schraube an die Servoachse geschraubt. Meine Halterung für die Plexiglasscheibe und Elektronik besteht aus Holzleisten. Zur Not kann auch eine CD-Hülle zweckentfremdet werden.

Jetzt geht es wieder ans Programmieren. Man muss herausfinden, bei welchen pulse-Werten das Servo den Zeiger auf 0, 20 und 40 Grad Celsius stellt. Hier hilft das zweite Listing, mit dem ich jeweils drei pulse-Werte gestestet habe.

Bei meiner Konstruktion wurden die gesuchten Temperaturen bei den pulse-Werten 100, 140 und 180 angezeigt. Für andere Skalen und andere Servos müssen die Werte entsprechend angepasst werden.

Tabelle: Temperatur
Um den Zeiger genau einzustellen, ermittele ich aus den gemessenen Temperaturen bei bestimmten pulse-Werten eine Funktion.

Listing 3

  1 symbol sensor = C.4
  2 symbol wert = b0
  3 symbol pulse = b1
  4 servo C.2,140
  5 
  6 main:
  7   readtemp sensor, wert
  8   pulse = 2 * wert
  9   pulse = pulse + 100
 10   servopos C.2, pulse
 11   pause 5000
 12 goto main

Auf dieser Grundlage habe ich mir mittels Tabellenkalkulation einen Graphen, seine Trendlinie und die Funktionsgleichung erstellt. Bei den vorliegenden, einfachen Zahlenverhältnissen ist das eigentlich unnötig, die Methode hat sich bei komplizierteren mathematischen Zusammenhängen aber mehrfach bewährt. Die Funktionsgleichung y = 2x + 100 entspricht pulse = 2 * wert + 100 und wird im Listing 3 in zwei Zeilen (8 und 9) aufgeteilt.

Digitales Thermometer

Um ein LC-Display zu verwenden, braucht man das Modul AXE 033.

Wer ein LC-Display vorzieht, kann zum Beispiel das serielle LCD-Modul AXE033 verwenden. Es müssen im seriellen Modus nur drei Leitungen gelegt werden. Zusätzlich zu den Verbindungen V+ und GND (Masse) wird die Datenleitung IN des Moduls am Picaxe-Port C.2 angeschlossen. Das Listing beschränkt sich auf die Messung positiver Celsius-Werte. Der Befehl serout überträgt die Daten zum Display-Modul: Mit serout lcd, rate, (254,1) wird ein leeres Display angezeigt, während serout lcd, rate, (254,128) wieder an Position 1 in der oberen Zeile springt. Der hexadezimale Wert $B2 lässt das Gradzeichen auf dem Display erscheinen.

Listing 4

  1 symbol sensor = C.4
  2 symbol lcd = C.2
  3 symbol wert = b0
  4 rate = N2400
  5 
  6 main:
  7      readtemp sensor, wert
  8      serout lcd, rate, (254,1)
  9      pause 30
 10      serout lcd, rate, (254,128)
 11      serout lcd, rate, ("Temperatur ", #wert,$B2, "C")
 12      pause 5000
 13 goto main

Das Modul kann auf der Unterseite mit einem Echtzeittaktgeber erweitert werden. Zur Anwendung kommt das IC DS1307. Im Bild ist auch das Potenziometer zu sehen, mit dem man den Kontrast der Anzeige einstellen kann. Die Anschlüsse LCD +/- ermöglichen die Hintergrundbeleuchtung. Eine Knopfzelle als Backup-Batterie erhält über mehrere Jahre das eingestellte Datum und die Uhrzeit.

Statt einem analogen Display kann man auch ein LC-Display nutzen.

Wenn man das Listing um serout lcd, rate,(0) hinter Zeile 11 ergänzt, werden neben der Temperatur auch das Datum und die Uhrzeit angezeigt. Vorher muss allerdings die aktuelle Uhrzeit eingestellt werden. Dazu dient das Listing 5. Das Modul lässt sich auch als Wecker programmieren. Dazu braucht es dann noch einen Buzzer, der Lärm macht.

Listing 5

  1 pause 500
  2 symbol lcd = C.2
  3 rate = N2400
  4 
  5 main:
  6      serout lcd, rate,(253, 0, "05/07/16 18:18 ")
  7      pause 1000
  8      serout lcd, rate, (0)
  9 goto main

Negative Temperaturen

Wer schließlich mit dem Sensor auch negative Temperaturen messen und auf dem LCD-Modul anzeigen möchte, nutzt das Listing 6. Wichtig zu wissen ist, dass die vom Befehl readtemp gemessene Temperatur in einem Byte im Speicher abgelegt wird. Ein Byte besteht aus 8 Bits, die von 0 bis 7 nummeriert sind. Die Bits 0 bis 6 enthalten bei positiven Temperaturen die Werte 0 bis 125, entsprechend 0 bis 125 Grad Celsius. Bei negativen Temperaturen werden stattdessen die Werte 0 bis 55 für 0 bis –55 Grad Celsius gespeichert. Das Bit Nummer 7 zeigt an, ob es gerade positive oder negative Temperaturen sind: Der Wert 0 steht für die positiven und 1 für die negativen Werte. Unter 0 Grad wird also die Temperatur plus 128 abgespeichert. Dies fragt die if-Bedingung ab. Schließlich muss der Temperaturwert vor der Ausgabe korrigiert werden (Zeile 15). hch

Listing 6

  1 symbol sensor = C.4
  2 symbol lcd = C.2
  3 symbol wert = b0
  4 rate = N2400
  5 
  6 main:
  7      readtemp sensor, wert
  8      serout lcd, rate, (254,1)
  9      pause 30
 10      serout lcd, rate, (254,128)
 11      if wert > 127 then negativ
 12      serout lcd, rate, ("Temperatur +",#wert,$B2, "C")
 13      pause 5000
 14 negativ:
 15      wert = wert - 128
 16      serout lcd, rate, ("Temperatur -",#wert,$B2, "C")
 17      pause 5000
 18 goto main