簡體   English   中英

Python Raspberry Pi在Kivy中創建欄

[英]Python Raspberry Pi Create bars in Kivy

我的代碼無法正常工作。 僅當read_SensorGeral為true時才創建條形,僅當read_SensorGeral為true且read_Sensor為false時才激活蜂鳴器。 在創建其他欄時,只有barGeral等於True嗎? 我的代碼:

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()

像這樣更改更新,以使條件正確:

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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM