Posts by mobby

    Es gibt die Möglichkeit Interrupts zu verwenden. Würde ich dir auch raten. Polling frisst mehr Resourcen und bei hohen Auflösungen versagt es auch zunehmend. Zwei Abfragen gleichzeitig laufen lassen geht in Python mit Threads. Einfach mal einlesen. Wenn es dann zu konkreten Fragen kommt, kannst du ja noch mal schreiben.


    Zudem wurden beide Themen hier im Forum schon häufig bearbeitet, also auch da bietet sich die Suche an.

    F11:


    Ich würde hier einen klassichen Zweipunkt-Regler mit Hysterese bauen. Einfach mal googeln, dann wird das schon klappen. Und hier noch eine kleine Hilfestellung:


    [code=php]#!/usr/bin/env python
    # -*- coding: utf-8 -*-



    from time import sleep



    def get_puffer():
    return 40



    def get_ofen():
    return 60


    # hysterese
    hysterese = 2


    # limits für puffer
    set_point_1 = 40
    top_1 = set_point_1 + hysterese / 2
    bottom_1 = set_point_1 - hysterese / 2


    # limits für ofen
    set_point_2 = 60
    top_2 = set_point_2 + hysterese / 2
    bottom_2 = set_point_2 - hysterese / 2



    while True:
    if bottom_1 < get_puffer() < top_1 and bottom_2 < get_ofen() < top_2:
    print 'Pumpe an'
    sleep(1)



    [/php]


    Und gleich vorweg als Tipp. Um unnötige Schaltvorgänge zu minimieren solltest du dir den "Zustand" der Pumpe in einem Status-Objekt oder Ähnlichem merken.

    Mit dem Event kannst du die Threads sich von alleine beenden lassen, sobald das Script fertig ist, oder wenn allgemeinen ein Thread beendet werden soll. Dafür musst du die while True Ansätze aber natürlich auch so ändern wie oben beschrieben. Und ich hoffe, dass dein Code eingerückt ist, weil dein Posting sieht nicht so aus. Verwende dafür doch bitte die Code Funktion. Zudem würde ich das Objekt an die Funktionen übergeben. Aber wichtigste Frage, funkioniert es jetzt? ^^


    Für Flags über Threads hinweg setzen würde ich prinzipiell auch Objekte benutzen ...


    [code=php]class Status(object):
    def __init__(self, bol_status):
    self.status = bol_status


    def get_status(self):
    return self.status


    def set_status_on(self):
    self.status = True


    def set_status_off(self):
    self.status = False[/php]

    Du musst einen Thread starten, damit deine Prozesse gleichzeitg laufen können. Dann lässt du sie über ein Objekt wie folgendes Kommunizieren.


    [code=php]from threading import Lock



    class Counter(object):
    def __init__(self, value=0):
    self.value = value
    self.lock = Lock()


    def increase(self):
    with self.lock:
    self.value += 1
       
    def decrease(self):
    with self.lock:
    self.value -= 1


    def show_count(self):
    return self.value


    def get_and_reset(self):
    with self.lock:
    result = self.value
    self.value = 0
    return result[/php]


    Als Tipp noch, die Threads sollten sich selber beenden und nicht mit "Gewalt" von außen gekillt werden. Folgendes Stichwort:


    [code=php]from threading import Thread, Event



    event = Event()



    def function():
    while not event.wait(0.5):
    print 'Hello World!'



    def end_thread():
    event.set()



    thread = Thread(target=function)
    thread.setDaemon(True)
    thread.start()[/php]

    Wieso schreibst du drei Funktionen die das gleiche machen? Vielleicht noch mal mit Python-Basics vertraut machen. Zu deinem eigentlichen Problem, warum lässt du nicht einfach eine Schleife laufen, die sagen wir ein mal pro Minute die Temperatur ausliest und anschließend den "Wert" der Label-Objekte ändert. Hier mal eins meiner 1-Wire Temperatur Objekte.


    [code=php]class Temp(object):
    def __init__(self, sensor_ids, sensor_names):
    self.sensor_ids = sensor_ids
    self.sensor_names = sensor_names


    def read_temp(self, command):
    temps = []
    s_date = time.strftime('%d-%m-%Y')
    s_time = time.strftime('%H:%M:%S')
    for x in range(len(self.sensor_ids)):
    for y in range(4):
    with open('/sys/bus/w1/devices/{0}/w1_slave'.format(
    self.sensor_ids[x]), 'r') as w1_slave:
    file_content = w1_slave.readlines()
    if file_content[0].strip()[-3:] == 'YES':
    temps.append(float(file_content[1].strip()[-5:]) / 1000)
    break
    if y == 3:
    temps.append('n/a')
    else:
    time.sleep(0.25)
    if command == 'print':
    for x in range(len(self.sensor_ids)):
    print '{0}-{1}: {2}: {3}°C'.format(s_date, s_time,
    self.sensor_names[x],
    temps[x])
    elif command == 'return':
    return temps
    elif command == 'print_and_return':
    for x in range(len(self.sensor_ids)):
    print '{0}-{1}: {2}: {3}°C'.format(s_date, s_time,
    self.sensor_names[x],
    temps[x])
    return temps
    else:
    print 'no command selected'[/php]



    In deinem Beispiel würde es so geladen und abgerufen:
    [code=php]sensor_ids = ['28-03156396f9ff', '28-0315639b22ff', '28-021563812bff']
    sensor_names = ['Sensor_01', 'Sensor_02', 'Sensor_03']
    temp = Temp(sensor_ids, sensor_names)
    temp.read_temp('return')[/php]


    Den read-Befehl in eine Schleife packen und innerhalb der Schleife jedes mal den "Wert" des Label-Objektes anpassen. Das geht mit .set() Hoffe das war in etwa nach dem du gesuchst hast.

    ToTTy: Das Close-Event sollte innerhalb der MainWindow-Klasse definiert werden. Dann wird die Funktion automatisch abgerufen, wenn du das Fenster z.B. über das Kreuz oben rechts schließt. Prinzipiell würde ich den Code zum Importieren eines von QtDesigner exportierten Moduls so gestalten. (So steht es eigentlich auch in allen Tutorials/Lehrbüchern).


    Beispiel mit PySide, wobei qt_gui dein exportiertes QtDesigner Modul ist.


    Hoffe es hilft dir weiter.

    noisefloor: Habe es jetzt mal mit dem Raspberry Pi 2 ausprobiert, da dauerst es nur noch 5 Sekunden. Liegt wohl also wirklich an der Leistung. Zum Initiieren ist das für mich okay, wie lange es dann bei Sachen wie animation dauert muss man dann sehen ...

    Hi Leute,


    wenn ich versuche eine Grafik am Pi zu plotten, dann ist das Ergebnis geradezu erschreckend. (Setup: Raspberry Pi rev. B + SSH + Xming) Egal welche Bibliothek ich verwende, dauert es ca. 15 Sekunden bis der Plot erscheint. Woran liegt das? Ist die Hardware wirklich so schlecht, oder gibt es da einen Trick in irgend einer Konfiguration? Ich habe schon versucht den Memory Split auf ca. 50:50 zu legen, aber nach einigen Tests ergab sich kein Unterschied in der Geschwindigkeit egal wie viel Memory ich auf der GPU hatte.



    Hier die Code Beispiele:


    matplotlib:

    Code
    import matplotlib.pyplot as plt
    plt.plot([1,2,3,4])
    plt.show()


    pylab:

    Hey Leute,


    ich habe eine kleines Problem mit meinem X11-Forwarding. Wenn ich mein Python-Skript normal aufrufe, welches eine GUI enthält, funktioniert das ohne Probleme. Sobald ich aber sudo davor setze, erscheint folgender Fehler:


    Code
    PuTTY X11 proxy: wrong authorisation protocol attemptedTraceback (most recent call last):
      File "test.py", line 26, in <module>
        root = Tk()
      File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1712, in __init__
        self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
    _tkinter.TclError: couldn't connect to display "localhost:10.0"


    Ich habe schon etwas gesucht und bin auf einen Fix gestoßen, dass ich in die SSH-Config Datei (/etc/ssh/sshd_config) die Zeile ForwardX11Trusted yes hinzufügen muss. Wenn ich das mache kann ich mich aber gar nicht mehr per SSH auf dem Pi anmelden. Irgendjemand eine Lösung dafür? Schon mal danke im Voraus!


    Gruß
    mobby

    Hey Leute,


    ich möchte euch mein neustes Projekt vorstellen. Das Ganze befindet sich jedoch noch mitten in der Bearbeitung und ist keineswegs fertig! Allerdings habe ich inzwischen einen Stand erreicht, den ich gerne vorstellen würde. Sinn und Zweck, nein wartet, es hat keinen Sinn und auch (noch) keinen Zweck, es dient bisher einzig und allein dem Spaß an der Sache :D. Nichtsdestotrotz habe ich einen kleinen Versuchsstand gebaut, mit dem sich ein hydraulisches System mit einem Raspberry Pi Messen, Steuern und Regeln lässt.


    Aktuelle Systemübersicht (wird aktualisiert)
    [Blocked Image: http://www.ec-baran.de/forum/overview_small.jpg]


    Der Thread wird kontinuierlich erweitert und unterliegt folgender Struktur:

    • Hardware
    • Funktionen
    • Software
    • Aussicht


    1. Hardware
    Zu Beginn der eigentliche hydraulische Aufbau. Oben lässt sich das System befüllen und unten wieder entleeren. Momentan ist noch keine Entlüftung eingebaut, kommt noch. Links sind ein Durschlusssensor sowie ein elektrisches Magnetventil verbaut. Rechts ist momentan eine simple Eimerpumpe als "Ersatz-Umwälzpumpe" verbaut. Gesteuert wird der Aufbau mit einem Raspberry Pi inklusive PiFace. Dabei werden alle Komponenten durch eine Versorgungsbox gespeist. In diesem Kasten sind berührgesichert ein 5V sowie ein 24V Netzteil verbaut. Zudem wird über einen S0-Sensor der Stromfluss, der über die Box läuft, gemessen. Über die Schraubklemmen an der Seite des Kasten lassen sich Plus und Minus der 5V sowie 24V Versorgung abgreifen. Auch der S0-Ausgang kann an dieser Verbindung abgegriffen werden (momentan noch nicht angeschlossen). Das schwarze Kabel geht einfach auf 230V Schuko. Sobald mit dem Wipschalter eingeschalten wird, startet der Ventilator zur Kühlung. Zusätzlich ist ein Temperatursensor im Gehäuse verbaut, der über 1-Wire ausgelesen werden kann (auch momentan noch nicht angeschlossen). Die Pumpe wird über ein PWM-Modul mit Strom versorgt.


    Durchflusssensor und Magnetventil
    [Blocked Image: http://www.ec-baran.de/forum/left_small.jpg]


    Pumpe
    [Blocked Image: http://www.ec-baran.de/forum/right_small.jpg]


    Steuerung
    [Blocked Image: http://www.ec-baran.de/forum/control_small.jpg]


    Versorgungsbox
    [Blocked Image: http://www.ec-baran.de/forum/box_small.jpg]


    2. Funktionen
    Momenan lassen sich mittels Raspberry Pi der Durchfluss ermitteln, das Ventil auf und zu schalten sowie mit der Hand die Pumpe zwischen 0 und 100% regulieren.


    3. Software
    Die Steuerung und die Oberfläche sind mit Python Tkinter programmiert. Details zur Software folgen.


    4. Aussicht
    Im nächsten Schritt soll die Regelung der Pumpe vom Raspberry Pi aus erfolgen sowie der Temperatur- und S0-Sensor angeschlossen werden. Aus der Kombination von Sensor und Aktor soll dann mittels eines PI-Reglers eine Regelung nach Durchfluss-Sollwert realisiert werden. Zudem wird die Prozessleittechnik erweitert und optimiert. Die Bilder zur Benutzeroberfläche mit einbegriffen ;).



    Ich freue mich auf Feedback und Anregungen.


    Gruß
    mobby

    BlueDogi: Dein subprocess.Popen() ist falsch. Schau dir das Modul noch mal genau an.


    Script-1: test.py

    Code
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    print 'test'


    Script-2: start.py


    Mit python start.py wird das Skript test.py ohne Schwierigkeiten ausgeführt.

    Tell: Zu Punkt 1, das war nur ein Tippfehler von mir. Da läuft schon das richtige Skript. Zu Punkt 2, gute Idee, werde ich nachher mal ausprobieren. Das komische ist nur, dass es mit dem Bash-Script geht. Beide haben nämlich auch die gleichen Rechte. Also chmod +x wurde schon gesetzt.

    Hey Leute,


    ich versuche eine Weboberfläche mit CGI zu realisieren. Standard Funktionen laufen super. Nur wenn ich mein PiFace ansteuern möchte funktioniert das nicht. Verwende ich ein Bash-Script geht es allerdings ... woran liegts?


    Bash-Script: script.cgi

    Bash
    #!/bin/bash
    gpio -p write 201 1


    http://IP-Adresse/cgi-bin/script.cgi lässt das Relays einschalten. Alles ok!


    Python-Script: script.py


    http://IP-Adresse/cgi-bin/script.py gibt mir diesen Fehler aus:



    Liegt wohl irgendwie an dem Initialisierungsprozess des PiFaces. Hat das schon mal jemand gelöst? Ps.: Der Code direkt am Pi ausgeführt funktioniert natürlich auch in Python.


    Vielen Dank für Rückmeldung.


    Gruß
    mobby

    Ich will 24V einer Pumpe schalten. Ich weiß, dass man das auch relativ einfach selber bauen kann, aber wenn das ferige Bauteil 5-10 Euro kostet ... naja dann nehme ich ehrlich gesagt lieber das fertige und spare mir die Zeit des Zusammenbaus. Habe den Artikel inzwischen auch bei Amazon (Affiliate-Link) gefunden.