#第九届立创电赛# 基于STM32的锂电池供电温湿度显示器设计与制作全记录
手把手教你做一个锂电池供电的温湿度显示器从硬件到软件的全过程最近有不少朋友问我想自己动手做一个便携的温湿度计既能学习STM32又能体验完整的硬件开发流程有没有合适的项目这不我正好借着参加立创电赛的机会完整地走了一遍从设计、焊接、编程到装壳的全过程今天就把这个基于STM32的锂电池供电温湿度显示器的制作经验毫无保留地分享给大家。这个项目特别适合电子竞赛的初学者或者嵌入式爱好者。你不仅能学会如何驱动OLED屏幕和温湿度传感器更重要的是能掌握如何为一个小型设备设计可靠的锂电池供电与充电系统这可是很多便携设备的核心。我踩过的坑、总结的技巧都会在教程里详细说明保证你跟着做就能成功。1. 项目整体规划我们要做一个什么东西简单来说我们要做的是一个巴掌大小、能随身携带的温湿度计。它核心的功能就两个测量环境的温度和湿度然后把数据显示在一块小屏幕上。为了让它能真正“便携”我们选择了锂电池供电并且内置了充电电路用普通的USB线就能充电。整个项目可以拆解成几个明确的模块主控使用经典的STM32F103C8T6单片机性价比高资料丰富。传感器采用DHT11温湿度传感器数字接口使用简单。显示使用0.96寸的OLED屏幕SSD1306驱动I2C接口显示清晰省电。供电这是本项目的重点改造部分将原来的5号电池方案改为可充电的锂电池并集成TP4056充电管理芯片。外壳使用3D打印为电路板做一个“家”让作品更完整、更美观。下面我们就从最核心的硬件改造开始一步步把它实现。2. 硬件设计与改造打造“续航心脏”原项目的参考设计使用的是5号电池供电。5号电池虽然方便但不可充电长期使用成本高也不够环保。我决定把它改成锂电池供电这涉及到供电电路和充电电路的重新设计。2.1 供电系统改造思路锂电池的标称电压是3.7V充满电约4.2V放电截止电压约3.0V。而我们的STM32和OLED屏幕通常需要3.3V的稳定电压。所以我们需要一个电源管理方案它要能完成两件事充电通过USB口安全地为锂电池充电。稳压将锂电池波动的电压3.0V-4.2V稳定地输出为3.3V给整个系统供电。我选择的方案是TP4056充电芯片 AMS1117-3.3稳压芯片。这是一个非常经典且廉价的组合。2.2 电路原理详解根据原文提供的原理图修改部分我们来解读一下关键电路。1. 锂电池充电电路TP4056TP4056是一颗单节锂电池线性充电芯片外围电路非常简单。它的核心功能是管理充电过程先恒流充电快充满时转为恒压充电充满后自动停止。USB_VCC ───┬─── TP4056(VIN) │ ├─── TP4056(CHRG) ─── LED1充电状态指示 │ └── TP4056(STDBY) ─── LED2充满状态指示 TP4056(BAT) ────── 锂电池正极 锂电池负极 ────── GNDPROG引脚通过连接一个1.2KΩ的电阻到地来设定充电电流。公式是I_CHG 1200V / R_PROG。用1.2K电阻充电电流就是1000mA1A。对于小容量电池如原文用的200mAh可以换用更大的电阻如3KΩ来减小充电电流对电池更友好。CHRG和STDBY引脚分别驱动两个LED用于指示充电状态红灯亮和充满状态绿灯亮。2. 电源路径与稳压电路这是改造的另一个关键点如何让系统既能在USB供电时工作又能在电池供电时工作并且两者无缝切换USB_VCC ────┬─── AMS1117-3.3(VIN) ── 3.3V_SYS │ 锂电池正极 ────┬──────────┼─── AMS1117-3.3(VIN) ── 3.3V_SYS │ │ [二极管] [二极管]我使用了两个二极管如1N5817组成一个“或门”电路。USB_VCC和电池电压分别通过一个二极管后连接到AMS1117的输入端。工作原理当插入USB时USB_VCC电压5V高于电池电压电流从USB路径流过二极管导通同时反向截止了电池的供电路径。系统由USB供电并同时为电池充电。当拔掉USB时电池电压通过其路径的二极管导通为系统供电。二极管的作用防止电池电流倒灌到USB口也防止USB电流直接灌入电池除了通过TP4056的充电路径。这是保证安全隔离的关键。AMS1117-3.3将上游的电压无论是USB来的~5V还是电池来的3.7V-4.2V稳定降至3.3V为MCU、传感器、屏幕提供洁净稳定的电源。注意AMS1117是线性稳压器当输入电压接近3.3V时比如电池电压降到3.5V以下其效率会变低压差太小时可能无法稳定输出。对于追求极致续航的项目可以考虑使用效率更高的DC-DC降压芯片如MP2359。2.3 PCB焊接与调试心得硬件设计好后就是制板和焊接。原文作者提到“铁板烧真香”指的是用加热台进行回流焊这对于有大量贴片元件的板子来说效率很高。给新手的焊接建议顺序很重要先焊高度低的元件再焊高的。通常顺序是芯片电阻电容 - 排针/插座 - 大的连接器或电池座。检查虚焊焊接完成后一定要仔细检查每个引脚特别是芯片的引脚和供电线路。用放大镜看或者用万用表通断档测量。先供电后上电焊接完第一件事先别插电池或USB用万用表测量3.3V输出端对地(GND)的电阻看看有没有短路。确认无短路后再通电测试。分模块测试先不接单片机只给板上电测量AMS1117输出是否是稳定的3.3V。然后再接上单片机和其他模块。原文作者遇到了“假的芯片”导致调试一下午的问题这非常常见。购买元器件一定要选择可靠的渠道比如立创商城等正规平台。一颗几毛钱的劣质芯片可能让你浪费几天时间。3. 软件编程让硬件“活”起来硬件是身体软件是灵魂。这个项目的软件逻辑其实很清晰初始化 - 循环读取传感器数据 - 刷新屏幕显示。3.1 开发环境与工程准备我使用的是Keil MDK开发环境这也是STM32开发最常用的工具之一。第一步建立工程在Keil中新建一个基于STM32F103C8的工程。需要添加必要的库文件。对于初学者我强烈建议使用标准外设库Standard Peripheral Library或者HAL库。原文作者是跟着视频教程敲代码大概率用的是标准外设库。你可以从ST官网下载。在工程中管理好文件夹比如/USER放主程序/FWLIB放标准库文件/HARDWARE放屏幕、传感器的驱动文件。第二步配置下载器原文提到了使用ST-Link下载器并且强调“要提前设置好不然会报错”。这里的关键设置是在Keil的Options for Target-Debug选项卡里选择你的调试器ST-Link。点击Settings在Flash Download选项卡里一定要勾选Reset and Run这样程序下载后会自动运行不用手动复位。确保Programming Algorithm里添加了对你所用芯片的Flash算法对于STM32F103C8通常是STM32F10x Med-density。3.2 核心驱动代码解析虽然原文没有提供具体代码但根据硬件DHT11, SSD1306 OLED, STM32我们可以梳理出核心的代码框架。1. OLED屏幕显示驱动 (I2C接口)OLED驱动的主要任务是初始化屏幕和实现画点函数有了画点函数就可以封装出画线、写字、显示图片等功能。// OLED初始化示例片段 (基于标准库) void OLED_Init(void) { // 1. 初始化I2C引脚 (GPIOB6-SCL, GPIOB7-SDA) GPIO_InitTypeDef GPIO_InitStructure; I2C_InitTypeDef I2C_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); // 配置GPIO为复用开漏输出 GPIO_InitStructure.GPIO_Pin GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_OD; // 复用开漏 GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOB, GPIO_InitStructure); // 2. 配置I2C参数 I2C_InitStructure.I2C_Mode I2C_Mode_I2C; I2C_InitStructure.I2C_DutyCycle I2C_DutyCycle_2; I2C_InitStructure.I2C_OwnAddress1 0x00; // 主机地址可任意设置 I2C_InitStructure.I2C_Ack I2C_Ack_Enable; I2C_InitStructure.I2C_AcknowledgedAddress I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed 400000; // 400kHz I2C_Init(I2C1, I2C_InitStructure); I2C_Cmd(I2C1, ENABLE); // 3. 发送一系列初始化命令序列给OLED (复位、设置对比度、扫描方式等) OLED_Write_Cmd(0xAE); // 关闭显示 // ... 更多初始化命令 OLED_Write_Cmd(0xAF); // 开启显示 OLED_Clear(); // 清屏 }2. DHT11温湿度传感器驱动DHT11使用单总线协议对时序要求非常严格。通信过程分为MCU发起起始信号 - DHT11响应 - 连续传输40位数据16位湿度16位温度8位校验和。// 读取一次DHT11数据的函数 uint8_t DHT11_Read_Data(uint8_t *temp, uint8_t *humi) { uint8_t buf[5]; uint8_t i, j; // MCU拉低总线至少18ms作为起始信号 DHT11_IO_OUT(); DHT11_DQ_OUT(0); delay_ms(20); DHT11_DQ_OUT(1); delay_us(30); // 切换为输入模式等待DHT11响应 DHT11_IO_IN(); // ... 检查DHT11的响应信号80us低电平 80us高电平 // 读取40位数据 for(i0; i5; i) { for(j0; j8; j) { // 等待50us低电平起始位结束 while(DHT11_DQ_IN()0); delay_us(40); // 延时40us后检测电平 if(DHT11_DQ_IN()1) { buf[i] | (1 (7-j)); // 高电平为‘1’ } while(DHT11_DQ_IN()1); // 等待高电平结束 } } // 校验数据 if(buf[4] (buf[0]buf[1]buf[2]buf[3])) { *humi buf[0]; *temp buf[2]; return 1; // 成功 } return 0; // 失败 }提示DHT11对时序敏感delay_us()函数的准确性至关重要。如果读取总是失败优先检查你的微秒延时函数是否准确。可以考虑使用定时器来产生精确延时。3. 主程序逻辑主程序的逻辑就是一个大循环定期读取传感器并更新显示。#include stm32f10x.h #include oled.h #include dht11.h int main(void) { uint8_t temperature, humidity; char disp_str[20]; SystemInit(); // 系统时钟初始化 OLED_Init(); // 屏幕初始化 DHT11_Init(); // 传感器初始化主要是GPIO初始化 OLED_ShowString(0, 0, Temp: C, 16); OLED_ShowString(0, 2, Humi: %, 16); while(1) { if(DHT11_Read_Data(temperature, humidity)) { // 读取成功 sprintf(disp_str, %d, temperature); OLED_ShowString(48, 0, disp_str, 16); // 在固定位置显示温度值 sprintf(disp_str, %d, humidity); OLED_ShowString(48, 2, disp_str, 16); // 在固定位置显示湿度值 } else { OLED_ShowString(0, 4, Read Error!, 16); // 显示错误 } delay_ms(2000); // 每2秒更新一次数据DHT11最快也要2秒读一次 } }4. 结构设计与项目收尾硬件软件都调通后一个裸露的电路板总感觉少了点什么。3D打印一个外壳能让你的作品瞬间提升一个档次。外壳设计思路测量精确测量你的PCB板尺寸、OLED屏幕开孔位置、传感器探头位置、USB接口位置以及按键位置。建模使用简单的3D建模软件如Fusion 360, SolidWorks 甚至是在线的Tinkercad进行设计。设计时务必考虑装配公差孔位和卡槽要比实际尺寸稍微大一点比如单边大0.2mm否则可能装不进去。考虑散热与透气DHT11传感器需要接触空气要在其对应的外壳位置设计透气孔。同时避免将芯片等发热部件完全密闭。分体设计外壳通常设计为上盖和下盖通过螺丝或卡扣固定。记得设计好螺丝柱的位置。原文作者分享了设计好的外壳模型图并提到“迫不及待就去下单了”。现在嘉立创等平台也提供了3D打印服务价格实惠非常适合个人开发者。最后把PCB板、电池装进外壳拧紧螺丝。接上USB线看到充电指示灯亮起屏幕点亮并显示出温湿度——恭喜你一个完全由自己动手制作的、锂电池供电的便携温湿度显示器大功告成了这个项目虽然基础但涵盖了嵌入式开发的主要环节电源设计、MCU控制、传感器应用、人机交互和结构设计。希望这个详细的教程能帮你顺利复现更重要的是理解每一步背后的原理。遇到问题别怕那正是学习的好时机祝你制作愉快

相关新闻

Python数据可视化避坑指南:解决云模型绘制中的NumPy弃用警告

Python数据可视化避坑指南:解决云模型绘制中的NumPy弃用警告

Python数据可视化避坑指南:深度解析NumPy弃用警告与云模型绘制优化 最近在重构一个基于云模型的评估系统可视化模块时,我又一次遇到了那个熟悉的黄色警告——DeprecationWarning: Conversion of an array with ndim > 0 to a scalar is deprecated。这…

2026/5/17 10:48:53 阅读更多 →
Qwen3-VL-2B显存不足?低成本GPU优化部署案例让推理效率提升150%

Qwen3-VL-2B显存不足?低成本GPU优化部署案例让推理效率提升150%

Qwen3-VL-2B显存不足?低成本GPU优化部署案例让推理效率提升150% 你是不是也遇到过这种情况:好不容易找到一个功能强大的视觉语言模型,比如阿里开源的Qwen3-VL-2B-Instruct,结果一部署就发现显存不够用?要么是模型太大…

2026/5/17 10:48:53 阅读更多 →
【立创开源六周年】知音·纪:基于安信可ESP12F的纪念版智能音箱开源项目全解析

【立创开源六周年】知音·纪:基于安信可ESP12F的纪念版智能音箱开源项目全解析

手把手复刻【知音纪】:用安信可ESP12F打造你的纪念版智能音箱 最近在立创开源平台上看到一个特别有温度的项目——【知音纪】,它是一个为纪念立创开源六周年而设计的智能音箱。作者不仅把蓝牙音箱、环境监测、氛围灯这些实用功能都做进去了,更…

2026/5/17 10:48:52 阅读更多 →

最新新闻

3步掌握高效数据迁移:开源格式转换工具的完整实战指南

3步掌握高效数据迁移:开源格式转换工具的完整实战指南

3步掌握高效数据迁移:开源格式转换工具的完整实战指南 【免费下载链接】onenote-md-exporter ConsoleApp to export OneNote notebooks to Markdown formats 项目地址: https://gitcode.com/gh_mirrors/on/onenote-md-exporter 你是否曾面对堆积如山的OneNot…

2026/7/6 5:40:40 阅读更多 →
利用Applera1n工具绕过iPhone激活锁:原理、实操与限制详解

利用Applera1n工具绕过iPhone激活锁:原理、实操与限制详解

1. 项目概述与核心需求解析最近在折腾旧iPhone的朋友,估计没少被“激活锁”这个拦路虎给卡住。手里拿着一台不知道Apple ID密码的二手设备,或者自己忘了密码的老机器,看着那个“激活锁”界面,感觉跟砖头没什么两样。我手头就有一台…

2026/7/6 5:40:40 阅读更多 →
ROFLPlayer:英雄联盟回放分析神器,三步解锁你的游戏复盘能力

ROFLPlayer:英雄联盟回放分析神器,三步解锁你的游戏复盘能力

ROFLPlayer:英雄联盟回放分析神器,三步解锁你的游戏复盘能力 【免费下载链接】ROFL-Player (No longer supported) One stop shop utility for viewing League of Legends replays! 项目地址: https://gitcode.com/gh_mirrors/ro/ROFL-Player 还在…

2026/7/6 5:38:39 阅读更多 →
d2s-editor:暗黑破坏神2存档编辑器,轻松管理你的游戏角色数据

d2s-editor:暗黑破坏神2存档编辑器,轻松管理你的游戏角色数据

d2s-editor:暗黑破坏神2存档编辑器,轻松管理你的游戏角色数据 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 你是否曾为暗黑破坏神2复杂的存档编辑而烦恼?想要调整角色属性却不知从何下手&am…

2026/7/6 5:36:39 阅读更多 →
如何用FanControl打造智能静音电脑:从零基础到专业调校的完整指南

如何用FanControl打造智能静音电脑:从零基础到专业调校的完整指南

如何用FanControl打造智能静音电脑:从零基础到专业调校的完整指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_…

2026/7/6 5:36:39 阅读更多 →
129、轻量化 Head 设计:用 Depthwise Conv 加 1×1 Conv 替代标准检测头卷积

129、轻量化 Head 设计:用 Depthwise Conv 加 1×1 Conv 替代标准检测头卷积

129、轻量化 Head 设计:用 Depthwise Conv 加 1乘1 Conv 替代标准检测头卷积 从一次显存爆炸说起 去年秋天调一个YOLOv11n的工业检测模型,输入分辨率压到640640,batch size设到32,结果RTX 3090直接OOM。排查半天,发现检测头三个分支的卷积层占了将近40%的参数量。当时项目…

2026/7/6 5:32:38 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻