В нашей повседневной жизни достаточно часто возникают ситуации, когда нам необходимо (желательно) измерить уровень заряда интересующей нас батареи. Поэтому в данной статье мы рассмотрим проект простого индикатора заряда батареи на основе платы Arduino, который будет показывать уровень заряда батареи с помощью столбчатой диаграммы на светодиодах, а также высвечивать его на экране ЖК дисплея.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- 10-сегментная столбчатая диаграмма на светодиодах (10 Segment LED Bar Graph) (купить на AliExpress).
- ЖК дисплей 16х2 (купить на AliExpress).
- Потенциометр 10 кОм (купить на AliExpress).
- Резисторы (100 Ом – 10 шт., 330 Ом – 1 шт.) (купить на AliExpress).
- Батарея (которую будем тестировать).
- Соединительные провода.
- Адаптер на 12 В (для питания Arduino).
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Работа схемы
Схема рассматриваемого нами индикатора заряда батареи представлена на следующем рисунке.
Столбчатая диаграмма (индикатор) на светодиодах (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); } } |