23-06-2024, 04:19 PM 
(Modification du message : 23-04-2025, 10:02 AM par Raphael591.
 Raison de la modification: Mise à jour
)
		
	
	
		MESSAGE MAJ SI NOUVELLE VERSION.
- 11/07/24 : Ecran 1, affichage T° au lieu et place de la version si sonde de température présente.
- 15/07/24 : Gestion bouton poussoir(on/off ou on avec extinction auto) ou capteur de présence (on avec extinction auto).
Source pour les versions antérieur à la v12 : https://uploadnow.io/f/WWgyH2n
- 12/10/24 : Adaptation version 12
- 05/12/24 : Condensé 1 seul écran : Affichage logo au démarrage. Ensuite Ecran 1 alternance première ligne : injection/heure routage et Ip niveau wifi
- 23/04/25 : Mise à jour suite à l'utilisation de la bib LovyanGFX par andré (Version >14.20)
Code d'affichage des infos du routeur pour écran OLED SH110X ET SSD1306
![[Image: Capture-d-cran-2025-04-23-005016.png]](https://i.ibb.co/whCyp5wg/Capture-d-cran-2025-04-23-005016.png)
Nécessite une version 14_20
Les lignes à ajouter dans solar_router_V...ino :
- "InitSSD();" après la ligne "Serial.println("Booting");"
- "OledAffiche();" après l'appel "EnergieQuotidienne();"
Créer un nouveau fichier (OLED.ino) dans le projet avec le code suivant :
A faire avant compilation du fichier :
- Commenter/dé-commenter les lignes suivantes en fonction de votre écran.
#define USE_SSD1306 1 //Pour les écrans SSD1306
//#define USE_SH110X 1 //Pour les écrans SH1106
- Définir les pin SDA,SCL pour l'écran : SDA_PIN et SCL_PIN ligne 34/35
- Si vous voulez gérer un bouton poussoir/capteur de présence pour affichage ou non, définir le pin du bouton/capteur : pinBtnOled ligne 45
Dans ce cas bouton ou capteur :
- Définir le statut de l'écran à off au démarrage "OledState=false;" ligne 43
- Définir le mode ligne 46, "ModeBtnOled" : 0 = bouton pour allumer/éteindre, 1 = Bouton/capteur pour allumer l'écran (Extinction auto après 40s)
1) Code
 
	
	
	
	
- 11/07/24 : Ecran 1, affichage T° au lieu et place de la version si sonde de température présente.
- 15/07/24 : Gestion bouton poussoir(on/off ou on avec extinction auto) ou capteur de présence (on avec extinction auto).
Source pour les versions antérieur à la v12 : https://uploadnow.io/f/WWgyH2n
- 12/10/24 : Adaptation version 12
- 05/12/24 : Condensé 1 seul écran : Affichage logo au démarrage. Ensuite Ecran 1 alternance première ligne : injection/heure routage et Ip niveau wifi
- 23/04/25 : Mise à jour suite à l'utilisation de la bib LovyanGFX par andré (Version >14.20)
Code d'affichage des infos du routeur pour écran OLED SH110X ET SSD1306
![[Image: Capture-d-cran-2025-04-23-005016.png]](https://i.ibb.co/whCyp5wg/Capture-d-cran-2025-04-23-005016.png)
Nécessite une version 14_20
Les lignes à ajouter dans solar_router_V...ino :
- "InitSSD();" après la ligne "Serial.println("Booting");"
- "OledAffiche();" après l'appel "EnergieQuotidienne();"
Créer un nouveau fichier (OLED.ino) dans le projet avec le code suivant :
A faire avant compilation du fichier :
- Commenter/dé-commenter les lignes suivantes en fonction de votre écran.
#define USE_SSD1306 1 //Pour les écrans SSD1306
//#define USE_SH110X 1 //Pour les écrans SH1106
- Définir les pin SDA,SCL pour l'écran : SDA_PIN et SCL_PIN ligne 34/35
- Si vous voulez gérer un bouton poussoir/capteur de présence pour affichage ou non, définir le pin du bouton/capteur : pinBtnOled ligne 45
Dans ce cas bouton ou capteur :
- Définir le statut de l'écran à off au démarrage "OledState=false;" ligne 43
- Définir le mode ligne 46, "ModeBtnOled" : 0 = bouton pour allumer/éteindre, 1 = Bouton/capteur pour allumer l'écran (Extinction auto après 40s)
1) Code
Code :
/***********************************
AFFICHAGE SUR SSD1306/SH110X
*************************************/
/*Reprise déclaration d'andré*/
//#include "EcranLED.h"
LGFXoled oled_screen;
LGFX_Sprite sprite(&oled_screen);  // Sprite = buffer secondaire dans lequel sera construite l'image à afficher avant d'être envoyée vers l'écran OLED.
#define OLED_BLACK 0x0000
#define OLED_WHITE 0xFFFF
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET     4 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
// Définir les broches SDA et SCL personalisées pour écran
#define SDA_PIN 26 //26
#define SCL_PIN 25 //25
//Choisir son écran ICI ************************
#define USE_SSD1306 1 //Pour les écrans SSD1306
//#define USE_SH110X 1 //Pour les écrans SH1106
//Choix ecran *************************************
bool OLED_on = false; //Si problème avec l'écran, les procédures sont ignorées
//*******BOUTON OLED***********/
//Changement état gérer dans boucle affichage, déconseillé dans l'interruption.
//gestion de la latence du bouton
volatile unsigned long button_time = 0; 
int btn_latence = 250; // Latence en ms
volatile bool OledState=true; //Statut oled On/Off (Mettre à la valeur désiré au démarrage)
volatile bool OledChange=true; //Changement sur bouton, true = applique le statut OledState (affichage oui/non)
int pinBtnOled = 0; //Indiquer ici le pin du bouton pour gérer l'écran/capteur de présence
int ModeBtnOled = 0; // 0 = bouton poussoir (on/off sur écran), 1 = capteur présence ou bouton poussoir pour allumage on (off automatique)
unsigned long DureeAffichage = 40000; //Durée affichage 40 secondes
//******BOUTON OLED ***********/
int MATERIEL_ROUTAGE=-1; //Pour la recherche TRIAC OU RELAIS
const unsigned char bitmap_Sun[] PROGMEM = {
  0x10,0x84, // ...#....#....#..
  0x08,0x08, // ....#.......#...
  0x01,0xC0, // .......###......
  0x07,0xF0, // .....#######....
  0x0F,0xF8, // ....#########...
  0x6F,0xFB, // .##.#########.##
  0x0F,0xF8, // ....#########...
  0x07,0xF0, // .....#######....
  0x11,0xC4, // ...#...###...#..
  0x20,0x02, // ..#...........#.
};
const unsigned char bitmap_Off[] PROGMEM = {
  0x00,0x00, // ................
  0x00,0x00, // ................
  0x00,0x00, // ................
  0x00,0x00, // ................
  0x1F,0xF8, // ...##########...
  0x1F,0xF8, // ...##########...
  0x00,0x00, // ................
  0x00,0x00, // ................
  0x00,0x00, // ................
  0x00,0x00, // ................
};
const unsigned char bitmap_Signal1[] PROGMEM = {
  0x00,0x00, // ................
  0x00,0x00, // ................
  0x00,0x00, // ................
  0x00,0x00, // ................
  0x00,0x00, // ................
  0x00,0x00, // ................
  0x00,0x00, // ................
  0x00,0x00, // ................
  0x00,0x00, // ................
  0x00,0x00, // ................
  0x40,0x00, // .#..............
  0xDD,0xDC  // ##.###.###.###..
};
const unsigned char bitmap_Signal2[] PROGMEM = {
  0x00,0x00, // ................
  0x00,0x00, // ................
  0x00,0x00, // ................
  0x00,0x00, // ................
  0x00,0x00, // ................
  0x00,0x00, // ................
  0x00,0x00, // ................
  0x04,0x00, // .....#..........
  0x0C,0x00, // ....##..........
  0x1C,0x00, // ...###..........
  0x5C,0x00, // .#.###..........
  0xDD,0xDC  // ##.###.###.###..
};
const unsigned char bitmap_Signal3[] PROGMEM = {
  0x00,0x00, // ................
  0x00,0x00, // ................
  0x00,0x00, // ................
  0x00,0x00, // ................
  0x00,0x40, // .........#......
  0x00,0xC0, // ........##......
  0x01,0xC0, // .......###......
  0x05,0xC0, // .....#.###......
  0x0D,0xC0, // ....##.###......
  0x1D,0xC0, // ...###.###......
  0x5D,0xC0, // .#.###.###......
  0xDD,0xDC  // ##.###.###.###..
};
const unsigned char bitmap_Signal4[] PROGMEM = {
  0x00,0x04, // .............#..
  0x00,0x0C, // ............##..
  0x00,0x1C, // ...........###..
  0x00,0x1C, // ...........###..
  0x00,0x5C, // .........#.###..
  0x00,0xDC, // ........##.###..
  0x01,0xDC, // .......###.###..
  0x05,0xDC, // .....#.###.###..
  0x0D,0xDC, // ....##.###.###..
  0x1D,0xDC, // ...###.###.###..
  0x5D,0xDC, // .#.###.###.###..
  0xDD,0xDC  // ##.###.###.###..
};
const unsigned char bitmap_Signal0[] PROGMEM = {
  0x03,0xE0, // ......#####.....
  0x1F,0xFC, // ...###########..
  0x3E,0x3E, // ..#####...#####.
  0x38,0x7E, // ..###....######.
  0x71,0xF7, // .###...#####.###
  0x73,0xC7, // .###..####...###
  0x77,0x87, // .###.####....###
  0x3F,0x0E, // ..######....###.
  0x3E,0x1E, // ..#####....####.
  0x1F,0xFC, // ...###########..
  0x03,0xE0, // ......#####.....
};
const unsigned char bitmap_Logo[] PROGMEM = {
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0x00,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0x01,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0x00,0x1F,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0x00,0x07,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0x03,0xC1,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0x3F,0xC0,0x7F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0xFF,0x00,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x01,0xFE,0x00,0x0F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x07,0xF8,0x00,0x03,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x0F,0xF0,0x60,0x61,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x3F,0xC0,0xE0,0x60,0x7F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x7F,0x80,0xE0,0x60,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0xFE,0x00,0xE0,0x60,0x0F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x01,0xFC,0x00,0xE0,0x60,0x07,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x01,0xF8,0x00,0xE0,0x60,0x03,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x01,0xF0,0x00,0xE0,0x60,0x01,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x01,0xE0,0x00,0xE0,0x60,0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x01,0xE0,0x00,0xE0,0x60,0x00,0x7C,0x03,0xFE,0x0E,0x07,0xF1,0xFF,0x8F,0xF0,0x00, 
  0x01,0xE0,0x00,0x60,0x60,0x00,0x7C,0x03,0xFF,0x1E,0x0F,0xF9,0xFF,0x8F,0xF8,0x00, 
  0x01,0xE0,0x00,0x00,0x00,0x00,0x7C,0x03,0xFE,0x3E,0x0F,0xFC,0xFF,0x8F,0xF8,0x00, 
  0x01,0xE0,0x01,0xFF,0xF8,0x00,0x7C,0x03,0x00,0x3E,0x0C,0x1C,0x18,0x0C,0x18,0x00, 
  0x01,0xE0,0x03,0xFF,0xFC,0x00,0x7C,0x03,0x00,0x06,0x0C,0x1C,0x18,0x0C,0x18,0x00, 
  0x01,0xE0,0x01,0xFF,0xF8,0x00,0x7C,0x03,0x00,0x06,0x0C,0x1C,0x18,0x0C,0x18,0x00, 
  0x01,0xE0,0x01,0xFF,0xF8,0x00,0x7C,0x03,0x00,0x06,0x0C,0x1C,0x18,0x0C,0x18,0x00, 
  0x01,0xE0,0x01,0xFF,0xF8,0x00,0x7C,0x03,0x00,0x06,0x0C,0x1C,0x18,0x0C,0x18,0x00, 
  0x01,0xE0,0x01,0xFF,0xF8,0x00,0x7C,0x03,0xF8,0x06,0x0F,0xFC,0x18,0x0F,0xF8,0x00, 
  0x01,0xE0,0x01,0xFF,0xF8,0x00,0x7C,0x03,0xF8,0x06,0x0F,0xFC,0x18,0x0F,0xF8,0x00, 
  0x01,0xE0,0x01,0xFF,0xF8,0x00,0x7C,0x03,0x00,0x06,0x0E,0x1C,0x18,0x0C,0x18,0x00, 
  0x01,0xE0,0x01,0xFF,0xF8,0x00,0x7C,0x03,0x00,0x06,0x0C,0x1C,0x18,0x0C,0x18,0x00, 
  0x01,0xE0,0x01,0xFF,0xF8,0x00,0x7C,0x03,0x00,0x06,0x0C,0x1C,0x18,0x0C,0x18,0x00, 
  0x01,0xE0,0x00,0xFF,0xF0,0x00,0x7C,0x03,0x00,0x06,0x0C,0x1C,0x18,0x0C,0x18,0x00, 
  0x01,0xE0,0x00,0xFF,0xF0,0x00,0x7C,0x03,0x00,0x06,0x0C,0x1C,0x18,0x0C,0x18,0x00, 
  0x01,0xE0,0x00,0x7F,0xE0,0x00,0x7C,0x03,0x00,0x0F,0x0C,0x1C,0x18,0x0E,0x38,0x00, 
  0x01,0xE0,0x00,0x3F,0xC0,0x00,0x7C,0x03,0x00,0x3F,0x8C,0x1C,0x18,0x0F,0xF8,0x00, 
  0x01,0xE0,0x00,0x0F,0x00,0x00,0x7C,0x03,0x00,0x3F,0x8C,0x0C,0x18,0x0F,0xF0,0x00, 
  0x01,0xE0,0x00,0x0F,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x01,0xE0,0x00,0x06,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x01,0xE0,0x00,0x06,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x01,0xE0,0x00,0x06,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x01,0xE0,0x00,0x1F,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x01,0xE0,0x00,0x7F,0xC0,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x01,0xE0,0x00,0xFF,0xF0,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x01,0xE0,0x01,0xFF,0xFC,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x01,0xE0,0x00,0x0F,0xFE,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x01,0xE0,0x00,0x03,0xFF,0x80,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x01,0xE0,0x0F,0xE0,0xFF,0xC0,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x01,0xF0,0x7F,0x80,0x3F,0xF1,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x01,0xF9,0xFF,0x00,0x1F,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0xFF,0xFC,0x00,0x07,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0xFF,0xF8,0x00,0x03,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x7F,0xE0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x1F,0xC0,0x00,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00  
};
int cligSun = 0;
int BoucleOled = 0; 
//Initialisation
void InitSSD(){
   //OLED init
  //Pour SSD1306
  #if(USE_SSD1306)
  oled_screen.LGFXoled_init(SDA_PIN, SCL_PIN, 1);  //SDA , SCL et SSD1306
  #endif
  //Pour écran SH110X
  #if(USE_SH110X)
  oled_screen.LGFXoled_init(SDA_PIN, SCL_PIN, 0);  //SDA , SCL et SSH1106
  #endif
 
  //FORCE RESET DE L'ECRAN SI PIN PARTICULIER POUR RESET
  if(OLED_RESET != -1) {
    pinMode (OLED_RESET, OUTPUT);
    digitalWrite(OLED_RESET, HIGH);
    digitalWrite(OLED_RESET, LOW);
    delay(100);
  }
  if (oled_screen.begin()) {
    OLED_on=true;
    oled_screen.setRotation(2);
    oled_screen.setBrightness(255);
    oled_screen.setTextFont(1);
    oled_screen.setTextColor(OLED_WHITE, OLED_BLACK);
    sprite.createSprite(128, 64);
    OledLogo();
    
    //Partie gestion bouton
    if(pinBtnOled > 0) {
      pinMode(pinBtnOled, INPUT_PULLUP);
      attachInterrupt(digitalPinToInterrupt(pinBtnOled), OledBouton, RISING) ;
      }
  }
}
//contenue écran 1
void Ecran1(int info = 0){
  
  if(OLED_on==false || !OledState) {
    return;
  }
  sprite.setTextSize(1);
  sprite.setTextColor(OLED_WHITE);
  sprite.setCursor(0,1);
  //Info première ligne (Ip, Injectée + Heure routé)
  switch (info)
  {
    case 0 :
      //IP
      if (WiFi.status() == WL_CONNECTED) {
        sprite.print(WiFi.localIP().toString());
      }
      else {
      (WiFi.getMode() == WIFI_STA)==false ? sprite.print(WiFi.softAPIP().toString()) :  sprite.print(F("Pas de wifi !"));
      }
      break;
    case 1 :
      //Info injection et heure routé
      //int v = (int) ((EnergieJour_M_Injectee)/10); 
      //float f = v/100 ; 
      sprite.print("I ");sprite.print(EnergieJour_M_Injectee);sprite.print(" w");
      float H = 0;
      sprite.setCursor(64,0);
      if(MATERIEL_ROUTAGE != -1 ) H = LesActions[MATERIEL_ROUTAGE].H_Ouvre;
      sprite.print("H ");sprite.print(H);
      break;
  }
  //Ligne de séparation
  sprite.drawLine(0,13,128,13,OLED_WHITE);
  //Puissance sonde maison
  sprite.setCursor(0,16);
  sprite.println(F("Puissance"));
  sprite.setCursor(0,29);
  sprite.setTextSize(2);
  sprite.print(int(PuissanceS_M - PuissanceI_M));
  
  sprite.setTextSize(1);
  //Ouverture du triac/ssr
  int Ouv = -1;
  if(MATERIEL_ROUTAGE != -1) {
    Ouv = 100 - Retard[MATERIEL_ROUTAGE];
  }
  if(Ouv>0 && info==0) {
    //Icone clignote, signale le routage
    if(cligSun==0) {
      sprite.drawBitmap(92, 0, bitmap_Sun , 16, 10, OLED_WHITE); 
      cligSun=1;
    }
    else {
      cligSun=0;
      sprite.drawBitmap(92, 0, bitmap_Off , 16, 10, OLED_WHITE);
    }
  } 
  else { 
    //Pas de triac/relais...
  }
  sprite.setCursor(0,38);
  if(Ouv == -1) {
    sprite.setCursor(73,16);
    sprite.print(F("Ouv")); //Triac erreur
    sprite.drawRect(60, 16, 10, 33, OLED_WHITE);
    sprite.setCursor(82,30);
    sprite.print(F(" !"));
  } 
  else {
    //Affiche jauge Triac/Relais
    sprite.setCursor(72,16);
    sprite.print(F("Ouv"));
    sprite.drawRect(60, 16, 10, 33, OLED_WHITE);
    float t = (float(33)/100)*Ouv; 
    sprite.fillRect(60+2, 16+(33-int(t)), 10-4 , int(t), OLED_WHITE);
    sprite.setTextSize(2);
    sprite.setCursor(73,29);
    sprite.print(Ouv);
    sprite.setTextSize(1);
  }
  // Affichage de la température canal 0
  if (TemperatureValide[0] > 0){
    sprite.setCursor(0, 57);
    sprite.print(F("T "));
    sprite.print(int(temperature[0]));
  }
  else
  {
    sprite.setCursor(0, 57);
    sprite.print(F("V"));
    sprite.print(Version);
  }
  //Affichage durée de fonctionnement ESP32
  int T = int(millis() / 1000);
  float DureeOn = float(T) / 3600;
  String durOn=String(DureeOn)+"h";
  sprite.setCursor(108-(durOn.length()*6),57);
  sprite.print(durOn);
}
//barre d'action affiché en ecran 1
void BarreEtatDroite(int info = 0) { /*Affiche une barre d'état WIFI et mode action*/
   if(OLED_on==false || !OledState) {
    return;
  }
  sprite.setTextSize(1);
  sprite.setTextColor(OLED_WHITE);
  sprite.drawLine(110,13,110,64,OLED_WHITE); //Ligne séparatrice à droite
  //Niveau Wifi
  if (info == 0) {
    if (WiFi.status() == WL_CONNECTED) {
      //Icone niveau connection
      int NivSignal = int(WiFi.RSSI()) ;
      if (NivSignal<-80) {sprite.drawBitmap(112, 0, bitmap_Signal1 , 16, 12, OLED_WHITE); }
      else if(NivSignal<-60) {sprite.drawBitmap(112, 0, bitmap_Signal2 , 16, 12, OLED_WHITE); }
      else if(NivSignal<-45) {sprite.drawBitmap(112, 0, bitmap_Signal3 , 16, 12, OLED_WHITE); }
      else if(NivSignal<-30) {sprite.drawBitmap(112, 0, bitmap_Signal4 , 16, 12, OLED_WHITE); }
    }
    else {
      (WiFi.getMode() == WIFI_STA)==false ? sprite.drawBitmap(112, 0, bitmap_Signal0 , 16, 11, OLED_WHITE) : sprite.drawBitmap(112, 0, bitmap_Signal0 , 16, 11, OLED_WHITE);
    }
  }
  //Mode en cours du Triac/ssr...
  int Mode = 0; 
  float laTemperature = -120;
  if (TemperatureValide[0] > 0) {  //La température de ce canal est valide
    laTemperature = temperature[0];
  }
  if (MATERIEL_ROUTAGE != -1) Mode = LesActions[MATERIEL_ROUTAGE].TypeEnCours(HeureCouranteDeci, laTemperature, LTARFbin, Retard[MATERIEL_ROUTAGE]);
  sprite.setCursor(115,17);
  sprite.setTextColor(OLED_WHITE);
  if(Mode!=1){
    sprite.print(F("OF"));
  } 
  else {
    sprite.fillRect(114,16,13,10,OLED_WHITE);
    sprite.setTextColor(OLED_BLACK);
    sprite.print(F("OF"));
  }
  sprite.setCursor(115,29);
  sprite.setTextColor(OLED_WHITE);
  if(Mode!=2){
    sprite.print(F("ON"));
  } 
  else {
    sprite.fillRect(114,28,13,10,OLED_WHITE);
    sprite.setTextColor(OLED_BLACK);
    sprite.print(F("ON"));
  }
  sprite.setCursor(115,41);
  sprite.setTextColor(OLED_WHITE);
  if(Mode!=3){
    sprite.print(F("PW"));
  } 
  else {
    sprite.fillRect(114,40,13,10,OLED_WHITE);
    sprite.setTextColor(OLED_BLACK);
    sprite.print(F("PW"));
  }
  sprite.setCursor(115,53);
  sprite.setTextColor(OLED_WHITE);
  if(Mode!=4){
    sprite.print(F("TR"));
  } 
  else {
    sprite.fillRect(114,52,13,10,OLED_WHITE);
    sprite.setTextColor(OLED_BLACK);
    sprite.print(F("TR"));
  }
  sprite.setTextColor(OLED_WHITE);
}
//Affichage du logo
void OledLogo() {
  oled_screen.clear();
  oled_screen.drawBitmap(0, 0, bitmap_Logo , 128, 68, OLED_WHITE); 
}
//Gestion du bouton 
void OledBouton() {
   switch (ModeBtnOled)
   {
   case 0 :
      //Gestion bouton poussoir (allume/éteint)
      if (button_time > millis()) break;
      OledState = !OledState; // inverse l’état de la variable
      button_time = millis() + btn_latence;
      OledChange=true;
    break;
   
   case 1 :
      //Capteur ou bouton avec extinction auto (allume)
      if (button_time > millis()) break; //on garde la notion de latence
      if (OledState == false) {
        OledState = true; // inverse l’état de la variable
        button_time = millis() + btn_latence;
        OledChange=true;
      }
    break;
   default:
    break;
    }
}
//Procédure boucle des écrans
void OledAffiche(){
  if(OLED_on==false) {
    return;
  }
  if(ModeBtnOled==1 && OledState==true) {
    //Contrôle durée d'affichage
    if(button_time-btn_latence+DureeAffichage < millis()) {
      //Durée affichage dépassé, on éteint
      OledState=false;
      OledChange=true;
    }
  }
  sprite.fillScreen(0x0000); // Efface le buffer (l'écran)
  if (OledChange) {
    OledChange=false; //Changement traité
    if(OledState) {
      BoucleOled=0; //reprise début boucle écran
    }
    else {
      oled_screen.clear();
      oled_screen.display();
      return;
    }
  }
  if(MATERIEL_ROUTAGE == -1) {
    //Recherche matériel
     for (int i = 0; i < NbActions; i++) {
        if(LesActions[i].Actif != 0 && MATERIEL_ROUTAGE == -1 ) MATERIEL_ROUTAGE=i;
     }
  }
  if (BoucleOled <= 10 ) {
      //Ecran 1
      BarreEtatDroite(1); //Sans WIFI
      Ecran1(1); //Affiche avec entête info
      sprite.pushSprite(0, 0);  // Publie le buffer sur l'écran sans aucun scintillement
      BoucleOled++;
  } 
  else if (BoucleOled <= 12 ) {
      //Ecran 2
      BarreEtatDroite(0); //Avec niveau WIFI
      Ecran1(0); //Affiche avec entête IP 
      sprite.pushSprite(0, 0);  // Publie le buffer sur l'écran sans aucun scintillement
      BoucleOled++;
  }
  else {
    BoucleOled=0;
  }
} 
			 
						 
						 
			 
 
								

 

![[Image: Capture-d-cran-2024-06-23-183753.png]](https://i.ibb.co/48mh9rF/Capture-d-cran-2024-06-23-183753.png) 
 ![[Image: Capture-d-cran-2024-06-23-183753-2.png]](https://i.ibb.co/mzdGNcK/Capture-d-cran-2024-06-23-183753-2.png) 
 ![[Image: Capture-d-cran-2024-06-23-183753-3.png]](https://i.ibb.co/pR7cXXM/Capture-d-cran-2024-06-23-183753-3.png)