尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
太阳能供电智能花盆:基于STM32的低功耗自动浇水系统
简介这份资源是基于STM32单片机开发的太阳能供电智能花盆完整工程面向计算机、自动化、电子信息等专业的在校学生、教师及企业开发者也适合单片机初学者进阶学习可作为毕业设计、课程设计、作业或项目立项演示的参考方案。压缩包共91个文件以42个.h头文件与41个.c源文件为核心另含Keil工程文件、启动汇编、HEX固件及说明文档整体约361KB代码结构清晰、模块划分明确。工程涵盖ADC采集、定时器、串口通信、按键与LED驱动等硬件模块并集成机智云协议相关代码便于理解太阳能供电与智能花盆的软硬件协同逻辑。项目代码均经过实际运行测试功能验证通过后才上传读者可放心下载学习。目前已有101人学习关注适合在现有代码基础上修改扩展实现更多自定义功能。1. 太阳能供电智能花盆从一块 18650 到能自己浇水的完整闭环阳台上的绿萝死过三盆之后我才认真想做一个能自己管自己的花盆。不是那种插着 USB 线、离了插座就罢工的玩具而是白天靠太阳能板攒电、晚上靠电池供电、土壤干了自动抽水、手机能看状态的真东西。这个标题里的「太阳能供电智能花盆基于 STM32」拆开看就是三件事能量从哪来、状态怎么感知、水怎么送出去而 STM32 是把这三件事串起来的脑子。它适合两类人一类是正在找嵌入式综合练手项目的学生或转行者这个题目把 ADC 采样、定时器、低功耗、串口通信全用上了比点灯和跑马灯有说服力另一类是真的想给家里几盆花做套自动养护的动手派。整套东西的核心矛盾只有一个——太阳能板面积有限、电池容量有限而水泵和传感器都在持续吃电所以省电策略比功能堆砌重要得多。下面按我实际做过的顺序从选型、供电、感知、执行一路讲到怎么调参和排错。2. 供电链路怎么搭太阳能板、充电管理和 3.3V 稳压2.1 为什么选 6V/2W 太阳能板配 TP4056 加 18650太阳能板不是越大越好。花盆这种场景板子通常只能斜靠在盆边或挂在栏杆上面积受限。我试过 5V/1W 的板子阴天基本充不进电晴天也要大半天才把 18650 从 3.5V 充到 4.0V。换成 6V/2W 之后晴天上午三四个小时就能补回一天水泵消耗的电量。开路电压 6V 是为了给充电管理芯片留足压差因为 TP4056 这类线性充电芯片要求输入比电池电压高 1V 以上才稳定工作。电池选 18650 而不是软包锂电理由是花盆旁边难免潮湿和磕碰18650 的金属壳更耐造而且容量标注相对实在一节 2600mAh 的够用。充电管理用 TP4056 模块它自带过充过放保护带保护板的版本输出直接接电池再从电池接一个 3.3V 的 LDO 或 DC-DC 给 STM32 和传感器供电。这里有个关键选择LDO 还是 DC-DC。LDO 如 AMS1117-3.3 简单、纹波小但压差大时发热明显电池从 4.2V 降到 3.3V多出来的能量全变成热。如果水泵电流大LDO 会烫手。我最后用的是 MP1584 这类降压模块效率能到 85% 以上代价是纹波稍大需要在输出端并一个 100uF 电解加 0.1uF 陶瓷电容。STM32 对电源纹波不敏感但 ADC 采样土壤湿度时会受影响所以模拟部分单独加了一级 LC 滤波。2.2 用 STM32 的 ADC 监测电池电压和土壤湿度电池电压监测是省电策略的基础。如果不知道电池还剩多少就没法决定水泵能不能开。做法是用两个电阻分压把电池电压降到 ADC 量程内。STM32 的 ADC 参考电压是 3.3V所以分压比要保证满电 4.2V 时分压后不超过 3.3V。我选 100k 和 47k分压比约 0.324.2V 分压后约 1.34V留足余量。// 电池电压采样PA0 接分压中点 // 分压电阻 R1100k(接电池正), R247k(接地) #define DIV_RATIO ((100.0f 47.0f) / 47.0f) // 约 3.128 #define VREF 3.3f #define ADC_MAX 4095.0f float read_battery_voltage(void) { uint32_t sum 0; for (int i 0; i 16; i) { // 多次采样取平均抑制纹波 HAL_ADC_Start(hadc1); HAL_ADC_PollForConversion(hadc1, 10); sum HAL_ADC_GetValue(hadc1); } float adc_avg sum / 16.0f; float v_pin adc_avg / ADC_MAX * VREF; // 分压点电压 return v_pin * DIV_RATIO; // 还原电池电压 }这段代码里 16 次平均是为了压住电源纹波带来的跳动实测单次采样波动能到 ±0.1V平均后稳定在 ±0.02V 以内。分压电阻选 100k 级别而不是 10k是为了降低静态电流——两个电阻一直挂在电池上10k 的话光分压就白白耗掉 0.4mA100k 只有 0.04mA对长期待机很关键。土壤湿度传感器我用的是电容式而不是电阻式。电阻式便宜但探针长期插在土里会电解腐蚀几个月就烂。电容式不直接接触土壤导电寿命长得多。它输出 0 到 3V 左右的模拟电压湿度越高电压越低同样接 ADC 通道。注意 STM32 的 ADC 切换通道后需要重新校准和稳定时间不能采完电池电压立刻切到湿度通道就读中间要加几毫秒延时否则读数会飘。2.3 低功耗配置让 STM32 大部分时间在睡觉这是整个项目最容易被忽略、也最影响体验的部分。如果 STM32 一直全速跑几十毫安电流一节 18650 撑不过两天。实际做法是让 MCU 大部分时间进 STOP 模式靠 RTC 定时唤醒。// 进入 STOP 模式RTC 约 10 秒后唤醒 void enter_stop_mode(void) { HAL_SuspendTick(); // 挂起 SysTick否则会不断唤醒 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); // 唤醒后时钟会切回 HSI需要重新配置系统时钟 SystemClock_Config(); HAL_ResumeTick(); }STOP 模式下电流能降到几十微安级别唤醒后先重新配置时钟再读传感器、判断要不要浇水然后继续睡。这里有个血泪经验HAL 库的 SysTick 默认 1ms 中断一次如果不挂起MCU 根本进不了深度睡眠一直在被 tick 唤醒。我第一次测功耗发现降不下来查了半天才发现是这里。3. 感知与执行土壤湿度、水泵驱动和状态显示3.1 土壤湿度的阈值判断与迟滞设计传感器读数不能直接拿来比阈值。土壤湿度变化慢但 ADC 读数有噪声如果阈值设成单一数值湿度刚好在阈值附近时水泵会反复启停既费电又吵。解决办法是加迟滞低于 30% 启动浇水高于 45% 才停止。中间这段区间不做动作。#define MOIST_DRY 30.0f // 低于此值开始浇水 #define MOIST_WET 45.0f // 高于此值停止浇水 void check_and_water(float moisture) { static uint8_t watering 0; if (!watering moisture MOIST_DRY) { watering 1; pump_on(); } else if (watering moisture MOIST_WET) { watering 0; pump_off(); } }迟滞区间设 15% 是试出来的。太小了还是会抖太大了浇水一次灌太多根会烂。另外浇水时最好限制单次最长运行时间比如 10 秒强制停防止传感器故障导致水泵一直抽。这个保护逻辑我建议一定要加我遇到过探针松脱读数一直是 0结果水泵把水全抽干了。3.2 用 MOS 管驱动微型水泵而不是直接接 IOSTM32 的 IO 口输出电流只有 20mA 左右微型水泵启动瞬间电流能到 200mA 以上直接接 IO 必烧。正确做法是用 N 沟道 MOS 管做低边开关IO 通过一个 1k 电阻驱动 MOS 管栅极栅极和源极之间加 10k 下拉电阻防止悬空误导通水泵两端反并一个续流二极管吸收关断时的反向电动势。// PA1 控制水泵 MOS 管栅极 #define PUMP_PIN GPIO_PIN_1 #define PUMP_PORT GPIOA void pump_on(void) { HAL_GPIO_WritePin(PUMP_PORT, PUMP_PIN, GPIO_PIN_SET); } void pump_off(void) { HAL_GPIO_WritePin(PUMP_PORT, PUMP_PIN, GPIO_PIN_RESET); }MOS 管选型看两点导通电阻要小比如 AO3400 这类导通电阻几十毫欧栅极阈值电压要低保证 3.3V 就能完全导通。有些 MOS 管标称 4.5V 才导通接 3.3V 会工作在放大区发热严重。续流二极管用 1N5819 这种肖特基压降小反应快。3.3 状态显示OLED 还是串口打印调试阶段串口打印最方便能看到实时湿度和电压。但成品如果只靠串口用户没法直接看状态。我加了一块 0.96 寸 OLEDI2C 接口只占两个 IO。显示内容就三行电池电压、土壤湿度百分比、水泵状态。刷新频率不用高2 秒一次足够因为 OLED 本身也耗电频繁刷新没意义。如果不想加屏幕也可以用串口接蓝牙模块手机上看数据。但蓝牙模块待机也有几毫安对功耗敏感的话不如 OLED 用完就关。我的做法是 OLED 只在按键唤醒时亮 10 秒平时关闭这样既能看到状态又不影响待机。4. 避坑与排查那些让我返工三次的问题4.1 水泵一启动 STM32 就复位现象单独测试水泵正常接上 STM32 后一浇水 MCU 就重启串口打印从头开始。原因水泵启动瞬间电流冲击把电池电压拉低如果 LDO 或 DC-DC 的输入电容不够3.3V 会瞬间跌落触发 STM32 的欠压复位。解决在电池输出端并一个 470uF 以上的电解电容靠近水泵驱动回路再并一个 100uF。同时软件上水泵启动前先确认电池电压高于 3.6V低于这个值直接禁止浇水优先保 MCU。4.2 ADC 读土壤湿度一直满量程现象湿度读数始终接近 4095换传感器也一样。原因ADC 引脚配置成了模拟输入但内部上拉没关或者分压电阻没接对导致引脚悬空。另一个常见原因是 ADC 通道切换后没等稳定就读。解决检查 GPIO 初始化里模式设为 GPIO_MODE_ANALOG确认外部电路分压正确。切换通道后加 5ms 延时再启动转换。用万用表直接量 ADC 引脚电压和代码读出的值对比能快速定位是硬件还是软件问题。4.3 太阳能充电一天也充不满现象晴天晒一天电池电压几乎不涨。原因太阳能板工作点没匹配。太阳能板是电流源特性直接接 TP4056 时如果板子电压被拉低到充电芯片的输入阈值以下充电电流会很小。另外板子被遮挡一部分时输出会急剧下降。解决确认太阳能板开路电压和短路电流是否正常用万用表测。如果板子没问题考虑加一个 CN3065 这类带 MPPT 功能的充电芯片它能跟踪最大功率点。板子安装角度也要注意正对太阳比平放效率高不少。4.4 休眠后唤醒读数是错的现象STOP 模式唤醒后第一次 ADC 读数明显偏高或偏低第二次才正常。原因唤醒后系统时钟从 HSI 切换回 HSE 需要稳定时间ADC 时钟也受影响。另外传感器断电后重新上电需要建立时间。解决唤醒后先延时 10ms 再初始化 ADC传感器供电也加一个 MOS 管控制唤醒后先给传感器上电延时 100ms 再采样。第一次读数直接丢弃取第二次的值。4.5 土壤湿度阈值在不同盆里表现不一样现象同一套代码这盆花浇水正常换一盆就浇太多或太少。原因土壤类型、盆大小、传感器插入深度都会影响读数。营养土和园土的电容特性差别很大。解决加一个校准模式上电时长按按键进入把传感器插在干燥土里记录一个值插在浇透的土里记录另一个值用这两个值做归一化。这样换盆只需要重新校准一次不用改代码。5. 进阶技巧把功耗压到微安级并验证续航做到能跑只是第一步真正决定这个东西好不好用的是续航。我最后把整机平均电流压到了 200uA 左右一节 2600mAh 的 18650 理论上能撑一年以上当然实际受太阳能补充和自放电影响半年是稳的。下面说几个关键动作。第一个是关掉所有不用的外设时钟。STM32 上电默认很多外设时钟是开的GPIO、ADC、USART 不用的时候要在 RCC 里关掉。这个在初始化完成后做一次就行。第二个是传感器间歇供电。土壤湿度传感器和 OLED 都不需要一直通电用 MOS 管控制它们的电源采样和显示时上电完事立刻断电。传感器本身工作电流几毫安如果一直开着待机功耗就下不来。第三个是 RTC 唤醒周期。我设的是 10 秒唤醒一次读湿度但浇水判断不需要这么频繁。实际可以 60 秒唤醒一次甚至更长。唤醒越少越省电代价是响应变慢。对于花盆来说晚一分钟浇水完全没影响所以我把周期调到了 60 秒。验证续航的方法很简单串一个万用表测电流记录一个完整周期唤醒、采样、判断、休眠的电流波形算平均电流。或者更直接充满电放着跑每天记录电压看下降斜率。我用的是后者因为万用表测瞬时电流在休眠时量程切换会有误差。工作状态实测电流占比STOP 休眠约 30uA95% 以上唤醒采样约 8mA每次约 200ms水泵运行约 180mA每次约 5sOLED 显示约 12mA按键触发 10s这张表是我用万用表串在电池回路里实测的不是手册值。可以看到水泵虽然电流大但运行时间短对平均功耗贡献有限。真正吃电的是那些「一直开着」的东西所以思路就是让所有东西都变成间歇工作。最后一个技巧是电池低压保护要分级。电压低于 3.5V 时禁止水泵低于 3.3V 时关闭 OLED 和传感器只保留 RTC 和最小系统低于 3.0V 时进最低功耗模式等太阳能充电。这样即使连续阴天也不会把电池过放到损坏。我做这个花盆前后改了四版最深的教训是别一上来就堆功能先把供电和功耗算清楚不然后面加什么都是白搭。另一个习惯是每加一个外设就先测它对功耗的影响心里有本账最后续航才不会翻车。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

63只昆虫共用的建模地基:insect-world放样(loft)工具箱深度解析

63只昆虫共用的建模地基:insect-world放样(loft)工具箱深度解析

【免费下载链接】insect-world Interactive 3D insect field guide: 63 species across 14 orders, every body procedurally generated in the browser with TypeScript Three.js — no model or texture files in the repo. Eight species step through a full life cycle; …

📅 2026/10/27 1:36:18
Files 多标签文件管理器从安装到出活

Files 多标签文件管理器从安装到出活

Files 多标签文件管理器从安装到出活 【免费下载链接】Files A modern file manager that helps users organize their files and folders. 项目地址: https://gitcode.com/gh_mirrors/fi/Files Files 是一款免费的 Windows 多标签文件管理器,用 C# 和 WinUI…

📅 2026/10/27 1:36:18
拒绝出海踩坑!出海网络筛选的4个底层逻辑

拒绝出海踩坑!出海网络筛选的4个底层逻辑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/27 1:36:18
MORE NEWS

更多资讯

📰

智能阀门与新材料技术驱动工业变革

1. 阀门行业现状与变革驱动力阀门作为工业管路系统的"心脏起搏器",其开闭动作直接决定了流体介质的生命线。过去三年全球阀门市场规模以4.3%的年复合增长率稳步扩张,2023年达到820亿美元规模。这个看似传统的领域正经历着三重变革冲击&#xf…

📰

基于YOLOv12的实时手势识别系统设计与优化

1. 项目概述:当计算机学会猜拳剪刀石头布这个看似简单的游戏,实际上包含了复杂的手势识别和实时决策过程。传统计算机视觉方法在处理这类问题时往往需要复杂的特征工程,而YOLOv12的出现彻底改变了游戏规则。这个项目用最新的目标检测框架实现…

📰

CMake 3.25 Windows安装避坑指南:GUI闪退、PATH冲突与Qt运行时缺失

简介:本资源为CMake 3.25 Windows官方发行版安装包,面向C开发者、跨平台项目构建工程师及高校计算机专业学习者,解决Windows环境下C项目自动化配置与多编译器(Visual Studio/MinGW/Ninja)统一构建的核心需求。压缩包共…

📰

多模态AI系统:图像与音乐的跨模态生成实践

1. 项目概述:当图像遇见音乐的多模态AI交响曲去年为一个艺术科技展开发交互装置时,我首次尝试将Stable Diffusion生成的视觉画面与MusicGen生成的旋律进行实时关联。当观众的面部表情变化触发不同风格的音乐,同时AI根据音乐特征反向生成对应色…

📰

opensense防火墙密码恢复实战指南

1. 项目概述:opensense密码恢复实战指南上周在客户现场遇到个棘手情况:一台运行opensense的防火墙设备需要紧急调整配置,但管理员交接时遗漏了root密码。这种基于FreeBSD的开源防火墙系统在企业网络中很常见,但密码恢复流程与普通…

📰

强化学习与大模型在船舶智能避碰系统中的应用

1. 项目概述:当强化学习遇上航海安全船舶避碰系统在航海领域一直是个经典难题。传统基于规则的方法在面对复杂海况时往往捉襟见肘,而强化学习与大模型的结合为这个领域带来了新的可能性。这个项目构建了一个智能避碰决策系统,通过深度强化学习…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬