ich bin ziemlicher Anfänger mit Python. Ich habe bisher hauptsächlich unter Windows programmiert (Java, C#). Jetzt habe ich gerade ein kleines Projekt umgesetzt und dabei hauptsächlich Codesnippets zusammengepastet. Ich verstehe was mein Programm macht, würde es aber gerne optimieren. Dafür fehlt mir allerdings die Python Erfahrung. Vielleicht könnt ihr mir hier ja weiterhelfen.
Folgendes Szenario:
Ich betreibe ein embedded Debian auf einer SheevaPlug. Daran angebunden ist ein Arduino Uno der bisher nichts weiter tut, als über einen Sensor die Raumtemperatur auf den Serial Port zu schreiben.
Mein Python Programm liest diesen Sensor aus und schreibt jede Minute die aktuelle Zeit + Temperatur in eine Datei. Diese Datei lese ich über meinen Webserver aus. Mit einem Javascript generiere ich mir dann eine hübsche Kurve. Das funktioniert auch soweit, aber wie gesagt, alles nur ein bisschen zusammengeschustert. Ich würde das jetzt gerne "schön" machen.
Hier das aktuelle Python Script:
Code: Alles auswählen
import datetime
import threading
import serial
import time
class Arduino(threading.Thread):
def run(self):
f = open('/var/www/values', 'a')
now = datetime.datetime.now()
self.ser = serial.Serial('/dev/ttyACM0', 9600, timeout=15)
while 1:
self.ser.flushInput()
data = self.ser.readline().strip()
if data:
timestamp = time.strftime("%m, %d, %Y %H:%M:%S", time.localtime())
f.write(timestamp + ";" + data.strip() + "\n")
f.flush()
time.sleep(60)
def main():
ard = Arduino()
ard.start()
main()
1. Wenn ich den Arduino von der Plug abziehe, soll das Programm nicht stoppen. Stattdessen soll das Programm so lange die Schnittstelle abfragen, bis der Arduino wieder steckt. (Vielleicht über Exception Handling?)
2. Wie man sieht, startet das Programm einen Thread. Wenn ich das Programm über "python readserial.py" ausführe, kann ich keine weitere Eingabe in der Konsole vornehmen. Schließe ich mein SSH Fenster, wird das Programm beendet. Ich umgehe das bisher, indem ich das Programm in einer Screen Session ausführe. Das fühlt sich aber irgendwie "falsch" an. Gibt es da einen eleganteren Weg?
Das sind erst einmal die beiden main issues. Sollten euch weitere Verbesserungsvorschläge einfallen, bin ich dem gegenüber nicht abgeneigt. In jedem Fall schon einmal danke fürs durchlesen