224   221     15   57    
19.07.2019   Уроки   Теги статьи #, #

Мониторинг уровня заряда аккумулятора с помощью Arduino

Следите за уровнем заряда батареи с помощью этого простого устройства, отслеживающего заряд на базе платы Arduino. Этот урок научит вас создавать индикатор напряжения на основе Arduino. Индикатор показывает состояние батареи, загораясь светодиодами на светодиодной гистограмме в зависимости от показаний напряжения батареи. Но если у вас нет светодиодной гистограммы, вы всегда можете использовать обычные светодиоды, как те, что мы использовали в этом проекте.

Почему важен мониторинг уровня заряда батареи

Был ли у вас опыт создания устройства с питанием от батарей, когда в какой-то момент вдруг оно перестает работать, потому что его нужно зарядить?

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

Комплектующие

  • Arduino Uno
  • 16 x 2 LCD Дисплей
  • Светодиодная гистограмма / 10 светодиодных ламп
  • Arduino IDE
  • 4 x 1.2В Батареи
  • Держатель батарей

Что такое светодиодная гистограмма?

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

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

Как этот проект измеряет уровень заряда батареи?

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

Значения, которые мы конвертируем, будут отображаться на светодиодной гистограмме, где они могут проецировать силу. Таким образом, если все десять светодиодов горят, аккумулятор полностью заряжен. Если горят только пять светодиодов, то аккумулятор наполовину заряжен (или разряжен - для пессимистов).

АЦП Arduino Uno имеет 10-битное разрешение. АЦП преобразует входные напряжения от 0 до 5 вольт в целочисленные значения от 0 до 1023. Поэтому, если мы умножим входное аналоговое значение на (5/1024), то получим цифровое значение входного напряжения.

Схема соединений

Ниже приведена схема сборки нашего устройства мониторинга уровня заряда батареи на основе Ардуино.

В собранном виде всё может выглядеть примерно так:

Код проекта

Во-первых, нам нужно определить библиотеку LCD и указать контакты, которые мы собираемся использовать с Arduino. Мы назначили аналоговый контакт A4 в качестве аналогового контакта для проверки напряжения аккумулятора. Значения задаются с плавающей запятой, поэтому мы можем получить значения напряжения с точностью до двух десятичных разрядов.

#include <LiquidCrystal.h>
const int rs = 12, en = 13, d0 = A0, d1 = A1, d2 = A2, d3 = A3;
const int analogPin = A4;
LiquidCrystal lcd(rs, en, d0, d1, d2, d3);
float analogValue;
float input_voltage;

Затем мы создаем массив для назначения выводов на светодиодную гистограмму. Массив номеров выводов, к которым прикреплены светодиоды.

int ledPins[] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; // The LEDs attach to this array of pin numbers
int pinCount = 10;           // the number of pins

Мы настроили ЖК-дисплей и аналоговые контакты как выходные контакты.

void setup()
{
   Serial.begin(9600);     //  opens serial port, sets data rate to 9600 bps
   lcd.begin(16, 2);       //// set up the LCD's number of columns and rows: 
   pinMode(A0,OUTPUT);
   pinMode(A1,OUTPUT);
   pinMode(A2,OUTPUT);
   pinMode(A3,OUTPUT);
   pinMode(A4,INPUT);
   lcd.print("Voltage Level");
}

Далее мы создаем функцию LED_function для использования гистограммы светодиодов.

void LED_function(int stage)
{
    for (int j=2; j<=11; j++)
    {
    digitalWrite(j,LOW);
    }
    for (int i=1, l=2; i<=stage; i++,l++)
    {
    digitalWrite(l,HIGH);    //delay(30);
    }
}

Когда у нас есть функция, нам нужен способ для преобразования аналоговых значений в цифровые значения напряжения. Используя встроенный аналого-цифровой преобразователь Arduino и формулу преобразования АЦП, мы сможем легко преобразовать значения. Мы также хотим отобразить эти преобразованные значения на нашем ЖК-дисплее.

//  Conversion formula for voltage
  analogValue = analogRead (A4);
  Serial.println(analogValue);
  delay (1000); 
  input_voltage = (analogValue * 5.0) / 1024.0;
  lcd.setCursor(0, 1);
  lcd.print("Voltage= ");
  lcd.print(input_voltage);
  Serial.println(input_voltage);
  delay(100);

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

if (input_voltage < 0.50 && input_voltage >= 0.00 )
    {
    digitalWrite(2, HIGH);
    delay (30);
    digitalWrite(2, LOW);
    delay (30);
    }
  else if (input_voltage < 1.00 && input_voltage >= 0.50)
    {
    LED_function(2);
    }
  else if (input_voltage < 1.50 && input_voltage >= 1.00)
    {
    LED_function(3);
    }
  else if (input_voltage < 2.00 && input_voltage >= 1.50)
    {
    LED_function(4);
    }
  else if (input_voltage < 2.50 && input_voltage >= 2.00)
    {
    LED_function(5);
    }
  else if (input_voltage < 3.00 && input_voltage >= 2.50)
    {
    LED_function(6);
    }
  else if (input_voltage < 3.50 && input_voltage >= 3.00)
    {
    LED_function(7);
    }
  else if (input_voltage < 4.00 && input_voltage >= 3.50)
    {
    LED_function(8);
    }
  else if (input_voltage < 4.50 && input_voltage >= 4.00)
    {
    LED_function(9);
    }
  else if (input_voltage < 5.00 && input_voltage >= 4.50)
    {
    LED_function(10);
    }

На изображении ниже вы можете видеть, что почти полностью заряженная батарея показывает примерно 3,84 В.

Вы можете скачать или скопировать код целиком ниже:

#include <LiquidCrystal.h>

const int rs = 12, en = 13, d0 = A0, d1 = A1, d2 = A2, d3 = A3;
const int analogPin = A4;
LiquidCrystal lcd(rs, en, d0, d1, d2, d3);
float analogValue;
float input_voltage;

int ledPins[] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; // an array of pin numbers to which LEDs are attached
int pinCount = 10;           // the number of pins (i.e. the length of the array)

void setup()
{
   Serial.begin(9600);     //  opens serial port, sets data rate to 9600 bps
   lcd.begin(16, 2);       //// set up the LCD's number of columns and rows: 
   pinMode(A0,OUTPUT);
   pinMode(A1,OUTPUT);
   pinMode(A2,OUTPUT);
   pinMode(A3,OUTPUT);
   pinMode(A4,INPUT);
   lcd.print("Voltage Level");
}

void LED_function(int stage)
{
    for (int j=2; j<=11; j++)
    {
    digitalWrite(j,LOW);
    }
    for (int i=1, l=2; i<=stage; i++,l++)
    {
    digitalWrite(l,HIGH);    //delay(30);
    }
   
}
void loop()
{
//  Conversion formula for voltage
  analogValue = analogRead (A4);
  Serial.println(analogValue);
  delay (1000); 
  input_voltage = (analogValue * 5.0) / 1024.0;
  lcd.setCursor(0, 1);
  lcd.print("Voltage= ");
  lcd.print(input_voltage);
  Serial.println(input_voltage);
  delay(100);

  if (input_voltage < 0.50 && input_voltage >= 0.00 )
    {
    digitalWrite(2, HIGH);
    delay (30);
    digitalWrite(2, LOW);
    delay (30);
    }
  else if (input_voltage < 1.00 && input_voltage >= 0.50)
    {
    LED_function(2);
    }
  else if (input_voltage < 1.50 && input_voltage >= 1.00)
    {
    LED_function(3);
    }
  else if (input_voltage < 2.00 && input_voltage >= 1.50)
    {
    LED_function(4);
    }
  else if (input_voltage < 2.50 && input_voltage >= 2.00)
    {
    LED_function(5);
    }
  else if (input_voltage < 3.00 && input_voltage >= 2.50)
    {
    LED_function(6);
    }
  else if (input_voltage < 3.50 && input_voltage >= 3.00)
    {
    LED_function(7);
    }
  else if (input_voltage < 4.00 && input_voltage >= 3.50)
    {
    LED_function(8);
    }
  else if (input_voltage < 4.50 && input_voltage >= 4.00)
    {
    LED_function(9);
    }
  else if (input_voltage < 5.00 && input_voltage >= 4.50)
    {
    LED_function(10);
    }
}

На этом всё. Теперь вам не нужно беспокоиться о том, что ваши батареи неожиданно разрядились. Надеемся, что этот урок поможет вам в вашем следующем проекте с питанием от батарей или аккумуляторов.

Ардуино+