Alimentation Solaire

De Wiki LOGre
Aller à la navigation Aller à la recherche

Bases d'un calcul

Il existe des enregistrements de 10 derniers années au pas horaire sur toute l'Europe... C'est le site de PVGiS https://re.jrc.ec.europa.eu/pvg_tools/en/ Utilisé massivement par les geeks du CEA INES...

Ça permet de voir le potentiel solaire d'un site... C'est très puissant et réaliste du productif sur un point donné...

Et le résultat est : De Lille à Marseille pour une orientation. Plein Sud et une inclinaison fixe de 35° Environ 1000 à 1300 kWh/an/kWc installé en moyenne annualisé... Après on peut/doit surtout analyser le mois de décembre... C'est lui qui détermine la pire production !

En gros en été il faudrait orthogonalement du 35° et en hiver 62°.

Ci-joint quelques schémas explicatifs de l'influence de l'azimut sur la production.

Inclinaison1.jpg
Rendement inclinaison orientation 2.jpg
Rendement inclinaison-orientation 1.jpg

Idéalement on pourrait partir sur du 45/50°, c'est ce que je fais sur mon relais perroquet.

Ça moyenne été/hiver sans avoir à le modifier en permanence.

Alexandre

L'inclinaison est plus importante en cherchant la disponibilité plus que la production. Pascal.

Théorie

Le 4096 assure une charge correcte de l'accu donc tout ce qui va entrer dans l'accu venant d'une alim (chargeur de téléphone ou cellule solaire) mais pas ce qui va sortir de l'accu, c'est le rôle du BMS.

Protection contre un court-circuit.

Protection contre une intensité trop forte.

Protection contre une décharge trop profonde mais attention il consomme un peu donc la batterie si elle n'est pas rechargée sera lentement amenée à une décharge profonde en cas d'inactivité prolongée. Un jouet non utilisé tuera sa batterie sauf à la déconnecter de son BMS, ce qui n'est pas possible sur les batteries d'ordi, de vélo, de trottinette... car c'est lui qui assure la sécurité.

Le BMS coupe à 2.5v (environ) et il ne rétablie la sortie que si on applique une recharge. Branché sur un chargeur de modélisme celui-ci ne démarrera pas car il croira que la batterie est déconnectée.

C'est pourquoi on ne l'utilise pas en modélisme car les propriétaires préfèrent perdre une batterie que leur modèle. En général par exemple dans une 7S5P de vélo une décharge profonde ne touche qu'une rangée P donc ici 5 accus à changer soit une rangée 1S sur les 7 rangées. Le BMS est capable de connaître la tension de chaque paquet de 5P et si l'un de ces paquets est en dessous de 2.5V il refuse la charge et le vendeur vous dit "c'est mort, faut acheter un nouvel accu".

En modélisme on y arrive vite si on tire de trop. On peut tenter une recharge en mode NiMH à 200 mA maxi jusqu'à ce que l'accu repasse au dessus de 2.5V cela prend quelques minutes? Il ne faut pas le laisser car un risque d'incendie est possible puis on finit avec une charge normale Li-ion. Mais l'élément à 0V ne reviendra jamais et si un élément revient il a souffert et n'aura plus la même capacité que les autres, l'utilisation de l'ensemble s'alignera sur le plus faible.

Si on veut pratiquer la récup d'accu li-ion récupérés ans le bac à recyclage il faut désassembler tous les éléments, les recharger individuellement, les recharger et reconstituer des ensembles avec des éléments de même capacité. Un chargeur de modélisme est indispensable https://fr.aliexpress.com/item/32850284742.html.

Ensuite en mettant un BMS avec balancing on peut s'en passer à condition de ne pas avoir une la tension de sortie du chargeur trop éloignée de l'ensemble.

Ex pour une 3S qui va remplacer 12V en Accu NIMH d'une perceuse récupérée en déchetterie il faudra un BMS 3S et 20 à 40A et le chargeur devra sortir un peu au dessus de 3x4,2 soit 12.6V.

Mais quand on a un chargeur de modélisme on l'utilise en priorité, il est capable de vous donner la capacité chargée, la tension de chaque élément en cours ou fin de charge et de tester une décharge en plus il peut recharger les batteries au plomb, CadNi, NiMh Un https://fr.aliexpress.com/item/1005005066241321.html n'est pas mal non plus si on n'a pas les ressources d'un labo à disposition.

Il existe (surtout pour le fumeurs de cigarette électronique) des accus 1S avec BMS inclus, ils sont un petit peu plus long, le BMS est au dessus du pôle

Certains montages intégrant un TP4056 assurent à la fois le rôle de chargeur ET de BMS.

Francis

Applications

Projet LoRa Messenger

Perso (Alexandre) je pense plutôt qu'il faut partir de la Conso maxi / prévoir 6 à 10 x jours consécutifs de merde à 0.5% maxi de la Production de décembre / Capacité batterie dimensionné pour tenir 1 semaine sans aucun apport PV

Qui connaît cette conso journalière de votre ESP + trafic data du LoRa ?

C'est réputé pour consommer vraiment que dalle ces trucs...

Au pifomètre je collerais 3 à 4x batteries 18650 de 2500 mAh en série + BMS 3/4S + PV de 10 à 30 Wc + MPPT pas trop pourri pour bien charger le bloc 3/4S... Et oui le budget explose vs le prix d'un ESP32+modem LowRa 😤 comme à chaque fois qu'on veut rendre autonome un « device »... Alexandre.


Le TTGO T3_V1.6 a un TP4054 gère seulement la charge. Et quand l'accu est déchargé, l'ESP s'arrête. Malheureusement un courant persistant achève le Li Ion, je ne suis pas le premier à perdre un accu de cette manière et le BMS protège l'accu de la décharge destructive.

Le TP4054 baisse la tension du panneau solaire, et la charge fonctionne. La tension plus faible gaspille la puissance, pas dramatique avec un panneau de 5V ou 6V. Au delà de 6V, un MPPT buck tire toute la puissance du panneau. Sachant qu'un MPPT consomme de l'énergie.

Avec un panneau jusque 6V 800mA, je choisis la série TP405x, compromis entre coût, gaspillage et conso du circuit. Il a un courant inverse négligeable. Pascal

Composants :

BMS 1S : HX107 autour d'un TP4056A : de l'info ici avec une fiche technique téléchargeable ici. Et voir dans les commandes groupées pour les liens vers Aliexpress. Ce BMS accepte jusqu'à 8 V entrée et charge jusqu'à 1 A. Ce BMS possède des protections mais pas contre les inversions de polarité...

Biblio - Glossaire

BMS : système de contrôle des batteries d'accumulateurs

ESP : https://fr.wikipedia.org/wiki/Email_service_provider ??

MPPT : suivi du point maximal de puissance (d'une source électrique) https://fr.wikipedia.org/wiki/Maximum_power_point_tracker

NiMh : accumulateur nickel-hydrure métallique

Montage pratique

Contacter Francis sur la liste pour des précisions.

Première étape avoir du courant de manière sécure

Pour avoir un montage autonome il faut que les accus soient en bonne forme.

Le phénomène est la suivant : le soleil manque : les accus se vident, heureusement il existe des BMS, petits montages présents dans les batteries de nos appareils fonctionnant avec des éléments li-ion.

On en trouve pour toutes les combinaisons de batteries. Ils ont trois fonctions tout en étant très abordables en prix.

– Couper le courant si le débit en intensité est supérieur à une valeur définie.

– Empêcher les courts-circuits.

– Empêcher la destruction de l’élément si on tente de le décharger trop. Si un élément voit sa tension descendre en dessous de 2,5V le BMS coupe. Mais le BMS en étant branché consomme lui aussi très peu donc un accu protégé ne doit pas rester dans un fond de tiroir trop longtemps.

Les jouets abandonnés sans recharge, les vélos qui n'ont pas servi durant la période de confinnement ont permis de voir les déchetteries les accueillir.

De même il existe des petits modules pour effectuer le cycle de recharge adaptés à l’accu.

Il assure une recharge avec une intensité correcte et surtout arrête la recharge quand l’accu est chargé.

J’ai choisi :

– le bms pour un accu li-ion 1S : https://fr.aliexpress.com/item/4000297338202.html

– le chargeur : https://fr.aliexpress.com/item/1005001562314459.html. Le circuit doit être branché sur du 5v mais il accepte jusqu’à 8V il pourra donc soit être branché sur un chargeur de smartphone, un powerbank sur le terrain soit un panneau solaire. On peut se passer du BMS cité plus haut en prenant la version "with protection".

C’est, semble-t-il, parfait mais si le soleil vient à manquer ? L’accu va chuter à 2.5V le BMS va couper la sortie, quand le jour reviendra la batterie va passer légèrement au dessus de 2.5V et le micro-contrôleur va démarrer… Mal, car il va demander pas mal de courant, la tension va chuter et on recommence, si malgré tout on a un superbe soleil le microcontrôleur va mal démarrer.

Pourquoi ? Simplement parce que avant d'avoir un beau soleil et donc un bon courant il y aura d'abord un petit courant, permettant au microcontrôleur de démarrer pas dans de bonnes conditions et aucun programme ne fonctionnera, il ne fera qu’user le courant, la batterie ne chargera pas, il ne pourra passer en deepsleep et videra la batterie dès que le soleil se cachera. Le seul moyen de s'en sortir c'est par beau soleil de faire un reset du microcontrôleur, pas bon pour un montage destiné à être autonome.

Que faire ? Il faudrait que la batterie se charge au minimum pour produire assez de courant à un voltage suffisant, après une recharge suffisante pour que la tension ne s'écroule pas dès qu'on tire un peu sur l'accu. Le KA75330 a une sortie qui reste à la masse tant que la tension qu’on lui donne reste en dessous de 3.3v…. Parfait utilisons-le, connectons la sortie du KA75330 au reset du microcontrôleur.

Oui mais le système alimenté ne doit pas trop consommer. Sinon, même problème car l’hystérésis est faible. Bien sûr s’il y a un grand soleil le panneau est capable de fournir assez de courant pour qu’un ESP8266 ou un ESP32 démarre mais y a pas toujours un grand soleil. Solution : augmenter la puissance des panneaux solaires mais où les mettre ? Ils vont prendre de la place et augmenter le budget.

Schéma du montage
vignette Le schéma théorique

Je suis donc passé à un petit microcontrôleur : le digispark, il fonctionne à partir d’une tension assez basse car équipé d’un attiny85. Les clones chinois ont une broche reset et il est capable de mesurer sa tension d’alimentation.

Pour mettre au point j’ai utilisé DigiKeyboardFr.h qui permet de voir s’afficher dans notepad une émulation de sortie série.

Code

#include "DigiKeyboardFr.h"              // https://github.com/Robotechnic/DigiKeyboardFr
const int pin_Lecture_Tension_Pile = 3;  // Entrée analogique pour mesure tension pile
int Tension_Pile_Digit = 0;

void setup(){
	pinMode(1, OUTPUT);  
	DigiKeyboardFr.delay(5000);          // attendre un peu
	DigiKeyboardFr.println("CECI DOIT ETRE EN MAJUSCULES");
	DigiKeyboardFr.println(" Digispark");  }

	//***********************************************************************
void loop(void){
	int Tension_Pile_Digit = 0;
	Tension_Pile_Digit=analogRead(pin_Lecture_Tension_Pile);  

                          // lire la tension de la pile (Lecture entre 0 et 1023.)
	DigiKeyboardFr.println(Tension_Pile_Digit);
	DigiKeyboardFr.delay(2000);  
                          // mettre ici le correctif pour avoir la tension réelle

// Comme le montage doit être utilisé pour tester la recharge par un panneau solaire 
// il faut bien connaître la tension par un autre moyen. Ici on va se servir de la led 
// interne du digispark. Il suffira de compter le nombre d'éclats pour avoir le chiffre
// des centaines de cV donc de volts, puis les dV et enfin les cV; un zéro sera un
// éclat long.
	int centaine = Tension_Pile_Digit/100; 
	DigiKeyboardFr.println(centaine); 
	if (centaine >0){
		for( int x=1;x<=centaine;x++){
			digitalWrite(1, HIGH);   
			DigiKeyboardFr.delay(300);              
			digitalWrite(1, LOW);   
			DigiKeyboardFr.delay(300);             }   }
	else {     // Utile ? S'il y a 0 en volt comment le digisspark ferait ? 
 		digitalWrite(1, HIGH);   
		DigiKeyboardFr.delay(800);              
		digitalWrite(1, LOW);   
		DigiKeyboardFr.delay(800);   }		
	DigiKeyboardFr.delay(2000); 
	int dizaine =   (Tension_Pile_Digit - centaine*100)/10;
	DigiKeyboardFr.println(dizaine); 
	if (dizaine >0){
		for( int x=1;x<=dizaine;x++){
			digitalWrite(1, HIGH);   
			DigiKeyboardFr.delay(300);              
			digitalWrite(1, LOW);   
			DigiKeyboardFr.delay(300);       }   } 
	else {
		digitalWrite(1, HIGH);   
		DigiKeyboardFr.delay(800);              
		digitalWrite(1, LOW);   
		DigiKeyboardFr.delay(800);   }
		DigiKeyboardFr.delay(2000);  
		int unite =   Tension_Pile_Digit%10;
		DigiKeyboardFr.println(unite); 
		if (unite >0){
			for( int x=1;x<=unite;x++){
				DigiKeyboardFr.println(x);
				digitalWrite(1, HIGH);
				DigiKeyboardFr.delay(300);
				digitalWrite(1, LOW);   
				DigiKeyboardFr.delay(300);    }   }
		else  {
			digitalWrite(1, HIGH);
			DigiKeyboardFr.delay(800);  
			digitalWrite(1, LOW);   
			DigiKeyboardFr.delay(800);}  
		DigiKeyboardFr.delay(8000);    
	}

Version avril 2021

Gestion de l’accumulateur : chargeur solaire, bms coupant l’alim à 2,5V, gestion du démarrage du microcontrôleur à 3.3V, affichage de la tension de l’accu, mise en sommeil et commande d’un mosfet P pour mise sous tension d’un circuit annexe.

Code

 /* lecture de la tension d'alim d'un digispark 
 brancher l'alim de l'accu sur le 5V de la carte
 
Aide mémoire  pour l'usage du digispark
Pin Number  Output Voltage  Analog Port Number  PWM      USB     Test LED   I2C
0                5v                             Y - 504 Hz                Rev1           SDA
1                5v                             Y - 504 Hz                Rev2/4 
2                5v             1                                                        SCL
3                5v             3                           Y - 1.5k Ohm to 5v  
4                5v             2               Y - 1007 Hz   Y  
5                3v             0

 Pin 0 → I2C SDA, PWM (LED on Model B)
 Pin 1 → PWM (LED on Model A)
 Pin 2 → I2C SCK, Analog
 Pin 3 → Analog In (also used for USB+ when USB is in use) à utiliser en entrée
 Pin 4 → PWM, Analog (also used for USB- when USB is in use) à utiliser en entrée
 Pin 5 → Analog In
*/

#include <avr/io.h>
#include <avr/wdt.h> 
#include <avr/sleep.h>
volatile uint8_t wdt_count;
volatile uint8_t tensionInter=0;

void setup() 
{                              //  le digispark met 5s à démarrer (bootloader)
   pinMode(2, OUTPUT);         // Sortie P2 à 0 le mosfet N n'est pas passant et 
   digitalWrite(2, LOW);       // donc le mosfetP est bloqué
   pinMode(1, OUTPUT);         // led interne servant d'affichage tension interne
   eclat(1);
   delay(1000);
   long voltage = readVcc();
   int voltageDeciVolt = voltage / 10;
   lecture(voltageDeciVolt);
   ACSR  |= _BV(ACD);                    // switch Analog Comparator OFF
   set_sleep_mode(SLEEP_MODE_PWR_DOWN);  // Configure attiny85 sleep mode
                                         // Reset watchdog interrupt counter
   wdt_count = 255;    }                 //max value

//***********************************************************************

void loop(void)
{  wdt_count = 0;
   ADCSRA &= ~_BV(ADEN);                 // switch ADC OFF
   watchdog_start_interrupt(6);          // prescale of 6 ~= 1sec
   while(wdt_count < 20)                 // Wait 10 watchdog interupts (~20secs)
   {  sleep_mode();    }                 // Make CPU sleep until next WDT interrupt
   watchdog_stop();                      // réveil
   ADCSRA |= _BV (ADEN);                 // réactiver ADC 
   delay(1000); 
   long voltage = readVcc();             // Affichage de la tension de la batterie
   int voltageDeciVolt = voltage / 10;
   lecture(voltageDeciVolt);
   delay(2000);
   if (voltageDeciVolt >= 375)      // A partir de 3,75 V on ouvre le circuit
   {   digitalWrite(2, HIGH);       // Sortie à 1 le mosfet N conduit et donc
       tensionInter += 1;           // La gate du mosfet P est à 0  et il conduit
       lecture(tensionInter); }     // on affiche le nb de boucles de loop       
   if (voltageDeciVolt <= 340)
   {   digitalWrite(2, LOW);  }     // Sortie P2 à 0 ordre d'arret
}

void lecture(int Tension)
{  int centaine = Tension/100; 
   if (centaine >0)
   {   eclat(centaine);  }
   else  
   {   digitalWrite(1, HIGH);   
       delay(800);              
       digitalWrite(1, LOW);   
       delay(800);   }
   delay(2000); 
   int dizaine =   (Tension - centaine*100)/10;
   if (dizaine >0)
   {   eclat(dizaine);   } 
   else  
   {   digitalWrite(1, HIGH);   
       delay(800);              
       digitalWrite(1, LOW);   
       delay(800);   }
   delay(2000);  
   int unite = Tension%10;
   if (unite >0)
   {   eclat(unite);  }
   else  
   {   digitalWrite(1, HIGH);   
       delay(800);     
       digitalWrite(1, LOW);   
       delay(800);  }     
   delay(8000);   }

void eclat(uint8_t flash)
{   bool state = HIGH;
    for(int i = 0; i<2*flash; i++)
    {  digitalWrite(1, state);
       state = !state;
       delay(300);   }    }

long readVcc()
{ ADMUX = _BV(MUX3) | _BV(MUX2);
  delay(2);                                 // Wait for Vref to settle
  ADCSRA |= _BV(ADSC);                      // Start conversion
  while (bit_is_set(ADCSRA,ADSC));          // measuring
  uint8_t low  = ADCL;                      // must read ADCL first - it then locks ADCH  
  uint8_t high = ADCH;                      // unlocks both
  long result = (high<<8) | low;
  result = 1125300L / result;               // Calculate Vcc (in mV);
                                            // 1125300 = 1.1*1023*1000
  return result;               }            // Vcc in millivolts

void enterSleep (void)
{  sleep_enable();
   sleep_cpu();  }

void watchdog_stop() /* Turn off WDT */
 { WDTCR |= _BV(WDCE) | _BV(WDE);
  WDTCR = 0x00; }

void watchdog_start_interrupt(uint8_t wd_prescaler)
{  if(wd_prescaler > 9) wd_prescaler = 9;
   byte _prescaler = wd_prescaler & 0x7;
   if (wd_prescaler > 7 ) _prescaler |= _BV(WDP3); 
            // ^ fourth bit of the prescaler is somewhere else in the register...
            // set new watchdog timer prescaler value
   WDTCR = _prescaler;
   WDTCR |= _BV(WDIE) | _BV(WDCE) | _BV(WDE);  }     // start timed sequence

ISR(WDT_vect)                 // Watchdog Interrupt Service / is executed when watchdog timed out
{  wdt_count++;
   WDTCR |= _BV(WDIE); }     // Watchdog goes to interrupt not reset


Schéma du second montage
vignette Le schéma théorique
Circuit imprimé
vignette Le circuit
le prototype
vignette Le prototype

Voir aussi : https://connect.ed-diamond.com/Open-Silicium/OS-005/Reduire-la-consommation-d-un-AVR


https://www.best-microcontroller-projects.com/tp4056.html peut être intéressant.


Il reste plus qu’à ajouter si on utilise un accu de 7.2V, que de mesurer la tension de l’accu avec un pont diviseur à l’aide du digispark, d’un panneau solaire plus puissant, d’un MPPT, d’un bms avec balance.

Par exemple 2 panneaux en série : https://fr.aliexpress.com/item/1005004546004726.html avec un MPPT https://fr.aliexpress.com/item/1005004429495160.html et BMS balancing https://fr.aliexpress.com/item/1005001636432977.html