#include <LiquidCrystal.h> // библиотека для работы с ЖК дисплеем

LiquidCrystal lcd( 9, 8, 7, 6, 5, 4 ); // контакты, к которым подключен ЖК дисплей
float r1 = 100000.0; //сопротивление резистора r1 для амперметра
float r2 = 10000.0; // сопротивление резистора r2 для амперметра
float Vin = 5.0;
float r3 = 1000.0; // сопротивление резистора r2 для омметра

int PinOut[2] {10, 11}; // пина выхода
int PinIn[2] {12, 13}; // пина входа
int mode = 0;
// Массив кнопок
const int value[2][2] {
  {0, 2},
  {1, 3}
};

void setup()
{
  lcd.begin(16, 2); // устанавливаем число столбцов и строк используемого нами ЖК дисплея

  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, INPUT);
  digitalWrite(12, HIGH);
  pinMode(13, INPUT);
  digitalWrite(13, HIGH);
}

void matrix () // создаем функцию для чтения кнопок
{
  for (int i = 1; i <= 2; i++) // цикл, передающий 0 по всем столбцам
  {
    digitalWrite(PinOut[i - 1], LOW); // если i меньше 4 , то отправляем 0 на ножку
    for (int j = 1; j <= 2; j++) // цикл, принимающих 0 по строкам
    {
      if (digitalRead(PinIn[j - 1]) == LOW) // если один из указанных портов входа равен 0, то..
      {
        mode = value[i - 1][j - 1];
      }
    }
    digitalWrite(PinOut[i - 1], HIGH); // подаём обратно высокий уровень
  }
}

void loop()
{
  matrix(); // используем функцию опроса матричной клавиатуры
  lcd.clear();

  switch(mode) {
    case 0: {
      lcd.setCursor(0, 0);
      lcd.print("WELCOME!!!");
      lcd.setCursor(0, 1);
      lcd.print("SELECT MODE");

      break;
    }
    case 1: {
      // DC DIGI VOLTMETER
      int analogvalue = analogRead(A0);
      float temp = (analogvalue * 5.0) / 1024.0; // формула для конвертирования значения напряжения
      float input_volt = temp / (r2/(r1+r2));
      if (input_volt < 0.1)
      {
        input_volt=0.0;
      }

      // выводим значение напряжения на экран ЖК дисплея
      lcd.setCursor(0, 0);
      lcd.print("VOLTMETER");
      lcd.setCursor(0, 1);
      lcd.print("Voltage= ");
      lcd.print(input_volt);
      
      break;
    }
    case 2: {
      // DC DIGI AMPERMETER
      int v0 = analogRead(A1);
      int v1 = analogRead(A2);
    
      float temp_val = ((v0 - v1) * 0.00488);
      float current_value = (temp_val/22);

      // выводим измеренное значение тока на экран ЖК дисплея
      lcd.setCursor(0, 0);
      lcd.print("AMPERMETER");
      lcd.setCursor(0, 1);
      lcd.print (current_value, 4); 
      lcd.print("A");

      break;
    }
    case 3: {
      // DC DIGI OHMMETER
      int a2d_data = analogRead(A3);

      float Vout = a2d_data * Vin / 1024.0;
      float unknownR = (r3 * Vout) / (Vin - Vout);

      // выводим измеренное сопротивления резистора на экран ЖК дисплея
      lcd.setCursor(0, 0);
      lcd.print("OHMMETER");
      lcd.setCursor(0, 1);
      lcd.print("R (ohm) = ");
      lcd.print(unknownR);

      break;
    }
  }

  delay(175);
}