Код:
// -- Индикатор лампового УМ на Arduino nano 3 и LCD 2004
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define PMETER A6
//byte lcdNumCols = 20; // -- number of columns in the LCD
//byte sensorPin = 0; // -- value for this example
uint16_t val_sm = 0;
uint16_t val_sm_old = 1;
LiquidCrystal_I2C lcd(0x27,20,4); // -- creating LCD instance
//LcdBarGraph lbg(&lcd, 20, 0, 0); // -- creating bargraph instance, format is (&lcd, lcdNumCols, start X, start Y). So (&lcd, 16, 0, 1) would set the bargraph length to 16 columns and start the bargraph at column 0 on row 1.
const uint8_t sm2[8] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00};
const uint8_t sm1[8] {0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x00};
const uint8_t sm0[8] {0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x00};
void setup(){
// -- initializing the LCD
lcd.init(); // Инициализация lcd
lcd.backlight(); // Включаем подсветку
lcd.begin(20, 4);
lcd.createChar(0, sm0);
lcd.createChar(1, sm1);
lcd.createChar(2, sm2);
lcd.clear();
// -- do some delay some time I've got broken visualization
//delay(100);
}
void loop()
{
// -- draw bar graph from the analog value readed
//lbg.drawValue( analogRead(A6), 1021);
// -- do some delay: frequent draw may cause broken visualization
val_sm = analogRead(PMETER);
if ((abs(val_sm - val_sm_old)) > 3) {
show_sm();
val_sm_old = val_sm;
}
//delay(100);
//lcd.clear();
// измерение анодного напряжения
// устанавливаем курсор в колонку 0, строку 2
lcd.setCursor(0, 2);
// считываем показания с аналогового входа A0
int anodU = analogRead(A0);
// переводим значения с АЦП A0 в вольты
float sensorVoltage = anodU * (5.0 / 120.0); // тут правим коэффициент для другого верхнего значения напряжения
// переводим вольты в напряжение
int anodV = sensorVoltage * 100;
// выводим результат на дисплей
lcd.print("Ua=");
// устанавливаем курсор в колонку 3, строку 2
// на самом деле это третья строка, т.к. нумерация начинается с нуля
lcd.setCursor(3, 2);
lcd.print(anodV);
lcd.print("V ");
// измерение анодного тока
// устанавливаем курсор в колонку 10, строку 2
lcd.setCursor(10, 2);
// считываем показания с аналогового входа A1
int anodI = analogRead(A1);
// переводим значения с АЦП A1 в вольты
float sensorVoltage1 = anodI * (5.0 / 123.0); // тут правим коэффициент для другого верхнего значения тока
// переводим вольты в милиамперы
int anodmA = sensorVoltage1 * 100;
// выводим результат на дисплей
lcd.print("Ia=");
// устанавливаем курсор в колонку 13, строку 2
lcd.setCursor(13, 2);
lcd.print(anodmA);
lcd.print("mA ");
// измерение напряжения экранной сетки
// устанавливаем курсор в колонку 0, строку 3
lcd.setCursor(0, 3);
// считываем показания с аналогового входа A2
int gridU2 = analogRead(A2);
// переводим значения с АЦП A2 в вольты
float sensorVoltage2 = gridU2 * (5.0 / 120.0); // тут правим коэффициент для другого верхнего значения напряжения
// переводим вольты в напряжение
int gridV2 = sensorVoltage2 * 100;
// выводим результат на дисплей
lcd.print("Ug=");
// устанавливаем курсор в колонку 3, строку 3
// на самом деле это третья строка, т.к. нумерация начинается с нуля
lcd.setCursor(3, 3);
lcd.print(gridV2);
lcd.print("V ");
// измерение тока экранной сетки
// устанавливаем курсор в колонку 10, строку 3
lcd.setCursor(10, 3);
// считываем показания с аналогового входа A3
int gridI2 = analogRead(A3);
// переводим значения с АЦП A3 в вольты
float sensorVoltage3 = gridI2 * (5.0 / 123.0); // тут правим коэффициент для другого верхнего значения тока
// переводим вольты в милиамперы
int gridmA2 = sensorVoltage3 * 100;
// выводим результат на дисплей
lcd.print("Ig=");
// устанавливаем курсор в колонку 13, строку 3
lcd.setCursor(13, 3);
lcd.print(gridmA2);
lcd.print("mA ");
// измерение мощности и КСВ
// устанавливаем курсор в колонку 10, строку 1
lcd.setCursor(0, 1);
// считываем показания с аналогового входа A6 A7
int pwr1 = analogRead(A6);
int pwr2 = analogRead(A7);
// переводим значения с АЦП A6 A7 в вольты
float U1 = pwr1 * (5.0 / 73.0);
float U2 = pwr2 * (5.0 / 73.0);
// переводим вольты в мощность и КСВ
int pwr11 = ((U1*U1)/50) * 15; // тут правим коэффициент для мощности 1472 Вт
int swr12 = ((U1+U2)/(U1-U2)) * 100;
//ограничиваем значение КСВ на уровне 9.99
// выводим результат на дисплей
lcd.print("PWR=");
// устанавливаем курсор в колонку 4, строку 1
lcd.setCursor(4, 1);
lcd.print(pwr11);
lcd.print("W ");
// устанавливаем курсор в колонку 10, строку 1
lcd.setCursor(10, 1);
// выводим результат на дисплей
lcd.print("SWR=");
lcd.print(" ");
// устанавливаем курсор в колонку 13, строку 1
lcd.setCursor(14, 1);
lcd.print(swr12 / 100); //целая часть
lcd.print(".");
if (swr12 - (swr12/100)*100 <= 9) {
lcd.print("0");
}
lcd.print(swr12 - (swr12/100)*100); //дробная часть
//lcd.print(swr12=swr12*10); //дробная часть
delay(150);
}
void show_sm() {
uint8_t m;
uint8_t a;
a = (val_sm + 3) / 51;
lcd.setCursor(0, 0);
for (m = 0; m < a; m++)
if (m < 13) // до 70% не закрашенные квадратики
lcd.print('\x00'); // символ sm0
else
lcd.print('\x01'); // символ sm1
for (m = a; m < 19; m++)
lcd.print('\x02');
}