2016-08-07 85 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运行不写栏...白屏.... –