| | #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); |
---|
| | } |
---|
| | |
---|
| | |