Python ve firmata kullanarak Arduino Ports'tan Dinamik Tkinter Widget Ölçeğini Güncelle


10

Arduino dijital bağlantı noktaları değerlerini almak ve bu değerleri bir Python Tkinter Widget Ölçeği ayarlamak çalışırken sorun yaşıyorum.

Firmata ile Python ve Arduino kullanıyorum. Arduino kartıma python kodu ile erişebiliyorum. Örneğin bir etiket widget'ında Arduino analog port değerini gerçek zamanlı olarak bir etikete aşağıdaki koddaki gibi sorunsuz olarak alıyorum ve ayarlıyorum:

import Tkinter
import pyfirmata

def onStartButtonPress():
    while True:
        if flag.get():
            analogReadLabel.config(text=str(a0.read()))
            analogReadLabel.update_idletasks()
            top.update()
        else:
            break
    board.exit()
    top.destroy()

def onExitButtonPress():
    flag.set(False)

port = 'COM7'
board = pyfirmata.Arduino(port)

it = pyfirmata.util.Iterator(board)
it.start()

a0 = board.get_pin('a:0:i')

top = Tkinter.Tk()
top.title("Reading Analog pins")

descriptionLabel = Tkinter.Label(top, text="Potentiometer input:- ")
descriptionLabel.grid(column=1, row=1)

analogReadLabel = Tkinter.Label(top, text="Press Start..")
analogReadLabel.grid(column=2, row=1)

flag = Tkinter.BooleanVar(top)
flag.set(True)

startButton = Tkinter.Button(top, text="Start", command=onStartButtonPress)
startButton.grid(column=1, row=2)

exitButton = Tkinter.Button(top, text="Exit", command=onExitButtonPress)
exitButton.grid(column=2, row=2)

top.mainloop()

Bu noktaya kadar sorun değil ve GUI bana şöyle bir şey gösteriyor:

Analog 0'dan gerçek zamanlı değeri okuyan Python Gui arayüzü

Ama yapmaya çalışıyorum ve alamadım:

Ölçeği dijital pinlerle güncellemeye çalıştığım şey

İşte kod:

import Tkinter
import pyfirmata
import serial; 

def onStartButtonPress():
    while True:
        if flag.get():
            analogReadLabel.config(text=str(d8.read()))
            analogReadLabel1.config(text=str(d9.read()))
            analogReadLabel2.config(text=str(d10.read()))
            analogReadLabel.update_idletasks()

        pos1 = d8.read()
        if pos1 == True:
            pos1 = int(pos1)
            pos1 = 0
            brightnessScale.set(pos1)

        pos2 = d9.read()
        if pos2 == True:
            pos2 = int(pos2)
            pos2 = 100
            brightnessScale.set(pos2)

       ''' and so on '''

        brightnessScale.update_idletasks()
        top.update()
    else:
        break
board.exit()
top.destroy()


def onExitButtonPress():
    flag.set(False)

port = 'COM7'
board = pyfirmata.Arduino(port)

it = pyfirmata.util.Iterator(board)
it.start()

a0 = board.get_pin('a:0:i')

d4 = board.get_pin('d:4:i')
d5 = board.get_pin('d:5:i')
d6 = board.get_pin('d:6:i')
d7 = board.get_pin('d:7:i')
d8 = board.get_pin('d:8:i')
d9 = board.get_pin('d:9:i')
d10 = board.get_pin('d:10:i')

top = Tkinter.Tk()
top.geometry("800x600")
top.title("Reading Analog pins")

descriptionLabel = Tkinter.Label(top, text="Potentiometer input:- ")
descriptionLabel.grid(column=1, row=1)

analogReadLabel = Tkinter.Label(top, text="Level 1")
analogReadLabel.grid(column=2, row=1)

analogReadLabel1 = Tkinter.Label(top, text="Level 2")
analogReadLabel1.grid(column=3, row=1)

analogReadLabel2 = Tkinter.Label(top, text="Level 3")
analogReadLabel2.grid(column=4, row=1)

brightnessScale = Tkinter.Scale(top, from_ = 500, 
                            to = 0, 
                            length = 500, 
                            width = "30",
                            tickinterval = 50, 

                            bg = "lightskyblue",
                            highlightcolor = "darkblue",
                            highlightbackground = "royalblue",
                            troughcolor = "darkblue",

                            state = Tkinter.DISABLED,
                            sliderlength = 50,
                            relief = "sunken",
                            label = "Volume do Reservatorio em %",
                            orient = Tkinter.VERTICAL)
brightnessScale.grid(column=1, row=5)
Tkinter.Label(top,text="Volume da Caixa em (%)").grid(column=1, row=6)

flag = Tkinter.BooleanVar(top)
flag.set(True)

startButton = Tkinter.Button(top, text="Start", command=onStartButtonPress)
startButton.grid(column=1, row=2)

exitButton = Tkinter.Button(top, text="Exit", command=onExitButtonPress)
exitButton.grid(column=2, row=2)

top.mainloop()

Özetlemek gerekirse: Kodda bildirilen her dijital bağlantı noktasında reed anahtarları var. Bu reed anahtarları normalde açık durumdur, yakınlarına bir manyetik alan koyduğumda kapanır ve False to True gibi bu değerde bir değişiklik alırım. Yapmaya çalıştığım şey, Tkinter Ölçeği Widget'ını etiket olarak gerçek zamanlı olarak güncellemektir, ancak almıyorum.

Python kodunda sorunumu çözebilecek bir hile var mı? Çünkü internette çok araştırma yaptım ve ikinci dijital pimin durumu değiştiğinde resim 2'de gördüğünüz gibi bir etiket True olarak değişiyor ve ölçek kodunda bu değere karşılık geliyor 100, ama hala 0 işareti üzerinde.

Ayrıca komut ve ölçek widget değişken parametreleri kullanımı ile rahat değilim.

Kısacası, firmata kullanarak arduino dijital bağlantı noktalarından değerlere göre gerçek zamanlı python Tkinter ölçek widget'ı güncellemek istiyorum.

Python 2.7 kullanıyorum

Not: bütünlük için:

Bu beklediğim gibi çalışan firmata olmadan benim arduino kodum (Sketch).

int level; 
int position; 

void setup() {

pinMode(8, INPUT); 
pinMode(9, INPUT);
pinMode(10, INPUT);
pinMode(11, INPUT);
pinMode(12, INPUT);

Serial.begin(9600); // ativa a porta serial

void loop() {
digitalWrite(8, LOW); 
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);


position = digitalRead(8); 
if ( position == HIGH) {level=0;}

position = digitalRead(9); 
if ( position == HIGH) {Level=100;}

position = digitalRead(10); 
if ( position == HIGH) {level=200;}

position = digitalRead(11); 
if ( position == HIGH) {level=300;}

position = digitalRead(12); 
if ( position == HIGH) {level=400;}

Serial.println(level); 
delay(500);

}

Burada da yapabileceğim, bu değerleri python'da seri olarak almak ve bu şekilde ölçeği güncellemek için kullanmaktır, ancak bu yöntemde de işe yarayacağını bilmiyorum!

Python'da düşündüğüm şey: Ama yine de algoritmalarda ve Veri Yapılarında öğrenecek çok şeyim var. Sadece Sözde Kod:

def setScaleValue():
while True:
    if flag.get():
         pos1 = d4.read()
        if pos1 == True: #or 1 
        #Here is the problem i don't know for sure what comes in my digital port
        #If is a True bool or a 1 as HIGH value from arduino
        #And probably i don't know if it's possible to change the values of a scale in this way !!!
        #or if i'm mistaken the Cast stuff in Python
            pos1 = int(pos1)
            pos1 = 0
            brightnessScale.set(pos1)

        pos2 = d8.read()
        if pos2 == True:
            pos2 = int(pos2)
            pos2 = 100
            brightnessScale.set(pos2)

        brightnessScale.update_idletasks()
        top.update()
    else:
        break
board.exit()
top.destroy()

return


d4 = board.get_pin('d:4:i')
d5 = board.get_pin('d:5:i')
d6 = board.get_pin('d:6:i')
d7 = board.get_pin('d:7:i')
d8 = board.get_pin('d:8:i')

brightnessScale = Tkinter.Scale(top, from_ = 500, 
                            to = 0, 
                            length = 500, 
                            width = "30",
                            tickinterval = 50, 

                            bg = "lightskyblue",
                            highlightcolor = "darkblue",
                            highlightbackground = "royalblue",
                            troughcolor = "darkblue",

                            state = Tkinter.DISABLED,
                            sliderlength = 50,
                            relief = "sunken",
                            label = "Volume do Reservatorio em %",
                            orient = Tkinter.VERTICAL)
brightnessScale.grid(column=1, row=5)
Tkinter.Label(top,text="Volume da Caixa em (%)").grid(column=1, row=6)

üçüncü dosyanız hatalı biçimlendirilmiş, def setScaleValue (): doğru tanımlanmadıysa, bir işlev tanımlamasından sonra girinti düzeyinde değişiklik yapmanız gerekir.
esoterik

Kodunuz çalıştığında, durdur düğmesine tıklayabilir misiniz?
Mert Gülsoy

Yanıtlar:


-1

kodunuzda:

pos2 = d8.read()
print("pos2 is {} type {}".format(pos2, type(pos2)))  # This way, you'll know the var type you're getting on the console
    if posX == True:
        posX = int(posX)          # You then cast to an integer
        posX = 100                # You discard pos2 value by setting it to 100
        brightnessScale.set(posX) # You set the scale always to value 100

Baskı satırını ekleyerek değişken değerini ve türünü sağlayabilirsiniz.
Ardından, if ifadenizi buna göre uyarlamanız gerekebilir.
O zaman ne yaptığınıza dikkat edin, posX'i yeniden alan 2 satırla, bu muhtemelen ölçeği güncellemeden önce yapmak istediğiniz şey değildir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.