查看: 1751|回复: 4

IP5306电量显示

[复制链接]

该用户从未签到

发表于 2020-2-24 10:27 | 显示全部楼层 |阅读模式
以下示例展示如何将电池电量按百分比分4段显示
已知5306的IIC地址为0x75,寄存器地址0x78为查询电量百分比,具体函数在M5Stack的库中查看Power.cpp,颜色显示采用了RGB565的方式
P_20200224_001801_vHDR_Auto.jpg
[mw_shl_code=arduino,true]#include <M5Stack.h>

#define RGB(r,g,b) (int16_t)(b + (g << 5) + (r << 11)) //RGB888转RGB565

unsigned long currentMillis;
unsigned long lastupdateMillis = 0;
int lastbattery = -1;

void displayBatteryLevel()
{
    if (currentMillis - lastupdateMillis > 1000) {
        int battlevel = 0;
        byte retval;
        Wire.beginTransmission(0x75);
        Wire.write(0x78);
        if (Wire.endTransmission(false) == 0 && Wire.requestFrom(0x75, 1)) {
            retval = Wire.read() & 0xF0;
            if (retval == 0xE0) battlevel = 25;
            else if (retval == 0xC0) battlevel = 50;
            else if (retval == 0x80) battlevel = 75;
            else if (retval == 0x00) battlevel = 100;
        }
        if (lastbattery != battlevel){
            M5.Lcd.fillRect(250, 5, 56, 21, RGB(31, 63, 31));
            M5.Lcd.fillRect(306, 9, 4, 13, RGB(31, 63, 31));
            M5.Lcd.fillRect(252, 7, 52, 17, RGB(0, 0, 0));
            if (battlevel <= 25)
                M5.Lcd.fillRect(253, 8, battlevel/2, 15, RGB(31, 20, 10));
            else
                M5.Lcd.fillRect(253, 8, battlevel/2, 15, RGB(20, 40, 31));
            lastbattery = battlevel;
        }
        lastupdateMillis = currentMillis;
    }
}

void setup() {
    M5.begin();
    Wire.begin();
    M5.Lcd.clear();
}

void loop() {
    currentMillis = millis();
    displayBatteryLevel();
}[/mw_shl_code]

该用户从未签到

发表于 2020-2-24 10:47 | 显示全部楼层
我记得 Ip5306 是没有 I2C 接口的啊

https://wenku.baidu.com/view/cdc ... c69ec3d4bbdb0e.html

该用户从未签到

 楼主| 发表于 2020-2-24 11:17 | 显示全部楼层
Zoologist 发表于 2020-2-24 10:47
我记得 Ip5306 是没有 I2C 接口的啊

https://wenku.baidu.com/view/cdc877fe66ec102de2bd960590c69ec3d4bb ...

这个是可以定制的

该用户从未签到

发表于 2021-2-14 13:20 | 显示全部楼层
你好,请问为啥,或取不到电量信息呢?看到官网Power相关的API里有这样写;说老版本的M5Stack不能与IP5306通讯,可以怎么改到能通讯吗?
Power related functions depend on the IP5306 chip. Please refer to the data sheet IP5306 as required.

The older M5STACK hardware does not support communication with IP5306 chip. When using functions, also consider supporting out of control cases. *
Use initialization, communication check, and control in this order, as shown in the example below.

  M5.Power.begin();
  if(!M5.Power.canControl()) {
    //can't control.
    return;
  }
  M5.Power.lightSleep(SLEEP_SEC(5));

该用户从未签到

发表于 2021-2-14 16:45 | 显示全部楼层
老版本的黑色M5Stack是用的普通版本IP5306,所以没法I2C通讯,看能否尝试换成I2C版本的
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

arduino程序设计基础 blinker物联网解决方案

热门推荐

【教程】pico+hx711电子秤
【教程】pico+hx711电子秤
pico+hx711电子秤 【前言】 我做过多款电子秤,这次移植到pico上
ESP8266+Onenet平台远程数据传输和控制
ESP8266+Onenet平台远程数
这是我的第一个diy,主要功能实现了onenet云平台温湿度数据的传输和远程控制LED灯平台
【Arduino】108种传感器模块系列实验(48)---三轴ADXL345模块
【Arduino】108种传感器模
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
ps2遥控小车——uno实现
ps2遥控小车——uno实现
前几天在阁楼发现了好久以前3d打印,激光切割的底盘,于是决定做这个东西 正好手上又
震惊!OLED菜单竟只用10行代码就可以完成到完美!!!
震惊!OLED菜单竟只用10行
震惊!OLED菜单竟只用10行代码就可
Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
快速回复 返回顶部 返回列表