ah au fait, mon système est autonome et fonctionne directement depuis l'alimentation de la batterie lipo ( merci le powerboost) ça peut être intéressant pour ton projet d'alarme
dans ton cas je pencherai pour un bête adaptateur secteur --> 5V et tu utilise le module GSM pour gérer l'état de charge de ta batterie (le module GSM a une entrée batterie et une fonction interne qui permet directement d'avoir son niveau en % ), un simple relais ou transistor mosfet coupe ou laisse passer le 5V sur l'entrée usb du powerboost
riens je pense que cette fonction que j'ai écrite pourras t'intéresser dans ce cas:
boucle principale :
// aquisition tension batterie GSM <-- test OK
Clock(0, Check_Charge_Clock);
Last_State_Charge = EN_charge_bat;
if (EN_charge_bat == 0 || Check_Charge_Clock.compt >= 300) // test de la tension batterie quand eveil ou toutes les 5 mins (300secs) (120secs pour les tests)
{ // si deja en charge (pas de deconnection intempestive de la charge)
if (EN_charge_bat == 1) // si baterrie en charge on attend 10 sec avant de mesurer sinon on attend pas
{
EN_charge_bat = 0; // coupure de la charge pour faire le test
digitalWrite(Enable_Charge, EN_charge_bat);
delay(10000); //attente pour stabiliser la tension batterie du module
}
else
{
EN_charge_bat = 0; // coupure de la charge pour faire le test
digitalWrite(Enable_Charge, EN_charge_bat);
}
Vbat_Save = checkBatGSM(); // aquisition tension batterie GSM
if (Vbat_Save >= 10)
{
Check_Charge_Clock.compt = 0; // si test batterie GSM OK, on reset le chrono
delay(100);
}
}
// gestion de la charge en focntions du niveau des 2 batteries <-- test OK
et fonction:
byte checkBatGSM() {
boolean last_DTR = 0;
int Vbat_P = 0;
int Vbat_mV = 0;
int mode = 0;
int TIMEOUT = 0;
last_DTR = digitalRead(DTR);
digitalWrite(DTR, HIGH);
delay(100);
if (!sim808.checkPowerUp()) // verification de connection avec AT commandes
{
digitalWrite(DTR, last_DTR);
return 1; // si pas de reponse, code erreur 1
}
GSMserial_flush(); // vidange du serial pour eviter les residus de serial
// emission de la demande d'information sur la charge de la batterie
GSMserial.println(F("AT+CBC\r\n"));
delay(500);
//attente d'une reponse du module
while (GSMserial.available() == 0 && TIMEOUT <= 500)
{
TIMEOUT++;
delay(10);
}
if (GSMserial.available() == 0 && TIMEOUT >= 500)
{
digitalWrite(DTR, last_DTR);
return 2; //si aucune reception en 5s retourne le code d'erreur: code erreur 2
}
else
{
if (GSMserial.find("+CBC:") == 0)
{
digitalWrite(DTR, last_DTR);
return 3; //si on trouve pas le bon string, retourne le code d'erreur: code erreur 3
}
}
mode = GSMserial.parseInt();
Vbat_P = GSMserial.parseInt();
Vbat_mV = GSMserial.parseInt();
GSMserial_flush(); // vidange une nouvelle fois pour ne rien laisser trainer
// precautions contre les valeures aberentes
if (Vbat_P < 10 ) Vbat_P = 10;
if (Vbat_P < 10 || Vbat_P > 100)
{
digitalWrite(DTR, last_DTR);
return 4; // si valeures aberantes, retourne code d'erreur: code erreur 4
}
else
{
digitalWrite(DTR, last_DTR);
return Vbat_P;
}
}