In dem Projekt Analoge Digitaluhr nutzen wir den Schrittmotor um die Minuten mit einem Zeiger darzustellen. Man kann damit aber natürlich auch noch andere Dinge darstellen. Zum Beispiel die aktuelle Temperatur.
Das Skript das wir dazu nutzen ist mit dem für die Uhr sehr ähnlich. Wir werden also nicht mehr genau drauf eingehen, wie die steueerung des Schrittmotors funktioniert. Du kannst das allerdings auch einfach online nachlesen: Uhr1 .
Um die aktuelle Temeratur zu messen, nutzen wir den DS18B20 Sensor. Mit diesem Sensor haben wir schon im Starterkit gearbeitet, wenn dir das neu ist, kannst du also auch dazu alles nochmal nachlesen: Starterkit15 .
Wenn wir beide Skripte kombinieren, sieht das fertige Skriptzum Beispiel so aus:
import time
import glob
import motor
import RPi.GPIO as gpio
path = "/sys/bus/w1/devices/"
sensor_path = glob.glob(path + "28*")[0]
sensor_data_path = sensor_path + "/w1_slave"
def read_temperature():
file = open(sensor_data_path, "r")
rows = file.readlines()
file.close()
return rows
def get_temperature_in_degree():
rows = read_temperature()
while rows[0].strip()[-3:] != 'YES':
time.sleep(0.2)
rows = read_temperature()
equals_pos = rows[1].find('t=')
if equals_pos != -1:
temp_string = rows[1][equals_pos+2:]
temp_c = float(temp_string) / 1000.0
return temp_c
motor.setup()
current_position = 0
def set_motor(value):
global current_position
move = value - current_position
motor.move(move)
current_position = value
try:
while True:
temp = get_temperature_in_degree()
set_motor(int(temp*4))
print(temp)
time.sleep(2)
except KeyboardInterrupt:
motor.move(-current_position)
gpio.cleanup()
In dem Skript importieren wir zu Beginn alle Bibliotheken, die wir in den anderen beiden Skripten auch nutzen. Danach initialisieren wir den Sensor und übernehmen die beiden Funktionen read_temperature()
und get_temperature_in_degree()
von dem Skript für den Temperatursensor.
Jetzt führen wir die motor.setup()
Funktion aus und setzen die Variable current_position
auf 0.
Bevor wir zum eigentlichen Teil kommen, definieren wir uns noch eine Funktion set_motor(value)
welche für uns nachher den Motor auf eine bestimmte Position setzen kann, indem sie die Schritte berechnet, die sich der Zeiger bewegen muss:
In Zeile 30 legen wir fest, dass wir die globale Variabe current_position
in der Funktion nuzen wollen. In der nächsten Zeile, berechnen wir die Schritte, die der Motor sich bewegen muss, damit der Zeiger auf der neuen Position landet und speichern diesen Wert in der Variable move
. Dann führen wir die Funktion motor.move()
aus und übergeben dabei die Variable move. Jetzt müssen wir am Ende der Funktion nur noch den neuen Wert auch in der Variable current_position
speichern.
Jetzt müssen wir nur noch alle Funktionen, die wir definiert haben, auch anwenden. Das machen wir in einer while(True)
-Schleife. Diese befindet sich in einem try
-Block. Zunächst holen wir uns mit der Funktion get_temperature_in_degree()
die Aktuelle Temperatur in speichern diese in der Variable temp
. Darauf nutzen wir die Funktion set.motor()
und übergeben den Wert. Vorher multiplizieren wir den Wert allerdings mit 10, da die Schritte von dem Motor sonst winzig wären. So ist die Anzeige später auch genauer. Weil der Wert allerdings ein float – also eine Kommazhl ist und der Motor keine halben Schritte mahcen kann, müssen wir vorher noch den Wret mit der Funktion int()
in ein Integer umwandeln. Jetzt können wir uns die aktuelle Temperatur noch mit print(temp)
in die Konsole schreiben lassen und warte darauf 2 Sekunden. In dem except Block Bewegen wir den Zeiger wieder auf die Nullposition indem wir die Funktoin motor.move()
aufrufen und den negaiven Wret von current_position
einsetzen. und heben die GPIO Pinbelegung auf Fertig!
Bevor du das Skript aber richtig nuzten kannst willst du wahrscheinlich noch Markierungen setzen, damit du mit dem Zeiger die Temperatur leichter ablesen kannst. Wie du den Zeiger auf die Nullposittion setzen kannst haben wir ja schon bei Uhr1 besprochen. Nämlich indem du das Skript motor.py
im Terminal aufruftst und die Anzahl an Schritten eingibst, die der Motor machen soll. (Nutze negative Zahlen, wenn du den Motor andersherum bewegen möchtest.)
So bewegst du den Zeiger 10 Schritte:
python3 motor.py 10
Navigiere den Zeiger also zuerst auf den Nullpunkt – also da, wo du auf deiner Skala 0 Grad Celsius haben möchtest. Mache dort einen kleinen Strich. Da wir ja vorhin den Faktor 10 verwendet haben, entsprechen 10 Schritte genau ein Grad Celsius. Du kannst deinen Zeiger also nun immer 10 Schritte laufen lassen und einen Kleinen Strich machen. Alle 5 Striche könntest du dann z.B. die entsprechende Temeratur eintragen. Ganz wie du willst.
Bevor du nun dein Skript startest, musst du allerdings den Zeiger vorher wieder auf Null setzen. Das Skript startest du so:
python3 analog_temp.py