Найти в Дзене
АмперКО

4-канальный вольтметр с ЖК-индикатором на базе Arduino

Четырехканальный "Arduino-вольтметр" может измерять четыре независимых напряжения постоянного тока в диапазоне от 0 до 50В. Аналоговые каналы с A2 по A5 на Arduino Uno используются для измерения четырех различных напряжений. Измеренные значения напряжений отображаются на 16-символьном, двухстрочном ЖК-индикаторе. Напряжения отображаются в виде значения с одной цифрой после запятой, напр., 5.3В, 12.8В и т.д. Принцип работы вольтметра Каждый канал вольтметра на базе Arduino имеет пару резисторов, которые образуют делитель напряжения. Делитель напряжения уменьшает входное напряжение до уровня, который может быть измерен микроконтроллером Arduino. Запущенный код на Arduino вычисляет действительное значение напряжения и отображает результат на ЖК-дисплее. Перед началом сборки схемы убедитесь в том, что ваш ЖК-дисплей имеет такое же количество выводов, что и дисплей, указанный на схеме. При неправильном подключении ЖК-дисплей может выйти из строя. Напряжение измеряется между точками A, B
Оглавление

Четырехканальный "Arduino-вольтметр" может измерять четыре независимых напряжения постоянного тока в диапазоне от 0 до 50В. Аналоговые каналы с A2 по A5 на Arduino Uno используются для измерения четырех различных напряжений. Измеренные значения напряжений отображаются на 16-символьном, двухстрочном ЖК-индикаторе.

Напряжения отображаются в виде значения с одной цифрой после запятой, напр., 5.3В, 12.8В и т.д.

Принцип работы вольтметра

Каждый канал вольтметра на базе Arduino имеет пару резисторов, которые образуют делитель напряжения. Делитель напряжения уменьшает входное напряжение до уровня, который может быть измерен микроконтроллером Arduino. Запущенный код на Arduino вычисляет действительное значение напряжения и отображает результат на ЖК-дисплее.


Электрическая схема вольтметра на базе Arduino
Электрическая схема вольтметра на базе Arduino

Перед началом сборки схемы убедитесь в том, что ваш ЖК-дисплей имеет такое же количество выводов, что и дисплей, указанный на схеме. При неправильном подключении ЖК-дисплей может выйти из строя.

Напряжение измеряется между точками A, B, C или D и землей или 0В. Не забудьте отрегулировать уровень контрастности с помощью потенциометра, чтобы показания на ЖК-дисплее были видимыми.

Резистор R1 обеспечивает ограничение тока для опциональной задней подсветки и позволяет ей быть постоянно включенной.

Скетч вольтметра на базе Arduino

Переменные sum и voltage объединяются в массив, что позволяет сохранять значения показаний от четырех аналоговых каналов. 

Калибровка

В нашем случае нужно вычислить коэффициент деления 4 делителей напряжения.

Значения калибровки могут быть легко изменены в верхней части кода:

// voltage divider calibration values
#define DIV_1 11.1346
#define DIV_2 11.1969
#define DIV_3 11.0718
#define DIV_4 11.0718
// ADC reference voltage / calibration value
#define V_REF 4.991

Калибровка опорного напряжения

Измерьте напряжение 5В и измените значения константы V_REF в соответствии с измеренным значением. Измерьте напряжение в схеме с подключенным ЖК-дисплеем и при запущенном скетче, поскольку напряжение может измениться при подключении ЖК-дисплея. Например, при подключенной схеме, значение напряжения с величины 5.015В при отключенном ЖК-дисплее может упасть до 4.991В при подключенном ЖК-дисплее на том же «железе».

Калибровка делителя напряжения

Измените значения делителя напряжения для каждого делителя напряжения от DIV_1 до DIV_4 в верхней части скетча. DIV_1 - DIV_4 соответствуют аналоговым выводам A2 - A5.

Список радиоэлементов


Плата Arduino - Arduino Uno - 1 шт.

R1 Резистор - 47 Ом - 1 шт.

R2, R4, R6, R8 Резистор - 1 МОм - 4 шт.

R3, R5, R7, R9 Резистор - 100 кОм - 4 шт.

RV1 Подстроечный резистор - 10 кОм - 1 шт.

LCDLCD дисплей 16x2 HD44780 - 1 шт.

Скетч

*в связи с некоторыми техническими ограничениями на яндекс перед всеми define нужно добавить символ решетки

#include <LiquidCrystal.h>
// number of analog samples to take per reading, per channel
define NUM_SAMPLES 10
// voltage divider calibration values
define DIV_1 11.1346
define DIV_2 11.1969
define DIV_3 11.0718
define DIV_4 11.0718
// ADC reference voltage / calibration value
define V_REF 4.991
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int sum[4] = {0}; // sums of samples taken
unsigned char sample_count = 0; // current sample number
float voltage[4] = {0.0}; // calculated voltages
char l_cnt = 0; // used in 'for' loops
void setup()
{
lcd.begin(16, 2);
}
void loop()
{
// take a number of analog samples and add them up
while (sample_count < NUM_SAMPLES) {
// sample each channel A2 to A5
for (l_cnt = 0; l_cnt < 4; l_cnt++) {
sum[l_cnt] += analogRead(A2 + l_cnt);
}
sample_count++;
delay(10);
}
// calculate the voltage for each channel
for (l_cnt = 0; l_cnt < 4; l_cnt++) {
voltage[l_cnt] = ((float)sum[l_cnt] / (float)NUM_SAMPLES * V_REF) / 1024.0;
}
// display voltages on LCD
// each voltage is multiplied by the resistor network
// division factor to calculate the actual voltage
// voltage 1 - A (pin A2)
lcd.setCursor(0, 0);
lcd.print("A ");
lcd.print(voltage[0] * DIV_1, 1);
lcd.print("V ");
// voltage 2 - B (pin A3)
lcd.setCursor(8, 0);
lcd.print("B ");
lcd.print(voltage[1] * DIV_2, 1);
lcd.print("V ");
// voltge 3 - C (pin A4)
lcd.setCursor(0, 1);
lcd.print("C ");
lcd.print(voltage[2] * DIV_3, 1);
lcd.print("V ");
// voltage 4 - D (pin A5)
lcd.setCursor(8, 1);
lcd.print("D ");
lcd.print(voltage[3] * DIV_4, 1);
lcd.print("V ");
// reset count and sums
sample_count = 0;
for (l_cnt = 0; l_cnt < 4; l_cnt++) {
sum[l_cnt] = 0;
}
}