Génial, le site et la consommation, superbe travail
si j’ai bien compris, la carte arduino et mini peuvent fonctionner sans regulateur de 1.8V à 5.5V donc sur la plage de tension dune batterie lithium qui varie de 4.2V à 3.3V. et cela permet de minimiser la consommation car le regulateur demande 5mA.
Dans ce cas, les 2 batteries lithium ion 18650 devrait etre mis en //.
Par contre, il va falloir utiliser une tension de reference pour la Conversion analogique si la tension d'alimentation change.
il faut changer de capteur de temperature LM35 qui a besoin de 4V minimum par une PT1000
Suite aux perspectives précédentes, la led peut être commandé en régulation de température ce qui permet de la commander pour le maximum de sa puissance.
Le schéma automatique de la régulation de courant qui s'imbrique dans la regulation de température est le suivant :
Exemple : La consigne de température maximum du dissipateur a été choisi de 100°C sachant le dissipateur ou est placé la led est de 15°C/W à 0km/h mais passe à 7°C/W avec une vitesse de 20km/h.
Donc avec une température ambiante de 25°C, la puissance maximale dans la led en fonction de la vitesse sera de
Pmax=(100°C-25°C)/15°C/W=4.33W à la vitesse de 0 km/h
Pmax=(100°C-25°C)/7°C/W=10W à la vitesse de 20 km/h
La température de jonction de la led avec sa résistance thermique de 3.5°C/W sera de
Tjonction=Tboitier+ PmaxRTHjc=100°C+10W3.5=135°C
Mais la température de jonction peut atteindre 150°C/W
La régulation de température n’est pas trop compliquée à programmer.
Par contre, le coefficient intégral est à modifier par rapport à celui du courant.
Car si la température de la led est au départ de 30°C pour atteindre les 100°C alors la Puissance admissible par la led precedente sera tres vite dépassé.
Il faut donc limiter le courant à une certaine valeur pour ne pas detruire la led car la regulation precedente augmentera inutilement la PWM, aisni que le courant
voici le code de la programmation
#include <LiquidCrystal.h>
//#include <SoftwareSerial.h>
#include <TimerOne.h>
#include <avr/wdt.h> //chien de garde
//#include <avr/power.h> //mise en veille
//#include <avr/sleep.h>
#include "LowPower.h" //https://github.com/rocketscream/Low-Power
#define led0 10 //
#define led1 A4 //
#define led2 12 //
#define led3 13 // 13
#define BP3 2 //
#define battery A0 //relay magnetron
LiquidCrystal lcd(9, 8, 4, 5, 6, 7); // LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
// Configuration des variables
unsigned int temps=0; //temps de la routine d'interruption
byte temps1=0;
byte mode=1; // etat du bouton poussoir
float Ic=0.35; // courant de consigne
float Ba=0; //tension batterie
byte SOC=0; //etat de charge en pourcentage
byte barreled=0;
byte PWM=0;
float I=0; //courant led principal
float erreur=0; //courant led principal
float kp=10; //coefficient proportionel integral
float ki=4;
float Integral=34;
float T=0; //temperature
float Tc=80; //consigne de temperature
float erreurT=0;
// the setup function runs once when you press reset or power the board
void setup() {
// digitalWrite(A5,HIGH);
// delay(200);
pinMode(led0, OUTPUT); //
pinMode(led1, OUTPUT); //
pinMode(led2, OUTPUT); //
pinMode(led3, OUTPUT); //led carte arduino
pinMode(3, OUTPUT); //PWM
pinMode(11, OUTPUT); //PWM
Timer1.initialize(1000); // initialize timer1, and set a 0,1 second period => 100 000 pour 0.01s 10 000
Timer1.attachInterrupt(callback); // attaches callback() as a timer overflow interrupt
lcd.begin(16, 2); //modifier pour un afficheur 20x4
// Serial1.begin(9600);
TCCR2B = (TCCR2B & 0b11111000) | 0x01; //pin 10 32khz http://playground.arduino.cc/Main/TimerPWMCheatsheet
pinMode(2, INPUT);
attachInterrupt(digitalPinToInterrupt(2), interBP, LOW); //routine d'interruption exterieur broche 2
//wdt_enable(WDTO_15MS);
}
// Interruptions tous les 0.001s fait par le timer1***********************************
void callback() {
temps++;
//if ( digitalRead(LEDV)== 1 ) {digitalWrite(LEDV,LOW);} else {digitalWrite(LEDV,HIGH);}
//wdt_reset();
}//fin routine
//interruption exterieur
void interBP() {
//interrupts();
mode++; //incrementation des modes
if (mode>=6) mode=1;
switch (mode) {
case 1:Ic=0.35;Integral=34; break; //donne un ordre de grandeur de la valeur de la PWM=255*(Rshunt*Ic-Useuil)/Ubattery
case 2:Ic=0.75;Integral=43; break;
case 3:Tc=80;Ic=1.5; break;
case 4:analogWrite(3,0); analogWrite(11,0);digitalWrite(led0,LOW);digitalWrite(led1,LOW);digitalWrite(led2,LOW);digitalWrite(led3,LOW); break; //puis mise en veuille
case 5: wdt_reset(); break; //remise à zero https://www.instructables.com/id/two-ways-to-reset-arduino-in-software/
}
}
///////////////////////////////////////////// Boucle correspondant à la fonction main
void loop() {
if (mode==4) {lcd .clear ();LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);}
// LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
//mode veuille
if (temps>1) //affichage tous les 100ms
{
Ba=analogRead(A0); //mesure tension
Ba=Ba/79; //
SOC=40*Ba-233; // cacul de l'etat de charge
lcd.setCursor(0,1); //colonne, ligne
lcd.print("SOC");
lcd.print(SOC);
barreled=(SOC/18)-1;
switch (barreled) {
case 0:digitalWrite(led0,LOW);digitalWrite(led1,LOW);digitalWrite(led2,LOW);digitalWrite(led3,LOW); break; //valeur deu courant dans la led principale
case 1:digitalWrite(led0,HIGH);digitalWrite(led1,LOW);digitalWrite(led2,LOW);digitalWrite(led3,LOW); break;
case 2:digitalWrite(led0,HIGH);digitalWrite(led1,HIGH);digitalWrite(led2,LOW);digitalWrite(led3,LOW); break;
case 3:digitalWrite(led0,HIGH);digitalWrite(led1,HIGH);digitalWrite(led2,HIGH);digitalWrite(led3,LOW); break;
case 4:digitalWrite(led0,HIGH);digitalWrite(led1,HIGH);digitalWrite(led2,HIGH);digitalWrite(led3,HIGH); break; }
I=analogRead(A1);
I=I/102;
lcd.setCursor(7,1);
lcd.print("I=");
lcd.print(I,1);
T=analogRead(A2); //mesure temperature
T=T/2;
lcd.setCursor(13,1);
lcd.print(T,0);
lcd.print(" ");
if ((T>90) && (mode==2)) {erreurT=Tc-T; Ic=Ic+erreurT*0.05;} //diminution du courant si la temperature atteint 90°C
if (mode==1 || mode==2 ) {lcd.setCursor(0,0);lcd.print("I"); } //limitation du courant à cause de la temperature
if (mode==3) {erreurT=Tc-T; Ic=Ic+erreurT*0.05 ;lcd.setCursor(0,0);lcd.print("T");} // regulation temperature
if (Ic>=2) {Ic=2; } // limitation du courant de la consigne
if (Ic<=0.35) {Ic=0.35; }
lcd.setCursor(1,0);
lcd.print(Ic);
erreur=Ic-I;
//Proportionnel=kp*erreur;
//derive=(erreur-erreurP)*kd; //derive=(erreur-erreur*Z^Ts)/Ts avec Ts=Tsampleur
//output=Proportionnel+Integral; //ce n'est pas la peine de divisée par Ts car si Ts est petit cela donne des valeurs enormes
Integral= Integral+erreur*ki;
if (Integral>=255) Integral=255;
if (Integral<=0) {Integral=0;}
PWM=Integral;
if (Ic==0) {PWM=0;}
lcd.setCursor(7,0);
lcd.print("PWM=");
lcd.print(PWM);
lcd.print(" ");
analogWrite(3,PWM); //broche et valeur PWM
//analogWrite(11,127);
temps1++;
if (temps1<2) {analogWrite(11,255); }
if (temps1>2) {analogWrite(11,0);temps1=0; }
temps=0;
}//temps>100
} // fin loop
Perspectives :
On pourrait aussi faire un mode qui gere l’eclairage en fonction de la lumière extérieure en mettant un capteur LDR sur le dessus de l’éclairage.
En effet en plein jour cela permettrait de couper l’éclairage. Attention, parfois on veut meme en plein jour ce faire voir. Donc, il faut garder les anciens modes.
Maintenant que le programme est effectué l’afficheur LCD peut etre retiré.
Etant donné que l’on a plus des sorties non utilisées, les 8 leds du barled pourraient etre utilisées sachant que leur consommation est dérisoire par rapport à la led de puissance
De plus à la place du LCD, la liaison serie pourrait exporter les dynamiques de la regulation de courant et de temperature pour optimiser la commande.