Relais mit Durchflussmesser stoppen

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Soink
User
Beiträge: 7
Registriert: Donnerstag 19. Dezember 2019, 14:19

Moin, Moin,

vorab ich bin ein absoluter Anfänger (NOOB) in Sachen Python und dem Pi, wollte aber ein kleines Projekt für mich starten, indem ich eine Flüssigkeit mit Hilfe einer Pumpe, in 100ml Flaschen abfüllen kann. Dafür habe ich mir dank Forensuche, Suchmaschinen und Videoportale etwas kleines basteln können (nicht schön, aber es funktioniert bedingt).

Die Pumpe wird mittels eines Befehls gestartet und läuft 100 sek. und stoppt dank "TIME" danach. Nur wenn der Schlauch nicht richtig liegt, kommen mal mehr und auch mal weniger als 100ml raus.

Nun dachte ich mir, dass ich das Stoppen nicht mehr über die Time Funktion mache sondern über einen Durchflussmesser, welcher nach 100ml dem Relais den Befehl gibt, die Pumpe auszuschalten.

Auf der Suche nach dem richtigen Code hab ich mehrere Stunden verbracht und nichts passendes gefunden, welches ich mir "zurechtbasteln" könnte. Viele Scripte mit Mengenangaben, aber welche mich nicht Interessen, da ich es nicht sehen muss wie viel durchgelaufen ist. Mir würde es reichen wenn das Relais nach der angegebenen Menge einfach die Pumpe ausschaltet.

Ich bin auch noch in einem anderen Forum angemeldet, doch richtig Helfen kann oder will mir da keiner. Mich hat da jemand auf den Weg gebracht über die Zählung von Interrrupts zum Ziel zu kommen, dafür bin ich auch sehr Dankbar, doch leider klappt das bei mir nicht.

Anbei mal der Code den ich gebastelt habe.

Über eure Hilfe wäre ich sehr dankbar.

Code: Alles auswählen

from tkinter import*
from tkinter import ttk
import tkinter.font
import RPi.GPIO as GPIO
import time
from tkinter import PhotoImage
from time import sleep

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(27, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

root = Tk()
myFont = tkinter.font.Font(family = 'Helvetica', size = 16, weight = 'bold')
root.title("Füllen")
root.geometry('310x405')
root.configure(background="black")

impulse = 0

    
def Pump():
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(17,GPIO.OUT)
    GPIO.output(17,GPIO.LOW)
    if impulse == 50:
        GPIO.output(17,GPIO.HIGH)
        GPIO.cleanup()
        
def Interrupt(channel): 
            global impulse
            impulse = impulse + 1
            

button1 = Button(font = myFont, text="Start der Pumpe", bd=0, command=Pump)
button1.place(x = 50, y = 70, width=203, height=330)

exitb = tkinter.Button(root, font = myFont, text="EXIT Programm", bd=0, command=quit)
exitb.place(x = 5, y = 5, width=300, height=60)

GPIO.add_event_detect(27, GPIO.RISING, callback = Interrupt, bouncetime =10)

root.mainloop()
    
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich habe das mal einmal ueberarbeitet. Probier das mal aus, ich habe keinen PI hier, und erst recht keinen Durchflussmesser. Bei Fehlern bitte den GESAMTEN Fehler posten.

Code: Alles auswählen

import tkinter as tk
import tkinter.font
import RPi.GPIO as GPIO
import queue
from functools import partial

PUMP_PIN = 17
FLOWMETER_PIN = 27
PULSE_COUNT = 50
STOP_TIMER_TIMEOUT = 500  # ms


def start_pump():
    GPIO.output(PUMP_PIN, GPIO.HIGH)


def stop_pump():
    GPIO.output(PUMP_PIN, GPIO.LOW)


def flowmeter_callback(pulse_queue, channel):
    pulse_queue.put(True)


def gpio_setup(pulse_queue):
    GPIO.setwarnings(False)
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(FLOWMETER_PIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
    GPIO.setup(PUMP_PIN, GPIO.OUT)
    GPIO.output(PUMP_PIN, GPIO.LOW)
    GPIO.add_event_detect(
        FLOWMETER_PIN,
        GPIO.RISING,
        callback=partial(flowmeter_callback, pulse_queue),
        bouncetime=10
    )


def pump_stop_timer_callback(root, pulse_queue):
    if pulse_queue.qsize() >= PULSE_COUNT:
        while not pulse_queue.empty():
            pulse_queue.get()
        stop_pump()

    root.after(
        STOP_TIMER_TIMEOUT,
        lambda: pump_stop_timer_callback(root, pulse_queue)
    )


def main():
    pulse_queue = queue.Queue()
    gpio_setup(pulse_queue)

    root = tk.Tk()
    myFont = tkinter.font.Font(family='Helvetica', size=16, weight='bold')
    root.title("Füllen")
    root.geometry('310x405')
    root.configure(background="black")

    button1 = tk.Button(font=myFont, text="Start der Pumpe", bd=0, command=start_pump)
    button1.place(x=50, y=70, width=203, height=330)

    exitb = tk.Button(root, font=myFont, text="EXIT Programm", bd=0, command=quit)
    exitb.place(x=5, y=5, width=300, height=60)

    pump_stop_timer_callback(root, pulse_queue)

    root.mainloop()


if __name__ == '__main__':
    main()
Soink
User
Beiträge: 7
Registriert: Donnerstag 19. Dezember 2019, 14:19

Vielen Vielen Dank für die schnelle und ausführliche Hilfe.

DAS IST DER KNALLER

Ich werde direkt eine Rückinfo geben sobald ich wieder am Pi bin.

Lieben Dank
Sirius3
User
Beiträge: 18264
Registriert: Sonntag 21. Oktober 2012, 17:20

@Soink: Zu Deinem Code. *-Importe sind schlecht, weil man sich unkontrollierbar Namen in den eigenen Namensraum schaufelt. `as` ist zum Umbenennen da, GPIO wird aber gar nicht umbenannt.
time, sleep, PhotoImage und ttk werden importiert, aber nicht benutzt.
Warnungen sind dazu da, sie zu beheben, und nicht um sie zu ignorieren. Dazu muß man aber sicher am Ende GPIO.cleanup aufrufen. setmode und cleanup sollten nicht irgendwo mitten im Code stehen.
Pin-Nummern sollten als Konstanten am Anfang der Datei stehen, damit man sie einfach ändern kann und innerhalb des Programms weiß, um was es sich handelt.
Aller ausführbarer Code gehört in Funktionen; benutze keine globalen Variablen.
`place` sollte man nicht benutzen, da sie je nach Display zu unterschiedlichen, zum Teil unbenutzbaren GUIs führt, besser pack oder grid benutzen.
Variablennamen sollten aussagekräftig sein, und keine Abkürzungen enthalten. exitb -> exit_button, button1 -> start_pump_button, myfont -> button_font.
Benutzeravatar
noisefloor
User
Beiträge: 4187
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

falls jemanden die (hardware-technische) Vorgeschichte interessiert: Link zum Raspi-Forum.

Gruß, noisefloor
Soink
User
Beiträge: 7
Registriert: Donnerstag 19. Dezember 2019, 14:19

@Sirius3: Lieben Dank für die Erklärung, jetzt wird mir einiges klarer wie man auch einen Code als absoluter Laie lesen kann. Ich werde die Tipps beim nächsten Versuch auf jeden Fall berücksichtigen.
Es hilft mir auch das Geschriebene von __deets__ ein wenig zu verstehen.

Ist halt mein erster Versuch in python. bzw. in einer Programmiersprache.

Schön das hier einem auch mit Beispielen "wie mache ich es richtig" geholfen wird.
Soink
User
Beiträge: 7
Registriert: Donnerstag 19. Dezember 2019, 14:19

__deets__ hat geschrieben: Donnerstag 19. Dezember 2019, 15:30 Ich habe das mal einmal ueberarbeitet. Probier das mal aus, ich habe keinen PI hier, und erst recht keinen Durchflussmesser. Bei Fehlern bitte den GESAMTEN Fehler posten.

Nabend, ich habe es jetzt mal ausprobiert und konnte alles anschließen.

Es kommt keine Fehlermeldung aber das Relais schaltet sich nicht aus. wahrscheinlich habe ich in der Hardware einen Fehler. Ich suche mal danach.
Bild
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du kannst mal ein print einbauen in das callback für den Durchflussmesser. Wenn das kommt, ist der nächste Schritt die Timer Funktion.
Soink
User
Beiträge: 7
Registriert: Donnerstag 19. Dezember 2019, 14:19

Leider kommt keine Anzeige. Ich hätte mal Elektrotechnik und Programmieren studieren sollen :-)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

🤷🏼‍♂️ Verkabelung und Eingänge prüfen. Da gibts vielleicht generische Tools um zu schauen wie die Eingänge gerade sind. Oszi bemühen. Etc.
Soink
User
Beiträge: 7
Registriert: Donnerstag 19. Dezember 2019, 14:19

Habe einem Freund schon bescheid gegeben der Oszilloskope und der gleichen hat. Ich vermute mal das am Signalpin nichts ankommt. ist vielleicht auch defekt das Bauteil, besorge mir nochmal sicherheitshalber einen günstigen Durchflussmesser als vergleich.
Soink
User
Beiträge: 7
Registriert: Donnerstag 19. Dezember 2019, 14:19

Sobald das passiert ist gebe ich Rückmeldung. Wünsche bis dahin schöne und besinnliche Festtage.
Antworten