Intelligenter Multi-Batterielader mit Multiplexing & Digitalanzeige
Komponenten und Materialien
| Bauteil | Menge |
|---|---|
| Arduino UNO | 1 |
| Arduino Proto Shield | 1 |
| Ultraschallsensor HC-SR04 | 1 |
| Adafruit MCP3008 8-Kanal 10-bit ADC | 1 |
| 5V Relais 2-Kanal Optokoppler | 3 |
| LM2596 DC/DC Buck Modul 3A einstellbar | 1 |
| Widerstand 1kΩ | 12 |
| 6-polige Klemmleiste | 1 |
Benötigte Werkzeuge
- Lötkolben
Projektbeschreibung
Im Nordosten der USA hat man oft mehrere Fahrzeuge (Oldtimer, Boot, Rasenmäher, Generator), die im Winter nicht genutzt werden. Für jede Batterie ein Erhaltungsladegerät zu kaufen wird teuer (5× 30$ = 150$).
Die Idee: Ein einziges Smart-Ladegerät, das automatisch zwischen bis zu 6 Batterien wechselt und jede einige Stunden am Tag lädt.
Funktionsweise
- Batterie 1 muss an Anschluss 1 (versorgt auch Arduino über Spannungsregler)
- Batterien 2–6 beliebig anschließen – Erkennung automatisch über Spannung (>8V)
- read_show_volts: Prüft alle Anschlüsse, fügt verbundene Batterien in Ladezyklus ein
- check_relays: Schaltet nach Timer (Standard 1h pro Batterie) zum nächsten Relais
- update_display: Zeigt Spannungen auf LCD (2×16). Zeile 1: Batt 1&2, Zeile 2: Batt 3&4. Wechselnd: Batt 5&6, Systemspannung (5V), Referenz (3,3V)
- read_distance_update: HC-SR04 schaltet LCD-Hintergrundlicht aus nach Inaktivität. Hand davor → Licht an für X Sekunden. Hält man Hand länger davor → Testmodus (kurze Zyklen, Relais-Klicken hörbar)
Variablen für Ladezeit, Anzeigedauer, Entfernungs-Schwellen etc. anpassbar.
Arduino-Code
#include <Wire.h>
#include <LiquidCrystal_I2C.h> // v1.2.1
#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; // Ladezeit pro Batterie (ms)
int charge_time_counter = 59;
int charge_time_max = 60; // Anzahl Zyklen pro Stunde
int relay1 = 3, relay2 = 4, relay3 = 5;
int current_relay = 0;
int max_relays = 3;
float volts1, volts2, volts3;
int min_volts = 1;
int volts_update_count = 5;
int volts_update_counter = 0;
int volts_update = 500;
int read_distance_update = 500;
int time_on_counter = 0;
int time_on_count = 100;
int heart_beat = 0;
UltraSonicDistanceSensor distanceSensor(11, 12);
int distance;
int relays[] = { relay1, relay2, relay3 };
int is_live[] = { 0, 0, 0 };
int debug = 5;
void all_change_to(int which) {
digitalWrite(relay1, which);
digitalWrite(relay2, which);
digitalWrite(relay3, which);
}
void toggle_relays(int whichOne) {
lcd.setCursor(0, 0);
lcd.print("Relay on:"); lcd.print(current_relay + 1);
all_change_to(HIGH);
digitalWrite(relays[current_relay], LOW);
lcd.print(" "); lcd.print(++acnt);
}
void checkRelays() {
charge_time_counter++;
if (charge_time_counter >= charge_time_max) {
current_relay++;
if (current_relay >= max_relays) current_relay = 0;
toggle_relays(current_relay);
charge_time_counter = 0;
}
}
void read_distance() {
distance = distanceSensor.measureDistanceCm();
if (distance < 80) {
lcd.backlight(); time_on_counter = 0;
} else {
time_on_counter++;
if (time_on_counter > time_on_count) {
time_on_counter = 0; lcd.noBacklight();
}
}
}
void read_show_volts() {
volts1 = analogRead(0) * 0.016;
lcd.setCursor(11, 0); lcd.print(volts1);
volts2 = analogRead(1) * 0.0164;
lcd.setCursor(4, 1); lcd.print(volts2);
volts3 = analogRead(2) * 0.0166;
lcd.setCursor(11, 1); lcd.print(volts3);
int temp_cnt = 0;
relays[0] = relays[1] = relays[2] = 0;
if (volts1 > min_volts) { relays[temp_cnt++] = relay1; }
if (volts2 > min_volts) { relays[temp_cnt++] = relay2; }
if (volts3 > min_volts) { relays[temp_cnt++] = relay3; }
max_relays = temp_cnt;
lcd.setCursor(0, 1);
lcd.print(heart_beat ? "<>" : "><");
heart_beat = !heart_beat;
lcd.print(charge_time_counter);
read_distance();
}
void setup() {
Serial.begin(19200);
lcd.begin(16, 2); lcd.backlight();
pinMode(relay1, OUTPUT); pinMode(relay2, OUTPUT); pinMode(relay3, OUTPUT);
all_change_to(HIGH);
read_show_volts(); checkRelays();
timer.every(chargeTime, checkRelays);
timer.every(volts_update, read_show_volts);
}
void loop() { timer.tick(); }
Schaltplan
Herstellungsprozess
- Intelligente Jalousien: Automatische Lichtsteuerung mit Arduino & Solarenergie
- Smartes Sparschwein: Münzprüfer mit Arduino Nano steuern
- Arduino Temperaturoverwachung & Echtzeituhr mit 3,2″ TFT-Display
- LED per Bluetooth mit Arduino steuern – Einfache DIY-Anleitung
- Optimierte Stromversorgungslösungen für Arduino-Projekte
- Interaktives Nextion HMI Projekt mit Arduino Mega und Sensoren
- DIY-Voltmeter mit Arduino und Nokia 5110 Display – Schritt-für-Schritt-Anleitung
- Umfassendes Arduino-Trainingskit mit Mega 2560, Sensoren, Motoren & Custom PCB
- Fridgeye-App mit Nextion-Display bauen: Schritt-für-Schritt-Anleitung
- Präzise Solareinstrahlungsmessung mit Arduino UNO & Ethernet Shield