Меню

Высокоточный вольтамперметр на arduino своими руками

В этом видео я рассказываю как сделать вольтамперметр своими руками на Ардуино и микроконтроллере ATMega8. Помимо вольтметра и амперметра получившееся устройство измеряет сопротивление нагрузки и потребляемую мощность.

Статья на сайте (схема, фото, плата, скетч, всё в одном месте) http://andreyandreich.ru/arduino-multimeter/

Архив проекта https://yadi.sk/d/GZkenCOy4MC6kg

=============================
Привет! Меня зовут Андрей Андреевич, я увлекался разного вида самоделками, в основном электронными. В своих проектах предпочитаю использовать детали от старой, отработавшей свое техники.
=============================

Мой сайт: http://andreyandreich.ru/
Instagram: https://www.instagram.com/andreich_more/
Группа Вконтакте: https://vk.com/hobbistelektronshhik
Почта: cooperation@andreyandreich.ru

Видео Вольтамперметр своими руками на Ардуино и ATMega8. канала Andrey Andreich

Показать

Среди начинающих разработчиков электронной техники популярно создавать амперметр и вольтметр на Ардуино. Эти устройства знакомы с курса физики, начиная с 7 класса.

В статье ниже подробно расписана инструкция о том, как создать собственный вольтметр на Ардуино с LCD дисплеем.

Высокоточный вольтамперметр на arduino своими руками

Принцип работы

Вольтметром называют приспособление, роль которого – измерение ЕДС, так называемой, электродвижущей силы. Измерения проводятся на определенном отрезке электрической цепи. Если сказать по-простому, задача прибора – замер напряжения.

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

Компоненты

Список компонентов для создания вольтамперметра на Ардуино или каждого устройства по отдельности:

  • 1 Arduino;
  • 1 Макет (не забудьте прокладки перемычек);
  • 1 Дисплей 1602А (16×2 с подсветкой);
  • 1 1×16 отсекают заголовки для фиксации дисплея;
  • 1 Зуммер;
  • 2 винтовые клеммы с двумя контактами;
  • 3 Тактильные переключатели (кнопки);
  • 1 потенциометр 10k;
  • 6 резисторов 10k;
  • 2 резистора 100k;
  • 1 резистор 100R;
  • 1 резистор 10R;
  • 1 0.47R 5W силовой резистор.

Компоненты должны быть собраны в макете следующим образом:

Высокоточный вольтамперметр на arduino своими руками

Программа для устройства

Ниже приведен отрывок из листинга программы «вольтметр на Ардуино»:

//version
#define NAME "Arduino Ammeter"
#define VERSION "0.9"

//debug flag (avoid enabling. it makes your device slower)
//#define DEBUG

//pins
const int PIN_BACKLIGHT = 2;
const int PIN_BUZZER = 3;
const int PIN_VOLTAGE = 1;
const int PIN_CURRENT = 2;
const int PIN_BUTTON_UP = 11;
const int PIN_BUTTON_SETUP =12;
const int PIN_BUTTON_DOWN = 13;

// includes
#include <LiquidCrystal.h>
#include <EEPROM.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

//variables
//voltage
int VOLTAGE_CURRENT;
int VOLTAGE_LAST=99999;
unsigned long VOLTAGE_MILLIS;
float VOLTAGE_CALCULATED;
float VOLTAGE_MAP = 50; //default voltage map... calibration needed
//current
int CURRENT_CURRENT;
int CURRENT_LAST=99999;
unsigned long CURRENT_MILLIS;
float CURRENT_CALCULATED;
float CURRENT_MAP = 10; //default current map... calibration needed 
//buttons
boolean BUTTON_PRESSED = false;
unsigned long BUTTON_MILLIS = false;
byte BUTTON_LAST;
boolean SETUP_MODE = false;
byte SETUP_ITEM;
boolean SETUP_DELAYBEEP;
//...
unsigned long MILLIS;
unsigned long SETUP_BLINKMILLIS;
boolean SETUP_BLINKSTATE;

//parameters
const int SENSOR_INTERVAL = 500;
const int BUTTON_HOLDTIME = 2000;
const int SETUP_MAXITEMS = 2;
const int SETUP_BLINKINTERVAL = 300;
const byte EEPROM_VALIDATOR = 73; //random number
const float VOLTAGE_STEP = 0.1;
const float CURRENT_STEP = 0.1;

//configuration
const byte EEPROM_CONFIGADDRESS = 0;
struct config_t
{
byte Validator;
/////////////////////
float VOLTAGE_MAP;
float CURRENT_MAP;
/////////////////////
byte ValidatorX2;
} EEPROM_DATA;

void setup() {
//configure pins
pinMode(PIN_BACKLIGHT, OUTPUT);
pinMode(PIN_BUZZER, OUTPUT);
pinMode(PIN_VOLTAGE, INPUT);
pinMode(PIN_CURRENT, INPUT);
pinMode(PIN_BUTTON_UP, INPUT);
pinMode(PIN_BUTTON_SETUP, INPUT);
pinMode(PIN_BUTTON_DOWN, INPUT);

//set up LCD
lcd.begin(16, 2);

//initial message 
lcd.setCursor(0, 0);
lcd.print(NAME);
lcd.setCursor(0, 1);
lcd.print("Version ");
lcd.print(VERSION);

//lights up
digitalWrite(PIN_BACKLIGHT, HIGH);

#ifdef DEBUG
delay(2000);
lcd.setCursor(0, 1);
lcd.print("Debug enabled! ");
lcd.print(VERSION);

Serial.begin(9600);
Serial.println("============================");
Serial.println(NAME);
Serial.println("Version ");
Serial.println(VERSION);
Serial.println("============================");
Serial.println("Debug messages:");
Serial.println("----------------------------");
#endif

//try to load the configuration
loadConfiguration();

//show initial message for a while then clear and beep
delay(2000);
lcd.clear();
showLabels();

//beep
beepStart();
}

void loop() {
processButtons();

MILLIS = millis();

if ( (MILLIS - VOLTAGE_MILLIS) >= SENSOR_INTERVAL )
{
readVoltage();

if (!SETUP_MODE || SETUP_ITEM!=1) {
showVoltage();
}

VOLTAGE_MILLIS = MILLIS;
}

if ( (MILLIS - CURRENT_MILLIS) >= SENSOR_INTERVAL )
{
readCurrent();

if (!SETUP_MODE || SETUP_ITEM!=2) {
showCURRENT();
}

CURRENT_MILLIS = MILLIS;
}

if (SETUP_MODE)
{
if ( (MILLIS - SETUP_BLINKMILLIS) >= SETUP_BLINKINTERVAL )
{
if (SETUP_BLINKSTATE)
{
if (SETUP_ITEM==1)
showVoltage();
else if (SETUP_ITEM==2)
showCURRENT();

SETUP_BLINKSTATE = false;
} else {
if (SETUP_ITEM==1)
hideVoltage();
else if (SETUP_ITEM==2)
hideCURRENT();

SETUP_BLINKSTATE = true;
}

SETUP_BLINKMILLIS = MILLIS;
}
}
}

void processButtons()
{
if (digitalRead(PIN_BUTTON_UP) == HIGH)
{
if (!BUTTON_PRESSED)
{
#ifdef DEBUG 
showDebug("Pressed UP");
#endif

BUTTON_LAST = PIN_BUTTON_UP;
BUTTON_PRESSED = true;
}
}
else if (digitalRead(PIN_BUTTON_SETUP) == HIGH)
{
if (!BUTTON_PRESSED)
{
#ifdef DEBUG 
showDebug("Pressed SETUP");
#endif

beepButton();
BUTTON_LAST = PIN_BUTTON_SETUP;
BUTTON_MILLIS = millis();
BUTTON_PRESSED = true;
SETUP_DELAYBEEP = false;
} else {
if ((millis() - BUTTON_MILLIS) > BUTTON_HOLDTIME)
if (!SETUP_DELAYBEEP)
{
beepButton();
SETUP_DELAYBEEP = true;
}

}
}
else if (digitalRead(PIN_BUTTON_DOWN) == HIGH)
{
if (!BUTTON_PRESSED)
{
#ifdef DEBUG 
showDebug("Pressed DOWN");
#endif

BUTTON_LAST = PIN_BUTTON_DOWN;
BUTTON_PRESSED = true;

}
}
else 
{
if (BUTTON_PRESSED) {
if (BUTTON_LAST == PIN_BUTTON_SETUP)
{
#ifdef DEBUG 
showDebug("Released SETUP");
#endif

if (!SETUP_MODE && (millis() - BUTTON_MILLIS) > BUTTON_HOLDTIME) {
#ifdef DEBUG 
showDebug("Entered setup mode!");
#endif

lcd.setCursor(0, 1);
lcd.print(" Setup Mode ");
SETUP_MODE = true;
SETUP_ITEM = 1;
} 
else {
if (SETUP_ITEM == SETUP_MAXITEMS) {
#ifdef DEBUG 
showDebug("Exited setup mode!");
#endif

showLabels();
SETUP_MODE = false;
SETUP_ITEM = 0;
saveConfiguration();
} 
else {
SETUP_ITEM++;
}

showVoltage();
showCURRENT();
}
} 
else if (BUTTON_LAST == PIN_BUTTON_UP) {
#ifdef DEBUG 
showDebug("Released UP");
#endif

if (SETUP_MODE) {
beepButton();

if (SETUP_ITEM==1) { //voltage
VOLTAGE_MAP+=VOLTAGE_STEP;
readVoltage();

#ifdef DEBUG 
startDebug("New VOLTAGE_MAP: ");
Serial.println(VOLTAGE_MAP,6);
#endif
} else if (SETUP_ITEM==2) { //current
CURRENT_MAP+=CURRENT_STEP;
readCurrent();

#ifdef DEBUG 
startDebug("New CURRENT_MAP: ");
Serial.println(CURRENT_MAP,6);
#endif
}
}
} 
else if (BUTTON_LAST == PIN_BUTTON_DOWN) {
#ifdef DEBUG 
showDebug("Released DOWN");
#endif

if (SETUP_MODE) {
beepButton();

if (SETUP_ITEM==1) { //voltage
VOLTAGE_MAP-=VOLTAGE_STEP;
readVoltage();

#ifdef DEBUG 
startDebug("New VOLTAGE_MAP: ");
Serial.println(VOLTAGE_MAP,6);
#endif
} else if (SETUP_ITEM==2) { //current
CURRENT_MAP-=CURRENT_STEP;
readCurrent();

#ifdef DEBUG 
startDebug("New CURRENT_MAP: ");
Serial.println(CURRENT_MAP,6);
#endif
}
}
}

BUTTON_PRESSED = false;
}
}
}

#ifdef DEBUG 
void showDebug(char* Message)
{
Serial.print(millis());
Serial.print(": ");
Serial.println(Message);
}

void startDebug(char* Message)
{
Serial.print(millis());
Serial.print(": ");
Serial.print(Message);
}
#endif

void showLabels()
{
lcd.setCursor(0, 1);
lcd.print("Volts Amps");
}

void showVoltage()
{
lcd.setCursor(0, 0);
lcd.print(VOLTAGE_CALCULATED, 2);
lcd.print(" V");

if (VOLTAGE_CALCULATED<10)
lcd.print(" ");
}

void hideVoltage()
{
lcd.setCursor(0, 0);
lcd.print(" ");
}

void showCURRENT()
{
lcd.setCursor(9, 0);

if (CURRENT_CALCULATED<10)
lcd.print(" ");

lcd.print(CURRENT_CALCULATED, 2);
lcd.print(" A");
}

void hideCURRENT()
{
lcd.setCursor(9, 0);
lcd.print(" ");
}

void beepStart()
{
for (int i=0; i<300; i++) {
digitalWrite(PIN_BUZZER, HIGH);
delayMicroseconds(200);
digitalWrite(PIN_BUZZER, LOW);
delayMicroseconds(200);
} 
}

void beepButton()
{
for (int i=0; i<20; i++) {
digitalWrite(PIN_BUZZER, HIGH);
delayMicroseconds(700);
digitalWrite(PIN_BUZZER, LOW);
delayMicroseconds(700);
} 
}

void readVoltage()
{
VOLTAGE_CURRENT = analogRead(PIN_VOLTAGE);
if ( VOLTAGE_CURRENT != VOLTAGE_LAST || SETUP_MODE ) {
VOLTAGE_LAST = VOLTAGE_CURRENT;
VOLTAGE_CALCULATED = fmap(VOLTAGE_CURRENT, 0, 1023, 0.0, VOLTAGE_MAP);

#ifdef DEBUG 
if (!SETUP_MODE)
{
startDebug("New voltage: ");
Serial.print(VOLTAGE_CALCULATED);
Serial.println("V");
}
#endif
}
}

void readCurrent()
{
CURRENT_CURRENT = analogRead(PIN_CURRENT);
if ( CURRENT_CURRENT != CURRENT_LAST || SETUP_MODE ) {
CURRENT_LAST = CURRENT_CURRENT;
CURRENT_CALCULATED = fmap(CURRENT_CURRENT, 0, 1023, 0.0, CURRENT_MAP);

#ifdef DEBUG
if (!SETUP_MODE)
{
startDebug("New current: ");
Serial.print(CURRENT_CALCULATED);
Serial.println("A");
}
#endif
}
}

float fmap(float x, float in_min, float in_max, float out_min, float out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

int EEPROM_writeConf()
{
byte Address = EEPROM_CONFIGADDRESS;

const byte* p = (const byte*)(const void*)&EEPROM_DATA;
int i;
for (i = 0; i < sizeof(EEPROM_DATA); i++)
EEPROM.write(Address++, *p++);
return i;
}

int EEPROM_readConf()
{
byte Address = EEPROM_CONFIGADDRESS;

byte* p = (byte*)(void*)&EEPROM_DATA;
int i;
for (i = 0; i < sizeof(EEPROM_DATA); i++)
*p++ = EEPROM.read(Address++);
return i;
}

void loadConfiguration()
{
//read data from eeprom
EEPROM_readConf();

//verify validators
if (EEPROM_DATA.Validator == EEPROM_VALIDATOR && EEPROM_DATA.ValidatorX2 == EEPROM_VALIDATOR*2)
{
//copy data
VOLTAGE_MAP = EEPROM_DATA.VOLTAGE_MAP;
CURRENT_MAP = EEPROM_DATA.CURRENT_MAP;

#ifdef DEBUG
showDebug("Configuration loaded from EEPROM!");
startDebug(" VOLTAGE_MAP: ");
Serial.println(VOLTAGE_MAP,6);
startDebug(" CURRENT_MAP: ");
Serial.println(CURRENT_MAP,6);
#endif
} else {
#ifdef DEBUG
showDebug("Configuration NOT loaded from EEPROM!");
#endif 
}
}

void saveConfiguration()
{
if ( EEPROM_DATA.VOLTAGE_MAP != VOLTAGE_MAP ||
EEPROM_DATA.CURRENT_MAP != CURRENT_MAP
) {
//copy validators
EEPROM_DATA.Validator = EEPROM_VALIDATOR;
EEPROM_DATA.ValidatorX2 = EEPROM_VALIDATOR*2;

//copy data
EEPROM_DATA.VOLTAGE_MAP = VOLTAGE_MAP;
EEPROM_DATA.CURRENT_MAP = CURRENT_MAP;

//save data to eeprom
EEPROM_writeConf();

#ifdef DEBUG
showDebug("Configuration saved!");
#endif
} else {
#ifdef DEBUG
showDebug("Configuration not changed!");
#endif 
}
}

Настройка

В основном, требования к запуску проекта «вольтметр на Arduino» на независимой печатной плате – это источник питания 5 В, 16-мегагерцовый кварцевый генератор и, конечно же, связанные выводы микроконтроллера со всеми цифровыми и аналоговыми портами платы Arduino. Диаграмма ниже популярна в Интернете и объясняет, как нужно использовать схему для работы в качестве прототипа.

Высокоточный вольтамперметр на arduino своими руками

Новые компоненты, которые необходимо добавить в прототип для работы на печатной плате:

  • 1 28-контактный паяльник для пайки (для микроконтроллера Atmega);
  • 1 разъем питания для печатной платы;
  • 1 регулятор LM78L05;
  • 1 1uf конденсатор;
  • 1 конденсатор 10футов;
  • 1 кварцевый генератор 16 МГц;

С новыми компонентами и выводом микроконтроллера имеем следующую схему проекта «Ардуино-вольтметр»:

Высокоточный вольтамперметр на arduino своими руками

Еще на просторах Интернета можно найти такую схему вольтметра:

Высокоточный вольтамперметр на arduino своими руками

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

Проверка работоспособности

Для калибровки используются 3 кнопки. Центральная кнопка является конфигурационной и активирует режим калибровки, если нажата в течение 2 секунд, а также подтверждена звуковым сигналом.

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

Как повысить точность измерения

Для повышения точности созданного устройства потребуется провести эксперимент. Первое значение получаем от вольтметра на Ардуино с выводом на ПК, вторую – с помощью необходимой функции. Поменяем константу (1.1 * 1023.0 * 1000) на усовершенствованную:

scales_constants = internal1s.1Refs * 1023 * 1000

Первый множитель означает – 1.1 * Vcc1 (с вольтметром) / Vcc2 (с нашей функцией).

В итоге получаем погрешность. Затем, путем подсчета, выходим на настоящие значение напряжения в электрической сети. Предел измерений показаний на Ардуино устройства варьируется между 0 и 50 Вольтами.

14 апреля 2018 в 23:22
| Обновлено 7 декабря 2019 в 02:16 (редакция)
Опубликовано: Редакция

Уроки, Arduino

Мы больше не будем рекомендовать вам подобный контент.

Отмена

Мы больше не будем рекомендовать вам подобный контент.

Отмена

Мы больше не будем рекомендовать вам подобный контент.

Отмена

Мы больше не будем рекомендовать вам подобный контент.

Отмена

Мы больше не будем рекомендовать вам подобный контент.

Отмена

Мы больше не будем рекомендовать вам подобный контент.

Отмена

Мы больше не будем рекомендовать вам подобный контент.

Отмена

Мы больше не будем рекомендовать вам подобный контент.

Отмена

Мы больше не будем рекомендовать вам подобный контент.

Отмена

Мы больше не будем рекомендовать вам подобный контент.

Отмена

Мы больше не будем рекомендовать вам подобный контент.

Отмена

Мы больше не будем рекомендовать вам подобный контент.

Отмена

Мы больше не будем рекомендовать вам подобный контент.

Отмена

Мы больше не будем рекомендовать вам подобный контент.

Отмена

Мы больше не будем рекомендовать вам подобный контент.

Отмена

Мы больше не будем рекомендовать вам подобный контент.

Отмена

Мы больше не будем рекомендовать вам подобный контент.

Отмена

Мы больше не будем рекомендовать вам подобный контент.

Отмена

Мы больше не будем рекомендовать вам подобный контент.

Отмена

Мы больше не будем рекомендовать вам подобный контент.

Отмена

Мы больше не будем рекомендовать вам подобный контент.

Отмена

Мы больше не будем рекомендовать вам подобный контент.

Отмена

Мы больше не будем рекомендовать вам подобный контент.

Отмена

Мы больше не будем рекомендовать вам подобный контент.

Отмена

Высокоточный вольтамперметр на arduino своими руками


Для одного изготавливаемого тестера, понадобился вольтамперметр. Готового цифрового вольтамперметра в наличии не было, стрелочные – имели неподходящие границы измерения. Пришлось делать вольтамперметр своими руками из того, что оказалось «под рукой».



Для вычислительной части, взял мою любимую arduino pro mini, а для вывода информации – дисплей K0-4B2, который нашелся в давно неиспользуемом стационарном телефоном аппарате.



Чтобы показания вольтметра были максимально реалистичными, необходимо в скетче указать точные сопротивления резисторов R7 и R8. Для реалистичных показаний амперметра, следует указать точное сопротивление шунта R11. Мощность шунт должна быть не менее 3 ватт.


В качестве дисплея, без переделки схемы, можно использовать K0-4B2, H1313/120D, LSD-10, на контроллерах H1313, HT1611, HT1613 и аналогичные.


Скачать разводку платы и скетч вольтамперметра, сделанного своими руками на arduino pro mini и индикаторе K0-4B2, можно ЗДЕСЬ.




Вольтметр в автомобиль — чтобы всегда видеть заряд аккумулятора и работу генератора!Подробнее

Вольтметр в автомобиль - чтобы всегда видеть заряд аккумулятора и работу генератора!

ПОЧЕМУ ОПЫТНЫЕ АВТОМОБИЛИСТЫ НЕ ИСПОЛЬЗУЮТ ВОЛЬТМЕТР В ПРИКУРИВАТЕЛЬПодробнее

ПОЧЕМУ ОПЫТНЫЕ АВТОМОБИЛИСТЫ НЕ ИСПОЛЬЗУЮТ ВОЛЬТМЕТР В ПРИКУРИВАТЕЛЬ

Как сделать цифровой вольтметр своими руками, применение самодельного прибора | #ОбзорПодробнее

Как сделать цифровой вольтметр своими руками, применение самодельного прибора | #Обзор

Графический вольтметр. Осциллограф на Arduino своими рукамиПодробнее

Графический вольтметр. Осциллограф на Arduino своими руками

Самоделка. Как сделать простой вольтметр? Шикарный DIYПодробнее

Самоделка. Как сделать простой вольтметр? Шикарный DIY

Ампер-вольтметр постоянного тока | #ОбзорПодробнее

Ампер-вольтметр постоянного тока | #Обзор

Заряд батареи/ встроенный вольтметр Защита от перенапряжения таймер зарядка/разрядка связьПодробнее

Заряд батареи/ встроенный вольтметр Защита от перенапряжения таймер зарядка/разрядка связь

Высокоточный вольтамперметр на Arduino своими рукамиПодробнее

Высокоточный вольтамперметр на Arduino своими руками

Стрелочный Вольтметр на 220в Своими рукамиПодробнее

Стрелочный Вольтметр на 220в Своими руками

Вольтметр переменного тока — Своими руками — Подключаю к АЦП ArduinoПодробнее

Вольтметр переменного тока - Своими руками - Подключаю к АЦП Arduino

ВОЛЬТМЕТР НА ВАЗ 2114 СВОИМИ РУКАМИ!!! ЭТО ПРОСТО#тюнинг#ваз2114Подробнее

ВОЛЬТМЕТР НА ВАЗ 2114 СВОИМИ РУКАМИ!!! ЭТО ПРОСТО#тюнинг#ваз2114

Скрытые возможности Стрелочного Вольтметра 250 V.Подробнее

Скрытые возможности Стрелочного Вольтметра 250 V.

Старенький SEAT глохнет, Вольтметр — обманщик, Ауди на январе 5.1Подробнее

Старенький SEAT глохнет, Вольтметр - обманщик, Ауди на январе 5.1

Мини вольтметр в милливольтметр, возможно лиПодробнее

Мини вольтметр в милливольтметр, возможно ли

Лабораторный блок питания — СВОИМИ РУКАМИ (ЛБП — мини)Подробнее

Лабораторный блок питания - СВОИМИ РУКАМИ (ЛБП - мини)

Высокоомный вольтметр из советского тестера / СССР тестер переделка в вольтметр 150 МомПодробнее

Высокоомный вольтметр из советского тестера / СССР тестер переделка в вольтметр 150 Мом

Что купил Как подключить амперметр, вольтметр, Гц, 60 500 В переменного тока,Подробнее

Что купил Как подключить амперметр, вольтметр, Гц, 60 500 В переменного тока,

Миниатюрный вольтметр с функцией осциллографа на Atmega 328 и олед дисплее 0.91″Подробнее

Миниатюрный вольтметр с функцией осциллографа на Atmega 328 и олед дисплее 0.91'

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *