Newer
Older
Heltec_WiFi_Kit_8 / BatteryMeters.ino
root on 15 Jun 2019 2 KB Initial commit
  1. #include <Arduino.h>
  2. #include <U8g2lib.h>
  3.  
  4. #ifdef U8X8_HAVE_HW_SPI
  5. #include <SPI.h>
  6. #endif
  7. #ifdef U8X8_HAVE_HW_I2C
  8. #include <Wire.h>
  9. #endif
  10.  
  11. U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ 16, /* clock=*/ 5, /* data=*/ 4);
  12. ADC_MODE(ADC_VCC);
  13.  
  14. void setup() {
  15. Serial.begin(115200);
  16.  
  17. // screen stuff (128 x 32 px)
  18. pinMode(10, OUTPUT);
  19. pinMode(9, OUTPUT);
  20. digitalWrite(10, 0);
  21. digitalWrite(9, 0);
  22. u8g2.begin();
  23. u8g2.enableUTF8Print();
  24.  
  25. Serial.println("Setup done");
  26.  
  27. getBatteryLevel();
  28. delay(100);
  29. }
  30.  
  31. int getBatteryLevel() {
  32. uint32_t getVcc = ESP.getVcc();
  33. Serial.println(getVcc);
  34. float measuredvbat = getVcc; // for actual voltage
  35. measuredvbat /= 1024; // convert to voltage
  36. Serial.println(measuredvbat);
  37.  
  38. int percent = map(getVcc, 2300, 3000, 0, 100); // turn vcc into batt perentage (yea I know it's not that accurate due to dropoff rate)
  39. return percent;
  40. //return 30; //DEBUG
  41. }
  42.  
  43. void smallText(int percent){
  44. String batvol = "";
  45. batvol += percent;
  46. batvol += "%";
  47. char batChr2[batvol.length()+1];
  48. batvol.toCharArray(batChr2, batvol.length()+1);
  49.  
  50. u8g2.setFont(u8g2_font_8x13_mf);
  51. u8g2.drawStr(70,25,batChr2);
  52. }
  53.  
  54. void smallBottomRightIcon(int percent){
  55. percent = map(percent, 0, 100, 1, 11);
  56. if(percent > 11){ percent = 11; }
  57. if(percent < 1){ percent = 1; }
  58. u8g2.setFont(u8g_font_unifont);
  59. //u8g.setFont(u8g_font_osb21);
  60. u8g2.drawFrame(111,24,15,8);
  61. u8g2.drawBox(113,26,percent,4); //3rd param is %(1-11)
  62. u8g2.drawBox(126,26,2,4);
  63. }
  64.  
  65. void topBar(int percent){
  66. percent = map(percent, 0, 100, 1, 128);
  67. if(percent > 128){ percent = 128; }
  68. if(percent < 1){ percent = 1; }
  69.  
  70. u8g2.drawLine(128-percent,0, 128, 0);
  71. }
  72.  
  73. void gauge(int percent){
  74. int arc=10;
  75. uint8_t angle = map(percent,0,100,0,90);
  76. if (angle<45){
  77. angle=angle+135;
  78. }else{
  79. angle=angle-45;
  80. }
  81. float x1=sin(2*angle*2*3.14/360);
  82. float y1=cos(2*angle*2*3.14/360);
  83. u8g2.drawLine(40, 32, 40+arc*x1, 32-arc*y1);
  84. u8g2.drawCircle(40, 32, 15, U8G2_DRAW_UPPER_LEFT);
  85. u8g2.drawCircle(40, 32, 15, U8G2_DRAW_UPPER_RIGHT);
  86. }
  87.  
  88. void loop() {
  89. u8g2.clearBuffer();
  90. int percent = getBatteryLevel();
  91. smallBottomRightIcon(percent);
  92. topBar(percent);
  93. gauge(percent);
  94. smallText(percent);
  95. u8g2.sendBuffer();
  96. delay(1000);
  97. }
Buy Me A Coffee