4、原始数据读取:使用Arduino读取传感器原始值、串口打印
好,咱们进入实战环节。
前面讲了那么多原理和选型,现在终于要真刀真枪地干一场了。这一节,我带你走一遍最基础、也是最关键的一步——用Arduino把传感器的原始值读出来,并通过串口打印到电脑上。
你可能会觉得,不就是读个数据嘛,有什么难的?
嗯,我刚开始做项目时也这么想。结果第一次调试水位传感器,串口打印出来全是乱码,或者数值跳得像心电图。后来才发现,是接线松了,外加波特率没对上。所以,别小看这一步,它是后面所有校准工作的地基。
4.1 硬件连接:别把线插反了
先说说接线。我习惯用Arduino Uno,因为它最通用,调试起来也方便。
水位传感器通常就三根线:
- VCC(电源正极)—— 接Arduino的5V或3.3V,具体看传感器手册。我一般先接5V,如果传感器发热再换3.3V。
- GND(电源负极)—— 接Arduino的GND。
- OUT(信号输出)—— 接Arduino的模拟输入引脚,比如A0。
另外,如果你的传感器是数字输出(比如高低电平),那就接数字引脚。但咱们做校准,肯定要用模拟信号,这样才能看到连续变化的水位值。
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的数值,映射成实际的水位高度(厘米或毫米)。
到时候你会发现,校准才是真正考验耐心和细心的活儿。