欢迎光临
我们一直在努力

如何使用Arduino串口绘图仪

目录

1. 准备工作

2. 基础用法:显示单条曲线

3. 显示多条曲线

3.1 使用逗号分隔

3.2 使用空格或制表符分隔

4. 为曲线添加标签

5. 高级技巧:固定Y轴范围

6. 进阶技巧:保存数据用于后期分析

6.1 使用串口助手软件

6.2 自己写Python脚本

7. 常见问题与排错

8. 总结

扩展阅读:


Arduino IDE 内置的 串口绘图仪(Serial Plotter) 是一个非常实用的工具,它可以将Arduino通过串口发送的数据实时绘制成动态波形图。无论是观察传感器数值变化、调试PID算法,还是分析信号波动,它都能让你直观地看到数据趋势,比单纯的串口监视器高效得多。

本教程将从零开始,带你掌握串口绘图仪的所有用法,包括单条曲线、多条曲线、添加标签、固定Y轴范围等技巧,并附上可直接运行的代码示例。


1. 准备工作

  • 硬件:一块开发板,以及必要的传感器(可选,用于实验)。

  • 软件:Arduino IDE(1.8.10以上版本,2.x版本也支持)。

  • 连接:用USB线将Arduino连接到电脑。


2. 基础用法:显示单条曲线

最简单的使用方式是让Arduino每隔一段时间发送一个数值,绘图仪就会自动绘制出该数值的变化曲线。

示例代码:读取模拟引脚A0的电压值(比如接了一个电位器)。

void setup() {
Serial.begin(9600); // 初始化串口,波特率必须与绘图仪一致
}

void loop() {
int sensorValue = analogRead(A0); // 读取0~1023的原始值
float voltage = sensorValue * (5.0 / 1023.0); // 转换为电压值0~5V
Serial.println(voltage); // 发送数据并换行
delay(50); // 控制发送频率
}

操作步骤:

  • 将代码上传到开发板。

  • 点击IDE菜单 工具 → 串口绘图仪。

  • 在绘图仪窗口右下角,将波特率设置为 9600(与代码一致)。

  • 稍等片刻,你就会看到一条实时变化的曲线。旋转电位器,曲线会随之上下波动。

  • 关键点:

    • 必须使用 Serial.println() 发送数值,因为绘图仪依靠换行符来区分每一帧数据。

    • 发送频率不宜过快(建议 delay(10) 以上),否则曲线过于密集,不易观察。


    3. 显示多条曲线

    很多时候我们需要同时观察多个变量(比如温度和湿度、期望值和实际值)。绘图仪支持在同一张图上显示多条曲线,只需在同一行内发送多个数值,并用分隔符隔开。

    3.1 使用逗号分隔

    void loop() {
    int val1 = analogRead(A0);
    int val2 = analogRead(A1);
    Serial.print(val1);
    Serial.print(","); // 逗号分隔
    Serial.println(val2);
    delay(50);
    }

    3.2 使用空格或制表符分隔

    Serial.print(val1);
    Serial.print(" "); // 空格分隔
    Serial.println(val2);

    绘图仪会自动为每条曲线分配不同颜色,并在图例中显示为“数据0”、“数据1”等。

    注意事项:

    • 每行发送的数值数量必须固定,否则绘图仪会解析错误。

    • 分隔符可以是逗号、空格或制表符(\\t),但不能混用(推荐统一使用逗号)。


    4. 为曲线添加标签

    如果默认的“数据0”、“数据1”不够直观,你可以在发送数值时加上名称:数值的格式,绘图仪就会将名称显示在图例中。

    格式:名称1:数值1,名称2:数值2 (名称和数值之间用英文冒号连接,不同数据间用逗号分隔)

    示例代码:发送正弦波和一条水平参考线,并分别命名为Sin和Ref。

    float sinValue;
    int refValue = 500;

    void setup() {
    Serial.begin(9600);
    }

    void loop() {
    sinValue = 220 * sin(millis() / 1000.0) + 220; // 模拟一个正弦波(范围约0~440)

    Serial.print("Sin:"); // 标签
    Serial.print(sinValue);
    Serial.print(","); // 逗号分隔
    Serial.print("Ref:"); // 标签
    Serial.println(refValue); // 自动换行

    delay(20);
    }

    此时绘图仪窗口的图例会显示为 Sin 和 Ref,非常清晰。

    重要:

    • 标签和数值之间必须紧跟英文冒号,不能有空格(例如 "Temp:23.5" 正确,"Temp : 23.5" 错误)。

    • 一行内如果有多个带标签的数据,它们之间仍然需要用分隔符(逗号或空格)隔开。


    5. 高级技巧:固定Y轴范围

    默认情况下,绘图仪的Y轴会自动缩放以适应数据范围。如果你希望固定Y轴的显示范围(例如始终显示0~5V),可以通过发送特殊名称的数据来“强制”绘图仪保持这个范围。

    原理:绘图仪为了显示所有数据,会调整坐标轴。如果我们发送两个特殊的、始终不变的数值(比如名为_rangeMin和_rangeMax的曲线),并且让它们的数值固定为你想要的上下限,那么绘图仪为了显示这两条“线”,就会把Y轴锁定在这个范围内。

    示例代码:固定Y轴为0~5,并显示一个0~5V的模拟输入。

    void loop() {
    // 发送两个特殊数据定义Y轴范围
    Serial.print("_rangeMin:0 ");
    Serial.print("_rangeMax:5 ");

    // 发送实际数据(带标签)
    float voltage = analogRead(A0) * (5.0 / 1023.0);
    Serial.print("Sensor:");
    Serial.println(voltage);

    delay(50);
    }

    注意:

    • 特殊名称 _rangeMin 和 _rangeMax 以下划线开头,这是绘图仪内置的识别规则。

    • 这两个特殊数据必须持续发送,不能只发一次,否则绘图仪会重新自动缩放。

    • 发送顺序可以任意,只要保证每行都包含它们即可。


    6. 进阶技巧:保存数据用于后期分析

    串口绘图仪本身没有“保存数据”的功能,但你可以通过以下两种方式记录数据:

    6.1 使用串口助手软件

    • 一些第三方串口助手(如 Serial Port Monitor、sscom)支持将接收到的数据保存为文本文件。

    • 只需打开这些软件,连接对应端口,设置好波特率,然后开始记录即可。

    6.2 自己写Python脚本

    Python的pyserial库可以轻松读取串口数据并保存为CSV文件,之后可以用Excel或Matplotlib进一步分析。

    简单示例(需安装pyserial):

    import serial
    import time

    ser = serial.Serial('COM3', 9600) # 替换为你的端口
    with open('data.csv', 'w') as f:
    f.write('time,value\\n')
    start = time.time()
    while True:
    line = ser.readline().decode().strip()
    if line:
    t = time.time() – start
    f.write(f'{t},{line}\\n')
    print(f'{t:.2f},{line}')


    7. 常见问题与排错

    Q1:绘图仪窗口一片空白,什么也没有?

    • 检查波特率:确保代码中的 Serial.begin() 值与绘图仪右下角选择的波特率完全一致(常见的是9600)。

    • 检查数据发送:确认代码中有 Serial.print() 或 Serial.println() 发送数据,且已经上传成功。

    • 检查换行符:必须使用 Serial.println() 或手动发送 \\n,否则绘图仪不知道一帧数据何时结束。

    • 检查端口:确保在绘图仪打开时,没有其他程序(如串口监视器)占用同一串口。

    Q2:曲线非常密集,看不清楚怎么办?

    • 在 loop() 中增加 delay() 时间,降低数据发送频率,例如从 delay(10) 改为 delay(50)。

    • 或者在代码中加入条件判断,只在一定时间间隔后发送数据(使用 millis() 非阻塞计时)。

    Q3:我想显示负数值,可以吗?

    可以,绘图仪支持负数,Y轴会自动包含负半轴。

    Q4:多条曲线时,颜色总变,我想固定颜色可以吗?

    目前绘图仪不支持手动指定曲线颜色,颜色是自动分配的。不过每次打开绘图仪,相同名称的曲线颜色会保持一致。

    Q5:发送的数据包含小数,能正常显示吗?

    可以,浮点数会被正确解析和显示。


    8. 总结

    Arduino串口绘图仪是一个简单但强大的可视化工具,掌握它能让你的调试工作事半功倍。回顾一下核心要点:

    • 单条曲线:Serial.println(数值)

    • 多条曲线:同一行内用逗号/空格分隔多个数值,例如 Serial.print(val1); Serial.print(","); Serial.println(val2);

    • 添加标签:Serial.print("名称:数值")

    • 固定Y轴范围:发送 _rangeMin:下限 和 _rangeMax:上限 两个特殊数据


    扩展阅读:

    • Arduino官方Serial Plotter文档https://www.arduino.cc/en/software/plotter

    • 用Processing自制更强大的绘图仪https://processing.org/

    赞(0)
    未经允许不得转载:171主机测评 » 如何使用Arduino串口绘图仪
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址