मुझे 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()
इस बिंदु तक यह ठीक है और जीयूआई मुझे कुछ इस तरह दिखाता है:
लेकिन जो मैं करने की कोशिश कर रहा हूं और जो नहीं हो रहा है:
यहाँ कोड है:
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)