手电大家谈-手电筒爱好者之家

 找回密码
 注册成为会员,享受更多功能。

QQ登录

只需一步,快速开始

只需一步,快速开始

搜索
查看: 3841|回复: 2

[充电器] DIY 一个智能 USB 充电器

[复制链接]
  • TA的每日心情

    2024-10-29 14:47
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2024-10-30 02:59 | 显示全部楼层 |阅读模式

    马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

    您需要 登录 才可以下载或查看,没有账号?注册成为会员,享受更多功能。

    x
    使用快充模块,加上MCU和传感器,实现电压、电流、功率、温度等参数采集,可以监测充电状态、统计充电容量,快速查看充电状态、了解设备电池状况、记录设备充电数据。数据还可以通过Wifi或espnow发送到其它设备,更多功能可以通过软件升级实现。
    本项目是为了提供一个可以参考的原型,大家可以在此基础上,增加或删除更多功能,按照自己想法DIY出更多有趣的制作。

    PCB设计使用了立创EDA软件,程序使用 micropython 开发。
    这个DIY项目得到EEWorld论坛的管理员和网友们提供的各种帮助,在此特别表示感谢。更多的DIY步骤、物料选型、设计讨论请参考EEWorld活动贴。



    主要器件为了简化DIY的复杂度,主要元件使用了模块,其它元件种类和数量也尽可能少,都是很容易找到的型号,方便DIY。
    • 快充模块。现在因为各种原因流入市场上的快充模块型号众多,以18W的模块居多(5V3.4A、9V2A、12V1.5A),可以根据需要选择。尽量选择容易将功率电感输出引出的型号,这样才方便测量电流。虽然价格低,但因为快充模块质量参差不齐,选择时尽量选择评价较高的,使用前需要多测试(注意安全),确认没有问题后在使用。
    • MCU:ESP32S2 mini开发板(也可以使用其它型号,例如ESP32C3)。
    • 电流传感器:INA219模块(第一版时使用了霍尔型的ACS712电流传感器),I2C接口,双向电流采集,最高总线电压26V。
    • 温度传感器:MF58热敏电阻(3950,10K)。监测充电过程中内部温度,在温度过高时可以提示。
    • OLED:128x32,I2C 接口。
    • 电源:DC/5V模块。用于将快充模块的输出电压转换为5V。支持快充功能的模块输出是高压,有的模块会动态调节输出电压,直接给ESP32供电会损坏模块,因此需要使用一个单独的DC5V模块。如果快充模块带有单独的USB 5V输出口(非快充口),则可以省略此模块。
    • 蜂鸣器:无源蜂鸣器(注意不要使用有源蜂鸣器),用于发出提示声音。
    • 光敏电阻(可选),用于采集环境光线亮度,用于动态调整LED输出亮度,避免晚上时 LED 太亮刺眼。
    • LED:三色共阳LED,用不同颜色指示充电状态。也可以使用 WS2812。
    大致成本
    • 快充模块:1-3元
    • MCU(ESP32S2/ESP32C3):10元
    • 电流传感器(INA219):4元
    • 温度传感器(NTC):0.1元
    • OLED(128x32):7元
    • 5V电源模块:2元
    • 无源蜂鸣器:0.2元
    • LED:0.1元
    • 光敏电阻:0.1元
    • 外壳(塑料盒):1-2元
    • 其它(电源线、导线、热缩套管、螺丝、尼龙螺柱):5元
    • 总计:约30元

    原理图


                                   
    登录/注册后可看大图
    下面是打样后的PCB,PCB使用LCEDA(立创EDA)设计,完整的设计文件已经开源,请参考文末的链接。


                                   
    登录/注册后可看大图

    制作步骤
    • 首先选择需要的器件、辅助材料等。
    • 根据快充模块和其它元件大小、安装位置,确定外壳尺寸。
    • 制作外壳,可以使用3D打印机打印外壳,或用亚克力板制作外壳,或者使用其它方式制作外壳。演示中是使用一个塑料盒做外壳。
    • 设计PCB板,打样并焊接元件。
    • 调试硬件,确定各部分工作正常。
    • 将快充模块的功率电感输出高压端引线取下,连接到INA219的IN+,INA219的IN-用导线连回到原电感输出端,也就是将INA219串联到电感输出回路中。
    • 将快充模块和其它元件固定到外壳中。
      • 安装前先测试快充模块,确定功能和功率都是正常的,避免安装后不能使用。
    • ESP32下载最新固件。
    • 编写MCU程序,测试程序功能,校正充电电流、功率。
      • INA219 的参数需要根据实际电路进行校正,每个设备有一定差异。
      • 显示的功率是根据USB的充电功率校准的,因此比实际功率要略低一些。
      • 系统检测的电压是总线电压,总线电压比USB的5V电压高,这是正常的。有的快充模块会根据设备情况调整总线电压。
    • 完成DIY,开始使用。


                                   
    登录/注册后可看大图

                                   
    登录/注册后可看大图

                                   
    登录/注册后可看大图

                                   
    登录/注册后可看大图

                                   
    登录/注册后可看大图


    程序说明

    程序使用micropython编写,用 asyncio 实现多任务。将系统功能分解为几个任务,分别完成采样、数据显示、LED状态显示等。
    OLED 部分使用了社区的 mpy-lib 驱动中的 I2C OLED ASCII display drive,使用了8x16点阵字体。OLED的分辨率是 128 x 32,正好用两行文字,将主要参数显示出来。以前的 ASCII display drive 只支持128x64,这次顺便也更新了。

    程序文件
    • main.py,主程序文件,用以启动 SAPF。
    • sapfmain.py,SAPF主程序。
    • sapf_cfg.py,任务配置文件。
    • gv.py,公共变量和函数。
    • board.py,板级驱动文件。
    • pins.py,引脚配置。
    • cfg.py,参数配置。
    • task_main.py,初始化、采样任务。
    • display.py,显示、触摸键、LED显示任务。
    • lib,驱动库文件夹。
      • oled.py,OLED驱动。
      • Font_6x8.py,字体文件。
      • Font_8x16.py
      • Font_12x24.py
      • Font_16x32.py
      • ina219.py,INA219驱动。
    程序功能说明上电后先检查 I2C 设备地址。如果地址不正确,将闪红色LED,程序死循环。
    自检通过后,启动各相关任务。
    • main() 任务定期采样(100ms),并判断是否处于充电状态。如果处于充电状态,则累计充电时间和充电功率。
    • show_info() 任务每秒刷新一次屏幕,显示总线电压、电流、功率、模块温度等参数。
      • 显示持续60秒后关闭OLED屏。
      • 当按下触摸键,或检测到充电开始、充电结束时自动打开 OLED。
    • task_LED() 任务以不同颜色的 LED,指示当前充电功率。
      • 小于0.3W时为未充电状态,显示绿色呼吸灯
      • 小于2W时为小功率模式,显示黄色呼吸灯
      • 小于6W时为中功率模式,显示橙色呼吸灯
      • 大于6W时为大功率模式,显示红色呼吸灯
      • 为了避免夜晚时 LED 刺眼,会自动根据环境光强度调整 LED 亮度。
    • task_TP() 任务检测触摸键。


    回复 dsu_marcocopyright:copyright

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-10-30 11:16
  • 签到天数: 1405 天

    [LV.10]以坛为家III

    发表于 2024-10-30 11:19 | 显示全部楼层
    图片挂了……
    回复

    使用道具 举报

    该用户从未签到

    发表于 2024-10-30 11:58 | 显示全部楼层
    正准备学Python,据说这个非常好学,应用也广,就是不知道从头开始学嵌入式开发难不难。
    回复

    使用道具 举报

    本版积分规则

    小黑屋|手机版|Archiver|论坛自带搜索|下载论坛app|手电大家谈-手电筒爱好者之家 ( 备案序号:鲁ICP备05002565号 )
    以上言论纯属个人观点,与手电大家谈立场无关。
    最佳浏览模式:1920*1080


    GMT+8, 2024-10-31 08:25 , Processed in 0.143757 second(s), 28 queries , Gzip On.

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

    快速回复 返回顶部 返回列表