Умный зарядный мультиплексор для 6 батареек на Arduino Uno с LCD и ультразвуковым управлением
Компоненты и материалы
| Название | Количество |
|---|---|
| Arduino UNO | 1 |
| Arduino Proto Shield | 1 |
| ADC MCP3008 (8-канальный, 10 бит, SPI) | 1 |
| Релейный модуль 2-канальный (оптопара) — 3 шт. (6 каналов) | 3 |
| DC-DC понижающий преобразователь LM2596 (3А, регулируемый) | 1 |
| Ультразвуковой датчик HC-SR04 | 1 |
| LCD 16x2 I2C (YWRobot LCM1602 IIC V1, адрес 0x27) | 1 |
| Резисторы 1 кОм (делители напряжения) — 12 шт. | 12 |
| Клеммник 6-позиционный | 1 |
Инструменты
- Паяльник
Как это работает
У автора 5–6 свинцово-кислотных батарей (авто, лодка, генератор). Покупка 5 умных зарядных — дорого. Идея: один «умный» зарядный блок (LM2596, настроенный на 13.8 В) + Arduino-контроллер, который по очереди подключает его к каждой батарее через реле. Каждая батарея заряжается 1 час (настраивается), затем переключение на следующую. Автоопределение подключённых батарей: если на входе ADC > 8 В — батарея в цикле.
Основные функции прошивки
- read_show_volts() — опрашивает 3 канала MCP3008 (можно до 6), обновляет LCD, определяет живые батареи (> min_volts), формирует массив активных реле.
- checkRelays() — таймер (по умолчанию 1 час) переключает заряд на следующую батарею.
- update_display() — чередует экраны: V1/V2, V3/V4, V5/V6, системное питание (5 В) и Vref (3.3 В).
- read_distance() — HC-SR04 выключает подсветку LCD через 100 сек бездействия. Поднесение руки (<80 см) включает подсветку. Длительное наведение руки переключает режим в «демо» (переключение реле каждые несколько секунд для проверки).
Скетч (Arduino)
Использует библиотеки: Wire.h, LiquidCrystal_I2C.h (v1.2.1), timer.h, HCSR04.h.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <timer.h>
#include <HCSR04.h>
auto timer = timer_create_default();
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
int chargeTime = 10 * 1000; // 10 сек для теста, ставьте 3600000 для 1 часа
int charge_time_max = 60; // сколько интервалов chargeTime на одну батарею
int relayPins[] = {3, 4, 5}; // реле 1,2,3 (можно до 6)
int current_relay = 0;
int max_relays = 3;
float volts[3];
int min_volts = 1; // порог «батарея подключена»
int volts_update = 500; // мс между измерениями
int read_distance_update = 500;
int time_on_count = 100; // сек до гашения подсветки
int time_on_counter = 0;
int heart_beat = 0;
UltraSonicDistanceSensor distanceSensor(11, 12); // Trig=11, Echo=12
void all_change_to(int state) {
for (int r : relayPins) digitalWrite(r, state);
}
void toggle_relays(int idx) {
lcd.setCursor(0, 0);
lcd.print("Relay on:"); lcd.print(idx + 1);
all_change_to(HIGH); // HIGH = выключено (реле с оптопарой)
digitalWrite(relayPins[idx], LOW);
}
void checkRelays() {
static int counter = 0;
if (++counter >= charge_time_max) {
counter = 0;
current_relay++;
if (current_relay >= max_relays) current_relay = 0;
toggle_relays(current_relay);
}
}
void read_distance() {
int dist = distanceSensor.measureDistanceCm();
if (dist < 80) {
lcd.backlight();
time_on_counter = 0;
} else if (++time_on_counter > time_on_count) {
lcd.noBacklight();
time_on_counter = 0;
}
}
void read_show_volts() {
// Чтение 3 каналов MCP3008 через аналоговые входы A0-A2 (примерно)
// На деле MCP3008 читается по SPI, здесь упрощённо analogRead для демонстрации
for (int i = 0; i < 3; i++) {
volts[i] = analogRead(i) * 0.016; // калибровка делителя
}
// Вывод на LCD
lcd.setCursor(11, 0); lcd.print(volts[0]);
lcd.setCursor(4, 1); lcd.print(volts[1]);
lcd.setCursor(11, 1); lcd.print(volts[2]);
// Определение активных батарей
int cnt = 0;
for (int i = 0; i < 3; i++) relayPins[i] = 0;
for (int i = 0; i < 3; i++) {
if (volts[i] > min_volts) relayPins[cnt++] = (i==0?3:(i==1?4:5));
}
max_relays = cnt;
// Heartbeat на LCD
lcd.setCursor(0, 1);
lcd.print(heart_beat ? "<>" : "><");
heart_beat ^= 1;
lcd.print(counter);
read_distance();
}
void setup() {
Serial.begin(19200);
lcd.begin(16, 2);
lcd.backlight();
for (int r : relayPins) pinMode(r, OUTPUT);
all_change_to(HIGH);
read_show_volts();
checkRelays();
timer.every(chargeTime, checkRelays);
timer.every(volts_update, read_show_volts);
}
void loop() {
timer.tick();
}
Принципиальная схема
На схеме: LM2596 питает Arduino и зарядный ток. Реле коммутируют выход LM2596 на клеммник батарей. Делители 1к/1к снижают 12В до ~6В для MCP3008 (опорное 5В — нужен дополнительный делитель или замер по референсу). HC-SR04 на D11/D12. LCD I2C на A4/A5.
Производственный процесс
- Умные шторы: автоматическое управление светом на Arduino с солнечной энергией
- Умная копилка: управление монетоприёмником на Arduino Nano
- Монитор температуры и реальные часы на Arduino Due с TFT-дисплеем 3.2"
- Управление светодиодом по Bluetooth с Arduino: простой DIY-гид
- Оптимизированные решения питания для проектов на Arduino
- Интерактивный HMI-проект на Nextion с Arduino Mega и датчиками
- Сборка вольтметра на Arduino с дисплеем Nokia 5110 — Пошаговое руководство
- Учебный стенд Arduino Mega 2560: сенсоры, моторы, дисплеи и собственная PCB
- Создание приложения Fridgeye с дисплеем Nextion: пошаговое руководство
- Измерение солнечной радиации на Arduino UNO с Ethernet Shield