L’éclairage de velo peut avoir de nombreuses options.
D’ailleurs, le post suivant l’avait démontré, mais ce post est parti dans tous les sens
Donc, j’ai relancé 3 équipes d’étudiants d’IUT génie électrique de Soissons avec des options différentes en utilisant des micro differents n’utilisant que de nombreuses leds faibles puissance et faible angle émissivité pour augmenter la valeur de l’eclairement.
Pour synthétiser tout ce qu’il y avait sur le lien du forum précédent un blog a été créé
Les étudiants doivent présenter leurs méthodes, leurs résultats et des explications de leurs différents programmes pour faire un tuto pour que d’autres personnes réalisent un éclairage à led celon leurs besoins et connaitre les limites de leurs éclairages avec le dossier suivant
pour le but premiere année
https://www.fichier-doc.fr/2022/04/25/sae-eclairage-led-pwm-1er-annee-2022/
pour le BUT deuxieme année
Le dossier précèdent présente le cahier des charges, le typons, les schémas électrique et le choix des composants
Exemple pour l’ESP32 avec une résistance shunt de 0.1 ohms donc un ampli de 10 pour améliorer la précision de la mesure courant.
Voici le schéma electrique et le typon
Voici les résultats avec l’éclairage utilisant un ESP32 avec 18 leds de 8° de 65candela demandant un courant de 0.9A.
Avec le programme en boucle ouverte suivant
//eclairage avant TTGO+OLED+18 LED
#include <TFT_eSPI.h>
#include <SPI.h>
// #include <EEPROM.h>
TFT_eSPI tft = TFT_eSPI(); // Invoke library
#define S1 0 // fonctionne à 0L BP gauche
#define S2 35 // BP droite
#define ADC_PIN 34 // tension batterie
RTC_DATA_ATTR bool flag=0,flagT; //save data sleep
RTC_DATA_ATTR int wakeup_reason;
RTC_DATA_ATTR float tensionbatt,consigne, courant, courant1, erreur;
RTC_DATA_ATTR unsigned int PWM, compteur1;
RTC_DATA_ATTR byte compteur,i ;
RTC_DATA_ATTR float courantled ;
const int ledChannel = 1;
void setup() {
pinMode(ADC_PIN, INPUT); //mesure de la tension batterie
pinMode(2, INPUT); //mesure courant
pinMode(S2, INPUT_PULLUP);
pinMode(14, OUTPUT); //mesure du temps à l'oscillo
pinMode(26, OUTPUT);
digitalWrite(14,1);
tft.init();
tft.setRotation(0); //format portrait a l'endroit
Serial.begin(115200);
tft.fillScreen(TFT_BLACK);
tft.setTextColor(TFT_WHITE,TFT_BLACK);
analogReadResolution(12); //12 bits
ledcSetup(ledChannel, 64000, 10); //PWM 64kHz 10bits
ledcAttachPin(32, 1); //broche 32 PWM, chanel 1
PWM=1023;
ledcWrite(ledChannel,PWM); //blocage transistor
}
void loop() {
//comande de la LED en boucle ouverte
if (digitalRead(S1)==0) {PWM=PWM-20;delay(100);}
if (digitalRead(S1)==1) {compteur=0;}
if (!(digitalRead(S2))) {compteur;PWM=PWM+20;delay(100);} //consigne=consigne-0.1;
if (PWM>=1023) {PWM=1023;}
if (PWM<=10) {PWM=20;}
//si appuie du S2 plus de 15 secondes (15 fois la loop )alors mise en veuille pour recharge batterie
if (compteur>=15){
esp_sleep_disable_wakeup_source(ESP_SLEEP_WAKEUP_TIMER); //reveille par le RESET
esp_deep_sleep_start(); //sleep le oled
}
//mise en veuille si batterie < à 3.2
/* if (tensionbatt<=3.2) {
esp_sleep_enable_ext0_wakeup(GPIO_NUM_0,0);
esp_deep_sleep_start(); //sleep le oled
}
*/
tensionbatt=analogRead(ADC_PIN); //34 interne, pont diviseur par 2 (100Kohm)
tensionbatt=(tensionbatt*2*3.63)/(4095);
for (i=0; i <= 10; i++) { //boucle de ?ms
if ( digitalRead(26)== 1 ) {digitalWrite(26,LOW);} else {digitalWrite(26,HIGH);}
courant=analogRead(2); //resistance shunt de 0.1ohm*10 ampli
courant1=(courant/1400); //mesure un courant max de 14.6A
// Serial.print(courant,3);Serial.print(";");Serial.println(PWM);
/*
erreur=consigne-courantled;
Integral= Integral+erreur*10; //Integral= Integral+erreur*ki;
if (Integral>=1023) Integral=1023;
if (Integral<=0) {Integral=0;}
PWM=Integral;
*/
ledcWrite(ledChannel,PWM);
delay (50); //1*50=>50ms
} //end for
//affichage tous les 50ms
tft.setCursor(0, 0, 4);// (x,y,taille) //durée 4ms
tft.print(tensionbatt,2);
tft.println("=V");
tft.print(courant1,3);
tft.println("=If");
tft.print(PWM);
tft.println("=PWM ");
}//end loop//eclairage avant TTGO+OLED+18 LED
#include <TFT_eSPI.h>
#include <SPI.h>
// #include <EEPROM.h>
TFT_eSPI tft = TFT_eSPI(); // Invoke library
#define S1 0 // fonctionne à 0L BP gauche
#define S2 35 // BP droite
#define ADC_PIN 34 // tension batterie
RTC_DATA_ATTR bool flag=0,flagT; //save data sleep
RTC_DATA_ATTR int wakeup_reason;
RTC_DATA_ATTR float tensionbatt,consigne, courant, courant1, erreur;
RTC_DATA_ATTR unsigned int PWM, compteur1;
RTC_DATA_ATTR byte compteur,i ;
RTC_DATA_ATTR float courantled ;
const int ledChannel = 1;
void setup() {
pinMode(ADC_PIN, INPUT); //mesure de la tension batterie
pinMode(2, INPUT); //mesure courant
pinMode(S2, INPUT_PULLUP);
pinMode(14, OUTPUT); //mesure du temps à l'oscillo
pinMode(26, OUTPUT);
digitalWrite(14,1);
tft.init();
tft.setRotation(0); //format portrait a l'endroit
Serial.begin(115200);
tft.fillScreen(TFT_BLACK);
tft.setTextColor(TFT_WHITE,TFT_BLACK);
analogReadResolution(12); //12 bits
ledcSetup(ledChannel, 64000, 10); //PWM 64kHz 10bits
ledcAttachPin(32, 1); //broche 32 PWM, chanel 1
PWM=1023;
ledcWrite(ledChannel,PWM); //blocage transistor
}
void loop() {
//comande de la LED en boucle ouverte
if (digitalRead(S1)==0) {PWM=PWM-20;delay(100);}
if (digitalRead(S1)==1) {compteur=0;}
if (!(digitalRead(S2))) {compteur;PWM=PWM+20;delay(100);} //consigne=consigne-0.1;
if (PWM>=1023) {PWM=1023;}
if (PWM<=10) {PWM=20;}
//si appuie du S2 plus de 15 secondes (15 fois la loop )alors mise en veuille pour recharge batterie
if (compteur>=15){
esp_sleep_disable_wakeup_source(ESP_SLEEP_WAKEUP_TIMER); //reveille par le RESET
esp_deep_sleep_start(); //sleep le oled
}
//mise en veuille si batterie < à 3.2
/* if (tensionbatt<=3.2) {
esp_sleep_enable_ext0_wakeup(GPIO_NUM_0,0);
esp_deep_sleep_start(); //sleep le oled
}
*/
tensionbatt=analogRead(ADC_PIN); //34 interne, pont diviseur par 2 (100Kohm)
tensionbatt=(tensionbatt*2*3.63)/(4095);
for (i=0; i <= 10; i++) { //boucle de ?ms
if ( digitalRead(26)== 1 ) {digitalWrite(26,LOW);} else {digitalWrite(26,HIGH);}
courant=analogRead(2); //resistance shunt de 0.1ohm*10 ampli
courant1=(courant/1400); //mesure un courant max de 14.6A
// Serial.print(courant,3);Serial.print(";");Serial.println(PWM);
/*
erreur=consigne-courantled;
Integral= Integral+erreur*10; //Integral= Integral+erreur*ki;
if (Integral>=1023) Integral=1023;
if (Integral<=0) {Integral=0;}
PWM=Integral;
*/
ledcWrite(ledChannel,PWM);
delay (50); //1*50=>50ms
} //end for
//affichage tous les 50ms
tft.setCursor(0, 0, 4);// (x,y,taille) //durée 4ms
tft.print(tensionbatt,2);
tft.println("=V");
tft.print(courant1,3);
tft.println("=If");
tft.print(PWM);
tft.println("=PWM ");
}//end loop