从零实现基于Arduino的温度传感器监测项目
从一块面包板开始:手把手教你用 Arduino 做温度监控系统
你有没有想过,家里的智能恒温器、温室大棚的自动控温装置,甚至是你手腕上那块能提醒发烧的手环,背后其实都藏着一个“看不见”的小卫士—— 温度传感器 ?
今天,我们就从零开始,不讲空话,只动手。用一块十几块钱的 Arduino Uno 和一个小小的温度传感器,搭建一套真正能用的环境温度监测系统。无论你是电子小白,还是刚入门嵌入式开发的新手,这篇教程都能让你在两小时内跑通第一个“会感知世界”的项目。
为什么选它?因为够简单、够真实
物联网听起来高大上,但它的起点往往特别朴素: 读一个数据,做一点反应 。而温度,是最直观、最容易理解的物理量之一。
我们这次要玩的是两个经典选手:
-
LM35
:模拟信号老将,便宜到不可思议;
-
DS18B20
:数字通信高手,支持多点串联,布线自由。
它们各有绝活,也各藏坑点。接下来我会像朋友一样,把踩过的雷、调过的参数、写过的代码,全都摊开讲清楚。
先认识你的“温度侦探”:LM35 vs DS18B20
LM35 —— 模拟时代的线性王者
这颗小芯片长得跟三极管差不多,但它输出的是电压,而且非常“讲道理”:每升高1°C,输出就精准增加10毫伏(mV)。
比如室温25°C时,它就会输出
250 mV
。
听起来很美,但现实有点骨感:
📌 关键限制来了 :Arduino Uno 的 ADC 是 10 位的,参考电压默认是 5V,意味着它能把 0~5V 分成 1024 份,每一份约等于 4.88 mV 。
所以你能分辨的最小温差是:
4.88 mV ÷ 10 mV/°C ≈ 0.49°C
也就是说,你最多只能看到“23°C”、“24°C”,很难捕捉更细微的变化。这不是传感器不准,而是“分辨率不够”。
但它胜在 接线极简 :VCC、GND、OUT 三根线搞定,连库都不用装。
DS18B20 —— 数字世界的组网高手
如果说 LM35 是独行侠,那 DS18B20 就是个社交达人。它走的是 单总线协议(1-Wire) ,一根数据线就能和多个设备通信——没错,你可以把十个 DS18B20 全接到同一个引脚上,靠它们各自的“身份证”(64位唯一ID)来区分。
更重要的是,它是直接输出 数字温度值 的,不需要 ADC 转换,避免了模拟信号受干扰的问题。精度最高可达 ±0.5°C,分辨率还能设到 0.0625°C !
不过,天下没有免费的午餐:
- 必须外加一个
4.7kΩ 上拉电阻
到 VCC,否则数据线拉不起来;
- 需要引入第三方库才能轻松使用;
- 单次测温需要等待最多 750ms(12位模式),不能太心急。
但一旦配好,你会发现它稳定得不像这个价位的产品。
硬件怎么连?一张表说清所有细节
| 组件 | 引脚 | 连接到 Arduino |
|---|---|---|
| LM35 | VCC | 5V |
| GND | GND | |
| OUT | A0(模拟输入) |
✅ 特别注意:不要接反电源!LM35 不耐高压,超过30V可能烧毁。
| DS18B20 (TO-92封装) | 标记面朝向你 | 左→右顺序 |
|---|---|---|
| 左侧 | VDD(电源) → 5V | |
| 中间 | DQ(数据) → 数字引脚 D2 | |
| 右侧 | GND → GND |
📌 重点来了 :在 DQ 和 VDD 之间必须焊接一个 4.7kΩ 电阻 !这是保证通信稳定的“命门”。没有它,程序会报错或读不到数据。
软件怎么写?两种风格,两种哲学
方案一:LM35 模拟采集 —— 最基础却最锻炼基本功
const int tempPin = A0;
void setup() {
Serial.begin(9600);
}
void loop() {
int raw = analogRead(tempPin); // 读取0~1023的原始值
float voltage = raw * (5.0 / 1023.0); // 换算成电压
float tempC = voltage * 100.0; // 因为10mV/°C → ×100
Serial.print("Temperature: ");
Serial.print(tempC);
Serial.println(" °C");
delay(1000);
}
💡
逐行解读
:
-
analogRead()
返回的是 ADC 的量化结果,不是真实电压;
-
(5.0 / 1023.0)
是为了精确计算每一步对应的电压;
-
*100
是因为 1V 对应 100°C(10mV/°C → 1000mV/V ÷ 10mV = 100);
🎯 优化技巧 :如果你发现数值跳动厉害,试试加个平均滤波:
float getAverageTemp() {
float sum = 0;
for (int i = 0; i < 10; i++) {
sum += analogRead(tempPin);
delay(10);
}
float voltage = (sum / 10.0) * (5.0 / 1023.0);
return voltage * 100.0;
}
这样可以有效抑制噪声干扰。
方案二:DS18B20 数字读取 —— 库帮你搞定复杂协议
先去 Arduino IDE 安装两个库:
-
OneWire
by Paul Stoffregen
-
DallasTemperature
by Miles Burton
然后上传以下代码:
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
void setup() {
Serial.begin(9600);
sensors.begin();
// 可选:打印总线上有多少设备
Serial.print("Found ");
Serial.print(sensors.getDeviceCount(), DEC);
Serial.println(" temperature devices.");
}
void loop() {
sensors.requestTemperatures();
float tempC = sensors.getTempCByIndex(0);
if (tempC == -127.0) {
Serial.println("❌ 传感器未连接或通信失败");
} else {
Serial.print("✅ Temperature: ");
Serial.print(tempC);
Serial.println(" °C");
}
delay(1000);
}
🧠
核心逻辑拆解
:
-
sensors.begin()
会扫描总线上的所有 DS18B20 设备;
-
requestTemperatures()
相当于喊一声:“各位,开始测温!”;
- 然后你要等一会儿(内部已处理),再用
getTempCByIndex(0)
拿第一个设备的数据;
- 如果返回
-127
,说明没找到设备,赶紧检查接线和上拉电阻!
🔧 进阶玩法 :如果你想挂两个以上传感器,可以用:
DeviceAddress sensor1, sensor2;
sensors.getAddress(sensor1, 0); // 获取第0个设备地址
sensors.getAddress(sensor2, 1); // 获取第1个设备地址
// 后续通过地址单独读取
sensors.getTempC(sensor1);
这才是分布式测温网络的雏形。
实际应用中那些没人告诉你的事
我在实际项目里被坑过太多次,现在把这些血泪经验交给你:
❗ 问题1:DS18B20 死活读不出数据?
👉 检查三点:
1. 上拉电阻是不是焊上了?4.7kΩ 接在 DQ 和 VCC 之间;
2. 接线有没有松动?特别是杜邦线容易接触不良;
3. 是否开启了寄生供电模式?如果不是,请务必接 VDD 供电。
❗ 问题2:LM35 数值忽高忽低?
👉 很可能是电源噪声太大。解决办法:
- 加一个 0.1μF 陶瓷电容在 VCC 和 GND 之间;
- 或者改用稳压电源模块供电;
- 软件端做滑动平均或卡尔曼滤波。
🛠 设计建议清单
| 场景 | 推荐方案 |
|---|---|
| 快速验证、教学演示 | LM35 + Arduino |
| 多点监测、长距离传输 | DS18B20 组网 |
| 户外使用 | 传感器套热缩管或灌封胶防水 |
| 电池供电 | 让 Arduino 睡眠,定时唤醒采样 |
| 数据可视化 | 串口绘图器 Serial Plotter 或 Blynk App |
这个项目能带你走多远?
别小看这个看似简单的温度计,它其实是通往更大世界的入口:
- 加个 DHT11 ,你就有了温湿度一体监测;
- 接上 ESP8266 WiFi 模块 ,数据就能上传云端;
- 用 OLED 屏幕 显示实时曲线,本地也能看;
- 设置阈值触发继电器,实现风扇自动启停;
- 把数据存进 SD 卡,做长期趋势分析;
- 甚至结合机器学习模型,预测设备过热风险……
我见过有人用类似的架构做了鸡舍温控系统,也有人把它改装成酿酒发酵监控仪。真正的创造力,永远来自最基础的组合。
写在最后:动手才是硬道理
技术文档可以写得很完美,但只有当你亲手把线接上、看到串口监视器跳出第一个“23.5 °C”的那一刻,那种“我让机器感知了世界”的成就感,才是无法替代的。
所以别犹豫了,打开你的工具箱,找一块 Arduino,买一个传感器,花一个小时试一遍。哪怕第一次失败了,查资料、换线、改代码的过程,就是最好的学习。
如果你在调试过程中遇到任何问题——读数异常、通信超时、库安装失败——欢迎留言交流。我们一起解决。
毕竟,每一个嵌入式工程师,都是从点亮一个 LED、读出一个温度开始的。
更多推荐
所有评论(0)