Точный измеритель напряжения на arduino. Bluetooth вольтметр на базе arduino

Широкий интерес для любителей самодельных электронно-программируемых устройств представляют многофункциональные сборки Arduino, позволяющие воплощать в жизнь интересные задумки.

Основное преимущество готовых схем Arduino заключается в уникальном блочно-модульном принципе: каждая плата может быть добавлена дополнительными интерфейсами, бесконечно расширяя возможности для создания различных проектов.

Модули Arduino построены на универсальном микроконтроллере с собственным загрузчиком, что позволяет легко прошивать его необходимым программным кодом, без использования дополнительных устройств. Программирование осуществляется на стандартном языке С++.

Одним из простейших примеров использования Arduino может стать реализация на базе этой сборки вольтметра постоянного напряжения повышенной точности с диапазоном измерения от 0 до 30 В.

Аналоговые входы Arduino предназначены для постоянного напряжения не более пяти вольт, поэтому, использование их при превышающих это значение напряжениях возможно с делителем напряжения.


Схема подключения Areduino через делитель напряжения

Делитель напряжения состоит из двух последовательно соединенных сопротивлений. Расчет его производится по формуле:

Внешний USB-разъем в автомагнитоле

Представлена полезная схема для любителей поэкспериментировать с Ардуино. Это простой цифровой вольтметр, которым надежно можно измерять постоянное напряжение в диапазоне 0 – 30В. Плату Ардуино, как обычно, можно питать от 9В батареи.

Как вам вероятно известно, аналоговые входы Ардуино можно использовать для измерения постоянного напряжения в диапазоне 0 – 5В и этот диапазон можно увеличить,
используя два резистора в качестве делителя напряжения. Делитель уменьшит измеряемое напряжение до уровня аналоговых входов Ардуино. А затем программа вычислит реальную величину напряжения.

Аналоговый датчик на плате Ардуино определяет наличие напряжения на аналоговом входе и преобразует его в цифровую форму для дальнейшей обработки микроконтроллером. На рисунке напряжение подается на аналоговый вход (А0) через простой делитель напряжения, состоящий из резисторов R1 (100кОм) и R2 (10кОм).

При этих значениях делителя на плату Ардуино можно подавать напряжение от 0 до
55В. На входе А0 имеем измеряемое напряжение деленное на 11,т.е.55В / 11=5В. Иначе говоря, при измерении 55В на входе Ардуино имеем максимально допустимое значение 5В. На практике лучше на этом вольтметре написать диапазон “0 – 30В”, чтобы оставался
Запас по безопасности!

Примечания

Если показания дисплея не совпадают с показаниями промышленного (лабораторного) вольтметра, то необходимо точным прибором измерить величину сопротивлений R1 и R2 и вставить эти значения вместо R1=100000.0 и R2=10000.0 в коде программы. Затем следует измерить лабораторным вольтметром реальное напряжение между выводами 5В и “Земля” платы Ардуино. Получится значение меньшее, чем 5В, например, получилось 4.95В. Это реальное значение следует вставить в строке кода
vout = (value * 5.0) / 1024.0 вместо 5.0.
Кроме того, старайтесь применять прецизионные резисторы с допуском 1%.

Резисторы R1 и R2 обеспечивают некоторую защиту от повышенных входных напряжений.Однако следует помнить, что любые напряжения выше 55В могут вывести из строя плату Ардуино. Кроме того, в этой конструкции не предусмотрены другие виды защиты(от скачков напряжения, от переполюсовки или повышенного напряжения).

Программа цифрового вольтметра

/*
DC Voltmeter
An Arduino DVM based on voltage divider concept
T.K.Hareendran
*/
#include
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
int analogInput = 0;
float vout = 0.0;
float vin = 0.0;
float R1 = 100000.0; // resistance of R1 (100K) -see text!
float R2 = 10000.0; // resistance of R2 (10K) – see text!
int value = 0;
void setup(){
pinMode(analogInput, INPUT);
lcd.begin(16, 2);
lcd.print(“DC VOLTMETER”);
}
void loop(){
// read the value at analog input
value = analogRead(analogInput);
vout = (value * 5.0) / 1024.0; // see text
vin = vout / (R2/(R1+R2));
if (vin<0.09) {
vin=0.0;//statement to quash undesired reading !
}
lcd.setCursor(0, 1);
lcd.print(“INPUT V= “);
lcd.print(vin);
delay(500);
}

Принципиальная схема Ардуино-вольтметра

Перечень компонентов

Плата Arduino Uno
100 кОм резистор
10 кОм резистор
100 Ом резистор
10кОм Подстроечный резистор
LCD дисплей 16?2 (Hitachi HD44780)

Бывают моменты, когда вы хотите проверить напряжение или какую-то точку в цепи, но у вас нет вольтметра или мультиметра под рукой? Бежать покупать? Это долго и дорого. Прежде чем вы это сделаете, как насчет того, чтобы создать вольтметр самому? На самом деле с помощью простых компонентов вы можете сделать его сами.

  • В уроке мы использовали плату совместимую с Ардуино - SunFounder Uno / Mars (http://bit.ly/2tkaMba)
  • USB-кабель для передачи данных
  • 2 потенциометра (50k)
  • LCD1602 - http://bit.ly/2ubNEfi
  • Макетная плата - http://bit.ly/2slvfrB
  • Несколько перемычек

Перед подключением, давайте сначала разберем как это работает.

Используйте плату SunFounder Uno для основной части обработки данных вольтметра, LCD1602 в качестве экрана, потенциометр для регулировки контрастности ЖК-дисплея, а другой - для разделения напряжения.

Когда вы вращаете потенциометр, подключенный к плате Uno, резистор потенциометра изменяется, тем самым изменяя напряжение на нем. Сигнал напряжения будет отправлен на плату Uno через контакт A0, а Uno преобразует полученный аналоговый сигнал в цифровую форму и записывает на ЖК-дисплей. Таким образом, вы можете увидеть значение напряжения при текущем сопротивлении емкости.

LCD1602 имеет два режима работы: 4-битный и 8-битный. Когда IO MCU недостаточны, вы можете выбрать 4-битный режим, при котором используются только контакты D4 ~ D7.

Следуйте таблице, чтобы подключить их.

Шаг 4: Подключаем потенциометр к LCD1602

Подключите средний контакт потенциометра к контакту Vo на LCD1602, а любой из остальных контактов - к GND.

Подсоедините средний контакт потенциометра к контакту A0 от SunFounder Uno, а один из остальных - к 5V, когда другой - к GND.

Шаг 6: Загружаем код

Такой код:

#include /****************************************************/ const int analogIn = A0;//potentiometer attach to A0 LiquidCrystal lcd(4, 6, 10, 11, 12, 13);//lcd(RS,E,D4,D5,D6.D7) float val = 0;// define the variable as value=0 /****************************************************/ void setup() { Serial.begin(9600);//Initialize the serial lcd.begin(16, 2);// set the position of the characters on the LCD as Line 2, Column 16 lcd.print("Voltage Value:");//print "Voltage Value:" } /****************************************************/ void loop() { val = analogRead(A0);//Read the value of the potentiometer to val val = val/1024*5.0;// Convert the data to the corresponding voltage value in a math way Serial.print(val);//Print the number of val on the serial monitor Serial.print("V"); // print the unit as V, short for voltage on the serial monitor lcd.setCursor(6,1);//Place the cursor at Line 1, Column 6. From here the characters are to be displayed lcd.print(val);//Print the number of val on the LCD lcd.print("V");//Then print the unit as V, short for voltage on the LCD delay(200); //Wait for 200ms }

Вращайте потенциометр, чтобы проверить напряжение на LCD1602 в режиме реального времени.

Вот хитрая штука. После того, как я запустил код, на ЖК-дисплее отобразились символы. Затем я отрегулировал контрастность экрана (постепенное изменение от черного до белого), вращая потенциометр по часовой стрелке или против часовой стрелки, пока экран не отобразил символы четко.

Возьмите две батареи, чтобы измерить их напряжение: 1,5 В и 3,7 В. Отцепите соединение второго потенциометра с контактом A0 и GND, что означает удаление потенциометра из цепи. Зажмите конец провода A0 до анода батареи и цепь GND на катод. НЕ подключайте их обратно, иначе получите короткое замыкание на батарее. Значение 0V - это обратное соединение.

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

PS: Если у вас проблемы с отображением на дисплее - смотрите этот FAQ для ЖК-дисплеев - http://wiki.sunfounder.cc/index.php?title=LCD1602/I2C_LCD1602_FAQ.

Исходные данные и доработка

Итак к этому момент у нас есть вольтметр постоянного напряжения с пределом 0..20в (смотрите предыдущую часть). Теперь мы добавляем к нему амперметр 0..5а. Для этого немного модифицируем схему - она станет проходной, то есть имеет как вход так и выход.

Часть касающуюся отображения на LCD я убрал - она не будет меняться. Впринципе основной новый элемент - шунт Rx на 0.1 Ом. Цепочка R1-C1-VD1 служит для защиты аналогового входа. Такую же имеет смысл поставить и по входу A0. Поскольку мы предполагаем достаточно большие токи, есть требования к монтажу - силовые линии должны быть выполнены достаточно толстым проводом и соединяться с выводами шунта непосредственно (проще говоря, припаяны), иначе показания будут далеки от реальности. Есть так же замечание по току - впринципе опорное напряжение 1.1в позволяет регистрировать на шунте 0.1 Ом ток до 11 ампер с точностью немного хуже 0.01а, но при падении на Rх такого напряжения выделяемая мощность превысит 10 Вт, что совсем не весело. Для решения проблемы можно было бы использовать усилитель с коэффициентом усиления 11 на качественном ОУ и шунт на 10 мОм (0.01Ом). Но пока мы не будем усложнять себе жизнь и просто ограничимся в токе до 5а (при этом мощность Rx можно выбрать порядка 3-5 Вт).

На этом этапе меня ждал сюрприз - оказалось что АЦП контроллера имеет достаточно большое смешение нуля - около -3мВ. То есть АЦП просто не видит сигналы менее 3мВ, а сигналы чуть большего уровня видны с характерной неточностью -3мВ, что портит линейность в начале диапазона. Беглый поиск не дал явных ссылок на такую проблему (смещение нуля это нормально, но оно должно быть существенно меньше), поэтому вполне возможно это проблема конкретного экземпляра Atmega 328. Решение я выбрал двоякое - по напряжению - программную ступеньку в начале диапазона (отображение начинается с 0.06 вольт), по току - подтягивающий резистор на шину 5в. Резистор обозначен пунктиром.

Исходный код

Полную версию этого вольт-ампер-метра (в варианте с I2C) можно скачать по ссылке в конце статье. Далее я покажу изменения в исходном коде. Добавилось чтение аналогового входа A1 с таким же усреднением как и для вольтметра. По сути это тот же вольтметр, только без делителя, а амперы мы получаем по формуле Ома: I = U/Rx (например, если падение напряжения на Rx = 0.01 В, то ток равен 0.1А). Также я ввел константу усиления по току AmpMult - на будущее. Константу AmpRx с сопротивлением шунта вероятно придется подобрать - учесть неточность резистора шунта. Ну и раз уже это это вольт-ампер-метр и на дисплее 1602 еще осталось место, то осталось вывести текущую потребляемую мощность в ваттах, получив не сложный дополнительный функционал.

.... // Аналоговый вход #define PIN_VOLT A0 #define PIN_AMP A1 // Внутреннее опорное напряжение (подобрать) const float VRef = 1.10; // Коэффициент входного резистивного делителя (Rh + Rl) / Rl. IN 0.2) InVolt += 3; // Перевод в вольты (In: 0..1023 -> (0..VRef) scaled by Mult) float Volt = InVolt * VoltMult * VRef / 1023; float Amp = InAmp * VRef / AmpMult / AmpRx / 1023 ; // Для учета падения на шунте раскомментировать 2 строки //float RxVolt = InAmp * VRef / 1023 / AmpMult; // Volt -= RxVolt; float Watt = Volt * Amp; // Вывод данных lcd.setCursor (8, 0); lcd.print(Watt); lcd.print("W "); lcd.setCursor (0, 1); lcd.print(Volt); lcd.print("V "); lcd.setCursor (8, 1); lcd.print(Amp); lcd.print("A "); }

Ссылки

  • Библиотека LiquidCrystal_I2C , позволяющая задать распиновку


Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: