Создать вольтметр на ардуино своими руками

Цепь заряда

Для данного зарядного устройства основой является схема для управления источником питания с помощью Arduino. Схема питается от источника напряжения 5 вольт, например, от адаптера переменного тока или компьютерного блока питания. Большинство USB портов не подходит для данного проекта из-за ограничений по току. Источник 5В заряжает батарею через мощный резистор 10 Ом и мощный MOSFET транзистор. MOSFET транзистор устанавливает величину тока, протекающего через батарею. Резистор добавлен как простой способ контроля тока. Контроль величины тока выполняется подключением каждого вывода резистора к аналоговым входным выводам Arduino и измерением напряжения с каждой стороны. MOSFET транзистор управляется выходным ШИМ выводом Arduino. Импульсы сигнала широтно-импульсной модуляции сглаживаются до постоянного напряжения фильтром на резисторе 1 МОм и конденсаторе 1 мкФ. Данная схема позволяет Arduino отслеживать и управлять током, протекающим через батарею.

Мотивация

Есть, по крайней
мере, две причины
для измерения
напряжения, питающего
наш
Arduino
(Vcc). Одним из них является наш проект, питающийся от батареи, если мы хотим следить за уровнем напряжения батареи. Кроме того, когда питание от батареи (Vcc) не может быть 5,0 вольт(например питание от 3-х элементов 1.5 В), а мы хотим сделать аналоговые измерения более точными — мы должны использовать либо внутренний источник опорного напряжения 1,1 В либо внешний источник опорного напряжения. Почему?

Обычно предполагают при использовании analogRead () то, что аналоговое напряжение питания контроллера составляет 5.0 вольт, когда в действительности это может быть совсем не так(например питание от 3-х элементов 1.5 В). Официальная документация Arduino даже может привести нас к этому неправильному предположению. Дело в том, что питание не обязательно 5,0 вольт, независимо от текущего уровня это питание подано на Vcc чипа. Если наше питание не стабилизировано или если мы работаем от аккумулятора, это напряжение может меняться совсем немного. Вот пример кода, иллюстрирующий эту проблему:

Double Vcc = 5.0; // не обязательно правда
int value = analogRead(0); / читаем показания с А0
double volt = (value / 1023.0) * Vcc; // верно только если Vcc = 5.0 вольт
Для того чтобы измерить напряжение точно, необходимо точное опорное напряжение. Большинство чипов AVR обеспечивает три источника опорного напряжения:

1,1 в от внутреннего источника, в документации он проходит как bandgap reference (некоторые из них 2,56 В, например ATMega 2560). Выбор осуществляется функцией analogReference() с параметром INTERNAL : analogReference(INTERNAL) ;

внешний источник опорного наптяжения, на ардуинке подписан AREF. Выбор: analogReference(EXTERNAL);

Vcc — источник питания самого контроллера. Выбор: analogReference(DEFAULT).

В Arduino нельзя просто взять и подключить Vcc к аналоговому пину напрямую — по умолчанию AREF связан с Vcc и вы всегда будете получать максимальное значение 1023, от какого бы напряжения вы не питались. Спасает подключение к AREF источника напряжения с заранее известным, стабильным напряжением, но это — лишний элемент в схеме.

Еще можно соединить Vcc с AREF через диод
: падение напряжение на диоде заранее известно, поэтому вычислить Vcc не составит труда. Однако, при такой схеме через диод постоянно протекает ток
, сокращая жизнь батареи, что тоже не очень удачно.

Источник внешнего опорного напряжения является наиболее точным, но требует дополнительных аппаратных средств. Внутренний ИОН стабильным, но не точен + / — 10% отклонение. Vcc является абсолютно ненадежен в большинстве случаев. Выбор внутреннего источника опорного напряжения является недорогим и стабильным, но большую часть времени, мы хотели бы измеряет большее напряжение чем 1.1 В, так что использование Vcc является наиболее практичным, но потенциально наименее точным. В некоторых случаях оно может быть очень ненадежным!

Исходный код программы

Полный код программы приведен в конце статьи, здесь же сначала рассмотрим его наиболее важные фрагменты.

В программе мы должны сообщить плате Arduino, к каким ее контактам подключен ЖК дисплей. Контакт RS ЖК дисплея подключен к цифровому контакту 2 платы Arduino, а контакт Enable – к цифровому контакту 3 платы Arduino. Контакты данных ЖК дисплея (D4-D7) подключены к цифровым контактам 4,5,6,7 платы Arduino.

Arduino

LiquidCrystal lcd(2,3,4,5,6,7); //rs,e,d4,d5,d6,d7

1 LiquidCrystallcd(2,3,4,5,6,7);//rs,e,d4,d5,d6,d7

Затем в программе мы должны инициализировать необходимые нам переменные.

Arduino

int Vin=5; //напряжение на контакте 5V платы arduino
float Vout=0; //напряжение на контакте A0 платы arduino
float R1=3300; //значение сопротивления известного резистора
float R2=0; // значение сопротивления неизвестного резистора

1
2
3
4

intVin=5;//напряжение на контакте 5V платы arduino

floatVout=;//напряжение на контакте A0 платы arduino

floatR1=3300;//значение сопротивления известного резистора

floatR2=;// значение сопротивления неизвестного резистора

Далее в программе мы должны инициализировать наш ЖК дисплей.

Arduino

lcd.begin(16,2);

1 lcd.begin(16,2);

Затем мы должны считать значение на выходе АЦП контакта A0.

Далее значение с выхода АЦП (оно в диапазоне от 0 до 1023) конвертируется в значение напряжения.

Arduino

buffer=a2d_data*Vin;
Vout=(buffer)/1024.0;

1
2

buffer=a2d_data*Vin;

Vout=(buffer)1024.0;

Далее в коде программе исходя из найденного значения напряжения мы рассчитываем значение сопротивления R2.

Arduino

buffer=Vout/(Vin-Vout);
R2=R1*buffer;

1
2

buffer=Vout(Vin-Vout);

R2=R1*buffer;

Далее найденное значение сопротивления резистора R2 выводится на экран ЖК дисплея.

Arduino

lcd.setCursor(4,0);
lcd.print(«ohm meter»);
lcd.setCursor(0,1);
lcd.print(«R (ohm) = «);
lcd.print(R2);

1
2
3
4
5

lcd.setCursor(4,);

lcd.print(«ohm meter»);

lcd.setCursor(,1);

lcd.print(«R (ohm) = «);

lcd.print(R2);

Если вас заинтересовал данный проект, то вы можете следующие похожие проекты на нашем сайте:
— цифровой вольтметр на Arduino;
— цифровой амперметр на Arduino;
— частотомер на Arduino;
— измеритель емкости на Arduino.

Далее приведен полный код программы.

Arduino

#include<LiquidCrystal.h>
LiquidCrystal lcd(2,3,4,5,6,7); //rs,e,d4,d5,d6,d7
int Vin=5; //напряжение на контакте 5V платы arduino
float Vout=0; //напряжение на контакте A0 платы arduino
float R1=3300; //значение сопротивления известного резистора
float R2=0; // значение сопротивления неизвестного резистора
int a2d_data=0;
float buffer=0;
void setup()
{
lcd.begin(16,2);
}
void loop()
{
a2d_data=analogRead(A0);
if(a2d_data)
{
buffer=a2d_data*Vin;
Vout=(buffer)/1024.0;
buffer=Vout/(Vin-Vout);
R2=R1*buffer;
lcd.setCursor(4,0);
lcd.print(«ohm meter»);
lcd.setCursor(0,1);
lcd.print(«R (ohm) = «);
lcd.print(R2);

delay(1000);
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

#include<LiquidCrystal.h>

LiquidCrystallcd(2,3,4,5,6,7);//rs,e,d4,d5,d6,d7

intVin=5;//напряжение на контакте 5V платы arduino

floatVout=;//напряжение на контакте A0 платы arduino

floatR1=3300;//значение сопротивления известного резистора

floatR2=;// значение сопротивления неизвестного резистора

inta2d_data=;

floatbuffer=;

voidsetup()

{

lcd.begin(16,2);

}

voidloop()

{

a2d_data=analogRead(A0);

if(a2d_data)

{

buffer=a2d_data*Vin;

Vout=(buffer)1024.0;

buffer=Vout(Vin-Vout);

R2=R1*buffer;

lcd.setCursor(4,);

lcd.print(«ohm meter»);

lcd.setCursor(,1);

lcd.print(«R (ohm) = «);

lcd.print(R2);

delay(1000);

}

}

Шаг 5. Скетч для Ардуино

Вы можете взять код или скачать его ниже:

#include "U8glib.h"  //Library for display 
#define MOSFET_Pin 2
#define Bat_Pin A0
#define Res_Pin A1

U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE);  // I2C interface for OLED  
float Capacity = 0.0; 
float Res_Value = 10.0;  
float Vcc = 4.410; //Measure it and change  
float Current = 0.0; 
float mA=0;         
float Bat_Volt = 0.0;  
float Res_Volt = 0.0;  
unsigned long previousMillis = 0; 
unsigned long millisPassed = 0;  
float sample1 =0.000;
float sample2= 0.000;
int x = 0;
int row = 0;

void draw(void) {
   u8g.setFont(u8g_font_fub14r); 
   if ( Bat_Volt < 1){
    u8g.setPrintPos(10,40);      
    u8g.println("No Battrey"); 
   }
   else if ( Bat_Volt > 4.3){
    u8g.setPrintPos(3,40);       
    u8g.println("High Voltage"); 
   }
   else if(Bat_Volt < 2.9){
    u8g.setPrintPos(3,40);      
    u8g.println("Low Voltage"); 
   }
   else if(Bat_Volt >= 2.9 && Bat_Volt < 4.3  ){
      
   u8g.drawStr(0, 20, "V: ");  
   u8g.drawStr(0, 40, "I: ");
   u8g.drawStr(0, 60, "mAh: ");
   u8g.setPrintPos(58,20);       
   u8g.print( Bat_Volt,2);  
   u8g.println("V"); 
   u8g.setPrintPos(58,40);        
   u8g.print( mA,0);  
   u8g.println("mA"); 
   u8g.setPrintPos(58, 60);       
   u8g.print( Capacity ,1);    
  
}
}
  void buz()
  {
  digitalWrite(9, HIGH);
  delay(100);          
  digitalWrite(9, LOW);  
  delay(10);            

}   
  void setup() {
   Serial.begin(9600);
   pinMode(A4,INPUT_PULLUP);
   pinMode(A5, INPUT_PULLUP);
   pinMode(MOSFET_Pin, OUTPUT);
   pinMode(9, OUTPUT);
   digitalWrite(MOSFET_Pin, LOW); 
  }
  
  void loop() {
  
  for(int i=0;i< 100;i++)
  {
   sample1=sample1+analogRead(Bat_Pin);
   delay (2);
  }
  sample1=sample1/100; 
  Bat_Volt = 2* sample1 *Vcc/ 1024.0; 

   for(int i=0;i< 100;i++)
  {
   sample2=sample2+analogRead(Res_Pin); 
   delay (2);
  }
  sample2=sample2/100;
  Res_Volt = 2* sample2 * Vcc/ 1024.0;
  
  if ( Bat_Volt > 4.3){
    digitalWrite(MOSFET_Pin, LOW); 
    buz();
    Serial.println( "Warning High-V! ");
    delay(1000);
   }
   
   else if(Bat_Volt < 2.9){
      digitalWrite(MOSFET_Pin, LOW);
      buz();
      Serial.println( "Warning Low-V! ");
      delay(1000);
  }
  else if(Bat_Volt > 2.9 && Bat_Volt < 4.3  ) { 
      digitalWrite(MOSFET_Pin, HIGH);
      millisPassed = millis() - previousMillis;
      Current = (Bat_Volt - Res_Volt) / Res_Value;
      mA = Current * 1000.0 ;
      Capacity = Capacity + mA * (millisPassed / 3600000.0);
      previousMillis = millis();
      row++;
      x++;
      delay(100); 
 
     }

  u8g.firstPage();  
  do {
    draw();
  } while( u8g.nextPage() );
  
 }

Вольтметр и тахометр для автомобиля на основе Arduino UNO

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

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

Здесь приводится описание очень несложного в изготовлении, благодаря применению готового модуля — ARDUINO UNO, прибора, который одновременно показывает и напряжение и частоту вращения коленвала. Причем, показывает это он на очень четком, подсвечиваемом ЖК-дисплее, который очень хорошо виден как днем, так и ночью. Следует заметить, что и себестоимость данного прибора относительно невысока, если покупать ARDUINO UNO и дисплей на радиорынке или на Aliexpress.

ЖК дисплей 16×2

ЖК дисплей 16×2 является одним из самых распространённых дисплеев для приложений встраиваемой электроники. У этого дисплея есть 2 важных регистра – регистр команд и регистр данных. Регистр команд используется для передачи команд, таких, к примеру, как очистить экран, вернуть курсор в исходное положение и т.п. Регистр данных используется для передачи данных которые будут отображаться на экране дисплея. В следующей таблице представлено назначение контактов (распиновка) ЖК дисплея 16×2.

Контакт Символ I/O (ввод/вывод) Описание
1 Vss земля
2 Vdd +5V (питающее напряжение)
3 Vee питание для управления контрастностью
4 RS I RS=0 — регистр команд, RS=1 -регистр данных
5 RW I R/W=0 — запись , R/W=1 — чтение
6 E I/O Enable (доступен)
7 D0 I/O 8-битная шина данных
8 D1 I/O 8-битная шина данных
9 D2 I/O 8-битная шина данных
10 D3 I/O 8-битная шина данных
11 D4 I/O 8-битная шина данных
12 D5 I/O 8-битная шина данных
13 D6 I/O 8-битная шина данных
14 D7 I/O 8-битная шина данных
15 A +5V для подсветки дисплея
16 K земля

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

#include < LiquidCrystal.h>

const int analogIn = A0;
LiquidCrystal lcd(4, 6, 10, 11, 12, 13);
float val = 0;

void setup()
{
  Serial.begin(9600);
  lcd.begin(16, 2);
  lcd.print("Voltage Value:");
}

void loop()
{
  val = analogRead(A0);
  val = val/1024*5.0;
  Serial.print(val);
  Serial.print("V");
 
  lcd.setCursor(6,1);
  lcd.print(val);
  lcd.print("V");
  delay(200);
}

Новые статьи

  • Управление погружным насосом на Arduino — 18/06/2019 17:07
  • Arduino и датчик ультразвука. Определение расстояния до объекта. — 12/04/2019 14:52

Предыдущие статьи

  • Подключаем терморезистор к arduino, получим температуру в градусах по Цельсию и по Фаренгейту — 23/02/2019 20:51
  • Как подключить дисплей LCD1602 к Arduino — 23/02/2019 19:35
  • Как подключить сервомотор к Arduino — 23/02/2019 19:12
  • Подключение RGB светодиода к Arduino — 12/01/2019 15:25
  • Фоторезистор и светодиоды на Arduino — 12/01/2019 11:38
  • Играем ноты на пищалке с Arduino — 12/01/2019 10:34
  • Вынос мозга!!! АЦКИЙ BUZZER — омерзительная пищалка на Arduino Uno — 12/01/2019 09:55
  • Новогодняя мини гирлянда в Arduino UNO. Как сделать мини гирлянду в Arduino UNO на светодиодах. — 12/01/2019 08:40
  • Скетч — выключатель, светодиод и кнопка в Arduino UNO — 12/01/2019 08:15
  • Включение светодиода через кнопку в Arduino UNO — 16/12/2018 04:55
  • Управление светодиодом в Arduino UNO — 14/12/2018 18:24
  • Установка среды разработки для Arduino UNO и пример программы — 14/12/2018 17:49

Принципиальная схема

Используя универсальный микроконтроллерный модуль ARDUINO UNO и двухстрочный ЖК-дисплей типа 1602А (на основе контроллера HD44780) можно легко сделать такой прибор. В одной строке он будет показывать напряжение U1, в другой — напряжение U2.

Рис. 1. Принципиальная схема двойного вольтметра с дисплеем 1602A на Arduino UNO.

Но, прежде всего, хочу напомнить, что ARDUINO UNO это относительно недорогой готовый модуль, — небольшая печатная плата, на которой расположен микроконтроллер ATMEGA328, а так же вся его «обвязка», необходимая для его работы, включая USB-программатор и источник питания.

Тем, кто незнаком с ARDUINO UNO, советую сначала ознакомиться со статьями Л.1 и Л.2. Схема двойного вольтметра показана на рис. 1. Он предназначен для измерения двух напряжений от 0 до 100V (практически, до 90V).

Как видно из схемы, к цифровым портам D2-D7 платы ARDUINO UNO подключен модуль жидкокристаллического индикатора Н1 типа 1602А. Питается ЖК-индикатор от стабилизатора напряжения 5V, имеющегося на плате стабилизатора напряжения 5V.

Измеряемые напряжения поступают на два аналоговых входа А1 и А2. Всего аналоговых входов шесть, — А0-А5, можно было выбрать любые два из них. В данном случае, выбраны А1 и А2. Напряжение на аналоговых портах может быть только положительным и только в пределах от нуля до напряжения питания микроконтроллера, то есть, номинально, до 5V.

Выход аналогового порта преобразуется АЦП микроконтроллера в цифровую форму. Для получения результата в единицах вольт, нужно его умножить на 5 (на опорное напряжение, то есть, на напряжение питания микроконтроллера) и разделить на 1024.

Для того чтобы можно было измерять напряжение более 5V, вернее, более напряжения питания микроконтроллера, потому что реальное напряжение на выходе 5-вольтового стабилизатора на плате ARDUINO UNO может отличаться от 5V, и обычно немного ниже, нужно на входе применить обычные резистивные делители. Здесь это делители напряжения на резисторах R1, R3 и R2, R4.

При этом, для приведения показаний прибора к реальному значению входного напряжения, нужно в программе задать деление результата измерения на коэффициент деления резистивного делителя. А коэффициент деления, обозначим его «К», можно вычислить по такой формуле:

К = R3 / (R1+R3) или К = R4 / (R2+R4),

соответственно для разных входов двойного вольтметра.

Очень любопытно то, что резисторы в делителях совсем не обязательно должны быть высокоточными. Можно взять обычные резисторы, затем измерить их фактическое сопротивление точным омметром, и уже в формулу подставить эти измеренные значения. Получится значение «К» для конкретного делителя, которое и нужно будет подставлять в формулу.

Повышаем точность

Пока большие допуски внутреннего источника питания 1.1 В. значительно ограничивают точность измерений при использовании в серийном производстве, для индивидуальных проэктов мы можем добиться большей точности. Сделать это просто, просто измерив Vcc с помощью вольтметра и нашей функции readVcc(). Далее заменяем константу 1125300L новой переменной:

scale_constant = internal1.1Ref * 1023 * 1000

internal1.1Ref = 1.1 * Vcc1 (показания_вольтметра) / Vcc2 (показания_функции_readVcc())

Это калиброванное значение будет хорошим показателем для измерений AVR чипом, но может зависеть от изменений температуры. Не стесняйтесь экспериментировать с вашим собственным измерениям.

Вывод

С этой маленькой функцией можно сделать многее. Вы можете использовать стабильное опорное напряжение близкое к 5.0 В не имея на самом деле 5.0 В на Vcc. Вы можете измерять напряжение вашей батареи или даже увидеть на каком вы питание от батареи или от стационарного источника питания.

И наконец, код будет поддерживать все Arduino, включая новый Leonardo, а также чипы ATtinyX4 и ATtinyX5 серий.

Привет, Хабр! Сегодня хочу продолжить тему «скрещивания» arduino и android. В предыдущей публикации я рассказал про bluetooth машинку , а сегодня речь пойдет про DIY bluetooth вольтметр. Еще такой девайс можно назвать смарт вольтметр, «умный» вольтметр или просто умный вольтметр, без кавычек. Последнее название является неправильным с точки зрения грамматики русского языка, тем не менее частенько встречается в СМИ. Голосование на эту тему будет в конце статьи, а начать предлагаю с демонстрации работы устройства, чтобы понять о чем же пойдет речь в статье.

Скетч

int analogInput = A0;
float val = 0.0;
float voltage = 0.0;
float R1 = 100000.0; //Battery Vin-> 100K -> A0
float R2 = 10000.0; //Battery Gnd -> Arduino Gnd and Arduino Gnd -> 10K -> A0
int value = 0;

Void setup() {
Serial.begin(9600);
pinMode(analogInput, INPUT);
}

Void loop() {
value = analogRead(analogInput);
val = (value * 4.7) / 1024.0;
voltage = val / (R2/(R1+R2));
Serial.println(voltage);
delay(500);
}

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

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

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

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

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

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

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

Bluetooth вольтметр на базе arduino

Привет! Сегодня хочу продолжить тему «скрещивания» arduino и android. В предыдущей публикации я рассказал про bluetooth машинку, а сегодня речь пойдет про DIY bluetooth вольтметр. Еще такой девайс можно назвать смарт вольтметр, «умный» вольтметр или просто умный вольтметр, без кавычек.

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

Disclaimer: статья рассчитана на среднестатистического любителя arduino, который обычно не знаком с программированием под android, поэтому как и в прошлой статье, приложение для смартфона мы будем делать, используя среду визуальной разработки android-приложений App Inventor 2.

Чтобы сделать DIY bluetooth вольтметр нам нужно написать две относительно независимых друг от друга программы: скетч для ардуино и приложение для андроид.Пожалуй начнем со скетча.

Здесь достаточно одной-двух строк кода, а напряжение подается напрямую на пин А0: int value = analogRead(0);// читаем показания с А0 voltage = (value / 1023.0) * 5; // верно только если Vcc = 5.0 вольт Второй случай: для измерения напряжения более 5 вольт используется делитель напряжения. Схема очень простая, код тоже.

Скетчint analogInput = A0; float val = 0.0; float voltage = 0.0; float R1 = 100000.0; //Battery Vin-> 100K -> A0 float R2 = 10000.0; //Battery Gnd -> Arduino Gnd and Arduino Gnd -> 10K -> A0

int value = 0;

void setup() { Serial.begin(9600); pinMode(analogInput, INPUT);

}

void loop() { value = analogRead(analogInput); val = (value * 4.7) / 1024.0; voltage = val / (R2/(R1+R2)); Serial.println(voltage); delay(500);

}

Третий случай. Когда нужно получить более точные о напряжении в качестве опорного напряжения нужно использовать не напряжение питания, которое может немного меняться при питании от акб, например, а напряжение внутренного стабилизатора ардуино 1.1 вольт.Тут схема такая же, но код чуть длиннее.

Приложение будем делать прямо из браузера в среде визуальной разработки android-приложений App Inventor 2. Заходим на сайт appinventor.mit.

edu/explore/, авторизуемся с помощью гугл-аккаунта, нажимаем кнопку create, new project, и путем простого перетаскивания элементов создаем примерно такой дизайн:Я сделал графику очень простой, если кому-то захочется более интересной графики, напомню, что для этого нужно использовать вместо .jpeg файлов, файлы формата .png с прозрачным фоном. Теперь переходим во вкладку Blocks и создаем там логику работы приложения примерно так:

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

Итак к этому момент у нас есть вольтметр постоянного напряжения с пределом 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в. Резистор обозначен пунктиром.