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