Матеріали і засоби
- Плата розробника серії Nucleo (наприклад STM32F103 Nucleo)
- Плата розширення LCD Keypad Shield з дисплеєм LCD WH1602 (HD44780)
- Будь яка контактна макетна плата breadboard (наприклад така)
- Один резистор 1.8 - 2.2 КОм
- Чотири з'єднувальні дроти два такі і два такі
- Засіб розробки "mbed compiler workspace" (знайомство з mbed тут)
Схема
Між землею і виводом А1 поставити резистор на 1.8 - 2 кОм. І вивести дроти на батарейку, або на тримач батарейок, якщо є в наявності, як показано на малюнку.
Схема підключення |
Програма
Програма трішки нагадує програму з попередньої статті "Підключення 1602 LCD Keypad Shield до STM32F103 Nucleo в засобі розробки mbed". В текст програми додано детальні коментарі. Додаткових пояснень не потребує. Константу "const int Vref" треба підібрати відповідно до опорної напруги. Якщо є можливість заміряти напругу 3.3 В на платі розробника точним приладом у мілівольтах - це і буде константа. Як ні, то достатньо приблизно вказати "3330". Все одно це більш іграшка для ознайомлення, чим серйозний прилад.
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 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 | #include "mbed.h" #include "freetronicsLCDShield.h" // Оголошуємо клас freetronicsLCDShield з назвою lcdKeypad, // та вказуємо всі потрібні піни для роботи freetronicsLCDShield lcdKeypad(D8, D9, D4, D5, D6, D7, D3, A0); //Оголошуємо аналоговий вхід для тестування батарейок AnalogIn analog_value(A1); int main() { /* оголошуємо змінну типу float для значень з аналогового входу A0, куди підключений keypad */ float val_button; /* оголошуємо змінну типу float для значень з аналогового входу A1, на якому будемо тестувати батарейки */ float meas; /* Так як значення зчитуємо з АЦП в межах від 0 до 1, то напруга яку можна поміряти 3.3 Вольта це без дільника напруги */ const int Vref = 3393; // опорна напруга в мілівольтах (для точності підбирається) // прапорець - виводити на екран виміряну напругу у вольтах чи мілівольтах bool flag_voltage = false; // прапорець - міряємо батарейку 1.5В або акумулятор 1.2В bool flag_battery = true; lcdKeypad.cls(); // Очищаємо дисплей while(1) { /*Зчитуємо значення на аналоговому вході A0. Так як значення в межах від 0 до 1, то множимо на 1000*/ val_button = lcdKeypad.readButton()*1000; // Зчитуємо значення на аналоговому вході A1. meas = analog_value.read(); if (flag_battery) { // Встановлюємо курсор в позицію 0,0 lcdKeypad.setCursorPosition(0, 0); lcdKeypad.printf("Battery: "); if (meas == 0) { // Якщо значення 0 то нічого не під'єднано lcdKeypad.printf("No Batt"); } if (meas * Vref > 1400) { // Якщо значення більше 1.4В то батарейка в доброму стані lcdKeypad.printf("Perfect"); } else if (meas * Vref < 1400 && meas * Vref > 1100) { // Якщо значення між 1.1В і 1.4В то батарейка середньо розряджена lcdKeypad.printf("Middle "); } else if (meas * Vref < 1100 && meas * Vref > 950) { // Якщо значення між 0.95В і 1.1В то батарейка майже розряджена lcdKeypad.printf("Badly "); } else if (meas * Vref < 950) { // Якщо значення менше 0.95В то батарейка розряджена lcdKeypad.printf("Died "); } // Встановлюємо курсор в позицію 1,0 lcdKeypad.setCursorPosition(1, 0); lcdKeypad.printf("Vbat = "); } else { // Встановлюємо курсор в позицію 0,0 lcdKeypad.setCursorPosition(0, 0); lcdKeypad.printf("Accum : "); if (meas == 0) { // Якщо значення 0 то нічого не під'єднано lcdKeypad.printf("No Acc "); } if (meas * Vref > 1150) { // Якщо значення більше 1.15В то акумулятор в доброму стані lcdKeypad.printf("Perfect"); } else if (meas * Vref < 1150 && meas * Vref > 1100) { // Якщо значення між 1.1В і 1.15В то акумулятор середньо розряджений lcdKeypad.printf("Middle "); } else if (meas * Vref < 1100 && meas * Vref > 1000) { // Якщо значення між 1В і 1.1В то акумулятор майже розряджений lcdKeypad.printf("Badly "); } else if (meas * Vref < 1000) { // Якщо значення менше 1В то акумулятор розряджений lcdKeypad.printf("Died "); } // Встановлюємо курсор в позицію 1,0 lcdKeypad.setCursorPosition(1, 0); lcdKeypad.printf("Vacc = "); } if (flag_voltage) { /*Так як значення meas в межах від 0 до 1, а опорна напруга має 3300 mV то множимо на 3300 mV (для точності треба заміряти точним приладом)*/ meas = meas * Vref; // Друкуємо результат вимірювань lcdKeypad.setCursorPosition(1, 7); lcdKeypad.printf("%.0f mV ", meas); } else { /*Так як значення meas в межах від 0 до 1, а опорна напруга має 3.3 V то множимо на 3.3 V (для точності треба заміряти точним приладом)*/ meas = meas * Vref / 1000; // Друкуємо результат вимірювань lcdKeypad.setCursorPosition(1, 7); lcdKeypad.printf("%.2f V ", meas); } // Перевіряємо яку кнопку натиснуто if (val_button < 50) { // встановлюємо прапорець для тестування батарейок flag_battery = true; } else if (val_button < 250) { // встановлюємо прапорець щоб показувати напругу в мілівольтах flag_voltage = true; } else if (val_button < 500) { // встановлюємо прапорець щоб показувати напругу в вольтах flag_voltage = false; } else if (val_button < 800) { // встановлюємо прапорець для тестування акумуляторів flag_battery = false; } } } |
Тестер батарейок |
Як користуватись
При увімкнені, за замовчуванням, тестуємо батарейки у Вольтах. Кнопка догори "UP" - міряємо у мілівольтах, кнопка вниз "DOWN" - міряємо у Вольтах. Кнопка ліворуч "LEFT" - міряємо акумулятор 1.2В, кнопка праворуч "RIGTH" - батарейку 1.5В. Міряти можна виключно елементи живлення до 3.3 Вольта. Висока напруга може вивести мікроконтролер з ладу.
Немає коментарів:
Дописати коментар