数码之家

标题: sw3518快充模块添加电压、电流等信息通过oled显示,单路 [打印本页]

作者: jiyabing    时间: 2025-3-25 23:05
标题: sw3518快充模块添加电压、电流等信息通过oled显示,单路
参考feng4253大佬的sw3518快充模块增加 电压、电流显示(二)的代码修改的单路SW3518读取的程序,修改SSD1306的i2c地址为0x3D实现oled与sw3518共用一条i2c总线,不需要添加i2c switch芯片就可以读取sw3518的信息显示到oled上
[attach]2399367[/attach]


修改SSD1306oled的i2c地址为0x3D,把oled屏幕背面的0x7B位置的电阻换到0x7A

[attach]2399334[/attach]
SW3518与OLED的i2c引脚连接到esp8266的GPIO4与GPIO5,SDA连接到GPIO4,SCL连接到GPIO5,SW3518与OLED的I2C引脚可以分别并在一起,两个地址不冲突可以使用一条总线

临时搭起来验证的,还没来得及画板
[attach]2399368[/attach]

代码是参考其他大佬代码改的,自己不会写(只会结合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);   // 左右分界线
}









作者: 俊输    时间: 2025-3-26 02:02
3518芯片内的数据直接读出,好先进!
作者: wy2000    时间: 2025-3-26 11:23
好牛逼的改造
作者: ccbw    时间: 2025-3-26 11:36
数据直接读出?
作者: JUNDDM    时间: 2025-3-26 11:48
大神啊,自己也再摸索单片机,但总觉得很难学。
作者: jiyabing    时间: 2025-3-26 12:32
ccbw 发表于 2025-3-26 11:36
数据直接读出?

嗯,很多快充模块都预留有i2c接口
作者: jiyabing    时间: 2025-3-26 12:35
JUNDDM 发表于 2025-3-26 11:48
大神啊,自己也再摸索单片机,但总觉得很难学。

我也小白,借鉴别人代码改的,自己也想学,但感觉学不进去
作者: z01228    时间: 2025-3-26 22:06
JUNDDM 发表于 2025-3-26 11:48
大神啊,自己也再摸索单片机,但总觉得很难学。

学arduino 还是比较容易的  太极创客的视频可以看看




欢迎光临 数码之家 (https://www.mydigit.cn/) Powered by Discuz! X3.4