太阳能给 Arduino/ESP32 供电:TP4056 充 18650,夜里到底能撑多久

Cartoon of a large white-framed solar panel tilted towards a yellow sun, its white cable running to a small royal-blue charger board beside a black holder with a pale blue 18650 cell

太阳能板并不会直接带动你的 Arduino —— 它负责把电池充满,真正供电的是电池。我们这块 6 W 5 V 太阳能板可以直接插进 TP4056 Type-C 充电模块,充满一颗 18650,再由升压模块稳稳送出 5 V。至于夜里撑不撑得住,那是一道算术题 —— 这篇就带你一起算。

给 Arduino 或 ESP32 用太阳能供电,到底需要哪些东西?

从阳光到你的项目之间,一套太阳能供电是四个环节:太阳能板 → 充电模块 → 电芯 → 升压模块。太阳能板的输出随云层忽高忽低,电芯把这份起伏缓冲掉,升压模块再把电芯一路下滑的 4.2–3.0 V 抬成 Uno 或 ESP32 要的稳定 5 V。

Parts list

ItemPriceQty
Soldering Service for Circuit Boards & Electronics - 10 Pins Soldering ServiceSoldering Service for Circuit Boards & Electronics - 10 Pins Soldering ServiceSOLSE10RM1.40

这条链路一共要焊八个点:充电模块的 B 焊盘两个、充电模块到升压模块的连线四个、升压模块输出两个。加购 10 针焊接服务,我们替你焊好 —— WhatsApp 上把你的项目告诉我们,我们就知道该焊哪几个焊盘。

6 W 5 V 太阳能板的线尾是一个 USB Type-C 公头,而 Type-C 版 TP4056 上正好是一个 Type-C 母座,所以输入这一端不用转接头、也不用焊 —— 选这一版,别选 micro-USB 版。太阳能板的电池片是硬接到插头的电源脚上的,没有任何协议芯片需要握手。

18650 充电升压一体模块把 Type-C 输入、4056 级别的充电电路、保护电路和一路 2 A 5 V 升压做在同一块 PCB 上 —— 焊两个点就够,不用焊八个。这份材料清单刻意把各环节拆开,方便你逐段测量。

卡通横排图:白色边框太阳能板、宝蓝色 TP4056 充电模块、装着淡蓝色 18650 电芯的黑色电池盒、带蓝色可调电位器的深藏青升压板,以及一块小开发板,用青色箭头依次相连
四个环节依次排开:太阳能板经充电模块把电芯充满,而真正接触你项目的只有升压模块的输出。

一块 6 W 的太阳能板,实际能往 18650 里灌多少电?

这块 6 W 5 V 太阳能板在烈日下大约能给出 1.2 A —— 6 W ÷ 5 V。TP4056 吃不下这么多:它设计上就是一颗 1 A 充电器,由一颗电阻编程,上限 1000 mA。所以整条链路的天花板就是 1 A,而 6 W 的板子已经把它喂饱了:换成 10 W15 W 太阳能板能给到 2 A、3 A,充电模块照样只拿 1 A,多出来的那部分根本离不开板子。

实际数字还会被热量再压低一截,因为 TP4056 是线性充电器:多余的电压它不转换,而是烧掉。输入 5 V、电芯 3.7 V、电流 1 A 时,(5 − 3.7) × 1 = 1.3 W 全变成封装里的热,而这个封装的额定耗散是 2 W、对环境的热阻是 50 °C/W —— 1.3 × 50 = 比周围空气高 65 °C。芯片会靠削减充电电流把自己的芯片结温压在 125 °C 以内,所以在马来西亚的午后、又关在密闭盒子里,它实际充进去的远低于 1 A。

因此把一颗空电芯充满,在天花板电流下大约要 2200 mAh ÷ 1000 mA ≈ 2.2 小时,再加上后段恒压 —— 充电模块把电压咬在 4.2 V,让电流慢慢衰减到截止。按 NASA POWER 的气候统计,吉隆坡全年平均每天约收到 4.8 kWh/m²,最阴的月份约 4.2;一个”峰值日照小时”等于 1 kWh/m²,所以固定安装的板子按大约 4.5 个峰值日照小时来估 —— 晴天大约能给出 4.5 Ah,而电芯只装得下 2.2 Ah;雨季一个阴天只有四分之一的光照,只存得进 1.3 Ah,连一颗电芯都填不满,而做容量估算时要扛住的恰恰是这种阴天。

12 V 的 CCTV 或警报系统属于另一条路线。一组 12 V 7 Ah 电池装着 84 Wh;6 W 的太阳能板在 4.5 小时的日照里、还没算损耗,最多也就收进约 27 Wh,而稳压到 4.2 V 的 TP4056 根本充不了这种电池组。这类系统需要更大的板子、一块多节的 2S/3S/4S CN3304 充电板,以及回到低压时的一个降压模块

同样这套算法,有人在工作台上量给你看:

一整夜下来,究竟什么才跑得动?

一颗 18650 电芯标称 3.7 V、2200 mAh —— 也就是 8.1 Wh。升压模块守恒的是能量,不是电流:它拿安培换伏特,路上还要抽一成。MT3608 数据手册标题写着”高达 97 %”,那是小幅升压时的最好情况;把一颗已经掉压的 3.7 V 电芯抬到 5 V,按 90 % 算才踏实。于是剩下 7.3 Wh,7.3 Wh ÷ 5 V ≈ 5 V 轨上的 1450 mAh。2200 mAh 的电芯不等于 2200 mAh 的 5 V 供电,大多数太阳能项目就死在这道缺口上。

马来西亚一年到头夜长都接近 12 小时,所以把这 1450 mAh 均摊在一夜里就是 120 mA 连续电流 —— 而且天亮时刚好见底。见底是硬停:模块上的 DW01 保护芯片会在过放阈值切断电芯,等电芯歇一会儿电压回弹后又再次跳闸,看起来就像板子坏了。请按”一夜只花半颗电芯”来设计。

5 V 轨上的负载 典型电流 12 小时一夜 占一颗电芯的比例(5 V 下 1450 mAh)
Arduino Uno,正常跑 sketch 约 45 mA 540 mAh 37 %
ESP32 DevKit,连着 Wi-Fi 待机 约 100 mA 1200 mAh 83 %
ESP32 DevKit,每 10 分钟醒 10 s 约 11.5 mA 138 mAh 10 %
裸 ESP32 模组深度睡眠 10 µA 0.12 mAh 约 0 %

间歇工作那一行是平均值,不是某个工作状态:(10 s × 100 mA + 590 s × 10 mA) ÷ 600 s = 11.5 mA。而那 10 mA 的底噪是整块开发板,不是芯片。乐鑫标称深度睡眠 10 µA、Wi-Fi 接收时 95–100 mA,但 DevKit 上还挂着一颗光是静态电流典型值就有 5 mA 的稳压器、一颗电源指示灯和一颗 USB 转串口芯片 —— 这些你的 sketch 一个也关不掉。自己的板子请自己量:用万用表串在回路里,或者用 INA3221 监测模块

卡通夜景:装着淡蓝色 18650 电芯的黑色电池盒给深藏青升压板和一块小开发板供电,下方一条青色脉冲波形显示短暂唤醒与长时间睡眠交替
能不能撑过一夜,看的是那些平坦的区段,而不是脉冲:醒一下就睡的板子,耗电只有一直挂在网上的十分之一。

这条链路怎么接,哪些地方必须焊?

TP4056 的四个焊盘正是这个项目最容易翻车的地方:电芯接 B+/B−,其余所有东西一律从 OUT+/OUT− 走,因为保护 MOSFET 就夹在这两对之间。我们的 TP4056 充电教程把焊盘纪律和指示灯状态讲得很完整。

为什么
太阳能板的 USB-C 公头 TP4056C 的 Type-C 母座 插上就好;不用转接头,不用焊
电池盒红线 TP4056 的 B+ 电芯正极,在保护电路里侧
电池盒黑线 TP4056 的 B− 电芯负极,在保护电路里侧
TP4056 OUT+ / OUT− MT3608 VIN+ / VIN− 受保护的输出去喂升压模块
MT3608 VOUT+ Uno 的 5V 引脚,或 ESP32 的 5V/VIN 把稳定的 5 V 送进开发板
MT3608 VOUT− 开发板 GND 整条链路共用的回流路径

这八个接点全是导线焊在裸露的过孔上;手法细节见焊接教程。把四根公对公杜邦线各剪成两截:其中两截两端都焊死,负责把 OUT+/OUT− 引到 VIN+/VIN−;另外两截接在 VOUT 上,留下的公头可以插进 Uno 的母排,或者插进面包板的电源轨,旁边就是插着公排针的 ESP32 DevKit。

MT3608 上那颗蓝色方块是多圈可调电位器,所以要转好多圈输出才开始动:一边用万用表盯着 VOUT 一边转,停在 5.0–5.2 V,然后再接负载。保持出厂设定的话,它的输出可能远高于 5 V,而 Arduino 的 5V 引脚背后没有稳压器替你兜底。开发板要么吃升压模块的电,要么吃 USB 的电,绝不能同时接:Uno 的 5V 引脚本身就是 USB 口那条电源轨,同时接的话,升压模块会往你笔电的 USB 口里灌电流。

怎么让 ESP32 在两次任务之间睡过去?

ESP32 的深度睡眠不是”暂停”:它会把 CPU 和射频整个断电,醒来时从 setup() 重新开始跑 sketch —— 这也是下面那个计数器要住在 RTC 内存里、而不是普通变量里的原因。

// ESP32 的太阳能友好间歇工作:醒来、干活、断电。
// 深度睡眠正是让一块 6 W 太阳能板够用的关键 - 整夜
// 让板子处于关闭状态,而不是整夜挂在 Wi-Fi 上空转。

const int WORK_SECONDS  = 10;   // 每个周期醒着的秒数
const int SLEEP_MINUTES = 10;   // 两次唤醒之间睡的分钟数

// 普通变量会被深度睡眠清空;RTC 内存则能挺过去。
RTC_DATA_ATTR unsigned int wakeCount = 0;

void doTheWork() {
  // 你真正要做的事写在这里:读传感器、上传数据、闪个 LED。
  // 尽量短 - 多醒一秒,就是多花掉一秒的电池。
  for (int s = 0; s < WORK_SECONDS; s++) {
    Serial.print("working... ");
    Serial.println(s + 1);
    delay(1000);
  }
}

void setup() {
  Serial.begin(115200);
  delay(200);                   // 等 USB 串口稳定下来
  wakeCount++;
  Serial.print("Wake #");
  Serial.println(wakeCount);

  doTheWork();

  // esp_sleep_enable_timer_wakeup() 的单位是微秒,所以睡 10 分钟
  // 要写成 10 * 60 * 1000000。请用 64 位来算:普通 int 运算在
  // 睡眠时间超过大约 35 分钟时就会溢出。
  uint64_t sleepMicros = (uint64_t)SLEEP_MINUTES * 60ULL * 1000000ULL;
  esp_sleep_enable_timer_wakeup(sleepMicros);

  Serial.print("Sleeping for minutes: ");
  Serial.println(SLEEP_MINUTES);
  Serial.flush();               // 等串口打印完,再让 UART 断电
  esp_deep_sleep_start();       // 这一行之后的代码永远不会执行
}

void loop() {
  // 永远到不了这里。从深度睡眠醒来等同于重启:芯片会从
  // setup() 重新开始 - 这正是 wakeCount 要住在 RTC 内存里的原因。
}

它编译出来是 276,128 字节,约占 DevKit 应用分区的 21 %。Arduino Uno 没有对等的省电空间 —— 它的 ATmega328P 是能睡,但板上的电源指示灯和 USB 转串口芯片照喝不误 —— 所以做太阳能供电,让 ESP32 间歇工作,比让 Uno 挨饿划算得多。我们ESP32 供电指南里那块双 18650 扩展板是个整洁的室内方案,但它走 micro-USB 充电,所以这块太阳能板的 Type-C 公头喂不了它。

太阳能板防水吗 —— 其他部件呢?

这块 6 W 单晶太阳能板是整条链路上唯一能待在户外的部件。它的电池片压在一层硬质层压面板之下,封进一体成型的边框里,正面没有任何开口,随板还附一个户外 CCTV 那种可调角度支架。请把它当作”耐雨”而不是”可浸水”:安装时倾斜一点,让雨水顺着流走、顺便把灰尘冲掉,出线口朝下。

插头之后的东西一概不防水。USB-C 接口、充电模块、升压模块、电芯和开发板都需要一个防护盒,线从底部进入,并且在入口前留一个滴水弯,让水沿着线滴走,而不是顺着线爬进去。这个盒子要放在阴凉处,别贴在太阳能板背面:锂电芯关在密闭黑盒子里、又在烈日下暴晒,是这整个项目里唯一真正危险的环节 —— 高温下给 18650 充电会让它迅速劣化,极端情况下正是电芯排气的成因。

卡通图:装在可调角度支架上的白色边框太阳能板正把青色雨滴甩落,白色线缆向下绕成一圈后从底部进入灰色密封盒,盒内是蓝色充电模块、淡蓝色 18650 电芯和藏青升压板
太阳能板本来就是给雨天设计的,电子件不是。盒子放在下方,线从底部经滴水弯进入,盒子本身避开阳光直射。

真实客户身上常见的错误

“solar panel for my cctv… is not enough” —— 多数情况是容量没算对,不是板子坏了。买之前先做那道算术:电池组的瓦时(电压 × 安时)对上太阳能板一天的收成(瓦数 × 峰值日照小时)。

“This solar panel is waterproof from rain and water?” —— 太阳能板本身可以;它后面的充电模块、电芯和开发板不行。

“ini solar panel bila charge ada battery 18650 di belakang tak” —— 没有;太阳能板就是电池片、边框和一条线,背面什么都没有。18650、电池盒和充电模块都是分开的零件。

以为项目一直开着,充电也能”充满”。TP4056 判定充电结束的条件是电流跌到设定值的十分之一,而它分不清这是电芯的电流还是你板子的电流,所以一个稳定的 100 mA 负载会让它永远停在阈值之上:充电指示灯一直不熄,电芯长期浮在 4.2 V,寿命就这么耗掉。请把平均负载压在充电电流的十分之一以下 —— 间歇工作的板子做得到,一直开着的做不到。

常见问题

太阳能板能不能不配电池,直接带动 Arduino?

不可靠。一片云飘过去,一秒之内太阳能板的输出就能腰斩,5 V 轨在指令执行到一半时塌下来,板子就复位了。电芯就是消掉这种起伏的缓冲。

我还需要另外买一个太阳能充电控制器吗?

在这个功率级别,TP4056 就是那个充电控制器:先恒流,再在 4.2 V 恒压,最后截止。它不是 MPPT 控制器 —— 太阳能板给什么电压它就收什么 —— 会损失一点收成,但在 6 W 上看不出来。

能不能用 4 槽 18650 电池盒来多存点电?

配 TP4056 不行。4 槽电池盒是把电芯串联的,整组电压接近 14.8 V,而稳压到 4.2 V 的单节充电器既充不了它,也承受不住。要用更多电芯,请改用为串联电池组设计的 CN3304 充电板。

一直开着的 ESP32,需要多大的太阳能板?

从不睡的 ESP32 大约吃 100 mA,12 小时一夜就要花掉一颗 18650 在 5 V 轨上那 1450 mAh 中的约 1200 mAh —— 勉强过夜、几乎不剩,再遇上一个阴天就直接黑掉。先做间歇工作,再加第二颗电芯;换更大的太阳能板,恰恰是那 1 A 天花板完全无视的一步。

最后更新:2026年8月。有问题?WhatsApp 联系我们

Leave a Reply

Your email address will not be published. Required fields are marked *