Donc, L’ESP32 consomme 2 fois plus que le pro mini 60mA…..
Mais, la led de l’éclairage arrière est activé pendant à 50ms sur 1 seconde, il est possible de le mettre en dép. sleep pendant 950ms.
Donc, la periode d’echantillonnage va passer à 1s
Donc sa consommation moyenne passerait de (5mA*0.95s+120mA*0.05s)=10mA
Par conséquent, à la place d’utiliser une routine d’interruption un delaysleep pourrait etre utiliser mais aussi pour l’Arduino nano
Arduino, Zigbee and Embedded Development: Sleeping Arduino - Part 4 Wake Up Via Internal Timer (donalmorrissey.blogspot.com)
Pour le TTGO le bouton S1 permettrait d’augmenter la consigne de courant et le bouton S2 de diminuer la consigne.
Le OLED permettrait d’afficher la consigne, la PWM, la tension batterie,
Son connecteur USB permettait de gere la charger de la batterie lithium de 1.2A.h (25mm*40mm*5mm) pour gagner de la place.
Dans le codage, un flag mettra l’allumage de la led pendant 5 seconde.
Un interrupteur sera utilisé pour que la batterie ne se decharge pas meme si la tension de la batterie est diminuée
Voici le code de l’eclairage pour canal N et regulation de courant
#include
#include
#include "BluetoothSerial.h"
BluetoothSerial SerialBT;
TFT_eSPI tft = TFT_eSPI(); //library 1,4" color 135, 240
String lire;
String myChar;
int a;
const int ledPin32 = 32; //
const int ledChannel = 2;
const float vref=1100;
float consigne=0.2;
float courant;
float tensionbatt;
float erreur;
float Integral=512; //initialisation
const float ki =1;
int PWM;
byte flag=10;
#define ADC_PIN 34
#define S1 0 //fonctionne à 0L, switch
#define S2 35 //key
//********************************
void espDelay(int ms)
{ esp_sleep_enable_timer_wakeup(ms * 1000);
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON);
esp_light_sleep_start(); }
void setup() {
pinMode(33, OUTPUT);
pinMode(14, OUTPUT); //power EN
pinMode(33, OUTPUT);
pinMode(2, INPUT);
pinMode(34, INPUT); //batterie
pinMode(35, INPUT); //S2
Serial.begin(9600);
SerialBT.begin("ESP32test"); //Bluetooth device name
tft.init();
tft.setRotation(0); //format portrait a l'endroit
tft.fillScreen(TFT_BLACK);
tft.setTextColor(TFT_WHITE,TFT_BLACK); //raffraichi l'ecriture avec fond noir
ledcSetup(ledChannel, 78000, 10); //PWM 78kHz 10bits
ledcAttachPin(ledPin32, ledChannel); //broche 32 et 22 Ok 36,37 ne fonctionne pas
analogReadResolution(12); //12 bits
}
void loop() {
if (!(digitalRead(S1))) {consigne=consigne+0.1;flag=6; tft.fillScreen(TFT_BLACK); }
if (!(digitalRead(S2))) {consigne=consigne-0.1;flag=6; tft.fillScreen(TFT_BLACK); }
if (consigne>=1) {consigne=1;}
if (consigne<=0.1) {consigne=0.1;}
if (flag==0) {
tft.fillScreen(TFT_RED);
ledcWrite(ledChannel, PWM);
digitalWrite(14,0);
courant=analogRead(2);
courant=(courant*3.65)/(4096*0.5);
erreur=consigne-courant;
Integral= Integral+erreur*ki;
if (Integral>=1023) Integral=1023;
if (Integral<=0) {Integral=0;}
PWM=Integral;
espDelay(48); //reste le temps allumé la led avec le programme precedent
ledcWrite(ledChannel, 0); //extinction de la led pendant 950ms
espDelay(950); }
if (flag>0) { //
digitalWrite(33,1);
PWM=512;
ledcWrite(ledChannel,PWM); //ledcWrite(Channel, dutyCycle); PWM=1 1024 10 bits 78kHz
digitalWrite(14,1); //lecture battery
flag--;
tft.setTextColor(TFT_BLUE,TFT_BLACK);
tft.setCursor(0, 0, 2);// (x,y,taille)
tft.println("IUT GEII Soissons");
tft.setCursor(0, 16, 4); //taille paire
tft.setTextColor(TFT_RED,TFT_BLACK); //(couleur police,background police)
tft.print("IC=");tft.print(consigne,2);
tft.setTextColor(TFT_WHITE,TFT_BLACK);
courant=analogRead(2); //https://randomnerdtutorials.com/esp32-adc-analog-read-arduino-ide/
courant=(courant*3.65)/(4096*0.5); //12bits analogSetSamples (8) 0.5ohms
tft.setCursor(0, 40, 4); // (x,y,taille) duree 2ms
tft.print("I=");tft.print(courant,2); //4 cararcters 1ms
erreur=consigne-courant;
Integral= Integral+erreur*ki;
if (Integral>=1023) Integral=1023;
if (Integral<=0) {Integral=0;}
PWM=Integral;
tft.setCursor(0, 40, 4);
tft.print("PWM=");tft.print(PWM);
tensionbatt=analogRead(ADC_PIN); //34 interne, pont diviseur par 2 (100Kohm)
tensionbatt=(tensionbatt*2*3.3*vref)/(4095*1000); //Vref=1.1V sans batterie ce seria la tension Vbus
tft.setCursor(0, 70, 4);// (x,y,taille)
tft.print("Vbat=");tft.print(tensionbatt,3);
digitalWrite(33,0);
delay(40); //reste le temps allumé la led avec le programme precedent
ledcWrite(ledChannel, 0); //extinction de la led pendant 950ms
delay(950); }
}//fin loop
le courant moyen de decharge correspondra à l'equation suivante exemple pour une consigne de 0.5A
(5mA*0.95s+(120mA+consigneLEDcourant)*0.05s)=0.035A
donc le temps de decharge pour une batterie de 1.2A.H sera de 33heures ce qui est tres honorable.
pourrait on utiliser le OLED comme eclairage arriere ?
à 10cm, l'eclairage OLED allumé rouge fournit 6 lux.
avec le back led , l'eclairage est de 7.5lux à 10cm ce qui est négligeable.
Il y a plusieurs façons de connaitre le temps restant de fonctionnement.
Mais en voici 1 :
En utilisant la capacité énergétique et divisé par le courant moyen estimé
La capacité énergétique peut être déduit de la tension de la batterie qui est à 100% pour 4.2V et 0% à 3V