#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 lcd(128, 64, &Wire, 4);
#define PIN_UP digitalRead(6)
#define PIN_OK digitalRead(3)
#define PIN_DOWN digitalRead(2)
#define PIN_BACK digitalRead(5)
#define PIN_MENU digitalRead(7)
float voltage, ampere;
uint32_t duration = 0, capacity = 0, energy = 0;
uint32_t lastmillis, nowmillis, interval, power, seconds;
int halaman = 1;
int menuItem = 1;
#define TINGGI_LOGO 8
#define LEBAR_LOGO 16
static const unsigned char PROGMEM logo_bmp[] =
{ B11111111, B11111111,
B11000000, B00000011,
B11000000, B00000011,
B11000000, B00000011,
B11000000, B00000011,
B11000000, B00000011,
B11000000, B00000011,
B11111111, B11111111
};
void setup() {
Serial.begin(9600);
lcd.begin(SSD1306_SWITCHCAPVCC, 0x3C);
lcd.clearDisplay();
lcd.setTextColor(WHITE);
}
void loop() {
callVoltage();
callDisplay();
callButton();
}
void callButton() {
// untuk button up
if (!PIN_UP && halaman == 1) {
menuItem --;
if (menuItem < 1)menuItem = 4;
}
//untuk button down
if (!PIN_DOWN && halaman == 1) {
menuItem ++;
if (menuItem > 4)menuItem = 1;
}
// untuk button ok
if (!PIN_OK) {
if (halaman == 1 && menuItem == 1) {
halaman = 2;
} else if (halaman == 1 && menuItem == 2) {
halaman = 3;
} else if (halaman == 1 && menuItem == 3) {
halaman = 4;
} else if (halaman == 1 && menuItem == 4) {
halaman = 5;
}
}
// untuk button back
if (!PIN_BACK) {
if (halaman == 2 || halaman == 3 || halaman == 4 || halaman == 5) {
halaman = 1;
}
}
//Serial.println(menuItem);
//delay(100);
}
void callDisplay() {
if (halaman == 1) {
lcd.clearDisplay();
lcd.setTextSize(1);
if (menuItem == 1) {
lcd.setCursor(5, 0);
lcd.print("> menuItem 1");
} else {
lcd.setCursor(5, 0);
lcd.print(" menuItem 1");
}
if (menuItem == 2) {
lcd.setCursor(5, 8);
lcd.print("> menuItem 2");
} else {
lcd.setCursor(5, 8);
lcd.print(" menuItem 2");
}
if (menuItem == 3) {
lcd.setCursor(5, 16);
lcd.print("> menuItem 3");
} else {
lcd.setCursor(5, 16);
lcd.print(" menuItem 3");
}
if (menuItem == 4) {
lcd.setCursor(5, 24);
lcd.print("> menuItem 4");
} else {
lcd.setCursor(5, 24);
lcd.print(" menuItem 4");
}
} else if (halaman == 2) {
lcd.clearDisplay();
// lcd.setTextSize(2);
// lcd.setCursor(5, 13);
displayVolt();
} else if (halaman == 3) {
lcd.clearDisplay();
lcd.setTextSize(2);
lcd.setCursor(0, 0);
//lcd.print("HALAMAN 2");
testdrawbitmap();
} else if (halaman == 4) {
lcd.clearDisplay();
displayVolt2();
} else if (halaman == 5) {
lcd.clearDisplay();
lcd.setTextSize(2);
lcd.setCursor(25, 25);
lcd.print("HALAMAN 4");
}
lcd.display();
}
void callVoltage() {
voltage = analogRead(A0) * (5.0 / 1023.0);
ampere = analogRead(A6) * (50.0 / 1023.0);
// Calculate timings
nowmillis = millis(); // read millis counter
interval = nowmillis - lastmillis; // calculate recent time interval
lastmillis = nowmillis; // reset lastmillis
duration += interval; // calculate total duration in millis
seconds = duration / 1000; // calculate total duration in seconds
// Calculate power, capacity and energy
power = (uint32_t)voltage * ampere; // calculate power in Watt
capacity += interval * ampere / 3600; // calculate capacity in uAh
energy += interval * power / 3600; // calculate energy in uWh
}
void displayVolt() {
lcd.setTextSize(1);
lcd.setCursor(0, 0);
lcd.print("V :" + String(voltage) + "V");
lcd.setCursor(0, 8);
lcd.print("A :" + String(ampere) + "A");
lcd.setCursor(0, 16);
lcd.print("P :" + String(power) + "W");
lcd.setCursor(0, 24);
lcd.print("E :" + String(energy) + "uWh");
}
void displayVolt2() {
byte vol = voltage;
lcd.setTextSize(2);
lcd.setCursor(0, 0);
if (vol < 10) {
lcd.print("0" + String(voltage) + " V");
}else{
lcd.print(String(voltage) + " V");
}
lcd.setCursor(0, 16);
lcd.print(String(voltage * 10) + " A");
lcd.setTextSize(1);
lcd.setCursor(85, 0);
lcd.print(String(power) + "W");
lcd.setCursor(85, 8);
lcd.print(String(capacity) + "mAh");
lcd.setCursor(85, 16);
lcd.print(String(energy) + "uWh");
lcd.setCursor(85, 24);
lcd.print(String(seconds) + "S");
Serial.println(vol);
}
void testdrawbitmap(void) {
lcd.clearDisplay();
lcd.drawBitmap(0, 0, logo_bmp, LEBAR_LOGO, TINGGI_LOGO, 1);
lcd.display();
delay(1000);
}