Battery level
-
Hi, does this sketch work with M5Stick too?
// https://github.com/m5stack/M5Stack/issues/74 #include <M5Stack.h> int8_t getBatteryLevel() { Wire.beginTransmission(0x75); Wire.write(0x78); if (Wire.endTransmission(false) == 0 && Wire.requestFrom(0x75, 1)) { switch (Wire.read() & 0xF0) { case 0xE0: return 25; case 0xC0: return 50; case 0x80: return 75; case 0x00: return 100; default: return 0; } } return -1; } void setup() { M5.begin(); Wire.begin(); } void loop() { delay(1000); M5.Lcd.clear(); M5.Lcd.setTextColor(GREEN); M5.Lcd.setCursor(0, 20); M5.Lcd.setTextSize(2); M5.Lcd.print("Battery Level: "); M5.Lcd.print(getBatteryLevel()); M5.Lcd.print("%"); }
tnks a lot?
-
I didn’t test it, but probably not likely to work. The M5Stack and m5stickC use different power management chips (IP5306_i2c vs. AXP192). This sketch might help you get some power info from the m5stickC though.
https://github.com/m5stack/M5StickC/blob/master/examples/Basics/AXP192/AXP192.ino
-
You can try this code for testing battery voltage level.
#include <M5Stack.h> #include <U8x8lib.h> int8_t getBatteryLevel() { Wire.beginTransmission(0x75); Wire.write(0x78); if (Wire.endTransmission(false) == 0 && Wire.requestFrom(0x75, 1)) { switch (Wire.read() & 0xF0) { case 0xE0: return 25; case 0xC0: return 50; case 0x80: return 75; case 0x00: return 100; default: return 0; } } return -1; } void setup() { M5.begin(); Wire.begin(); } void loop() { delay(200); Serial.print("Battery Level: "); Serial.print(getBatteryLevel()); Serial.println("%"); }
-
@m5-docs coool it works!!
but, when I plug the usb cable the serial monitor say 100%,
though the battery level is less..is there a software way to know if the usb cable is connected? (to make power cable symbol appear on display)
-
Theres a pretty nice comprehensive blog post on the battery and output of the stick c but in japanese https://lang-ship.com/blog/?p=523. He posts his arduino code though on how to read different information about the battery. I tested and it works pretty well.
#include <M5StickC.h> void setup() { // put your setup code here, to run once: M5.begin(); M5.Lcd.fillScreen(BLACK); M5.Axp.EnableCoulombcounter(); } double vbat = 0.0; int discharge,charge; double temp = 0.0; double bat_p = 0.0; double bat_p2 = 0.0; void loop() { M5.Lcd.fillScreen(BLACK); vbat = M5.Axp.GetVbatData() * 1.1 / 1000; charge = M5.Axp.GetIchargeData() / 2; discharge = M5.Axp.GetIdischargeData() / 2; temp = -144.7 + M5.Axp.GetTempData() * 0.1; bat_p = M5.Axp.GetPowerbatData() * 1.1 * 0.5 /1000; M5.Lcd.setCursor(0, 0, 1); M5.Lcd.printf("vbat:%.3fV\r\n",vbat); M5.Lcd.printf("icharge:%dmA\r\n",charge); M5.Lcd.printf("idischg:%dmA\r\n",discharge); M5.Lcd.printf("temp:%.1fC\r\n",temp); M5.Lcd.printf("pbat:%.3fmW\r\n",bat_p); M5.Lcd.printf("CoIn :%d\r\n",M5.Axp.GetCoulombchargeData()); M5.Lcd.printf("CoOut:%d\r\n",M5.Axp.GetCoulombdischargeData()); M5.Lcd.printf("CoD:%.2fmAh\r\n",M5.Axp.GetCoulombData()); M5.Lcd.printf("Vin:%.3fmV\r\n",M5.Axp.GetVinData() * 1.7); M5.Lcd.printf("Iin:%.3fmA\r\n",M5.Axp.GetIinData() * 0.625); M5.Lcd.printf("VBin:%.3fmV\r\n",GetVBinData() * 1.7); M5.Lcd.printf("IBin:%.3fmA\r\n",GetIBinData() * 0.375); M5.Lcd.printf("VAPS:%.3f\r\n", GetVapsData()*1.4/1000); delay(1000); } uint16_t GetVBinData(void){ uint16_t vin = 0; Wire1.beginTransmission(0x34); Wire1.write(0x5a); Wire1.endTransmission(); Wire1.requestFrom(0x34, 1); uint8_t buf = Wire1.read(); Wire1.beginTransmission(0x34); Wire1.write(0x5b); Wire1.endTransmission(); Wire1.requestFrom(0x34, 1); uint8_t buf2 = Wire1.read(); vin = ((buf << 4) + buf2); // V return vin; } uint16_t GetIBinData(void){ uint16_t iin = 0; Wire1.beginTransmission(0x34); Wire1.write(0x5c); Wire1.endTransmission(); Wire1.requestFrom(0x34, 1); uint8_t buf = Wire1.read(); Wire1.beginTransmission(0x34); Wire1.write(0x5d); Wire1.endTransmission(); Wire1.requestFrom(0x34, 1); uint8_t buf2 = Wire1.read(); iin = ((buf << 4) + buf2); // V return iin; } uint16_t GetVapsData(void){ uint16_t vaps = 0; Wire1.beginTransmission(0x34); Wire1.write(0x7E); Wire1.endTransmission(); Wire1.requestFrom(0x34, 1); uint8_t buf = Wire1.read(); Wire1.beginTransmission(0x34); Wire1.write(0x7F); Wire1.endTransmission(); Wire1.requestFrom(0x34, 1); uint8_t buf2 = Wire1.read(); vaps = ((uint16_t)(buf << 4) + buf2); return vaps; }
-
does it should work on GRAY M5Stick too ?
tnks
-
@cepics said in Battery level:
does it should work on GRAY M5Stick too ?
tnks
I don't think so but i could be mistaken.