Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Умный зарядный мультиплексор для 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 В — батарея в цикле.

Основные функции прошивки

Скетч (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();
}

Принципиальная схема

Умный зарядный мультиплексор для 6 батареек на Arduino Uno с LCD и ультразвуковым управлением

На схеме: LM2596 питает Arduino и зарядный ток. Реле коммутируют выход LM2596 на клеммник батарей. Делители 1к/1к снижают 12В до ~6В для MCP3008 (опорное 5В — нужен дополнительный делитель или замер по референсу). HC-SR04 на D11/D12. LCD I2C на A4/A5.

Производственный процесс

  1. Умные шторы: автоматическое управление светом на Arduino с солнечной энергией
  2. Умная копилка: управление монетоприёмником на Arduino Nano
  3. Монитор температуры и реальные часы на Arduino Due с TFT-дисплеем 3.2"
  4. Управление светодиодом по Bluetooth с Arduino: простой DIY-гид
  5. Оптимизированные решения питания для проектов на Arduino
  6. Интерактивный HMI-проект на Nextion с Arduino Mega и датчиками
  7. Сборка вольтметра на Arduino с дисплеем Nokia 5110 — Пошаговое руководство
  8. Учебный стенд Arduino Mega 2560: сенсоры, моторы, дисплеи и собственная PCB
  9. Создание приложения Fridgeye с дисплеем Nextion: пошаговое руководство
  10. Измерение солнечной радиации на Arduino UNO с Ethernet Shield