Chargeur de batterie intelligent multiplexé avec affichage digital
Composants nécessaires
- 1 × Arduino Uno
- 1 × Shield de prototypage Arduino Proto Shield
- 1 × Capteur ultrasons HC-SR04 (pour réveil écran par proximité)
- 1 × ADC 8 canaux 10-bit MCP3008 (SPI)
- 3 × Relais 5V 2 canaux (optocouplés) = 6 canaux de commutation
- 1 × Module abaisseur de tension LM2596 (3A, réglable) pour alimenter le chargeur
- 12 × Résistances 1kΩ (diviseurs de tension pour MCP3008)
- 1 × Borne à vis 6 positions (connexions batteries)
- 1 × Écran LCD 16x2 I²C (adresse 0x27, module YWRobot LCM1602 IIC V1)
- Alimentation 12V DC (pour le chargeur), 5V pour l'Arduino (via LM2596 ou USB)
Outils
- Fer à souder
Problématique
L'auteur possède plusieurs véhicules (voiture classique, pickup, bateau, générateur) avec batteries 12V qui restent inutilisés l'hiver. Au lieu d'acheter 5 chargeurs intelligents (~150€), il conçoit un chargeur unique qui commute automatiquement entre 6 batteries, chargeant chacune 1 heure en rotation. Le système détecte automatiquement les batteries connectées (seuil > 8V) et adapte le cycle.
Principe de fonctionnement
L'Arduino Uno dispose de seulement 6 entrées analogiques, mais A4/A5 sont utilisées pour l'I²C du LCD. Le MCP3008 ajoute 8 entrées analogiques via SPI. Chaque entrée batterie passe par un diviseur de tension (2 × 1kΩ) pour ramener 0-15V dans 0-5V. Trois modules relais 2 canaux (6 relais total) commutent la sortie du chargeur (LM2596 réglé à ~13.8V) vers la batterie active. Un capteur HC-SR04 détecte la présence de l'utilisateur devant l'appareil pour allumer le rétroéclairage du LCD (économie d'énergie).
Fonctions principales du firmware
- read_show_volts() : lit les 6 tensions via MCP3008, met à jour l'affichage (2 tensions par ligne), détecte les batteries connectées (> 8V) et met à jour le tableau des relais actifs.
- checkRelays() : toutes les
chargeTime(par défaut 1h), passe au relais suivant dans la liste des batteries actives. - read_distance() : si objet < 80cm devant HC-SR04, allume le rétroéclairage LCD et reset le compteur d'extinction (défaut 100s).
- Mode test : en maintenant la main devant le HC-SR04 quelques secondes, le cycle passe à quelques secondes par batterie pour vérifier la commutation.
Code Arduino (extrait principal)
#include
#include
#include
#include
auto timer = timer_create_default();
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
int chargeTime = 10 * 1000; // 10s pour test, mettre 3600000 pour 1h
int charge_time_counter = 0, charge_time_max = 60;
int relayPins[] = {3, 4, 5}; // 3 relais dans l'exemple (extensible à 6)
int current_relay = 0, max_relays = 3;
float volts[3];
int min_volts = 1; // seuil détection batterie (en V après diviseur)
UltraSonicDistanceSensor distanceSensor(11, 12); // Trig=11, Echo=12
void all_change_to(int level) {
for (int r : relayPins) digitalWrite(r, level);
}
void toggle_relays(int idx) {
lcd.setCursor(0, 0);
lcd.print("Relay on:"); lcd.print(idx + 1);
all_change_to(HIGH);
digitalWrite(relayPins[idx], LOW); // relais actif à LOW (optocoupleur)
}
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_show_volts() {
for (int i = 0; i < 3; i++) {
volts[i] = analogRead(i) * 0.016; // calibration à ajuster
// affichage LCD 2 par ligne...
}
// détection batteries actives
int cnt = 0;
for (int i = 0; i < 3; i++) {
if (volts[i] > min_volts) relayPins[cnt++] = relayPins[i];
}
max_relays = cnt;
// heartbeat LCD
read_distance();
}
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 setup() {
Serial.begin(19200);
lcd.begin(16, 2); lcd.backlight();
for (int r : relayPins) { pinMode(r, OUTPUT); digitalWrite(r, HIGH); }
read_show_volts(); checkRelays();
timer.every(chargeTime, checkRelays);
timer.every(500, read_show_volts); // mise à jour tension toutes les 500ms
}
void loop() { timer.tick(); }
Schéma de câblage
Voir le schéma dans la section "Schematics" : diviseurs de tension vers MCP3008 (SPI: D10=CS, D11=MOSI, D12=MISO, D13=SCK), relais sur D3-D5, LCD I²C sur A4/A5, HC-SR04 sur D11/D12.
Personnalisation
- Modifiez
chargeTimeà 3 600 000 ms (1h) pour l'usage réel. - Ajustez les coefficients de conversion tension (0.016, 0.0164, 0.0166) selon vos diviseurs exacts.
- Étendez à 6 batteries en ajoutant 3 relais et en câblant les entrées MCP3008 3-5.
Processus de fabrication
- Stores intelligents : contrôle automatisé de la lumière avec Arduino et énergie solaire
- Construire une Tirelire Intelligente : Contrôler un Accepteur de Pièces avec Arduino Nano
- Moniteur de Température et Horloge Temps Réel Arduino avec Écran TFT 3.2"
- Contrôler une LED par Bluetooth avec Arduino et MIT App Inventor
- Solutions d'alimentation optimisées pour projets Arduino
- Station météo interactive Nextion HMI avec Arduino Mega et capteurs
- Construire un voltmètre DIY avec Arduino et écran Nokia 5110
- Kit de Formation Arduino Complet : Mega 2560, Capteurs, Moteurs et PCB Personnalisé
- Construire l'application Fridgeye avec un écran Nextion : guide étape par étape