如何仅在可用时从Arduino中提取数据并保存数据?
How to extract data from Arduino only when it is available and save the data?
我正在尝试从 Arduino 提取传感器数据。 Arduino 代码每 1 秒使用串行通信发送一次传感器数据。我的目标是显示此数据并使用 Tkinter 在 GUI 中实时绘制它。但我似乎被卡住的地方是从 Arduino 检索数据。在我的代码中,我尝试提取数据并将它们保存在多个变量中。但是,当 Arduino 仅发送 5 秒的数据(即 5 个传感器测量值)时,我的 python 代码在变量中保存了 60 多个测量值。我不知道如何解决这个问题。我被困在这里有一段时间了。这是我的 python 代码。
在给定的图片中我 运行 代码 5 秒。即 5 个测量值将从 Arduino 发送。我正在正确接收数据,但是当我处理它们并将它们分成各个变量时,我有 analog_voltage containing:80 、current:70、voltage:75 和 temperature:65 测量值它们应该只包含 5 个。我该怎么办,有什么办法可以解决这个问题吗?
当我尝试保存文件时,这也是同样的问题。对于 5 秒的数据,程序在 csv 中保存了一百万行数据。任何帮助深表感谢。感谢阅读。
arduino 数据的图像仅供参考,因为由于串行通信协议,不可能 运行 同时使用两个程序,因此数据看起来不同。
data_to_sort =[]
analog_voltage = []
Voltage= []
Current=[]
Temperature=[]
def arduino_read_serialdata():
global ser
ser = serial.Serial('COM4', 9600, timeout=1)
time.sleep(1.0)
ser.flushInput()
while True:
global analog_voltage, Voltage, Temperature, Current, yp, cleaned_data, anvol
incoming_data = ser.inWaiting()
incoming_data = ser.readline()
incoming_data = incoming_data.decode()
cleaned_data = incoming_data.strip("/n")
data_to_sort.append(cleaned_data)
for everyrow in data_to_sort:
if everyrow.startswith("Measuring voltage and current with INA219 ..."):
pass
elif everyrow.startswith("MAX31855 test"):
pass
elif everyrow.startswith("Initializing sensor...DONE checking reading the values now."):
pass
elif everyrow.startswith("The Analog Voltage is:"):
anvol = everyrow[-8:]
anvol = float(anvol)
analog_voltage.append(anvol)
elif everyrow.startswith("Bus Voltage............:"):
vol = everyrow[-8:]
Voltage.append(float(vol))
elif everyrow.startswith("Current..............:"):
cur = everyrow[-8:]
Current.append(float(cur))
elif everyrow.startswith("Temperature in celcius:"):
temp = everyrow[-7:]
Temperature.append(float(temp))
else:
pass
with open("Sensor_data.csv", 'w+', newline='') as output_file:
output_file.flush()
output_file = csv.writer(output_file)
fields = ['Analog Voltage V', 'Voltage V', 'Current mA', 'Temperature °C']
output_file.writerow(fields)
for idx in range(0, len(analog_voltage)):
output_file.writerow([analog_voltage[idx]])
if keyboard.is_pressed("q"):
print("Manually interrupted by user")
ser.close()
# output_file.close()
print("Serial port closed")
file.close()
print("File closed, Writing done")
你有一个数组
data_to_sort =[]
然后将每个传入行附加到它
data_to_sort.append(cleaned_data)
对于每个传入的数据,您都会处理整个数据
for everyrow in data_to_sort:
并将值添加到这四个列表中:
analog_voltage = []
Voltage= []
Current=[]
Temperature=[]
并且这些列表永远不会被清除。
应该怎么做:
- 要么用每个传入数据清除这四个列表,要么
- 只处理传入的线路
我个人倾向于后者。不要总是写入整个输出文件,而是使用 "a"
而不是 "w+"
.
仅将最后一行附加到输出文件
我正在尝试从 Arduino 提取传感器数据。 Arduino 代码每 1 秒使用串行通信发送一次传感器数据。我的目标是显示此数据并使用 Tkinter 在 GUI 中实时绘制它。但我似乎被卡住的地方是从 Arduino 检索数据。在我的代码中,我尝试提取数据并将它们保存在多个变量中。但是,当 Arduino 仅发送 5 秒的数据(即 5 个传感器测量值)时,我的 python 代码在变量中保存了 60 多个测量值。我不知道如何解决这个问题。我被困在这里有一段时间了。这是我的 python 代码。
在给定的图片中我 运行 代码 5 秒。即 5 个测量值将从 Arduino 发送。我正在正确接收数据,但是当我处理它们并将它们分成各个变量时,我有 analog_voltage containing:80 、current:70、voltage:75 和 temperature:65 测量值它们应该只包含 5 个。我该怎么办,有什么办法可以解决这个问题吗?
当我尝试保存文件时,这也是同样的问题。对于 5 秒的数据,程序在 csv 中保存了一百万行数据。任何帮助深表感谢。感谢阅读。
arduino 数据的图像仅供参考,因为由于串行通信协议,不可能 运行 同时使用两个程序,因此数据看起来不同。
data_to_sort =[]
analog_voltage = []
Voltage= []
Current=[]
Temperature=[]
def arduino_read_serialdata():
global ser
ser = serial.Serial('COM4', 9600, timeout=1)
time.sleep(1.0)
ser.flushInput()
while True:
global analog_voltage, Voltage, Temperature, Current, yp, cleaned_data, anvol
incoming_data = ser.inWaiting()
incoming_data = ser.readline()
incoming_data = incoming_data.decode()
cleaned_data = incoming_data.strip("/n")
data_to_sort.append(cleaned_data)
for everyrow in data_to_sort:
if everyrow.startswith("Measuring voltage and current with INA219 ..."):
pass
elif everyrow.startswith("MAX31855 test"):
pass
elif everyrow.startswith("Initializing sensor...DONE checking reading the values now."):
pass
elif everyrow.startswith("The Analog Voltage is:"):
anvol = everyrow[-8:]
anvol = float(anvol)
analog_voltage.append(anvol)
elif everyrow.startswith("Bus Voltage............:"):
vol = everyrow[-8:]
Voltage.append(float(vol))
elif everyrow.startswith("Current..............:"):
cur = everyrow[-8:]
Current.append(float(cur))
elif everyrow.startswith("Temperature in celcius:"):
temp = everyrow[-7:]
Temperature.append(float(temp))
else:
pass
with open("Sensor_data.csv", 'w+', newline='') as output_file:
output_file.flush()
output_file = csv.writer(output_file)
fields = ['Analog Voltage V', 'Voltage V', 'Current mA', 'Temperature °C']
output_file.writerow(fields)
for idx in range(0, len(analog_voltage)):
output_file.writerow([analog_voltage[idx]])
if keyboard.is_pressed("q"):
print("Manually interrupted by user")
ser.close()
# output_file.close()
print("Serial port closed")
file.close()
print("File closed, Writing done")
你有一个数组
data_to_sort =[]
然后将每个传入行附加到它
data_to_sort.append(cleaned_data)
对于每个传入的数据,您都会处理整个数据
for everyrow in data_to_sort:
并将值添加到这四个列表中:
analog_voltage = []
Voltage= []
Current=[]
Temperature=[]
并且这些列表永远不会被清除。
应该怎么做:
- 要么用每个传入数据清除这四个列表,要么
- 只处理传入的线路
我个人倾向于后者。不要总是写入整个输出文件,而是使用 "a"
而不是 "w+"
.