/*
    Voltmeter with Arduino by Steve Barth
*/ 

#include <SPI.h>
#include <Wire.h>
//#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Fonts/FreeSansBold9pt7b.h>

#define OLED_RESET 4
Adafruit_SSD1306 oled(128,64,&Wire,OLED_RESET);

#define v_ref 1.1   // external reference voltage LM4040 2.048V (2.048V / 1024 = 0,002V)

void setup() {
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3D);   // Initialize with the I2C addr 0x3D if not working use 0x3C (for the 128x64)
  oled.setTextColor(WHITE);
  delay(1); 
}

void loop(){
  oled.clearDisplay();
  oled.setCursor(12,5);
  oled.print("Digital Voltmeter");

  oled.setCursor(5,25);
  oled.print("A1:");
  
  oled.setCursor(5,46);
  oled.print("A2:");

  oled.setCursor(35,27);    // print out the value you read:
  oled.setFont(&FreeSansBold9pt7b);
  int V_input1=analogRead(A1);    // measurment voltage A1 input reading
  float voltage1 = (V_input1 * v_ref) / 1.023;   // converting that reading to voltage, which is based off the reference voltage
  char string[8];                                   // string max 6 digit (0000.0)
  dtostrf(voltage1 * 100, 6, 1, string);            // convert data to string (0000), dtostrf(FLOAT,WIDTH,PRECSISION,BUFFER)
  oled.print(string);                               // screen data
  oled.println(" V");

  oled.setCursor(35,54);    // print out the value you read:
  oled.setFont(&FreeSansBold9pt7b);
  int V_input2=analogRead(A2);    // measurment voltage A1 input reading
  float voltage2 = (V_input2 * v_ref) / 1023;   // converting that reading to voltage, which is based off the reference voltage
  oled.print(voltage2*1000); 
  oled.println(" V");

  oled.display();
  oled.setFont();   // set font default

}