Hallo Gemeinde,
ich bin Raspberry- und Python Neuling – eigentlich unterstütze ich nur seien Freund bei seinem ersten Projekt einer kleinen MSR Station.
Mein letztes Programmieren mit C und Java liegt Jahre zurück und ehe ich falsche oder schlechte Ratschläge gebe oder eine Käfer-Fabrik „MyBug4you“ eröffne .. dachte ich es wäre klüger im Forum zu fragen.
Das Projekt in Kurzform:
Temperaturmessung in eine CSV oder eine RoundRobin-Datenbank (RR wäre cool da es da auch code gibt um das grafisch aufzubereiten) von einem/mehreren 1-Wire Sensor DS1820 oder vergleichbar. Dazu ein paar Status-Leds und Taster für Start/Stop/Notiz
Da ich als Kind der C64 Generation über den PC vom Spaghetti Code zum Prozeduralen und zum OO gekommen bin habe ich zwar ein Grobkonzept im Kopf aber eben leider mehr aus der Hüfte geschossen und wäre dankbar wenn ich hier ein paar Hilfestellungen bekommen kann.
Da eine Messung alle 2-5 Sekunden mehr als ausreichend ist denke ich dass ic bei vielem nicht auf Speed setzen muss aber ich würde gerne sauber und modular arbeiten und sehe mich an der einen oder anderen Stelle noch ahnungslos ...
Ich mache hier mal ein ausführliches Posting was wir haben und gesehen aben und hoffe dass dann wenigstens nicht der Eindruck besteht dass wir eine fertige Lösung vom Forum erwarten; es geht um Angreungen und Hinweise worauf man achten sollte (neben der vermaledeiten Einrückung in Py)
Gedanklich bin ich etwa soweit:
# Declare - Inputs
#myTaster 1 – START Messung ; Wert = Pin
#myTaster 2 – Notiere zeitstempel in gesonderte Liste ;Wert = Pin
#myTaster 3 – Stoppt Messung ;Wert = Pin
#mySensor1 – DS1820 SigleWire Sensor Nr 1 ;Wert = BusIDNr
#mySensor..x – DS1820 SigleWire Sensor Nr ..x ;Wert = BusIDNr
# Declare – Outputs
#myLed1 – Messung Läuft ;Wert = Pin
#myLed1 – Messung spezieller Zustand erreicht ;Wert = Pin
#myLed3 – Taste Notiz getätigt ;Wert = Pin
#myLed4 – Messung beednet ;Wert = Pin
#myBuzzer1 – Signaltongeber aktivieren;Wert = Pin
Alles anzeigen
[u][i]procedure LedAn(Gpio-pin) [/i][/u]
..– setzt Pin auf true also an /false
[u][i]procedure LedAus(Gpio-pin)[/i][/u]
.. – setzt Pin auf false also aus
[u][i]procedure LedAnDauer(Gpio-pin,Dauer) [/i][/u]
..– setzt Pin auf true also an für Dauer X
[u][i]procedure BuzzerAn(Gpio-pin) [/i][/u]
..– setzt Pin auf true also an und gibt kurz ton über Piezzotongeber
[i][u]procedure TasterStatus(Gpio-pin)[/u][/i]
.. – liefert true oder false falls gedrückt nicht gedrückt.
.. - da keine Echtzeit nötig ist denke ich dass ich wir da nicht bis auf Interrupt ebene runter müssen.
procedure Sensorwert(Gpio-pin)
.. – liefert Sensorwert oder schon auf Grad Celsius umgerechnet (Faktor 1000?)
.. - da keine Echtzeit nötig ist denke ich dass ich wir da nicht bis auf Interrupt ebene runter müssen.
[i][u]procedure StarteMessung()[/u][/i]
.. – setze alle LEDs auf AUS
.. - Leere/initialisiere Variabeln
.. - speichere einen Zeitstempel TSTAMP_Messung_Start
.. - erzeuge eine Protokolldatei und eine Messwert-Datei mit dem Namen des Zeitstempels
.. .. - Speichre Zeit/Datum/ Sensorkennung, erste Messwerte
.. – setze LEDs Messung_Aktiv auf an
.. – kurzer Buzzer Ton
[u][i]procedure Messung(Sensor)[/i][/u]
.. - Leere/initialisiere Variabeln
.. - Lese Wert von SensorX
.. - update min/max/mittelwert für Sensor X
[u]procedure StoppeMessung()[/u]
.. – setze alle LEDs auf AUS
.. – setze LEDs Messung_Beendet auf an
.. – kurzer Buzzer Ton
.. - speichere alle Werte, in Datenbank/CSV, erstelle RR-DB Grafik versende ggf Dateien per Mail
Alles anzeigen
Meine Fragen sind aktuell insbesondere
(A)
Ein Problem sehe ich dabei, dass der Buzzer und die Notiz Led nur kurz aktiv sein sollen ich aber gerne die Messung weiter laufen lassen will. Als Hardware-Hack dachte ich an einen kleine Elko der per Transistor durchgeschaltet wird. Softwareseitig würde mir nur ein Zeitstempelvergleich einfallen wenn ich nicht die Messung für 2-5 Sekunden anhalten will (was im konkreten Fall noch ok wäre aber mir unsauber erscheint).
(B)
Ein Problem sehe ich dabei, dass ich nicht weiss ob ich in eine CSV mittels Datei-File-Write schreiben soll oder besser eine RR-DB nehme von der ich aber nicht weiß ob ich die dann zB in LibreCalc einlesen kann um noch mit den Werten zu arbeiten
(C)
Ein Problem sehe ich dabei, dass ich nicht weiß ob das mit den Prozeduren oder Funktionen in Python so machbar ist oder ob ich was übersehen habe; ich lese mich gerade seit ein paar Tagen ein nachdem ich diverse Codes ähnlicher Projekte gesehen habe und nun weiß was wir ungefähr wollen/brauchen
An Quellcodes habe ich mir u.a. folgendes angesehen:
für Die Messung selbst dachte ich etwa an den Code aus „http://www.netzmafia.de/skripten/hardw…rojekt-Onewire/“ allerdings müsste ich entweder dann am Ende die Daten filtern und sortieren oder jeden Sensor in eine eigene DB/CSV schreiben wenn ich mal mehr als einen verwende
#!/usr/bin/python
# -*- coding: utf-8 -*-
# 1-Wire Slave-Liste lesen
file = open('/sys/devices/w1_bus_master1/w1_master_slaves')
w1_slaves = file.readlines()
file.close()
# Fuer jeden 1-Wire Slave aktuelle Temperatur ausgeben
for line in w1_slaves:
# 1-wire Slave extrahieren
w1_slave = line.split("\n")[0]
# 1-wire Slave Datei lesen
file = open('/sys/bus/w1/devices/' + str(w1_slave) + '/w1_slave')
filecontent = file.read()
file.close()
# Temperaturwerte auslesen und konvertieren
stringvalue = filecontent.split("\n")[1].split(" ")[9]
temperature = float(stringvalue[2:]) / 1000
# Temperatur ausgeben
print(str(w1_slave) + ': %6.2f °C' % temperature)
Die Ausgabe dazu sieht bei mir so aus:
10-000802bf634d: 24.25 °C
10-000802cfb15d: 24.38 °C
Alles anzeigen
für den Taster dann an den Code von „https://www.xgadget.de/anleitung/rasp…r-anschliessen/“ anlehnen:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import RPi.GPIO as GPIO
# SET GPIO Button-Pin
gpio = 5
# Main Function
def main():
value = 0
while True:
if not GPIO.input(gpio):
value += 0.01
if value > 0:
if GPIO.input(gpio):
print "gedrueckt"
main()
time.sleep(0.03)
return 0
if __name__ == '__main__':
GPIO.setmode(GPIO.BCM)
GPIO.setup(gpio, GPIO.IN)
main()
Alles anzeigen
und für die LED dann nach dem Code von „http://technik.elbebilder.de/2014/12/28/sen…erry-pi-taster/“
toggle_led.py
import RPi.GPIO as GPIO
BUTTON = 23
LED = 24
led_on = False
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(BUTTON, GPIO.IN)
GPIO.setup(LED, GPIO.OUT)
def toggle_led(channel):
global led_on
led_on = not led_on
GPIO.output(LED,GPIO.HIGH if led_on else GPIO.LOW)
print "LED: ", led_on
GPIO.add_event_detect(BUTTON, GPIO.FALLING, callback=toggle_led, bouncetime=200)
try:
while True:
pass
except KeyboardInterrupt:
print "Ctrl-C - quit"
finally:
GPIO.cleanup()
Alles anzeigen
.. es wäre toll ein wenig Feedback und Anergungen zu bekommen
Danke schon vorab
Gruß
Mike
- EDIT: korrektes quoten mit dem CodeTag
- EDIT: procedure LedAnDauer() dazu
- EDIT: Name drunter