अजगर और फर्मेटा का उपयोग करके Arduino पोर्ट्स से डायनामिक रूप से टिंकर विजेट स्केल अपडेट करें


10

मुझे Arduino डिजिटल पोर्ट वैल्यूज़ प्राप्त करने और पायथन Tkinter विजेट स्केल में इन मानों को सेट करने की कोशिश करने में परेशानी हो रही है।

मैं फर्मेटा के साथ पायथन और अरुडिनो का उपयोग कर रहा हूं। मैं अजगर कोड के साथ अपने arduino बोर्ड का उपयोग करने में सक्षम हूं। उदाहरण के लिए एक लेबल विजेट में मैं प्राप्त कर रहा हूं और किसी भी समस्या के बिना निम्नलिखित कोड में एक लेबल में वास्तविक समय में Arduino एनालॉग पोर्ट मान सेट कर रहा हूं:

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

इस बिंदु तक यह ठीक है और जीयूआई मुझे कुछ इस तरह दिखाता है:

पायथन गुई इंटरफ़ेस एनालॉग 0 से वास्तविक समय मूल्य पढ़ रहा है

लेकिन जो मैं करने की कोशिश कर रहा हूं और जो नहीं हो रहा है:

मैं डिजिटल पिन के साथ स्केल को अपडेट करने की कोशिश कर रहा हूं

यहाँ कोड है:

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

संक्षेप में: मैंने कोड में घोषित प्रत्येक डिजिटल पोर्ट में फिर से स्विच किया है। ये रीड स्विच आम तौर पर खुले राज्य होते हैं, जब मैं उनके पास एक चुंबकीय क्षेत्र डालता हूं तो वह बंद हो जाता है और मुझे उस मूल्य में एक बदलाव मिलता है जैसे कि फाल्स से ट्रू। मैं जो करने की कोशिश कर रहा हूं वह लेबल के रूप में टिंकर स्केल विजेट को वास्तविक समय में अपडेट करना है लेकिन मुझे नहीं मिल रहा है।

क्या अजगर कोड में कोई चाल है जो मेरी समस्या को हल कर सकता है? क्योंकि मैंने इंटरनेट पर बहुत सारे शोध किए और मैं नहीं कर पाया, जैसा कि आप छवि 2 में देख सकते हैं जब दूसरे डिजिटल पिन की स्थिति बदलती है, एक लेबल True में बदल जाता है, और स्केल कोड में यह मान से मेल खाता है 100, लेकिन यह अभी भी 0 के निशान पर है।

मैं कमांड के उपयोग और स्केल विजेट के चर मापदंडों के साथ भी सहज नहीं हूं।

संक्षेप में, मैं फर्मेटा का उपयोग करते हुए arduino से डिजिटल पोर्ट्स के मूल्यों के अनुसार वास्तविक समय अजगर टिंकर स्केल विजेट में अपडेट करना चाहता हूं।

मैं पायथन 2.7 का उपयोग कर रहा हूं

पुनश्च: पूर्णता के लिए:

यह फर्मेटा के बिना मेरा Arduino कोड (स्केच) है, जो उम्मीद के मुताबिक काम कर रहा है।

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

}

मैं यहाँ क्या कर सकता था, अजगर में धारावाहिक के माध्यम से इन मूल्यों को प्राप्त कर सकते हैं और इस तरह से पैमाने को अपडेट करने के लिए उनका उपयोग कर सकते हैं लेकिन मुझे नहीं पता कि क्या इस पद्धति में यह काम करने वाला है!

और मैंने पायथन में क्या सोचा: लेकिन मुझे अभी भी एल्गोरिदम और डेटा संरचनाओं में बहुत कुछ सीखना है। बस छद्म कोड:

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)

आपकी तीसरी फ़ाइल विकृत है, setScaleValue () को ठीक से परिभाषित नहीं किया गया है, आपको फ़ंक्शन परिभाषा के बाद एक इंडेंट स्तर के बदलाव की आवश्यकता है।
एसोटेरिक

जब आपका कोड चलता है, तो क्या आप स्टॉप बटन पर क्लिक कर सकते हैं?
मर्ट गुल्सोइ

जवाबों:


-1

आपके कोड में:

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

प्रिंट लाइन को जोड़कर, आप परिवर्तनीय मूल्य और प्रकार सुनिश्चित कर सकते हैं।
फिर, आपको अपने स्टेटमेंट को उसके अनुसार बदलना पड़ सकता है।
जो आप कर रहे हैं उससे सावधान रहें कि उन 2 पंक्तियों के साथ पॉसएक्स को फिर से देखें, यह संभवतः वह नहीं है जो आप पैमाने को अपडेट करने से पहले करना चाहते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.