В нашей повседневной жизни достаточно часто возникают ситуации, когда нам необходимо (желательно) измерить уровень заряда интересующей нас батареи. Поэтому в данной статье мы рассмотрим проект простого индикатора заряда батареи на основе платы Arduino, который будет показывать уровень заряда батареи с помощью столбчатой диаграммы на светодиодах, а также высвечивать его на экране ЖК дисплея.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- 10-сегментная столбчатая диаграмма на светодиодах (10 Segment LED Bar Graph) (купить на AliExpress).
- ЖК дисплей 16х2 (купить на AliExpress).
- Потенциометр 10 кОм (купить на AliExpress).
- Резисторы (100 Ом – 10 шт., 330 Ом – 1 шт.) (купить на AliExpress).
- Батарея (которую будем тестировать).
- Соединительные провода.
- Адаптер на 12 В (для питания Arduino).
Работа схемы
Схема рассматриваемого нами индикатора заряда батареи представлена на следующем рисунке.
Столбчатая диаграмма (индикатор) на светодиодах (LED Bar Graph)
Столбчатые индикаторы на светодиодах изготавливаются стандартных промышленных размеров и отличаются низким энергопотреблением. Они классифицируются по интенсивности свечения. Использованный нами индикатор рассчитан на рабочее напряжение до 2,6 В, а рассеяние мощности на один сегмент составляет 65 мВт. Диапазон рабочих температур индикатора: от -40℃ до 80℃. Подобные светодиодные индикаторы находят широкое применение в разнообразных электронных устройствах.
Распиновка подобного индикатора представлена на следующих рисунках.
Объяснение программы для Arduino
Полный текст программы для Arduino приведен в конце статьи, здесь же рассмотрим его основные фрагменты.
Сначала в программе нам необходимо подключить библиотеку для работы с ЖК дисплеем, а также сказать плате Arduino, к каким ее контактам подключен ЖК дисплей. Измеряемая батарейка одним концом подключается к корпусу, а другим – к аналоговому контакту A4 платы Arduino. Мы будем использовать переменную типа Float для хранения значения измеренного на батарейке напряжения чтобы обеспечить точность измерений до двух знаков после запятой.
1 2 3 4 5 6 |
#include <LiquidCrystal.h> const int rs = 12, en = 13, d4 = A0, d5 = A1, d6 = A2, d7 = A3; LiquidCrystal lcd(rs, en, d0, d1, d2, d3); const int analogPin = A4; float analogValue; float input_voltage; |
Для работы со светодиодным индикатором инициализируем массив.
1 2 3 4 |
int ledPins[] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; // номера контактов, к которым подключены светодиоды индикатора int pinCount = 10; // количество задействованных контактов (длина массива) |
Установим режим работы контактов.
1 2 3 4 5 6 7 8 9 10 11 |
void setup() { Serial.begin(9600); // инициализируем последовательный порт для работы на скорости 9600 бод/с lcd.begin(16, 2); // инициализируем ЖК дисплей 16х2 pinMode(A0,OUTPUT); pinMode(A1,OUTPUT); pinMode(A2,OUTPUT); pinMode(A3,OUTPUT); pinMode(A4,INPUT); lcd.print("Voltage Level"); } |
Запрограммируем функцию для работы со светодиодным индикатором. Можно, конечно, включать светодиоды в индикаторе по одному, но тогда код программы станет немного длиннее.
1 2 3 4 5 6 7 8 9 10 11 12 |
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); } } |
В следующем фрагменте программы мы считываем значение напряжения с контакта A4 и конвертируем его в цифровое значение с помощью аналогово-цифрового преобразования (АЦП), и затем отображаем его на экране ЖК дисплея.
1 2 3 4 5 6 7 8 9 10 |
// формула для преобразования напряжения 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); |
Запишем условия для отображения уровня заряда батареи на светодиодном индикаторе:
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
if (input_voltage < 0.50 && input_voltage >= 0.00 ) { digitalWrite(2, HIGH); delay (30); digitalWrite(2, LOW); delay (30); // когда напряжение равно нулю или близко к нулю 1-й светодиод индикатора будет мигать } 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); } } |
Работа проекта
Принцип работы нашего индикатора заряда батареи достаточно прост. Напряжение с выхода батареи считывается аналоговым контактом A4 платы Arduino и конвертируется в цифровое значение с помощью АЦП. Разрешение АЦП платы Arduino составляет 10 бит, поэтому на его выходе диапазон возможных значений составляет от 0 до 1023. То есть чтобы получить цифровое значение входного напряжения, мы значение с выхода АЦП должны умножить на (5/1024). Более подробно об АЦП в Arduino можно прочитать в этой статье. Затем это цифровое значение напряжения используется для того, чтобы зажечь соответствующие светодиоды в составе светодиодного индикатора.
Исходный код программы
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
#include <LiquidCrystal.h> const int rs = 12, en = 13, d0 = A0, d1 = A1, d2 = A2, d3 = A3; LiquidCrystal lcd(rs, en, d0, d1, d2, d3); const int analogPin = A4; float analogValue; float input_voltage; int ledPins[] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; // номера контактов, к которым подключены светодиоды индикатора int pinCount = 10; // количество задействованных контактов (длина массива) void setup() { Serial.begin(9600); // инициализируем последовательный порт для работы на скорости 9600 бод/с lcd.begin(16, 2); // инициализируем ЖК дисплей 16х2 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() { // формула для преобразования напряжения 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); // когда напряжение равно нулю или близко к нулю 1-й светодиод индикатора будет мигать } 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); } } |