2016-08-07 84 views
0

我的代碼無法按預期工作。 僅當read_SensorGeral爲true時才應創建條形,只有在read_SensorGeral爲true並且read_Sensor爲false時才應激活蜂鳴器。 僅當創建其他酒吧barGeral等於真? 我的代碼:Python Raspberry Pi在Kivy中創建酒吧

from kivy.app import App 
from kivy.clock import Clock 
from kivy.core.window import Window 
from kivy.graphics import Color, Rectangle 
from kivy.properties import NumericProperty 
from kivy.uix.floatlayout import FloatLayout 
from kivy.uix.widget import Widget 
import RPi.GPIO as GPIO 
import time 

GPIO.setmode(GPIO.BCM) 
GPIO.setup(26, GPIO.IN, pull_up_down = GPIO.PUD_DOWN) #pino sensor 1 
GPIO.setup(20, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)  #pino sensor 2 
GPIO.setup(21, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)  #pino sensor 3 
GPIO.setup(4, GPIO.IN, pull_up_down = GPIO.PUD_DOWN) #pino sensor 4 
GPIO.setup(17, GPIO.IN, pull_up_down = GPIO.PUD_DOWN) #pino sensor 5 
GPIO.setup(27, GPIO.IN, pull_up_down = GPIO.PUD_DOWN) #pino sensor 6 
GPIO.setup(22, GPIO.IN, pull_up_down = GPIO.PUD_DOWN) #pino sensor 7 
GPIO.setup(10, GPIO.IN, pull_up_down = GPIO.PUD_DOWN) #pino sensor 8 
GPIO.setup(9, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)  #pino sensor 9 
GPIO.setup(19, GPIO.IN, pull_up_down = GPIO.PUD_DOWN) #pino master 
GPIO.setup(12, GPIO.OUT) #pino buzzer 


pin_Master = 19 
pin_1 = 26 
pin_2 = 20 
pin_3 = 21 
pin_4 = 4 
pin_5 = 17 
pin_6 = 27 
pin_7 = 22 
pin_8 = 10 
pin_9 = 9 


class MainLayout(FloatLayout): 
    pass 

class bar(Widget): 
    r = NumericProperty(1) 
    g = NumericProperty(0) 

    def __init__(self, pin, p1, p2, **kwargs): 
     super(bar, self).__init__(**kwargs) 
     self.pin = pin 
     self.p1 = p1 
     self.p2 = p2 
     self.pin_Buzzer = 12 
     Clock.schedule_interval(self.update, 1.0/60.0) 

    def update(self, dt): 
     self.canvas.clear() 
     if self.read_SensorGeral(self.pin) == True: 
      with self.canvas: 
       Color(self.g, 1, 0, 1) 
       Rectangle(pos=(self.p1,self.p2), size=(35,300)) 
      GPIO.output(12, 0) 
     else: 
      with self.canvas: 
       Color(self.r, 0, 0, 1) 
       Rectangle(pos=(self.p1,self.p2), size=(35,30)) 
      GPIO.output(12, 1) 
    def read_Sensor(self, pin): 
     sensor = GPIO.wait_for_edge(pin, GPIO.BOTH, timeout=200)                 
     if sensor is None: 
      return False 
     else: 
      return True 

    def read_SensorGeral(self, pin): 
     sensor = GPIO.wait_for_edge(pin, GPIO.BOTH, timeout=200)                 
     if sensor is None: 
      return False 
     else: 
      return True 

    class MainApp(App): 
     def build(self): 
      Window.clearcolor = (1, 1, 1, 1) 
      self.mainlayout = Widget() 
      barGeral = bar(pin_Master, 26, 100) 
      bar1 = bar(pin_1, 26, 30) 
      bar2 = bar(pin_2, 106, 30) 
      bar3 = bar(pin_3, 186, 30) 
      bar4 = bar(pin_4, 266, 30) 
      bar5 = bar(pin_5, 346, 30) 
      bar6 = bar(pin_6, 426, 30) 
      bar7 = bar(pin_7, 506, 30) 
      bar8 = bar(pin_8, 586, 30) 
      bar9 = bar(pin_9, 666, 30) 

      self.mainlayout.add_widget(barGeral) 
      self.mainlayout.add_widget(bar1) 
      self.mainlayout.add_widget(bar2) 
      self.mainlayout.add_widget(bar3) 
      self.mainlayout.add_widget(bar4) 
      self.mainlayout.add_widget(bar5) 
      self.mainlayout.add_widget(bar6) 
      self.mainlayout.add_widget(bar7) 
      self.mainlayout.add_widget(bar8) 
      self.mainlayout.add_widget(bar9) 
      return self.mainlayout 
    try: 
     if __name__ == '__main__': 
      MainApp().run() 

    except KeyboardInterrupt: 
     print("Programa finalizado!") 
     GPIO.cleanup() 

回答

0

更改您的更新就是這樣,讓你的條件右:

def update(self, dt): 
    self.canvas.clear() 
    if self.read_SensorGeral(self.pin) == True: 
     with self.canvas: 
      Color(self.g, 1, 0, 1) 
      Rectangle(pos=(self.p1,self.p2), size=(35,300)) 
     if not self.read_Sensor(self.pin): 
      GPIO.output(12, 1) 
    else: 
     with self.canvas: 
      Color(self.r, 0, 0, 1) 
      Rectangle(pos=(self.p1,self.p2), size=(35,30)) 
     GPIO.output(12, 0) 

有可能是另一個問題土特產品。您每秒運行update() 60次,但允許引腳超時爲200.這意味着您有多個update()線程同時運行。這可能會給人意想不到的結
也許你應該更新爲一個線程每個酒吧循環。像這樣:

from thread import start_new_thread 



class bar(Widget): 
    r = NumericProperty(1) 
    g = NumericProperty(0) 

    def __init__(self, pin, p1, p2, **kwargs): 
     super(bar, self).__init__(**kwargs) 
     self.pin = pin 
     self.p1 = p1 
     self.p2 = p2 
     self.pin_Buzzer = 12 

     start_new_thread(self.update()) 


    def update(self): 
     self.canvas.clear() 
     if self.read_SensorGeral(self.pin) == True: 
      with self.canvas: 
       Color(self.g, 1, 0, 1) 
       Rectangle(pos=(self.p1,self.p2), size=(35,300)) 
      if not self.read_Sensor(self.pin): 
       GPIO.output(12, 1) 
     else: 
      with self.canvas: 
       Color(self.r, 0, 0, 1) 
       Rectangle(pos=(self.p1,self.p2), size=(35,30)) 
      GPIO.output(12, 0) 

     time.sleep(10) # maybe a little time sleep between the updates 
     self.update() 

然後在您的__init__方法中啓動更新循環。 self.update()

+0

不工作...更新慢! –

+0

@VictorSued你刪除了時鐘嗎?你是否在等待邊緣,引腳正在移動? – EL3PHANTEN

+0

評論時鐘,刪除超時等待邊緣和編輯def uptade()等於你張貼,iam運行不寫欄...白屏.... –