পাইথন এবং ফার্মাটা ব্যবহার করে আরডুইনো বন্দরগুলি থেকে ডায়নামিকালি টিন্টার উইজেট স্কেল আপডেট করুন


10

আমারে আরডিনো ডিজিটাল পোর্টের মানগুলি পেতে চেষ্টা করতে সমস্যা হচ্ছে এবং এই মানগুলিকে পাইথন টিনকিটার উইজেট স্কেলে সেট করতে পারি।

আমি পাইথন এবং আরডুইনো ফিরমাটার সাথে ব্যবহার করছি। আমি পাইথন কোড দিয়ে আমার আরডুইনো বোর্ড অ্যাক্সেস করতে সক্ষম। উদাহরণস্বরূপ কোনও লেবেল উইজেটে আমি আরডুইনো এনালগ পোর্ট মানটি রিয়েল-টাইমে কোনও লেবেলে কোনও সমস্যা ছাড়াই নিম্নলিখিত কোড হিসাবে সেট করে নিচ্ছি:

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

সংক্ষিপ্তসার হিসাবে: আমি কোডে ঘোষিত প্রতিটি ডিজিটাল পোর্টে রিডগুলি রেখেছি। এই রিডগুলি স্যুইচগুলি সাধারণত উন্মুক্ত স্থিতি হয়, যখন আমি তাদের কাছে একটি চৌম্বক ক্ষেত্র রাখি এটি বন্ধ হয়ে যায় এবং আমি ফলস থেকে সত্য হিসাবে এর মানটিতে পরিবর্তন পাই। আমি যা করার চেষ্টা করছি তা হ'ল টিন্টার স্কেল উইজেটটি রিয়েল টাইমে লেবেল হিসাবে আপডেট করা কিন্তু আমি তা পাচ্ছি না।

পাইথন কোডে এমন কোন কৌশল আছে যা আমার সমস্যার সমাধান করতে পারে? কারণ আমি ইন্টারনেটে প্রচুর গবেষণা করেছি এবং আমি কাজটি করতে পারিনি, কারণ আপনি দ্বিতীয় চিত্রটিতে দেখতে পারবেন যখন দ্বিতীয় ডিজিটাল পিনের অবস্থা পরিবর্তিত হয়, একটি লেবেল সত্যে পরিবর্তিত হয় এবং স্কেল কোডে এটি মানটির সাথে মিলে যায় 100, তবে এটি এখনও 0 চিহ্নে রয়েছে।

কমান্ড এবং স্কেল উইজেটের পরিবর্তনশীল পরামিতি ব্যবহার করেও আমি স্বাচ্ছন্দ্য বোধ করি না।

সংক্ষেপে, আমি ফার্মাটা ব্যবহার করে আরডুইনো থেকে ডিজিটাল বন্দরগুলির মান অনুযায়ী রিয়েল টাইম পাইথন টিকিনটার স্কেল উইজেট আপডেট করতে চাই।

আমি পাইথন ২.7 ব্যবহার করছি

পিএস: সম্পূর্ণতার জন্য:

এটি ফার্মাটা ছাড়া আমার আরডুইনো কোড (স্কেচ), যা প্রত্যাশা অনুযায়ী কাজ করছে।

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)

আপনার তৃতীয় ফাইলটি বিকৃত, ডিএফ সেটস্কেলভ্যালু (): সঠিকভাবে সংজ্ঞায়িত করা হয়নি, একটি ফাংশন সংজ্ঞার পরে আপনার ইনডেন্ট স্তর পরিবর্তন প্রয়োজন।
esoterik

যখন আপনার কোডটি চলে, আপনি কি স্টপ বাটনে ক্লিক করতে পারবেন?
Mert Gülsoy

উত্তর:


-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 লাইনগুলি পুনরায় প্রতিক্রিয়াযুক্ত পোস্টএক্স দিয়ে কী করছেন তখন সাবধান হন, স্কেলটি আপডেট করার আগে আপনি যা করতে চান এটি সম্ভবত তা নয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.