ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

基于Arduino与LM35传感器的数字温度计制作全攻略

2026/8/19 5:23:45 拓冰建站 浏览量
基于Arduino与LM35传感器的数字温度计制作全攻略 1. 项目概述从零打造一台数字温度测量仪最近在工作室整理东西翻出几个闲置的LM35温度传感器和一块Arduino Nano突然就想动手做点什么。数字温度测量设备听起来像是个实验室里的专业仪器但其实它的核心原理并不复杂我们自己完全可以用手头的常见电子元件搭建一个。无论是想监控鱼缸水温、记录室内外温差还是单纯想学习一下模拟信号到数字信号的转换过程这个项目都是一个绝佳的起点。它融合了传感器技术、模数转换、微控制器编程和数据显示等多个基础但核心的电子工程概念。通过这个项目你将亲手完成从传感器选型、电路搭建、代码编写到最终校准的完整流程。最终得到的不仅是一个能显示具体温度数值的小设备更是一套对嵌入式系统和数据采集的直观理解。无论你是电子爱好者、创客还是相关专业的学生跟着走一遍这个过程收获会远比直接买一个成品温度计大得多。接下来我就以最经典的LM35传感器和Arduino平台为例带你一步步实现它并深入聊聊每个环节背后的门道和容易踩的坑。2. 核心器件选型与原理深度解析制作数字温度测量设备第一步不是急着焊接电路而是搞清楚我们要用哪些“积木”以及它们为什么能协同工作。选型决定了设备的精度、成本和复杂度而理解原理则能让你在出现问题时不至于束手无策。2.1 温度传感器的抉择为什么是LM35市面上温度传感器种类繁多有热电偶、热敏电阻、数字传感器如DS18B20和模拟集成传感器如LM35。对于入门和大多数通用场景我强烈推荐LM35原因有以下几点线性度极佳这是LM35最大的优点。它的输出电压与摄氏温度成完美的线性关系比例系数是10mV/°C。这意味着在0°C时输出0mV25°C时输出250mV100°C时输出1000mV。你不需要像使用热敏电阻那样去查复杂的阻值-温度对照表或进行对数计算数据处理变得非常简单直接。无需外部校准LM35在出厂时已经过校准其常温下的精度典型值为±0.5°C。对于非精密测量场合我们拿到手就可以直接用省去了复杂的校准步骤。使用简单它只有三个引脚电源Vcc、输出Vout和地GND。电路连接非常简洁。低成本与易获取这是最经典的模拟温度传感器之一价格低廉在任何电子元器件商城都很容易买到。当然它也有局限性测量范围通常是-55°C到150°C具体看型号输出是模拟信号容易受到电源噪声和长导线干扰。但对于我们桌面级的数字温度计项目这些缺点完全在可接受范围内。注意购买时请认准“LM35”而不是“LM35DZ”。后者是TO-92塑料封装我们手工焊接最方便。还有LM35CAH是TO-46金属封装精度更高一些。2.2 微控制器的角色Arduino为何是首选传感器产生了代表温度的电压信号我们需要一个“大脑”来读取这个信号并将其转换成我们能理解的数字。这就是微控制器MCU的工作。选择Arduino系列如Uno, Nano, Mega的原因如下内置ADC模数转换器Arduino板载的ATmega328P芯片拥有一个10位精度的ADC。这意味着它可以将0-5V的输入电压以Arduino的基准电压为准量化为0-1023之间的一个整数值。这正是读取LM35模拟输出所必需的功能。开发环境友好Arduino IDE简单易用库生态丰富极大地降低了编程门槛。你不需要从零开始配置寄存器几行代码就能完成ADC读取。丰富的IO和通信接口除了读取传感器我们还需要驱动显示设备如LCD屏或OLED或者将数据发送到电脑。Arduino的通用IO口和硬件串口Serial让这些扩展变得轻而易举。社区支持强大几乎你遇到的所有问题都能在网上找到相关的讨论和解决方案。ADC原理浅析这是本项目最核心的技术点之一。Arduino的ADC基准电压默认是板载的5V被分成了1024级2^10。每一级对应的电压值是 5V / 1024 ≈ 4.88mV。当LM35输出250mV代表25°C时ADC读到的数值大约是 250mV / 4.88mV ≈ 51。我们的代码就是将这个原始数值比如51通过计算还原成温度值。2.3 显示与输出单元的选择我们需要一个界面来展示温度数据。常见选择有串口监视器最简单通过USB线将Arduino连接到电脑在Arduino IDE中打开串口监视器温度数据就能以文本形式打印出来。这是前期调试和验证的最快方式。LCD1602液晶屏经典直观16字符x2行的字符型液晶屏需要连接较多线4位或8位数据模式但显示稳定、可视角度好。需要LiquidCrystal库支持。I2C OLED屏推荐像SSD1306驱动的0.96寸OLED屏。它通过I2C总线通信只需要连接4根线VCC, GND, SDA, SCL节省IO口并且显示效果更现代、美观。需要Adafruit_SSD1306和Adafruit_GFX库。数码管适合需要远距离观察的场景但驱动电路和编程稍复杂。对于首个项目我建议采用“串口监视器OLED屏”的组合。前者用于调试后者用于最终成品兼顾了便捷和美观。3. 电路设计与搭建实操要点理解了“为什么用这些零件”之后我们开始动手把它们连接起来。正确的电路是设备稳定工作的物理基础。3.1 核心测量电路连接这是最精简的电路仅实现基本测温功能。所需元件Arduino Nano或Uno x1LM35温度传感器 x1面包板 x1跳线若干连接步骤供电将Arduino的5V引脚连接到面包板的正极电源轨GND引脚连接到负极电源轨。连接LM35LM35的Vcc引脚正面朝上从左至右通常为Vcc, Vout, GND接面包板的5V电源轨。LM35的GND引脚接面包板的GND电源轨。关键一步LM35的Vout模拟输出引脚连接到Arduino的任何一个模拟输入引脚例如A0。可选添加滤波电容为了获得更稳定的读数可以在LM35的Vcc和GND引脚之间尽可能靠近传感器本身的地方并联一个0.1uF104的陶瓷电容。这可以有效滤除电源线上的高频噪声。实操心得连接LM35输出线时尽量使用较短的导线。模拟信号非常脆弱长导线就像天线会引入空间电磁干扰导致读数跳动。如果必须延长建议使用屏蔽线。3.2 增加OLED显示模块让我们把设备做得更完整加上一个OLED屏幕。所需额外元件I2C OLED模块SSD1306, 128x64 x14根母对母跳线连接步骤OLED模块的VCC接Arduino的5V或3.3V需看模块支持。OLED模块的GND接Arduino的GND。OLED模块的SCL时钟线接Arduino的A5引脚在Nano/Uno上这是I2C的SCL。OLED模块的SDA数据线接Arduino的A4引脚在Nano/Uno上这是I2C的SDA。电路布局建议将LM35用延长线引出使其可以测量环境温度而Arduino主板和OLED屏可以放在一个固定位置或小盒子里。这样既方便测量又便于观察。3.3 供电方案考量在调试阶段通过USB线供电是最方便的。但如果想做成一个独立的便携设备就需要考虑外部供电。电池供电便携方案9V方块电池通过标准的2.1mm直流电源插座给Arduino供电。板载稳压芯片会将其降至5V。简单但电池容量小不经济。锂电池组推荐例如使用一块3.7V的18650锂电池配合一个TP4056充电保护板和DC-DC升压模块升压至5V。这是性价比和续航能力俱佳的方案。手机充电宝直接使用USB输出极其方便。电源稳定性注意无论采用何种供电方式确保电源电压稳定是关键。如果LM35的供电电压即Arduino的5V输出波动会直接导致输出模拟电压波动造成测量误差。在电池电压下降时这种误差会显现出来。4. 软件编程与核心算法实现电路搭建完毕接下来是赋予设备“灵魂”的步骤——编程。我们将一步步编写代码实现温度读取、计算和显示。4.1 基础代码读取与串口输出我们先从最核心的测温功能开始通过串口在电脑上查看结果。// 数字温度计 - 基础串口版本 // 引脚定义 const int sensorPin A0; // LM35输出接在A0引脚 void setup() { Serial.begin(9600); // 初始化串口通信波特率9600 Serial.println(Digital Thermometer Started...); } void loop() { // 1. 读取模拟值 int rawADC analogRead(sensorPin); // 读取A0引脚得到0-1023之间的整数 // 2. 将模拟值转换为电压值 (假设使用默认5V基准电压) float voltage rawADC * (5.0 / 1024.0); // 单位伏特(V) // 3. 将电压值转换为温度值 (LM35: 10mV/°C) float temperatureC voltage * 100.0; // 电压 * 100 即为摄氏度 // 4. 通过串口输出结果 Serial.print(Raw ADC: ); Serial.print(rawADC); Serial.print( | Voltage: ); Serial.print(voltage, 3); // 打印3位小数 Serial.print(V | Temperature: ); Serial.print(temperatureC, 2); // 打印2位小数 Serial.println( °C); delay(1000); // 每秒读取一次 }代码关键点解析analogRead(pin)这是Arduino读取模拟引脚的核心函数返回0到1023的整数。voltage rawADC * (5.0 / 1024.0)这是ADC反算电压的公式。5.0是基准电压1024.0是ADC的分辨率2^10。务必使用5.0而不是5以确保进行浮点数计算避免精度丢失。temperatureC voltage * 100.0利用LM3510mV/°C的特性将电压单位V乘以100即得到摄氏度。例如0.25V对应25°C。上传这段代码后打开串口监视器你应该能看到不断刷新的温度数据。用手捏住LM35传感器观察温度上升这证明你的硬件和基础代码工作正常。4.2 进阶代码集成OLED显示现在我们加入OLED显示功能让设备脱离电脑独立工作。首先需要在Arduino IDE中安装库点击“工具” - “管理库”搜索并安装Adafruit SSD1306和Adafruit GFX Library。// 数字温度计 - 完整OLED显示版本 #include Wire.h #include Adafruit_GFX.h #include Adafruit_SSD1306.h // 引脚定义 const int sensorPin A0; // OLED定义 #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define OLED_RESET -1 // 如果OLED有RESET引脚则接其引脚号否则用-1 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, Wire, OLED_RESET); void setup() { Serial.begin(9600); // 初始化OLEDI2C地址通常是0x3C或0x3D if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println(F(SSD1306 allocation failed)); for(;;); // 初始化失败程序卡死 } display.clearDisplay(); display.setTextSize(2); // 设置字体大小 display.setTextColor(SSD1306_WHITE); // 设置字体颜色 display.setCursor(0, 0); // 设置起始光标位置 display.println(Thermo-); display.println(meter); display.display(); // 将缓存内容显示到屏幕上 delay(2000); } void loop() { // 读取并计算温度 int rawADC analogRead(sensorPin); float voltage rawADC * (5.0 / 1024.0); float temperatureC voltage * 100.0; // 在串口打印用于调试 Serial.print(Temp: ); Serial.print(temperatureC, 1); Serial.println( C); // 在OLED上显示 display.clearDisplay(); display.setTextSize(2); display.setCursor(0, 0); display.print(Temp:); display.setTextSize(3); // 温度数值用更大字体 display.setCursor(10, 25); display.print(temperatureC, 1); // 显示一位小数 display.setTextSize(2); display.print( ); display.setTextSize(3); display.cp437(true); // 使用Code Page 437字符集 display.write(167); // 显示度符号 ° display.setTextSize(2); display.print(C); display.display(); delay(500); // 每0.5秒更新一次 }代码升级点解析库与对象通过引入Adafruit_SSD1306库我们可以用高级命令控制屏幕无需关心底层I2C通信细节。显示流程OLED库采用“缓存-刷新”机制。所有display.print()或display.draw操作都是修改内存中的显示缓存。只有调用display.display()时才会将缓存内容一次性发送到屏幕显示。这避免了屏幕闪烁。度符号显示OLED库默认的字符集可能不包含“°”符号。这里通过write(167)直接写入该符号的ASCII扩展码Code Page 437是一种实用的技巧。4.3 算法优化滤波与精度提升直接读取的原始数据可能会有微小跳动。为了提高读数的稳定性和准确性我们可以从软件算法上进行优化。多次采样求平均这是最简单有效的软件滤波方法。连续读取N次ADC值然后取平均值作为本次的有效读数。const int numSamples 10; // 采样次数 int sensorSum 0; for(int i0; inumSamples; i) { sensorSum analogRead(sensorPin); delay(10); // 每次采样间隔一小段时间 } int rawADC sensorSum / numSamples; // 得到平均ADC值使用外部基准电压Arduino ADC的默认基准是板载的5V稳压输出这个电压本身可能有±5%的误差。如果你追求更高精度可以使用更稳定的外部基准源。例如将Arduino的AREF引脚连接一个3.3V的精密基准电压芯片如LM4040并在setup()中调用analogReference(EXTERNAL)。此时ADC的满量程就是3.3V计算公式中的5.0要换成3.3。特别注意使用外部基准时确保输入ADC的电压绝对不能超过AREF引脚电压否则可能损坏芯片。中位值平均滤波结合“取中值”和“求平均”能有效抵抗偶然的脉冲干扰。即采样N个数据去掉一个最大值和一个最小值然后对剩下的数据求平均。5. 校准、测试与性能优化设备做出来了显示着数字但它准吗如何让它更可靠这就是校准和测试阶段要解决的问题。5.1 简易校准方法即使LM35出厂已校准但整个系统的误差ADC基准误差、电路噪声等仍可能导致读数偏差。我们可以进行一点简单的系统校准。冰水混合物法0°C点校准准备一个保温杯装入纯净水和冰块充分搅拌静置几分钟使其达到冰水共存状态。此时温度应非常接近0°C。将LM35的金属头确保防水或涂上导热硅脂后用热缩管密封插入冰水中避免接触冰块。读取设备稳定后的温度值T_measure。计算偏移量Offset 0 - T_measure。在代码的温度计算公式后加上这个偏移量temperatureC voltage * 100.0 Offset;体温对比法快速验证将LM35传感器紧贴你的腋下确保良好接触。等待约1分钟让传感器与体温平衡。正常人体腋下温度约为36.0°C ~ 37.0°C。对比设备读数可以快速判断是否存在巨大偏差如超过±1°C。注意事项校准环境要稳定传感器要与被测介质充分热接触。LM35的响应速度不是瞬间的需要给予足够的平衡时间通常几十秒。5.2 测量范围与响应测试了解你设备的边界和性能。高温测试可以用吹风机的冷风档避免高温损坏缓缓加热传感器观察读数变化。切勿让LM35长时间超过150°C否则可能永久损坏。低温测试可以将传感器放入冰箱冷藏室约4°C或冷冻室约-18°C进行测试。同样注意LM35的最低工作温度。响应速度测试记录从室温环境突然放入冰水中读数下降到稳定值所需的时间。这反映了传感器的热惰性。小型TO-92封装的LM35响应速度较快但如果用热缩管或胶密封了速度会变慢。5.3 功耗优化针对电池供电如果你想让它用电池运行得更久可以优化代码降低功耗。降低工作频率在setup()中可以通过设置时钟分频寄存器来降低Arduino的CPU主频但这对新手较复杂且可能影响通信。睡眠模式最有效让Arduino在两次测量之间进入深度睡眠。这需要额外的库如LowPower库和可能的外部中断唤醒电路是进阶的优化手段。关闭未用模块在不需要时可以关闭OLED屏幕的显示display.clearDisplay(); display.display();然后让OLED进入睡眠模式具体看驱动芯片手册或关闭ADC模块。对于初学者最简单的省电方法就是降低采样频率。如果不是监测快速变化的温度将loop()中的delay(500)改为delay(5000)5秒读一次功耗就能立即降低90%。6. 常见问题排查与进阶扩展即使按照步骤操作你也可能会遇到一些问题。这里汇总了一些常见坑点及其解决方案。6.1 问题排查速查表现象可能原因排查步骤与解决方案读数始终为01. 传感器电源未接通或接反。2. 模拟引脚连接错误。3. 代码中引脚号定义错误。1. 用万用表测量LM35 Vcc和GND之间是否有5V电压。2. 检查面包板连线是否松动。3. 确认代码中sensorPin定义的引脚与实际连接一致。读数跳动剧烈1. 电源噪声大。2. 传感器输出线过长引入干扰。3. 没有进行软件滤波。1. 在LM35的Vcc和GND间并联0.1uF和10uF电容。2. 缩短传感器到Arduino的导线或使用双绞线/屏蔽线。3. 在代码中实现“多次采样求平均”算法。读数明显偏高或偏低1. Arduino的5V基准电压不准。2. LM35传感器个体差异或损坏。3. 计算公式错误。1. 用万用表测量Arduino 5V引脚的实际电压替换代码公式中的5.0。2. 更换一个LM35传感器测试。3. 检查公式voltage rawADC * (实测Vcc / 1024.0)。OLED屏幕不显示1. I2C地址错误。2. 电源接错3.3V屏接了5V。3. 库未正确安装或初始化失败。1. 常见地址是0x3C或0x3D尝试修改display.begin()中的地址参数。2. 确认OLED屏的工作电压部分屏是3.3V逻辑电平接5V可能损坏。3. 检查Arduino IDE的库管理确认库已安装。查看串口监视器是否有初始化失败信息。温度变化反应迟钝1. 传感器被绝缘材料包裹。2. 被测物体热容量大温度变化慢。3. 代码中delay()时间过长。1. 确保LM35的金属面与被测物体良好接触使用导热硅脂。2. 这是物理限制选择更小封装的传感器或改进安装方式。3. 适当减少主循环的延迟时间。6.2 项目进阶扩展思路一个基础的数字温度计完成后你可以以此为平台添加更多功能多路温度监测使用模拟多路复用器如CD4051或直接使用Arduino Mega的多个模拟口同时连接多个LM35实现多点温度监测和对比。温度数据记录仪增加一个SD卡模块将温度数据连同时间戳需要DS3231等RTC时钟模块保存到txt或csv文件中用于长期环境监测。无线传输与物联网加入ESP8266或ESP32 WiFi模块将温度数据上传到云端平台如Blynk、ThingsBoard、自建服务器实现手机APP远程查看或超温报警。高精度升级将LM35更换为16位高精度ADC如ADS1115和PT100铂电阻配合恒流源电路可以将测量精度提升到±0.1°C级别用于更专业的场合。人机交互增强增加按键可以切换显示单位摄氏/华氏、查看历史最高/最低温度、设置报警阈值等。外观与结构设计使用3D打印或激光切割为你的设备制作一个外壳将OLED屏、按键、传感器接口等规整地排列起来让它从一个实验原型变成一个真正的产品样机。这个项目就像一把钥匙打开了嵌入式开发的大门。从读取一个简单的模拟信号开始你可以不断叠加新的模块和功能最终构建出满足你特定需求的复杂系统。每一次遇到的问题和解决的过程都是最宝贵的经验。