Serail.readline() не обновляет значение с помощью метода .after() при измерении напряжения с помощью arduino/pcPython

Программы на Python
Ответить
Anonymous
 Serail.readline() не обновляет значение с помощью метода .after() при измерении напряжения с помощью arduino/pc

Сообщение Anonymous »

Я привел полный код ниже, потому что на самом деле я даже не уверен, в чем проблема, но я могу обратить ваше внимание на def read_analog(), поскольку это наиболее вероятное место в зависимости от того, что происходит не так. >
Цель состоит в том, чтобы считать напряжение постоянного тока 0–5 В с помощью аналогового вывода Arduino, используя read_analog() для чтения последовательного порта каждые 2 секунды и распечатать значение. Метод .after был применен с ожиданием 2000 мс, чтобы «освободить» код для выполнения чего-либо еще за пределами функции, поскольку я также отправляю данные для управления оборудованием. По какой-то причине функция read_analog() считывает значение из последовательного порта только на первой итерации. После этого он просто повторяет одно и то же значение каждые две секунды (может отличаться на 1) и не реагирует на изменения входного напряжения. Я подтвердил, что биты правильно принимаются ПК по последовательному порту, так что это проблема кода Python. Как ни странно, если я использую «read_analog()» с методом .after вместо «read_analog», он будет выполнять непрерывный цикл, но сообщит правильные обновленные значения.
Есть мысли?
Спасибо!
import serial
import time
import tkinter
import customtkinter
from PIL import ImageTk, Image
from tkinter import ttk
from pynput import keyboard
import tk_tools

step = 0

def quit_button():
global tkTop
ser.write(bytes('K', 'UTF-8'))
tkTop.destroy()

def on_button():
varLabel.set("LED ON ")
ser.write(bytes('H', 'UTF-8'))

def off_button():
varLabel.set("LED OFF")
ser.write(bytes('K', 'UTF-8'))

def l_button():
varLabel.set("Rotate Left")
ser.write(bytes('L', 'UTF-8'))
global step
step = step - 1
progressbar.step(step)
p.set_value(step)
print("Step",step)
#varLabel.set("LED OFF")
ser.write(bytes('K', 'UTF-8'))

def r_button():
varLabel.set("Rotate Right")
ser.write(bytes('R', 'UTF-8'))
global step
step = step + 1
progressbar.step(step)
p.set_value(step)
print("Step",step)
#varLabel.set("LED OFF")
ser.write(bytes('K', 'UTF-8'))

def on_press(key):
if key == keyboard.Key.right:
r_button()
if key == keyboard.Key.left:
l_button()

def read_analog():
value = ser.readline().decode()
value = value.rstrip('\r\n') # Remove carriage return
#valueint = int(float((value)))
print('Voltage', value, ' volts')
tkTop.after( 2000, read_analog) # period depends on how frequent the arduino writes data to its serial port

listener = keyboard.Listener(
on_press=on_press)
listener.start()

#change the COM port below
ser = serial.Serial('COM10', 9600, timeout=0.1)
print("Reset Arduino")
time.sleep(2)
ser.write(bytes('K', 'UTF-8'))

tkTop = tkinter.Tk()
tkTop.geometry('400x400') #500 x 500 window
tkTop.title("LED control") #name in title bar
# Create a parent frame
parent_frame = tkinter.Frame(tkTop)
parent_frame.pack()

tkTop.after( 2000, read_analog()) # period depends on how frequent the arduino writes data to its serial port

#define button images
upimage = ImageTk.PhotoImage(Image.open('voltup.png').resize((60,60)))
downimage = ImageTk.PhotoImage(Image.open('voltdown.png').resize((60,60)))

#label to display the status
varLabel = tkinter.IntVar()
tkLabel = tkinter.Label(textvariable=varLabel, )
varLabel.set("LED STATUS")
tkLabel.pack()

#label for HV controls
HVlabel = tkinter.Label(text= "HV Control")
HVlabel.place(x=300, y=40),

#button1 - ON
button1 = tkinter.IntVar()
button1state = tkinter.Button(tkTop,
text="ON",
command=on_button,
height = 4,
width = 8,
bg = 'green'

)
button1state.pack(side='top', ipadx=10, padx=10, pady=15)

#button2 - OFF
button2 = tkinter.IntVar()
button2state = tkinter.Button(tkTop,
text="OFF",
command=off_button,
height = 4,
width = 8,
)
button2state.pack(side='top', ipadx=10, padx=10, pady=15)

#button3 - Rotate Right
button3 = tkinter.IntVar()
button3state = tkinter.Button(tkTop,
text="Rotate Right",
command=r_button,
height = 60,
width = 60,
image = upimage
)
button3state.place(x=300, y=60)

#button4 - Rotate Left
button4 = tkinter.IntVar()
button4state = tkinter.Button(tkTop,
text="Rotate Left",
command=l_button,
height = 60,
width = 60,
image = downimage
)
button4state.place(x=300, y=180)

#Quit button
tkButtonQuit = tkinter.Button(
tkTop,
text="Quit",
command=quit_button,
height = 4,
width = 8,
)

p = tk_tools.RotaryScale(tkTop, max_value = 60, unit = "step")
p.place(x=300, y =300)
#print("step",step)
tkTop.title("Progress Bar in Tk")
progressbar = ttk.Progressbar(maximum=1500)
progressbar.place(x=400, y=60, width=160)

tkButtonQuit.pack(side='top', ipadx=10, padx=10, pady=15)
tkinter.mainloop()


Подробнее здесь: https://stackoverflow.com/questions/791 ... ng-voltage
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»