Chargeur Solaire
Description
Le chargeur solaire est un dispositif complet de recharge de batterie : batterie au plomb 12V ou chargeur USB (pour smatrphone, …).
Il comprend ;
- un panneau solaire 12V nominal
- un régulateur de charge 12V pour batterie au plomb
- un convertisseur DC/DC : 12V-5V (USB)
De plus, il est instrumenté, afin de pouvoir réaliser en temps réel des mesures, et les afficher. Pour cela il comporte :
- un microcontrôleur Arduino UNO
- un capteur de courant/tension INA219
- un afficheur LCD 2 lignes
Modélisations
Maquette volumique
Matériel
Programme
#include <LiquidCrystal.h> #include <Adafruit_INA219.h> LiquidCrystal lcd(12,11,5,4,3,2); Adafruit_INA219 ina219; // Variables globales const int periodeMesure = 1000; // millisecondes unsigned long lastMesureTime = 0; // Menu uint8_t menu = 4; const uint8_t max_menu = 4; const uint8_t BTN_PIN = 8; int buttonState; // the current reading from the input pin int lastButtonState = LOW; // the previous reading from the input pin unsigned long lastDebounceTime = 0; // the last time the output pin was toggled unsigned long debounceDelay = 50; // the debounce time; increase if the output flickers // Grandeurs mesurées float shuntvoltage = 0; // mV float busvoltage = 0; // V float current_mA = 0; float loadvoltage = 0; float power_mW = 0; float E = 0.0; // Énergie (J) unsigned long t = 0; unsigned long t_1 = 0; void setup() { Serial.begin(9600); lcd.begin(16,2); // Initialize the INA219. // By default the initialization will use the largest range (32V, 2A). However // you can call a setCalibration function to change this range (see comments). if (! ina219.begin()) { Serial.println("Failed to find INA219 chip"); lcd.print("Echec INA219"); while (1) { delay(10); } } pinMode(BTN_PIN, INPUT_PULLUP); digitalWrite(BTN_PIN, HIGH); t = millis(); } void loop() { // read the state of the switch into a local variable: int reading = digitalRead(BTN_PIN); if (reading != lastButtonState) { lastDebounceTime = millis(); } if ((millis() - lastDebounceTime) > debounceDelay) { if (reading != buttonState) { buttonState = reading; if (buttonState == HIGH) { menu += 1; if (menu > max_menu) { menu = 0; } //Serial.println(menu); afficher(); } } } lastButtonState = reading; // Mesures et affichage if ((millis() - lastMesureTime) > periodeMesure) { lastMesureTime = millis(); mesurer(); afficher(); } } void afficher() { lcd.clear(); if (menu == 1) { //affichage du courant lcd.setCursor(0,0); lcd.print("Courant bat "); lcd.setCursor(0,1); lcd.print("I = "); lcd.print(prefixe(current_mA/1000, 3)); lcd.print("A "); } else if (menu == 2) { //affichage de la tension lcd.setCursor(0,0); lcd.print("Tension bat "); lcd.setCursor(0,1); lcd.print("U = "); lcd.print(prefixe(busvoltage, 3)); lcd.print("V "); } else if (menu == 3) { //affichage de la puissance lcd.setCursor(0,0); lcd.print("Puissance bat "); lcd.setCursor(0,1); lcd.print("P = "); lcd.print(prefixe(power_mW/1000, 3)); lcd.print("W "); } else if (menu == 4) { //affichage de l'énergie produite sur 24h// lcd.setCursor(0,0); lcd.print("Energie bat "); t_1 = t; t = millis(); E += power_mW/1e6 * (t-t_1); // Joules lcd.setCursor(0,1); lcd.print("E = "); lcd.print(prefixe(E, 2)); lcd.print("J "); } else { lcd.setCursor(0,0); lcd.print("Mesures batterie"); lcd.setCursor(0,1); lcd.print("bouton : menu"); } } void mesurer() { busvoltage = ina219.getBusVoltage_V(); current_mA = ina219.getCurrent_mA(); power_mW = busvoltage*current_mA; //ina219.getPower_mW(); Serial.println(String("U = ") + busvoltage + " V"); Serial.println(String("I = ") + current_mA + " mA"); Serial.println(String("P = ") + power_mW + " mW"); Serial.println(String("P = ") + busvoltage*current_mA + " mW"); Serial.println(String("E = ") + E + " J"); Serial.println(); } /******************************************************************************************/ char __mathHelperBuffer[17]; char * prefixe(float f, int n) { int pos = 0; // Handle negative numbers bool neg = (f < 0.0); if (neg) { __mathHelperBuffer[pos++] = '-'; f = -f; } //Serial.println(f,4); char p; if (f >= 1000) { p = 'k'; f /= 1000; } else if (f > 1) { p = ' '; } else if (f > 1/1000) { p = 'm'; f *= 1000; } //Serial.println(f,4); int exponent = 0; while (f >= 10.0) { f /= 10; exponent++; } while (f < 1 && f != 0.0) { f *= 10; exponent--; } //Serial.print(f,4); //Serial.print(" E"); //Serial.println(exponent); f *= pow(10, n-1); f = round(f); //Serial.println(f,4); char digits[n+1]; int i = 0; int e = int(f); bool z = false; while (i <= n) { if (n-i-1 == exponent) { if (z) { digits[n-i] = '.'; } else { digits[n-i] = '\0'; } z = true; } else { if ((e % 10 != 0) || z) { digits[n-i] = (e % 10) + '0'; z = true; } else { digits[n-i] = '\0'; } e /= 10; } i++; } //Serial.println(digits); if (digits[0] == '.') { __mathHelperBuffer[pos++] = '0'; } i = 0; while ((i < n+1) && (digits[i] != '\0')) { __mathHelperBuffer[pos++] = digits[i]; i++; } if (p != ' ') { __mathHelperBuffer[pos++] = ' '; __mathHelperBuffer[pos++] = p; } __mathHelperBuffer[pos] = '\0'; return __mathHelperBuffer; } /******************************************************************************************/ float moy_analog( int pin ) { int valeur; float moyenne = 0; int nbr_lectures = 50; for( int i = 0; i < nbr_lectures; i++ ){ valeur = analogRead( pin ); moyenne = moyenne + float(valeur); delay(2); } moyenne = moyenne / float(nbr_lectures); return moyenne; }