- #include <Arduino.h>
- #include <U8g2lib.h>
-
- #ifdef U8X8_HAVE_HW_SPI
- #include <SPI.h>
- #endif
- #ifdef U8X8_HAVE_HW_I2C
- #include <Wire.h>
- #endif
-
- U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ 16, /* clock=*/ 5, /* data=*/ 4);
- ADC_MODE(ADC_VCC);
-
- void setup() {
- Serial.begin(115200);
-
- // screen stuff (128 x 32 px)
- pinMode(10, OUTPUT);
- pinMode(9, OUTPUT);
- digitalWrite(10, 0);
- digitalWrite(9, 0);
- u8g2.begin();
- u8g2.enableUTF8Print();
-
- Serial.println("Setup done");
-
- getBatteryLevel();
-
- delay(100);
- }
-
- int getBatteryLevel() {
- uint32_t getVcc = ESP.getVcc();
- Serial.println(getVcc);
- float measuredvbat = getVcc; // for actual voltage
- measuredvbat /= 1024; // convert to voltage
- Serial.println(measuredvbat);
-
- 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)
- return percent;
- //return 30; //DEBUG
- }
-
- void smallText(int percent){
- String batvol = "";
- batvol += percent;
- batvol += "%";
- char batChr2[batvol.length()+1];
- batvol.toCharArray(batChr2, batvol.length()+1);
-
- u8g2.setFont(u8g2_font_8x13_mf);
- u8g2.drawStr(70,25,batChr2);
- }
-
- void smallBottomRightIcon(int percent){
- percent = map(percent, 0, 100, 1, 11);
- if(percent > 11){ percent = 11; }
- if(percent < 1){ percent = 1; }
-
- u8g2.setFont(u8g_font_unifont);
- //u8g.setFont(u8g_font_osb21);
- u8g2.drawFrame(111,24,15,8);
- u8g2.drawBox(113,26,percent,4); //3rd param is %(1-11)
- u8g2.drawBox(126,26,2,4);
- }
-
- void topBar(int percent){
- percent = map(percent, 0, 100, 1, 128);
- if(percent > 128){ percent = 128; }
- if(percent < 1){ percent = 1; }
-
- u8g2.drawLine(128-percent,0, 128, 0);
- }
-
- void gauge(int percent){
- int arc=10;
- uint8_t angle = map(percent,0,100,0,90);
- if (angle<45){
- angle=angle+135;
- }else{
- angle=angle-45;
- }
- float x1=sin(2*angle*2*3.14/360);
- float y1=cos(2*angle*2*3.14/360);
- u8g2.drawLine(40, 32, 40+arc*x1, 32-arc*y1);
-
- u8g2.drawCircle(40, 32, 15, U8G2_DRAW_UPPER_LEFT);
- u8g2.drawCircle(40, 32, 15, U8G2_DRAW_UPPER_RIGHT);
- }
-
- void loop() {
- u8g2.clearBuffer();
- int percent = getBatteryLevel();
-
- smallBottomRightIcon(percent);
- topBar(percent);
- gauge(percent);
- smallText(percent);
-
- u8g2.sendBuffer();
- delay(1000);
- }