基于ESP-01S的USB电压电流表

前言

强迫症的手里绝对不能多一颗主控芯片,而我恰巧多一颗esp-01s,更让人难受的是它只有4个I/O,逛遍立创开源广场发现做个电压电流表还是不错的选择,下面开搞!

一、所需元件

放个作品实拍图
USB电压电流表
以下部分为所需元件:
1.ESP-01S一个;
2.0.91寸oled(ssd1306&IIC版)一个;
3.INA226模块或者芯片一个;
4.电源芯片MP1584EN;
5.外围电路所需阻容元件若干。
注:下面的链接是我用立创EDA绘制的PCB文件,链接的附件里还有库函数和代码。
https://oshwhub.com/Engineer_Jiang/dian-ya-dian-liu-biao

二、硬件IO分配

由于ESP-01S仅有四个IO,且其中两个默认为TX(GPIO-1)和RX(GPIO-3),本项目是双路IIC通信,所以IO0/2用于INA226的硬件IIC通信,IO1/3则使用U8G2库进行软件模拟IIC与0.91 oled屏幕通信,不在使用串口功能。具体分配是:
SDA_SSD1306 1
SCL_SSD1306 3
SDA_INA226 0
SCL_INA226 2

三、软件代码

本项目是基于ARDUINO IDE进行开发,需要安装对应的芯片包,具体操作步骤见下面的链接。
https://www.arduino.cn/thread-76029-1-1.html

1.引入库

所需库有两个:
1.INA226;
2.U8G2。
库文件在所需元件的链接里面可以下载,将压缩包解压至安装Arduino的路径下libraries文件夹内即可。

2.项目完整代码

不啰嗦上代码:

#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>
#include <INA226.h>

#define SDA_SSD1306 1
#define SCL_SSD1306 3

#define SDA_INA226 0
#define SCL_INA226 2

U8G2_SSD1306_128X32_UNIVISION_1_SW_I2C u8g2(U8G2_R0, /*clock=*/ SCL_SSD1306, /*data=*/ SDA_SSD1306, /*reset=*/ U8X8_PIN_NONE);

INA226 ina;

unsigned long now_time, old_time1, old_time2;
float BusVoltage, ShuntCurrent, BusPower;

void setup() {  
  Wire.begin(SDA_INA226,SCL_INA226);
  ina.begin();
  ina.configure(INA226_AVERAGES_128, INA226_BUS_CONV_TIME_1100US, INA226_SHUNT_CONV_TIME_1100US, INA226_MODE_SHUNT_BUS_CONT);
  ina.calibrate(0.01, 6);
  u8g2.begin();
}

void loop() {
  now_time = millis();
  
  if( (now_time - old_time2) >= 15){
   BusVoltage = ina.readBusVoltage();
   ShuntCurrent = ina.readShuntCurrent();
   BusPower = ina.readBusPower(); 
   old_time2 = now_time; 
  }
  
  if( (now_time - old_time1) >= 250){
   u8g2.firstPage();
   do{
      VoltageDisplay();
      CurrentDisplay();
      PowerDisplay();
   } while ( u8g2.nextPage() );
   old_time1 = now_time; 
  }
}

void VoltageDisplay()
{
    u8g2.setFont(u8g2_font_helvR14_tr);
    u8g2.setCursor(0, 16);
    if(BusVoltage >= 10)
       u8g2.print(BusVoltage,2);
    else
       u8g2.print(BusVoltage,3);
    u8g2.setCursor(47, 16);
    u8g2.print("V");
}

void CurrentDisplay()
{
    u8g2.setFont(u8g2_font_helvR14_tr);
    u8g2.setCursor(0, 32);
    ShuntCurrent = (ShuntCurrent < 0) ? 0 : ShuntCurrent;
    u8g2.print(ShuntCurrent,3);
    u8g2.setCursor(47, 32);
    u8g2.print("A");
}

void PowerDisplay()
{
    u8g2.drawRFrame(70, 0, 58, 32, 4);
    u8g2.setFont(u8g2_font_profont22_mr);
    if(BusPower >= 10)
      { 
      u8g2.setCursor(79, 23);
      u8g2.print(BusPower,0);  
      u8g2.setCursor(109, 23);
      u8g2.print("W");
      }
    else
      {
      u8g2.setCursor(74, 23);
      u8g2.print(BusPower,1);
      u8g2.setCursor(114, 23);
      u8g2.print("W");
      }
}
 

总结

本项目是纯粹出于DIY的乐趣,不考虑成本,需要有一定的焊接水平,有问题可以留言,所有的文件我已开源,请尽情享用。

  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
介绍 基于STM32的USB电压电流表可以轻松查看充电器是否在快速充电模式下工作,还可以轻松测试USB设备的功耗或USB充电器的输出功率。 版本更新说明 v1.1-2020 / 4/15 添加自动屏幕功能,在检测到无电流输出20秒后,屏幕将自动关闭以保护OLED屏幕。关闭屏幕后,当检测到电流输出或手动按下按钮时,屏幕将自动点亮。 特性 基于STM32F030K6,代码使用HAL库,GCC编译器编写 0.91英寸白色OLED显示屏,显示效果清晰 使用低电阻采样电阻(5mΩ),以防止过高的内部电阻影响USB电源效率 支持4.7〜24V的宽电压范围,0〜5A的电流测量 它可以测量Vbus,D +,D-电压和Vbus电流。支持功率显示和能量计算 可以选择使用内部参考电压源(Vref)或外部参考电压源(AZ431) 软件校准功能可以保证校准后的一定精度。 完全开源,您可以自己添加功能 -- 校准说明 该USB电压电流表具有软件校准功能,可以补偿硬件偏差。开机过程中按住按钮,直到屏幕上显示“准备校准~~~~”,然后释放按钮以进入校准模式。请根据屏幕提示提供标准电压和电流以完成校准。 代码说明 该代码是STM32CubeMX生成的trueStudio项目,建议使用trueStudio 9.3.0导入。 预防措施 USB插座有两种类型,一种是内部触点朝下(面向焊盘),另一种是内部触点朝上(背向焊盘)。两个PCB可以使用相同的PCB封装。如果使用的USB插座的触点较低,则应将其焊接到板的正面,否则应焊接到板的背面。示例图片使用下触点的USB插座,原理图和PCB设计是上触点的母插座。制作时请注意这一点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值