从一块面包板开始:手把手教你用 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、读出一个温度开始的。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐