ฉันมีปัญหาในการพยายามรับค่าพอร์ตดิจิตอล Arduino และตั้งค่าเหล่านี้เป็น Python Tkinter Widget Scale
ฉันใช้ Python และ Arduino กับ Firmata ฉันสามารถเข้าถึงบอร์ด 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()
เมื่อถึงจุดนี้มันก็โอเคและ GUI แสดงให้ฉันเห็นว่า:
แต่สิ่งที่ฉันพยายามทำและไม่ได้รับคือ:
นี่คือรหัส:
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()
เพื่อสรุป: ฉันมีสวิตช์กกในพอร์ตดิจิตอลแต่ละพอร์ตที่ประกาศในรหัส สวิทช์ลิ้นเหล่านี้เป็นสถานะเปิดปกติเมื่อฉันวางสนามแม่เหล็กไว้ใกล้ ๆ มันจะเปลี่ยนเป็นปิดและฉันได้รับการเปลี่ยนแปลงในค่านั้นเช่นจากเท็จเป็นจริง สิ่งที่ฉันพยายามทำคืออัปเดต Tkinter Scale Widget ตามเวลาจริงในฐานะป้ายกำกับ แต่ฉันไม่ได้รับ
มีเคล็ดลับในรหัสไพ ธ อนที่สามารถแก้ปัญหาของฉันได้ไหม เนื่องจากฉันทำการค้นคว้าบนอินเทอร์เน็ตเป็นจำนวนมากและฉันไม่สามารถทำได้อย่างที่คุณเห็นในภาพที่ 2 เมื่อสถานะการเปลี่ยนแปลงของพินดิจิตอลที่สองเปลี่ยนเลเบลเป็น True และในสเกลโค้ดที่สอดคล้องกับค่า 100 แต่ยังคงอยู่ที่เครื่องหมาย 0
ฉันไม่พอใจกับการใช้คำสั่งและพารามิเตอร์ตัวแปรของวิดเจ็ตสเกล
กล่าวโดยย่อฉันต้องการอัปเดตวิดเจ็ต python Tkinter ตามเวลาจริงตามค่าจากพอร์ตดิจิตอลจาก arduino โดยใช้ firmata
ฉันใช้ Python 2.7
PS: เพื่อความสมบูรณ์:
นี่คือรหัส 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);
}
สิ่งที่ฉันสามารถทำได้ที่นี่คือรับค่าเหล่านี้ผ่านทางอนุกรมในหลามและใช้พวกเขาเพื่ออัปเดตสเกลด้วยวิธีนี้ แต่ฉันไม่รู้ว่าในวิธีนี้มันจะทำงานด้วยหรือไม่!
และสิ่งที่ฉันคิดใน Python: แต่ฉันยังมีอีกมากที่ต้องเรียนรู้ในอัลกอริทึมและโครงสร้างข้อมูล เพียงรหัสหลอก:
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)