4. Arduino与传感器:开发环境搭建与基础数据采集
好,咱们进入正题。这一章,我带你亲手把Arduino和传感器跑起来。
很多初学者拿到Arduino板子,第一反应是「这玩意儿怎么玩?」。别急,咱们一步步来。我个人习惯,先把开发环境搭好,再动手写代码。这样后面出问题了,排查起来也快。
4.1 开发环境搭建——别小看这一步
Arduino的开发环境,说白了就是它的IDE(集成开发环境)。你从官网下载就行,免费、开源。
安装步骤其实很简单:
- 去
arduino.cc下载对应你操作系统的版本(Windows、macOS、Linux都行)。 - 双击安装,一路默认选项。嗯,这里要注意:Windows用户可能会遇到驱动安装提示,点同意就好。
- 安装完成后,打开IDE。你会看到一个白色的编辑窗口,下面有个黑色的控制台区域。
装好IDE后,第一件事是选对板子和端口。你想想看,如果板子没选对,代码烧录进去也没反应。
- 选板子: 菜单栏 → 工具 → 开发板 → Arduino Uno(如果你用的是Uno)。
- 选端口: 工具 → 端口 → 选择你板子对应的COM口(Windows)或/dev/cu.usbmodem(Mac)。
怎么确认端口对不对?插上板子,看端口列表里多出来的那个就是。拔掉再插一次,对比一下,很直观。
4.2 数字引脚读取——开关信号就这么简单
Arduino的数字引脚,说白了就是只能读「0」或「1」的引脚。0代表低电平(0V),1代表高电平(5V或3.3V)。
我在项目中遇到过一个问题:用数字引脚读一个按键,结果按键按下时信号抖动,程序误判了好几次。后来加了消抖处理才搞定。这个后面会讲。
先看一个最简单的例子:读取按键状态。
// 数字引脚读取示例
int buttonPin = 2; // 按键接在D2引脚
int ledPin = 13; // 板载LED在D13
void setup() {
pinMode(buttonPin, INPUT); // 设置D2为输入
pinMode(ledPin, OUTPUT); // 设置D13为输出
Serial.begin(9600); // 开启串口,方便看数据
}
void loop() {
int buttonState = digitalRead(buttonPin); // 读取引脚状态
Serial.println(buttonState); // 打印到串口监视器
if (buttonState == HIGH) {
digitalWrite(ledPin, HIGH); // 按键按下,点亮LED
} else {
digitalWrite(ledPin, LOW); // 否则熄灭
}
delay(50); // 简单消抖
}
这段代码里,digitalRead() 就是核心函数。它返回 HIGH 或 LOW。你按下按键,引脚被拉高,读到1;松开,引脚被拉低,读到0。
pinMode(pin, INPUT_PULLUP))。否则你的数据会像抽风一样乱跳。
4.3 模拟引脚读取——连续变化的信号
数字引脚只能读0和1,但现实世界里的传感器信号大多是连续变化的,比如温度、光照、声音强度。这时候就要用模拟引脚了。
Arduino Uno有6个模拟输入引脚(A0~A5)。它们内部有一个10位的ADC(模数转换器),能把0~5V的电压映射成0~1023的整数。
为什么是0~1023? 因为10位ADC,2的10次方是1024,所以范围是0~1023。分辨率就是5V / 1024 ≈ 4.88mV。也就是说,电压每变化约5mV,读数就会跳1。
来看一个读取电位器的例子:
// 模拟引脚读取示例
int potPin = A0; // 电位器接在A0
int sensorValue = 0; // 存储读取值
void setup() {
Serial.begin(9600);
}
void loop() {
sensorValue = analogRead(potPin); // 读取模拟值(0~1023)
Serial.print("原始值: ");
Serial.print(sensorValue);
// 转换成电压值(0~5V)
float voltage = sensorValue * (5.0 / 1023.0);
Serial.print(" 电压: ");
Serial.println(voltage);
delay(200);
}
这里 analogRead() 返回的是0~1023的整数。如果你想得到实际的物理量(比如温度),就需要根据传感器的数据手册做换算。这个后面章节会细讲。
4.4 基础数据采集程序编写——把传感器数据读出来
好,现在我们把数字和模拟引脚的知识结合起来,写一个完整的数据采集程序。假设我们有一个光敏电阻模块(输出模拟信号)和一个按键(输出数字信号)。
程序逻辑:
- 每隔1秒读取一次光敏电阻的模拟值。
- 同时检测按键是否按下。
- 把数据通过串口发送到电脑。
// 综合数据采集示例
int lightPin = A0; // 光敏电阻接A0
int buttonPin = 2; // 按键接D2
int lightValue = 0;
int buttonState = 0;
void setup() {
pinMode(buttonPin, INPUT_PULLUP); // 启用内部上拉
Serial.begin(9600);
Serial.println("传感器数据采集开始...");
}
void loop() {
// 读取模拟值
lightValue = analogRead(lightPin);
// 读取数字值(注意:因为用了上拉,按下时是LOW)
buttonState = digitalRead(buttonPin);
// 格式化输出,方便后续分析
Serial.print("光照:");
Serial.print(lightValue);
Serial.print(" 按键:");
if (buttonState == LOW) {
Serial.println("按下");
} else {
Serial.println("松开");
}
delay(1000); // 每秒采集一次
}
INPUT_PULLUP,所以按键按下时读到的是 LOW。如果你用外部下拉电阻,逻辑就反过来。我个人习惯用内部上拉,省一个电阻。
你把这个程序烧录到Arduino里,打开串口监视器(工具 → 串口监视器),就能看到数据一行一行地打印出来。这就是最原始的数据采集。
4.5 知识体系总览
下面这张图,是我用SVG画的本章知识结构。你看一眼,就能明白Arduino和传感器打交道的完整流程。
这张图把整个流程串起来了。你从传感器获取信号,通过Arduino的引脚读取,再经过程序处理,最后输出到电脑。每一步都有对应的函数和注意事项。
4.6 几个实用小技巧
- 串口波特率要一致: 代码里写的是9600,串口监视器右下角也要选9600。否则你看到的全是乱码。我刚开始学时就吃过这个亏。
- delay() 会阻塞程序: 在
delay()期间,Arduino啥也干不了。如果你需要同时做多件事(比如一边读传感器一边控制LED),可以用millis()函数做非阻塞延时。这个后面会讲。 - 模拟引脚也能当数字用: 如果数字引脚不够用,可以把A0~A5当作数字引脚(编号14~19)。但反过来,数字引脚不能当模拟用。
Serial.println() 打印中间变量。这样你能看到程序到底在执行什么。调试的时候,这招比啥都管用。
好了,这一章的内容就到这里。你跟着我把开发环境搭好,把数字和模拟引脚的读取跑通,再写一个完整的数据采集程序。后面章节我们会在这个基础上,接入各种具体的传感器。
可可精品资料库