4. Arduino与传感器:开发环境搭建与基础数据采集

好,咱们进入正题。这一章,我带你亲手把Arduino和传感器跑起来。

很多初学者拿到Arduino板子,第一反应是「这玩意儿怎么玩?」。别急,咱们一步步来。我个人习惯,先把开发环境搭好,再动手写代码。这样后面出问题了,排查起来也快。

4.1 开发环境搭建——别小看这一步

Arduino的开发环境,说白了就是它的IDE(集成开发环境)。你从官网下载就行,免费、开源。

安装步骤其实很简单:

  1. 去 arduino.cc 下载对应你操作系统的版本(Windows、macOS、Linux都行)。
  2. 双击安装,一路默认选项。嗯,这里要注意:Windows用户可能会遇到驱动安装提示,点同意就好。
  3. 安装完成后,打开IDE。你会看到一个白色的编辑窗口,下面有个黑色的控制台区域。
我的小经验: 我第一次装Arduino IDE时,选了「便携版」(Portable),结果后面装库文件时路径总出问题。后来我改用标准安装版,再也没折腾过。建议你也用标准版。

装好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。

避坑指南: 我曾经犯过一个低级错误——数字引脚悬空时,读到的值是不确定的!一定要接上拉电阻或下拉电阻,或者用Arduino内部的上拉电阻(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. 每隔1秒读取一次光敏电阻的模拟值。
  2. 同时检测按键是否按下。
  3. 把数据通过串口发送到电脑。
// 综合数据采集示例
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传感器数据采集知识体系 传感器 光敏/温度/按键等 模拟/数字信号 Arduino Uno analogRead() / digitalRead() 串口通信 电脑端 串口监视器/数据记录 数字引脚 digitalRead() 0或1,按键/开关 模拟引脚 analogRead() 0~1023,连续信号 程序结构 setup() + loop() 串口输出 + 延时控制 核心:传感器 → 引脚读取 → 数据处理 → 输出

这张图把整个流程串起来了。你从传感器获取信号,通过Arduino的引脚读取,再经过程序处理,最后输出到电脑。每一步都有对应的函数和注意事项。

4.6 几个实用小技巧

  • 串口波特率要一致: 代码里写的是9600,串口监视器右下角也要选9600。否则你看到的全是乱码。我刚开始学时就吃过这个亏。
  • delay() 会阻塞程序: 在 delay() 期间,Arduino啥也干不了。如果你需要同时做多件事(比如一边读传感器一边控制LED),可以用 millis() 函数做非阻塞延时。这个后面会讲。
  • 模拟引脚也能当数字用: 如果数字引脚不够用,可以把A0~A5当作数字引脚(编号14~19)。但反过来,数字引脚不能当模拟用。
我的建议: 刚开始写程序时,多用 Serial.println() 打印中间变量。这样你能看到程序到底在执行什么。调试的时候,这招比啥都管用。

好了,这一章的内容就到这里。你跟着我把开发环境搭好,把数字和模拟引脚的读取跑通,再写一个完整的数据采集程序。后面章节我们会在这个基础上,接入各种具体的传感器。

可可精品资料库