数码之家

标题: sw3518快充模块增加 电压、电流显示(二) [打印本页]

作者: feng4253    时间: 2024-2-29 16:47
标题: sw3518快充模块增加 电压、电流显示(二)
在上一个帖子中我做了显示部分:sw3518快充模块增加 电压、电流显示 但打板有错误,我就重新打了一块板,特点是模块化,引出了7个通道,支持7个i2c设备,修改代码就可以实现多显示屏+多快充模块的组合,只需要焊接4根线,就可以添加一块快充模块:

[attach]2049215[/attach][attach]2049216[/attach]
[attach]2049214[/attach]
[attach]2049217[/attach]


这是打的板,是免费打的样,做工还不错,我一次打了5块,就是有个电阻位置❀错了,不过不影响:
[attach]2049219[/attach]
这是焊接好的样子:
[attach]2049220[/attach]
按钮是用来复位和下载程序用的,虽然电源写的是5V,实际可以支持到30v,所以可以直接接在主电源上,下面是工程文件和打板文件,需要的话可以自己打板来耍,好多公司打样是免费的:
[attach]2049235[/attach]

我还试了白色oled的,也挺好看的:
[attach]2049237[/attach]
还写了中文的代码,接一个模块挺好,也可以接两块模块:
[attach]2049218[/attach][attach]2049213[/attach]

快充模块接线方法:左边是SDA,右边是SCK,
[attach]2049238[/attach][attach]2049239[/attach]
有的朋友说太细,不好焊接,说说我的方法:
1、必须是纯铜漆包线,头发粗细就差不多了;
2、不要刮漆,直接用电烙铁上锡,挂锡要长一点;
3、烙铁头要尖,我用的是刀头的,先焊接SDA(就是里面那根),把线对其,用镊子压住不动,用烙铁头烫上锡的漆包线,这样就好了,然后用同样的方式焊另一根。
4、最后用502或热熔胶,有条件的用绿油固定就行了。
是不是很简单,需要协助的朋友可以留言,我们共同探讨。
下面是中文的代码:

//该代码是单块模块使用
#include <Arduino.h>
#include <h1_SW35xx.h>
#include <U8g2lib.h>
#include <Wire.h>
#include "TCA9548A.h"
#define setFont_6 u8g_font_5x7
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/U8X8_PIN_NONE);  //该驱动是1.3寸的OLED屏幕。---------
using namespace h1_SW35xx;
TCA9548A I2CMux;  // 地址可以传递到构造函数中
//TCA9548A(0x70);//不焊接选择电阻的i2c地址。
SW35xx sw(Wire);


void setup() {

  Serial.begin(115200);  //显示屏和引脚初始化
  Wire.begin();
  u8g2.enableUTF8Print();
  I2CMux.begin(Wire);  // Wire instance is passed to the library
  I2CMux.closeAll();   // Set a base state which we know (also the default state on power on)
  I2CMux.openChannel(0);
  u8g2.begin();
  I2CMux.closeChannel(0);
  pinMode(LED_BUILTIN, OUTPUT);  // Initialize the LED_BUILTIN pin as an output
  sw.setMaxCurrent5A();//设置最大电流
}

void loop() {
  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();   //电流、电压数据读取通道1
  I2CMux.openChannel(0);
  u8g2.sendBuffer();
  I2CMux.closeChannel(0);
  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 "NOT_FAST";
      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() {
  I2CMux.openChannel(1);
  /* 与总线上1通道显示的地址交互的代码 */
  float vin=sw.vin_mV;
  float vout=sw.vout_mV;
  float aa=sw.iout_usba_mA;
  float ac=sw.iout_usbc_mA;
  float W1 = vout/1000 * (aa+ac)/1000;
  sw.readStatus();
  sw.begin();
  Serial.println("==================CN1=====================");
  printf("Current input voltage:%dmV\n", sw.vin_mV);
  u8g2.setCursor(26, 12);
  u8g2.print(vin/1000);
  printf("Current output voltage:%dmV\n", sw.vout_mV);
  u8g2.setCursor(50, 28);
  u8g2.print(vout/1000);
  printf("Current USB-C current:%dmA\r\n", sw.iout_usbc_mA);
  printf("Current USB-A current:%dmA\r\n", sw.iout_usba_mA);
  u8g2.setCursor(50, 40);
  u8g2.print((ac+aa)/1000);
  printf("Current fast charge type:%s\n", fastChargeType2String(sw.fastChargeType));

    u8g2.setCursor(50, 63);
  u8g2.print(fastChargeType2String(sw.fastChargeType));
  if (sw.fastChargeType == SW35xx::PD_FIX || sw.fastChargeType == SW35xx::PD_PPS)
    printf("Current PD version:%d\n", sw.PDVersion);

  printf("temperature:", sw.readTemperature());
  u8g2.setCursor(90, 12);
  u8g2.print(sw.readTemperature()/100);
  u8g2.setCursor(50, 52);
  u8g2.print(W1);
  Serial.println("=======================================");
  Serial.println("");
  I2CMux.closeChannel(1);
  delay(400);
}


void VIWH() {
  I2CMux.openChannel(0);
  u8g2.drawStr(114, 6, "o");  //摄氏度圆圈
  u8g2.enableUTF8Print();//enable UTF8
  u8g2.setFont(u8g2_font_wqy12_t_gb2312b);//设置中文字符集
  u8g2.drawRFrame(0,0,128,15,3);// 绘制一个空心框(圆角)
  u8g2.drawStr(120, 12, "C");
  u8g2.setCursor(2, 12);
  u8g2.print("输入     V");
    u8g2.setCursor(64, 12);
  u8g2.print("温度:");
    u8g2.setCursor(10, 28);
  u8g2.print("电压:           V");
    u8g2.setCursor(10, 40);
  u8g2.print("电流:           A");
    u8g2.setCursor(10, 52);
  u8g2.print("功率:           W");
    u8g2.setCursor(10, 63);
  u8g2.print("快充:");
  I2CMux.closeChannel(0);
}



库文件可以在我上一个帖子里下载。



作者: chenjhy2767    时间: 2024-2-29 19:55
谢谢分享,回头试试
作者: 我爱玩数码    时间: 2024-2-29 20:07
高手
作者: jxf269    时间: 2024-2-29 22:25
这充电线也不错,我以前还以为带电流电压显示的是像车充一样的假把式呢。
话说国标一直没让电源充电头带电压电流累计等功能,就是在放任劣质电池市场。
倘若电瓶车充电器带这种显示功能,普通人都能看出来,电池的大概容量,充电时长,等更容易受到控制
作者: by64214    时间: 2024-3-1 11:53
谢谢楼主分享  没有整体整合  有点乱
作者: ddnr    时间: 2024-3-2 09:06
谢谢分享             
作者: feng4253    时间: 2024-3-2 10:43
by64214 发表于 2024-3-1 11:53
谢谢楼主分享  没有整体整合  有点乱

图片只是测试,后期会整理装壳的
作者: lileisgns    时间: 2024-3-4 08:31
学习了,就是没时间弄
作者: tsfrhym    时间: 2024-3-4 15:17
非常好,谢谢分享


作者: tsfrhym    时间: 2024-3-4 15:20
模块自己做把引脚接出来不就好焊了

作者: aec    时间: 2024-3-5 10:11
“就是有个电阻位置放错了,不过不影响……”,楼主说的这个电阻指的是哪个?
作者: 562034962    时间: 2024-3-5 22:25
谢谢分享~学习了
作者: feng4253    时间: 2024-3-7 02:57
aec 发表于 2024-3-5 10:11
“就是有个电阻位置放错了,不过不影响……”,楼主说的这个电阻指的是哪个? ...

r11,应该接GPIO15,画成接在GPIO2了,造成模块休眠了,把电阻换个方向,下面一张图片有电阻的焊接位置。
作者: bennanhaier    时间: 2024-3-9 14:24
下了个打板文件和工程文件,一下55家元!哈哈哈哈
作者: leoooooooooo    时间: 2024-3-12 09:59
请教下大佬,有没有功能简单,只需要显示一路,便宜,小巧,还能直接用大佬程序的主控
作者: aec    时间: 2024-3-12 11:02
leoooooooooo 发表于 2024-3-12 09:59
请教下大佬,有没有功能简单,只需要显示一路,便宜,小巧,还能直接用大佬程序的主控 ...

就是楼主这个单路的要是改成0.91oled显示就小巧了
作者: tomyluo    时间: 2024-3-12 11:21
这是通过I2C从SW3518获取电压、电流数据吗?
作者: feng4253    时间: 2024-3-13 02:27
leoooooooooo 发表于 2024-3-12 09:59
请教下大佬,有没有功能简单,只需要显示一路,便宜,小巧,还能直接用大佬程序的主控 ...

esp8266已经是最便宜和最简单的了,其他主控的话stm32也可以,就是引脚定义需要简单修改,还要更小巧的,可以将8266芯片和flash取出来重新画电路板。
作者: feng4253    时间: 2024-3-13 02:28
tomyluo 发表于 2024-3-12 11:21
这是通过I2C从SW3518获取电压、电流数据吗?

是的哦,读取sw3518内部寄存器数据,并显示出来。
作者: 闪耀的空白    时间: 2024-3-13 10:32
做的非常不错
作者: 沨の痕    时间: 2024-4-8 23:27
lz能添加改100w设置
作者: feng4253    时间: 2024-4-9 01:39
沨の痕 发表于 2024-4-8 23:27
lz能添加改100w设置

sw.setMaxCurrent5A();就是打开100w的代码,设置最大电流为5A,20v输出最大就是100W。
作者: 沨の痕    时间: 2024-4-9 13:54
feng4253 发表于 2024-4-9 01:39
sw.setMaxCurrent5A();就是打开100w的代码,设置最大电流为5A,20v输出最大就是100W。 ...

请问附件是包含打板文件和程序
作者: feng4253    时间: 2024-4-10 20:51
沨の痕 发表于 2024-4-9 13:54
请问附件是包含打板文件和程序

只有工程文件,正文是程序
作者: skywing    时间: 2024-4-11 08:56
沨の痕 发表于 2024-4-8 23:27
lz能添加改100w设置

我在淘宝9块买这个模块,到手测试就是100W的,不过这个模块没有散热,跑100W 五六分钟后温度100多度,建议还是不要用到这么大的功率为宜,这种是非隔离的,出问题输入高压直通输出把设备搞坏得不偿失。
作者: wanjie    时间: 2024-4-12 14:05
为何不直接再加一个功能 修改支持pd100w  的支持 我记得是要改革寄存器吧
作者: zuiaisouhu    时间: 2024-5-1 06:13
感谢分享,好好学习,
作者: zuiaisouhu    时间: 2024-5-8 01:25
你这方案,可利用性太多了,正好手上有几个充电宝快充板,可以好好改造一下桌面充电坞
作者: bennanhaier    时间: 2024-7-17 21:06
[attach]2160715[/attach][attach]2160717[/attach][attach]2160720[/attach]
作者: bennanhaier    时间: 2024-7-17 21:09
bennanhaier 发表于 2024-7-17 21:06

VCC和GND刚好反
作者: wujiak72    时间: 2024-7-19 08:23
学习了,改天也搞一个
作者: 猛犸象    时间: 2024-8-30 07:53
挺有意思的,这个板子和屏幕有成品卖吗,整一个回来,
作者: sdasdasds    时间: 2024-9-7 19:21
单片机的原理图能发上吗

作者: 12111    时间: 2024-9-10 14:59
牛批,寄存器手册在哪下载呀
作者: 眼镜王蛇    时间: 2024-12-29 11:52
求助大佬,不用TCA9548A可以吗?单路用只有材料ESP12F,0.96OLED屏,sw3518s模块,请问代码如何修改?




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