前言
强迫症的手里绝对不能多一颗主控芯片,而我恰巧多一颗esp-01s,更让人难受的是它只有4个I/O,逛遍立创开源广场发现做个电压电流表还是不错的选择,下面开搞!
一、所需元件
放个作品实拍图
以下部分为所需元件:
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的乐趣,不考虑成本,需要有一定的焊接水平,有问题可以留言,所有的文件我已开源,请尽情享用。