做电池供电的物联网设备,最纠结的就是选 ESP32 还是 ATmega328P。一个带 WiFi、跑得快也耗电,一个是 Arduino 老牌入门芯、据说贼省电。这篇不吹不黑,用两个芯片官方数据手册上的真实电流数字给你对比,最后告诉你什么项目该选谁。
先看 ATmega328P(Arduino Uno 的心脏,8位AVR核)。数据手册上的电源电流是这样:活动模式16MHz/5V时典型约9.2mA(上限14mA),降到8MHz约5.2mA;空闲(Idle)16MHz/5V约1.9到2.8mA;真正的断电睡眠模式(Power-down)典型只有40到60µA,纯裸片关掉欠压检测最低能做到0.1到0.9µA。

不过要提醒一句:上图的9mA是裸芯片的数字,整块 Uno 开发板可没这么老实——板上还带着USB转串口芯片、稳压器和一颗常亮的电源LED,全速跑实测能到45mA左右,睡眠也剩不下多少。所以真正追求低功耗的,往往会跳过开发板,用裸片自己搭最小系统。

再看 ESP32(32位双核,主频最高240MHz)。它耗电分几个档:关掉WiFi、CPU正常工作时约20到44mA(80MHz约20-31mA,160MHz约27-44mA);Modem-sleep(射频关闭、保持连接)约20到30mA;Light-sleep约0.8mA;Deep-sleep(只留RTC定时器和RTC内存)约5到10µA,芯片完全断电最低1µA。
这是 Espressif 官方对 ESP32 低功耗电流的实测波形:设备大部分时间睡在微安级基底电流,靠RTC定时器周期唤醒干活再睡回去,平均电流能压在5.5µA左右。这种“睡一会、醒一下、再睡”的节奏,就是ESP32做电池设备的省电核心。

这里有个很多人踩的对比陷阱。网上不少“ESP32比Arduino省电”的对比,其实是拿一台始终活动、从没调用过睡眠函数的Arduino(一直15到20mA)去对一台正确进入深度睡眠的ESP32(5到10µA)。这是拿“没做睡眠”打“做了睡眠”,不公平。要是两边都进各自最低功耗的睡眠,AVR的power-down 和ESP32的deep sleep其实差不了多少,纯裸片AVR还更低。
真正拉开差距的是要不要无线。需要周期性连WiFi上报数据的设备,ESP32的睡眠加唤醒循环是唯一现实解——它把射频集成在片内,避免了外挂WiFi模块自己那份固定功耗和握手开销。反过来,如果只是点灯、读个传感器、完全不上网,还要靠电池跑几年,那裸ATmega328P的功耗下限更低,更合适。
一句话选型:插电、要联网、吃性能的,闭眼选ESP32;纯电池、任务极简、想几年不换电池的,裸ATmega328P才是省电天花板。WiFi是电池最大的敌人,ESP32一发WiFi数据包峰值能冲到一两百毫安甚至更高,做低功耗一定要让它该睡就睡。







WiFi真的电老虎,一发数据包峰值几百毫安,做电池项目必须让它该睡就睡。
纯电池选328P、要联网选ESP32,一句话点透,这篇值。
终于有人把窗户纸捅破了,网上那些“ESP32吊打Arduino省电”的对比,大多是拿没睡着的Arduino去对睡了ESP32,确实不公平。我自己实测过,裸328P深度睡眠能到微安级,这篇引用数据手册的数字很扎实,选型那段看完就明白怎么挑了。