diff --git a/BatteryMeters.ino b/BatteryMeters.ino new file mode 100755 index 0000000..188aa83 --- /dev/null +++ b/BatteryMeters.ino @@ -0,0 +1,102 @@ +#include +#include + +#ifdef U8X8_HAVE_HW_SPI +#include +#endif +#ifdef U8X8_HAVE_HW_I2C +#include +#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); +} diff --git a/BatteryMeters.ino b/BatteryMeters.ino new file mode 100755 index 0000000..188aa83 --- /dev/null +++ b/BatteryMeters.ino @@ -0,0 +1,102 @@ +#include +#include + +#ifdef U8X8_HAVE_HW_SPI +#include +#endif +#ifdef U8X8_HAVE_HW_I2C +#include +#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); +} diff --git a/README.md b/README.md index 2a51f51..794ef2c 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,18 @@ -Heltec_WiFi_Kit_8 +Heltec WiFi Kit 8 =============== -Example scripts and useful links for the Heltec WiFi Kit 8 \ No newline at end of file +Example scripts and useful links for the Heltec WiFi Kit 8 + +#**Scripts** + +# BatteryMeters.ino +Example Battery Gauges + + +Click to watch demo video: + +[![https://www.youtube.com/watch?v=EnLS2lJF1Ls](http://img.youtube.com/vi/EnLS2lJF1Ls/0.jpg)](http://www.youtube.com/watch?v=EnLS2lJF1Ls "Battery Gauges") + +#**Useful links** + +Use the following guide to setup the arduino environment for the wifi kit 8: [https://robotzero.one/heltec-wifi-kit-8/](https://robotzero.one/heltec-wifi-kit-8/) \ No newline at end of file