4、原始数据读取:使用Arduino读取传感器原始值、串口打印

好,咱们进入实战环节。

前面讲了那么多原理和选型,现在终于要真刀真枪地干一场了。这一节,我带你走一遍最基础、也是最关键的一步——用Arduino把传感器的原始值读出来,并通过串口打印到电脑上

你可能会觉得,不就是读个数据嘛,有什么难的?

嗯,我刚开始做项目时也这么想。结果第一次调试水位传感器,串口打印出来全是乱码,或者数值跳得像心电图。后来才发现,是接线松了,外加波特率没对上。所以,别小看这一步,它是后面所有校准工作的地基。

4.1 硬件连接:别把线插反了

先说说接线。我习惯用Arduino Uno,因为它最通用,调试起来也方便。

水位传感器通常就三根线:

  • VCC(电源正极)—— 接Arduino的5V或3.3V,具体看传感器手册。我一般先接5V,如果传感器发热再换3.3V。
  • GND(电源负极)—— 接Arduino的GND。
  • OUT(信号输出)—— 接Arduino的模拟输入引脚,比如A0。
⚠️ 注意: 我曾经有一次把VCC和GND接反了,传感器瞬间冒烟。虽然大多数传感器有防反接保护,但别赌。上电前,用万用表量一下电压,确认无误再通电。

另外,如果你的传感器是数字输出(比如高低电平),那就接数字引脚。但咱们做校准,肯定要用模拟信号,这样才能看到连续变化的水位值。

4.2 代码实现:从零开始写读取程序

好,线接好了,接下来写代码。

我个人的习惯是,先写一个最简单的版本,确保能读到数据,再逐步优化。别一上来就搞什么滤波、平均算法,先把原始值抓出来再说。

下面这个代码,就是最基础的读取程序:

// 水位传感器原始数据读取
// 作者:你的名字
// 日期:2025年

#define SENSOR_PIN A0  // 传感器接在A0引脚

void setup() {
  // 初始化串口通信,波特率设为9600
  Serial.begin(9600);
  
  // 给串口一个启动提示
  Serial.println("水位传感器初始化完成!");
  Serial.println("开始读取原始数据...");
  delay(1000);  // 等1秒,让传感器稳定
}

void loop() {
  // 读取模拟值,范围0-1023
  int rawValue = analogRead(SENSOR_PIN);
  
  // 打印到串口
  Serial.print("原始值: ");
  Serial.println(rawValue);
  
  // 每200毫秒读一次,别太快
  delay(200);
}

这段代码很简单,对吧?但有几个细节我得跟你聊聊。

4.3 串口打印的讲究

你可能会问,为什么用Serial.print而不是Serial.println

其实两个都用到了。我习惯用print打印标签,用println打印数值并换行。这样串口监视器里看起来就是一行一行的,方便后续用Excel或Python处理。

另外,波特率为什么设9600?

9600是Arduino的默认速度,稳定可靠。如果你数据量很大,可以调到115200,但别一上来就调高。我遇到过波特率不匹配导致乱码的情况,排查了半天才发现是电脑端串口工具设成了9600,而Arduino代码里写的是115200。嗯,这种低级错误,犯过一次就记住了。

4.4 串口监视器的使用技巧

代码上传成功后,打开Arduino IDE的串口监视器(快捷键Ctrl+Shift+M)。

你会看到类似这样的输出:

水位传感器初始化完成!
开始读取原始数据...
原始值: 512
原始值: 510
原始值: 513
原始值: 511

数值在512左右跳动?别慌,这是正常的。

因为传感器本身有噪声,加上Arduino的ADC(模数转换器)也有±2个LSB的误差。你想想看,如果数值纹丝不动,那才奇怪呢。

💡 小技巧: 用手轻轻触碰传感器的感应面,数值应该会明显变化。如果没反应,检查一下接线,或者换个引脚试试。

4.5 数据格式化的进阶用法

如果你想把数据直接复制到Excel里做分析,可以改成CSV格式输出:

void loop() {
  int rawValue = analogRead(SENSOR_PIN);
  
  // 输出CSV格式:时间戳,原始值
  Serial.print(millis());  // 当前运行时间(毫秒)
  Serial.print(",");
  Serial.println(rawValue);
  
  delay(200);
}

这样输出就是:

1000,512
1200,510
1400,513

直接复制到Excel里,用分列功能一拆,就能做图表了。我在做传感器标定时,经常用这个办法快速采集几百个数据点。

4.6 常见问题与避坑指南

最后,我总结几个新手容易踩的坑:

  • 串口没数据? 检查波特率是否一致。Arduino代码里写9600,串口监视器右下角也要选9600。
  • 数值一直不变? 可能是传感器坏了,或者引脚定义搞错了。用万用表量一下OUT引脚对GND的电压,应该随水位变化。
  • 数值跳得太厉害? 正常现象。后面我们会讲软件滤波,比如滑动平均法,能有效平滑数据。
  • 串口打印乱码? 大概率是波特率不匹配。或者你用了中文注释,但Arduino IDE的编码设置不对。我一般只用英文注释,省心。
📌 核心要点:
  • 接线前确认VCC和GND,别接反。
  • 先用最简单的代码验证传感器是否工作。
  • 串口打印时注意格式,方便后续数据分析。
  • 数值有波动是正常的,别急着怀疑硬件。

好了,这一节就到这里。你现在应该能成功读取到传感器的原始值了。下一节,我们会基于这些原始数据,开始做校准——把0-1023的数值,映射成实际的水位高度(厘米或毫米)。

到时候你会发现,校准才是真正考验耐心和细心的活儿。