|
|
参考feng4253大佬的sw3518快充模块增加 电压、电流显示(二)的代码修改的单路SW3518读取的程序,修改SSD1306的i2c地址为0x3D实现oled与sw3518共用一条i2c总线,不需要添加i2c switch芯片就可以读取sw3518的信息显示到oled上
修改SSD1306oled的i2c地址为0x3D,把oled屏幕背面的0x7B位置的电阻换到0x7A
SW3518与OLED的i2c引脚连接到esp8266的GPIO4与GPIO5,SDA连接到GPIO4,SCL连接到GPIO5,SW3518与OLED的I2C引脚可以分别并在一起,两个地址不冲突可以使用一条总线
临时搭起来验证的,还没来得及画板
代码是参考其他大佬代码改的,自己不会写(只会结合deepseek摸索着改改),有大佬可以帮忙优化最好
附件为用到的库文件及ino文件
以下是arduino的代码
#include <Wire.h>
#include <U8g2lib.h>
#include <h1_SW35xx.h>
#define setFont_6 u8g_font_5x7
#define setFont_Large u8g2_font_7x14B_tf // 大号字体
#define setFont_Medium u8g2_font_6x10_tf // 中号字体
#define setFont_Small u8g2_font_5x7_tf // 小号字体
// 初始化U8g2对象
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, 0X3D, U8X8_PIN_NONE, U8X8_PIN_NONE);
using namespace h1_SW35xx;
SW35xx sw(Wire);
void setup() {
Serial.begin(115200); //显示屏和引脚初始化
Wire.begin();
u8g2.setI2CAddress(0x3D*2);
u8g2.enableUTF8Print();
u8g2.begin();
pinMode(LED_BUILTIN, OUTPUT); // Initialize the LED_BUILTIN pin as an output
sw.setMaxCurrent5A();//设置最大电流
}
void loop() {
//Wire.begin();
digitalWrite(LED_BUILTIN, LOW); // Turn the LED on (Note that LOW is the voltage level
u8g2.setFont(setFont_6);
u8g2.setFontDirection(0);
u8g2.clearBuffer();
VIWH(); //框架绘制并显示//通道0
sw35XX(); //电流、电压数据读取通道2
u8g2.sendBuffer();
digitalWrite(LED_BUILTIN, HIGH); // Turn the LED off by making the voltage HIGH
}
const char *fastChargeType2String(SW35xx::fastChargeType_t fastChargeType) {
switch (fastChargeType) {
case SW35xx::NOT_FAST_CHARGE:
return "NA";
break;
case SW35xx::QC2:
return "QC2.0";
break;
case SW35xx::QC3:
return "QC3.0";
break;
case SW35xx::FCP:
return "FCP";
break;
case SW35xx::SCP:
return "SCP";
break;
case SW35xx::PD_FIX:
return "PD Fix";
break;
case SW35xx::PD_PPS:
return "PD PPS";
break;
case SW35xx::MTKPE1:
return "PE1.1";
break;
case SW35xx::MTKPE2:
return "PE2.0";
break;
case SW35xx::LVDC:
return "LVDC";
break;
case SW35xx::SFCP:
return "SFCP";
break;
case SW35xx::AFC:
return "AFC";
break;
default:
return "unknown";
break;
}
}
void sw35XX() {
float W1 = sw.vout_mV * sw.iout_usbc_mA/1000000;
float W2 = sw.vout_mV * sw.iout_usba_mA/1000000;
float vin=sw.vin_mV;
float vout=sw.vout_mV;
float aa=sw.iout_usba_mA;
float ac=sw.iout_usbc_mA;
//计算温度
float Rntc = sw.readTemperature()/100-2;
float lnR = log(Rntc / 10.0);
float T = 1.0/((1.0/298.15)+(1.0/3450)*lnR);
float tempC = T - 273.15;
sw.readStatus();
sw.begin();
Serial.println("==================CN1=====================");
printf("Current input voltage:%dmV\n", sw.vin_mV);
u8g2.setFont(setFont_Large);
u8g2.setCursor(23, 14);
u8g2.print(vin/1000);//输入电压
printf("Current output voltage:%dmV\n", sw.vout_mV);
u8g2.setCursor(27, 28);
u8g2.print(vout/1000);//输出电压
u8g2.setCursor(10, 53);
u8g2.print(ac/1000);//C口输出电流
printf("Current USB-A current:%dmA\r\n", sw.iout_usba_mA);
u8g2.setCursor(74, 53);
u8g2.print(aa/1000);//A口输出电流
printf("Current fast charge type:%s\n", fastChargeType2String(sw.fastChargeType));
u8g2.setCursor(80, 28);
u8g2.print(fastChargeType2String(sw.fastChargeType));//快充协议
if (sw.fastChargeType == SW35xx::PD_FIX || sw.fastChargeType == SW35xx::PD_PPS)
printf("Current PD version:%d\n", sw.PDVersion);
u8g2.setCursor(77, 14);
u8g2.print(tempC);//读取温度
u8g2.setCursor(10, 64);
u8g2.print(W1);//C口功率
u8g2.setCursor(74, 64);
u8g2.print(W2);//A口功率
Serial.println("=======================================");
Serial.println("");
delay(400);
}
void VIWH() {
//oled显示
u8g2.setFont(setFont_Large);//设置字体
u8g2.drawStr(0, 14, "IN: V");
u8g2.drawStr(113, 10, "o"); //摄氏度圆圈
u8g2.drawStr(120, 14, "C"); //摄氏度C
u8g2.drawStr(49, 53, "A");
u8g2.drawStr(113, 53, "A");
u8g2.drawStr(49, 64, "W");
u8g2.drawStr(113, 64, "W");
u8g2.drawStr(0, 28, "OUT: V");
u8g2.setFont(setFont_Medium);//设置字体
u8g2.drawStr(15, 40, "TYPE-C");
u8g2.drawStr(79, 40, "TYPE-A");
u8g2.drawHLine(0, 16, 128); // 标题下方横线
u8g2.drawHLine(0, 30, 128); // 主数据显示区分隔线
u8g2.drawVLine(64, 30, 48); // 左右分界线
}
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|