Bonsoir.
Voici mon nouveau programme ARDUINO (le second car j'en suis à mes débuts).
Je vous le soumets, je pense que j'ai assez correctement expliqué à quoi il sert.
Bien sur votre avis et vos remarques/critiques sont importants pour moi.
Surtout l'utilisation de la fonction millis() pour les temporisation sans utiliser delay() qui me pose pas mal de soucis.
Code:/*Programme qui controle la charge batterie par les panneaux photovoltaiques (circuit 12V, 2 panneaux de 75W, 1 batterie de 100Ah 12V). A partir de 14.4V (batterie considérée chargée), on met en route une pompe 220VDC (moteur universel type mixer ou perceuse) alimentée par un convertisseur DC12V/Dc280V. Le but est de ne pas "gaspiller" l'énergie une fois la batterie chargée mais aussi de garder la pleine capacité de la batterie pour pouvoir l'utiliser quand il n'y a plus de soleil pour s'éclairer le soir. Le "surplus" est donc dévié vers une pompe à eau (90W/220V) qui rempli une cuve. On ajuste la puissance d'alimentation de la pompe par une commande PWM en fonction de l'intensité du soleil disponible afin de ne pas puiser dans la batterie. Un autre système de régulateur est mis en place pour le cas ou une avarie arrive sur la pompe et que celle ci ne puisse absorber le trop plein d'énergie des panneaux et éviter de surcharger la batterie et la détruire. Dans ce cas on court-circuite les panneaux solaire. J'ai choisi d'utiliser des MOSFET pour servir en commutation de tout celà. IRF3205 pour alimenter le convertisseur en 12V 20A DFP830 pour le PWM sur la pompe IRF540 pour la régulation de sécurité court-circuitant les panneaux */ int mesureTensionBat = 0; // select the pin A0 for the batterie voltage int IRF3205 = 11; // select the pin for the converter MOSFET IRF3205 55V, 110A, 8mOhm int DFP830 = 12; // select the pin for the pump MOSFET DFR830, 500V, 5.3A, 1.5Ohm int IRF540 = 10; // select the pin for the security over charge MOSFET IRF540, 100V, 30A int dutyCycle = 200; int Ubat100 = 0; //tension batterie en centivolt int tauxSurcharge = 0; float Ubat = 0; unsigned long previousMillis = 0; unsigned long currentMillis = 0; void setup() { digitalWrite(IRF3205, LOW); // s'assure que tout est arrêté au démarrage de Arduino afin de commencer par charger la batterie digitalWrite(DFP830, LOW); // "" digitalWrite (IRF540, LOW); //s'assure que les panneaux ne sont pas court-circuité au démarrage de Arduino Serial.begin(9600); //ouvre le serial monitor pour certain controle digitalWrite(13, LOW); //éteint la LED de la platine Arduino qui ne me sert à rien } void loop() { mesureTensionBat = analogRead(A0); //prend la tension batterie 12V par un pont diviseur 0-5V Ubat100 = map(mesureTensionBat, 0, 1023, 0, 1800); //"map" la tension lue de 0 a 1800centiV Ubat = Ubat100 / 100; //transforme la tension batterie de centiV en V avec 2 décimales Serial.print (Ubat); //affiche la tension batterie avec 2 décimales sur le "serial monitor" Serial.print(" "); //affiche 1 espace Serial.println(mesureTensionBat); // affiche la valeur entre 0 et 1023 sur 10 bit correspondant à la tension batterie if (Ubat >= 14.2) // si condition vraie, met en route le convertisseur puis, 1 seconde après, la pompe en ajustant le signal PWM pour maintenir //une tension batterie stable de 13.4V { digitalWrite(IRF3205, HIGH); // mise en route le convertisseur currentMillis = millis(); if (currentMillis - previousMillis >= 1000) // tempo 1s avant de mettre la pompe en route { analogWrite(DFP830, 200); // mise en route de la pompe à 100% de 220V soit 78% de 280VDC (tension disponible au convertisseur) ou 78% de 0-255 pendant 1s avant prise en charge de la regul proportionnelle dutyCycle } } if (currentMillis - previousMillis >= 2000) { dutyCycle = map (Ubat100, 1340, 1445, 100, 220); //ajuste le dutyCycle entre 50% de 220V (100) et 110% de 220V (220) 1s après le démarrage de la pompe // en foncton de l'intensité du soleil analogWrite(DFP830, dutyCycle); //ajuste la commande PWM en fonction du dutyCycle défini ci-dessus } previousMillis = currentMillis; if(Ubat < 13.4) //si condition vraie, arrête pompe et convertisseur { digitalWrite(DFP830, LOW); // arrêt de la pompe digitalWrite(IRF3205, LOW); // arrêt du convertisseur dutyCycle = 200; // réinitialise dutyCycle à la valeur de démarrage (100% de 220V) } // régul de sécurité au cas ou le surplus d'energie ne soit pas absorbé par la pompe tauxSurcharge = map(Ubat100, 1420, 1445, 0, 255); //map la tension entre 14.20V et 14.45V pour générer 1 duty cycle de court-circuitage des panneaux solaire //14.20V taux de surcharge = 0; 14.45V taux de surcharge = 100% analogWrite(IRF540, tauxSurcharge); //court-circuite les panneaux solaires en fonction du taux de surcharges défini par le "mapage" ci dessus }
-----