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.
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login