【问题标题】:Arduino Uno Raspberry Pi Serial Communication double readingsArduino Uno Raspberry Pi 串行通信双读数
【发布时间】:2018-08-27 13:26:52
【问题描述】:

我使用 Arduino Uno 将来自光传感器的模拟数据转换为数字数据,然后通过 USB 数据线将这些数据发送到树莓派。但是,当我运行代码时,我会从 10 位传感器读取像 1923 这样的值。

这是arduino代码

int a = A0;
int meas = 0;
void setup() {
Serial.begin(9600);
}
void loop() {
meas = analogRead(a);
if(Serial.readString() == "1"){ //Check that Raspberry wants data or not
Serial.println(meas);     
}
}

这是树莓派中的 Python 代码

import serial
from datetime import datetime
now = datetime.now()

ser = serial.Serial('/dev/ttyACM0', 9600)
ser.write("1".encode())
s = ser.readline()

file = open("dataset.txt", "a")
file.write(now.strftime("%Y-%m-%d %H:%M") + " Sensor Value:" + str(s)+ "\n")
file.close()

这是每 5 分钟运行一次代码后的示例输出

14:08 Sensor Value:6
14:10 Sensor Value:8
14:15 Sensor Value:8
14:20 Sensor Value:10
14:25 Sensor Value:6
14:30 Sensor Value:9
14:35 Sensor Value:6
14:40 Sensor Value:7
14:45 Sensor Value:5
14:50 Sensor Value:5
14:55 Sensor Value:12
15:00 Sensor Value:1
15:05 Sensor Value:1
15:10 Sensor Value:10
15:15 Sensor Value:12
15:20 Sensor Value:14
15:25 Sensor Value:1922
15:30 Sensor Value:2211
15:35 Sensor Value:11
15:39 Sensor Value:6
15:40 Sensor Value:7
15:45 Sensor Value:8
15:50 Sensor Value:10
15:55 Sensor Value:1
16:00 Sensor Value:
16:05 Sensor Value:11

我想去掉这些 1 和 1922 之类的东西,它们肯定是毫无意义的数据。

PS:传感器在山顶,我正在使用远程连接检查数据和操作代码。

我该怎么做?感谢您的宝贵时间。

【问题讨论】:

  • 在 Arduino 上阅读之前尝试测试 serial.available() 并在 Pi 上的 readline() 之前等待 200 毫秒。

标签: python arduino raspberry-pi arduino-uno pyserial


【解决方案1】:

我认为 Mark Setchell 是对的。您正在从过去的测量中获取数据。

我个人会实现一个更健壮的协议,但由于您的应用程序非常基础,您可以尝试使用更简单的方法,这就是他的建议。

这很容易解决,方法是在请求和读取之间在 python 程序中添加一个小延迟。这样的事情就足够了:

from time import sleep
...
ser.write("1".encode())
sleep(0.05);
s = ser.readline()

与此同时,我不喜欢您在 arduino 中处理阅读的方式。如果你总是发送单字符命令,我建议这种方法:

void loop() {
    meas = analogRead(a);
    if (Serial.available())
    {
        if (Serial.read() == '1')
        {
            Serial.println(meas);
        }
    }
}

这不会阻止循环的执行(如果您打算扩展功能,它可以派上用场)

【讨论】:

  • 我尝试了你在我的 Python 代码中所说的内容,但现在我从 arduino 中一无所获。在树莓派中
  • @EkinEkinEkin 你是改了arduino代码还是只改了python?你运行的是哪个版本的python?
  • 我都改变了,我正在使用 python 2
  • @EkinEkinEkin 你能分享一下你所说的“有时工作,不能正常工作”是什么意思吗?你收到什么?你没有收到什么?您遇到的行为是什么?为什么不是您所期望的?
  • @EkinEkinEkin 好的,尝试打开串口时使用超时选项(ser = serial.Serial('/dev/ttyACM0', 9600, timeout=1))。如果仍然无法正常工作,请尝试使用串行监视器检查与 arduino 的通信是否正常,并且您正在收到预期的结果
【解决方案2】:

你可以看看校准,这是一段示例代码,

https://www.arduino.cc/en/Tutorial/Calibration

【讨论】:

  • 但是传感器在山顶的一个盒子里
  • 该代码用于校准传感器发出的值。您需要一种方法来限制值的范围。
  • 我认为是异步通信引起的,您有什么解决办法吗?
  • 没有多少错误校准会使analogRead 返回超过 1023。校准不会解决它。
  • 正如您在这里提到的错误校准,这意味着误解,校准不在设备上,而是在代码中确定和指定有效值范围。 @EkinEkinEkin,您是否尝试过在 arduino.cc 下的 Sensors 论坛上发帖。他们也会要求提供图表和详细的传感器信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-16
  • 2019-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多