目录

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);                               // 控制发送频率
}

操作步骤

  1. 将代码上传到开发板。

  2. 点击IDE菜单 工具 → 串口绘图仪

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

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

关键点

  • 必须使用 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 (名称和数值之间用英文冒号连接,不同数据间用逗号分隔)

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

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 Monitorsscom)支持将接收到的数据保存为文本文件。

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

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:上限 两个特殊数据


扩展阅读

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐