本帖最后由 迪洛克 于 2022-8-29 12:00 编辑
各位大佬,小弟自己画了一块esp8266的小板子用来改造一个小风扇。
因为早就注意到充电宝有小电流无法识别导致休眠的机制,所以在板子上设计了一个用三极管控制的负载,如下图
负载电路设计
回来后担心43欧可能电流不够,设计是用的两个43欧的电阻叠起来的
经过测试,我发现正常情况下,不打开负载电流大概在20-30mA左右,打开以后确实可以到100多mA近200mA
目前测试如下(一般晚上睡前弄好,早上看一下):
1. 负载常开,充电宝可以持续供电,但是太耗电
2.负载设置为每3分钟开10s,早上发现已经断电,但是起码正常工作了半小时以上
3.负载设置为每10s开100ms,过了三个小时后发现已断电,离开前看到正常工作了快一个小时
以上几种测试情况都是充电宝直接供电的,但是当我用usb电压电流表接上充电宝看的时候,不管怎么设置,充电宝都能持续工作,我猜测应该是电压电流表本身耗电的缘故
各位大佬,小弟对硬件设计也是一知半解,对充电宝的休眠机制更是不太明白,我问了客服说是1分钟,电流小于0.1A休眠,这无法解释还能短暂地则正常工作一段时间,各位有啥想法帮帮小弟,感谢
最后附上相关代码
- #define AVOID_POWER_SLEEP
- #ifdef AVOID_POWER_SLEEP
- #define AVOID_POWER_SLEEP_PIN 5
- #define AVOID_POWER_SLEEP_PERIOD 10000 // 10*1000 10s
- #endif
- void PressKey(uint8_t pin, uint32_t pressTime)
- {
- digitalWrite(pin, HIGH);
- Blinker.delay(pressTime);
- digitalWrite(pin, LOW);
- Blinker.delay(200);
- }
- #ifdef AVOID_POWER_SLEEP
- void avoidPowerSleep(uint8_t powerPin, uint64_t period)
- {
- static uint64_t lastTimeMs = 0, curTimeMs = 0;
- curTimeMs = millis();
- if (SmartFan.fanPowerState) {
- lastTimeMs = curTimeMs;
- return;
- }
- if (curTimeMs - lastTimeMs >= period) {
- PressKey(powerPin, 100);
- // BLINKER_LOG("avoid power sleep deal");
- lastTimeMs = curTimeMs;
- }
- }
- #endif
- void setup()
- {
- #ifdef AVOID_POWER_SLEEP
- pinMode(AVOID_POWER_SLEEP_PIN, OUTPUT);
- digitalWrite(AVOID_POWER_SLEEP_PIN, LOW);
- #endif
- }
- void loop()
- {
- Blinker.run();
- #ifdef AVOID_POWER_SLEEP
- avoidPowerSleep(AVOID_POWER_SLEEP_PIN, AVOID_POWER_SLEEP_PERIOD);
- #endif
- }
复制代码
|