2017-07-02 5 views
-2

Ich habe einen Raspberry Pi und mit Python habe ich eine GUI geschrieben, um einen Lüfter mit PWM zu steuern und die RPM aus dem gepulsten Lüfterausgang herauszuarbeiten. Die GUI hat oben eine Beschriftung, Tasten zur Auswahl verschiedener Tastverhältnisse, eine LED-Logo-Anzeige zur Anzeige, welche Taste ausgewählt ist, Tasten zu 'STOP FAN', 'Exit', 'Display RPM'.Wie man ein ständig aktualisierendes Etikett in Python erstellt

Ich starte den Ventilator mit dem 'Start Fan' Knopf. Ich kann dann verschiedene Arbeitszyklen wählen. Wenn ich auf die Schaltfläche "RPM anzeigen" klicke, zeigt die Beschriftung oben auf der GUI die RPM an (mit vielen Zahlen nach der Dezimalstelle), es ist nur eine kurze Momentaufnahme der RPM. Mein Code läuft in Ordnung.

Meine Frage ist dies. Wie bekomme ich das Etikett, um die wechselnden RPM ständig anzuzeigen? Ich würde gerne die Schaltfläche "Display RPM" entfernen und einfach nur das Etikett mit den sich ständig ändernden RPM-Werten anzeigen lassen. Ich habe mehrere Stunden lang nach Hilfe gegoogelt und 'nachher', 'Funktionsaufrufe' usw. ausprobiert. Aber ich kann nicht begreifen, was ich tun soll oder wo im Code es hingehen soll.

Vielen Dank im Voraus für Ihre Zeit und Hilfe. Der Code ist vielleicht nicht der beste, den ich kenne, aber ich lerne. Ich werde gerne Vorschläge zur Verbesserung annehmen.

# Fan PWM Control 
import time 
from time import sleep 
import piface.pfio as pfio 
pfio.init() 

import RPi.GPIO as GPIO 
GPIO.setmode(GPIO.BOARD) 
GPIO.setup(7,GPIO.OUT) 
GPIO.setup(18,GPIO.IN,pull_up_down=GPIO.PUD_UP) 
my_pwm = GPIO.PWM(7,1000) 
last_time = time.time() 
this_time = time.time() 
RPM = 0 


from Tkinter import * 

import Tkinter as tk 

a=0 

class App: 

    def __init__(self, master): 
      self.master=master 
      frame = Frame(master) 
      frame.pack() 

      self.TACHO = Label(frame, text=RPM) 
      self.TACHO.grid(row=0, column=0) 

      self.button0 = Button(frame, text='Start Fan', command=self.convert0) 
      self.button0.grid(row=2, column=0) 
      self.LED0 = Label(frame, image=logo2) 
      self.LED0.grid(row=2, column=1) 

      self.button1 = Button(frame, text='Fan 30% Duty Cycle', command=self.convert1) 
      self.button1.grid(row=3, column=0) 
      self.LED1 = Label(frame, image=logo2) 
      self.LED1.grid(row=3, column=1) 

      self.button2 = Button(frame, text='Fan 45% Duty Cycle', command=self.convert2) 
      self.button2.grid(row=4, column=0) 
      self.LED2 = Label(frame, image=logo2) 
      self.LED2.grid(row=4, column=1) 

      self.button3 = Button(frame, text='Fan 60% Duty Cycle', command=self.convert3) 
      self.button3.grid(row=5, column=0) 
      self.LED3 = Label(frame, image=logo2) 
      self.LED3.grid(row=5, column=1) 

      self.button4 = Button(frame, text='Fan 75% Duty Cycle', command=self.convert4) 
      self.button4.grid(row=6, column=0) 
      self.LED4 = Label(frame, image=logo2) 
      self.LED4.grid(row=6, column=1) 

      self.button5 = Button(frame, text='Fan 90% Duty Cycle', command=self.convert5) 
      self.button5.grid(row=7, column=0) 
      self.LED5 = Label(frame, image=logo2) 
      self.LED5.grid(row=7, column=1) 

      self.button6 = Button(frame, text='Fan 100% Duty Cycle', command=self.convert6) 
      self.button6.grid(row=8, column=0) 
      self.LED6 = Label(frame, image=logo2) 
      self.LED6.grid(row=8, column=1) 

      self.button7 = Button(frame, text='STOP FAN', command=self.convert7) 
      self.button7.grid(row=9, column=0) 

      self.button8 = Button(frame, text='Exit', command=self.convert8) 
      self.button8.grid(row=10, column=0) 


      self.button9 = Button(frame, text='Display RPM', command=self.Tach) 
      self.button9.grid(row=11, column=0) 


    def convert0(self): 

      print('Fan 15% Duty Cycle') 
      global a 
      a = 1 
      self.button0.config(text='Fan 15% Duty Cycle') 
      self.LED0.config(image = logo) 
      my_pwm.start(15) 
      pfio.digital_write(0,1) #turn on 
      self.LED1.config(image = logo2) 
      self.LED2.config(image = logo2) 
      self.LED3.config(image = logo2) 
      self.LED4.config(image = logo2) 
      self.LED5.config(image = logo2) 
      self.LED6.config(image = logo2) 
      pfio.digital_write(1,0) #turn off 
      pfio.digital_write(2,0) #turn off 
      pfio.digital_write(3,0) #turn off 
      pfio.digital_write(4,0) #turn off 
      pfio.digital_write(5,0) #turn off 
      pfio.digital_write(6,0) #turn off 
      pfio.digital_write(7,0) #turn off 


    def convert1(self): 

     if a==0: 

      print('Please Start the Fan') 

     else: 

      print('Fan 30% Duty Cycle') 
      self.button1.config(text='Fan 30% Duty Cycle') 
      self.LED1.config(image = logo) 
      my_pwm.ChangeDutyCycle(30) 
      pfio.digital_write(1,1) #turn on 
      self.LED0.config(image = logo2) 
      self.LED2.config(image = logo2) 
      self.LED3.config(image = logo2) 
      self.LED4.config(image = logo2) 
      self.LED5.config(image = logo2) 
      self.LED6.config(image = logo2) 
      pfio.digital_write(0,0) #turn off 
      pfio.digital_write(2,0) #turn off 
      pfio.digital_write(3,0) #turn off 
      pfio.digital_write(4,0) #turn off 
      pfio.digital_write(5,0) #turn off 
      pfio.digital_write(6,0) #turn off 
      pfio.digital_write(7,0) #turn off 

    def convert2(self): 

     if a==0: 

      print('Please Start the Fan') 

     else: 

      print('Fan 45% Duty Cycle') 
      self.button2.config(text='Fan 45% Duty Cycle') 
      self.LED2.config(image = logo) 
      my_pwm.ChangeDutyCycle(45) 
      pfio.digital_write(2,1) #turn on 
      self.LED0.config(image = logo2) 
      self.LED1.config(image = logo2) 
      self.LED3.config(image = logo2) 
      self.LED4.config(image = logo2) 
      self.LED5.config(image = logo2) 
      self.LED6.config(image = logo2) 
      pfio.digital_write(0,0) #turn off 
      pfio.digital_write(1,0) #turn off 
      pfio.digital_write(3,0) #turn off 
      pfio.digital_write(4,0) #turn off 
      pfio.digital_write(5,0) #turn off 
      pfio.digital_write(6,0) #turn off 
      pfio.digital_write(7,0) #turn off 

    def convert3(self): 

     if a==0: 

      print('Please Start the Fan') 

     else: 

      print('Fan 60% Duty Cycle') 
      self.button3.config(text='Fan 60% Duty Cycle') 
      self.LED3.config(image = logo) 
      my_pwm.ChangeDutyCycle(60) 
      pfio.digital_write(3,1) #turn on 
      self.LED0.config(image = logo2) 
      self.LED1.config(image = logo2) 
      self.LED2.config(image = logo2) 
      self.LED4.config(image = logo2) 
      self.LED5.config(image = logo2) 
      self.LED6.config(image = logo2) 
      pfio.digital_write(0,0) #turn off 
      pfio.digital_write(1,0) #turn off 
      pfio.digital_write(2,0) #turn off 
      pfio.digital_write(4,0) #turn off 
      pfio.digital_write(5,0) #turn off 
      pfio.digital_write(6,0) #turn off 
      pfio.digital_write(7,0) #turn off 

    def convert4(self): 

     if a==0: 

      print('Please Start the Fan') 

     else: 

      print('Fan 75% Duty Cycle') 
      self.button4.config(text='Fan 75% Duty Cycle') 
      self.LED4.config(image = logo) 
      my_pwm.ChangeDutyCycle(75) 
      pfio.digital_write(4,1) #turn on 
      self.LED0.config(image = logo2) 
      self.LED1.config(image = logo2) 
      self.LED2.config(image = logo2) 
      self.LED3.config(image = logo2) 
      self.LED5.config(image = logo2) 
      self.LED6.config(image = logo2) 
      pfio.digital_write(0,0) #turn off 
      pfio.digital_write(1,0) #turn off 
      pfio.digital_write(2,0) #turn off 
      pfio.digital_write(3,0) #turn off 
      pfio.digital_write(5,0) #turn off 
      pfio.digital_write(6,0) #turn off 
      pfio.digital_write(7,0) #turn off 

    def convert5(self): 

     if a==0: 

      print('Please Start the Fan') 

     else: 

      print('Fan 90% Duty Cycle') 
      self.button5.config(text='Fan 90% Duty Cycle') 
      self.LED5.config(image = logo) 
      my_pwm.ChangeDutyCycle(90) 
      pfio.digital_write(5,1) #turn on 
      self.LED0.config(image = logo2) 
      self.LED1.config(image = logo2) 
      self.LED2.config(image = logo2) 
      self.LED3.config(image = logo2) 
      self.LED4.config(image = logo2) 
      self.LED6.config(image = logo2) 
      pfio.digital_write(0,0) #turn off 
      pfio.digital_write(1,0) #turn off 
      pfio.digital_write(2,0) #turn off 
      pfio.digital_write(3,0) #turn off 
      pfio.digital_write(4,0) #turn off 
      pfio.digital_write(6,0) #turn off 
      pfio.digital_write(7,0) #turn off 

    def convert6(self): 

     if a==0: 

      print('Please Start the Fan') 

     else: 

      print('Fan 100% Duty Cycle') 
      self.button6.config(text='Fan 100% Duty Cycle') 
      self.LED6.config(image = logo) 
      my_pwm.ChangeDutyCycle(100) 
      pfio.digital_write(6,1) #turn on 
      self.LED0.config(image = logo2) 
      self.LED1.config(image = logo2) 
      self.LED2.config(image = logo2) 
      self.LED3.config(image = logo2) 
      self.LED4.config(image = logo2) 
      self.LED5.config(image = logo2) 
      pfio.digital_write(0,0) #turn off 
      pfio.digital_write(1,0) #turn off 
      pfio.digital_write(2,0) #turn off 
      pfio.digital_write(3,0) #turn off 
      pfio.digital_write(4,0) #turn off 
      pfio.digital_write(5,0) #turn off 
      pfio.digital_write(7,0) #turn off 

    def convert7(self): 


      print('STOP FAN') 
      global a 
      a = 0 
      self.button7.config(text='STOP FAN') 
      my_pwm.stop() 
      pfio.digital_write(7,1) #turn on 
      self.LED0.config(image = logo2) 
      self.LED1.config(image = logo2) 
      self.LED2.config(image = logo2) 
      self.LED3.config(image = logo2) 
      self.LED4.config(image = logo2) 
      self.LED5.config(image = logo2) 
      self.LED6.config(image = logo2) 
      self.button0.config(text='Start Fan') 
      pfio.digital_write(0,0) #turn off 
      pfio.digital_write(1,0) #turn off 
      pfio.digital_write(2,0) #turn off 
      pfio.digital_write(3,0) #turn off 
      pfio.digital_write(4,0) #turn off 
      pfio.digital_write(5,0) #turn off 
      pfio.digital_write(6,0) #turn off 


    def convert8(self): 


      print('EXIT PROGRAM') 
      my_pwm.stop() 
      quit() 

    def EventsPerTime(self): 
     global RPM, this_time, last_time 
     if GPIO.input(self) > 0.5: 
      this_time = time.time() 
      RPM = (1/(this_time - last_time))*30 
      last_time = this_time 
      #print 'RPM is %d' % RPM 



    GPIO.add_event_detect(18, GPIO.RISING, callback=EventsPerTime, bouncetime=3) 


    def Tach(self): 
     global RPM 
     if RPM > 1: 
      print 'RPM is %d' % RPM 
      self.TACHO.config(text=RPM) 




root = Tk() 
logo2 = PhotoImage(file="/home/pi/Off LED.gif") 
logo = PhotoImage(file="/home/pi/Red LED.gif") 


root.wm_title('FAN PWM Control program') 
app = App(root) 

root.mainloop() 
+0

Wenn Sie die RPM bereits in regelmäßigen Abständen von 'EventsPerTime' beziehen, was hindert Sie daran, das Label dort zu aktualisieren? –

+0

Ich habe das ursprünglich mit einem meiner Google-Ergebnisse versucht. Ich ding es war selbst. Tach(). Aber ich konnte es nicht zur Arbeit bringen, wenn es das Richtige war. –

+1

Bitte machen Sie eine [mcve]. Wenn Ihr Problem darin besteht, RPM anzuzeigen, benötigen Sie nicht den gesamten Code, der nicht mit der RPM-Anzeige zusammenhängt. –

Antwort

0

Hier mein Code-Änderungen sind für die PWM-GUI-Steuerung mit angezeigtem RPM auf meinem Raspberry Pi. Ich habe es geschafft, das Programm zum Laufen zu bringen und zu erreichen, was ich aufgrund des guten Feedbacks und der Hilfe durch diesen Post und die Website erreichen wollte. Der Code ist wahrscheinlich nicht so gut oder effizient wie er sein könnte, also zögern Sie nicht, Verbesserungsvorschläge zu machen.

Vielen Dank für Ihre Hilfe und Ihr Wissen.

 #self.button9 = Button(frame, text='Display RPM', command=self.Tach) Stopped using this button 
     #self.button9.grid(row=11, column=0) Stopped using this button 

     self.TimerInterval = 500 #This sets the time interval between RPM readings 
     self.Tach()   #This will start the 'Tach' method when the GUI starts 

def convert0(self): 

Ich schrieb auch ein Verfahren zum ‚Tach‘, die die ‚nach‘ Funktion verwendet, die eine gegebene Funktion nach einem festgelegten Intervall nennen. Also habe ich es so eingestellt, dass es sich alle 500ms nennt.

def Tach(self): 
    print 'RPM is %d' % RPM 
    self.TACHO.config(text='RPM is %d' % RPM) 
    self.master.after(self.TimerInterval,self.Tach) #Used 'after' to repeat this method at the time interval 

Ich bin mir nicht sicher, wie eine ‚nach‘ Funktion stoppen noch nicht, aber ich werde auf dem Weg, dass und lernen, bekommen.

1

Sie haben bereits eine Funktion, die die aktuelle RPM erhält. Die einfachste Sache ist, das Etikett zu aktualisieren, genau dort:

def EventsPerTime(self): 
    global RPM, this_time, last_time 
    if GPIO.input(self) > 0.5: 
     ... 
     RPM = (1/(this_time - last_time))*30 
     ... 

     self.TACHO.configure(text=RPM) 

Ein weiterer Teil des Problems ist, dass Sie falsch sind unter Angabe Ihren Rückrufs. Sie müssen diesen Code ändern:

GPIO.add_event_detect(..., callback=EventsPerTime, ...) 

dazu:

GPIO.add_event_detect(..., callback=self.EventsPerTime, ...) 

Sie werden auch EventsPerTIme neu definieren müssen, um ein zusätzliches Argument zu akzeptieren:

def EventsPerTime(self, channel): 
    ... 
+0

Ich habe es versucht, aber ich bekomme einen Fehler - AttributeError: 'int' Objekt hat kein Attribut 'TACHO'. –

+0

@blast_uk: Es ist nicht möglich, dass der Code in Ihrer Frage diesen Fehler angibt. Sie müssen 'self.TACHO' irgendwo als Integer definieren. –

+0

das ist der Fehler, den ich bekomme, aber ja ich stimme dem zu, was du sagst, ich kann es einfach nicht sehen. Ich schaue mir die 'Zeit', die Drehzahlberechnung usw. an. –

Verwandte Themen