From e02c67421f913ee0eccf53fa174495dd57605d01 Mon Sep 17 00:00:00 2001 From: Vanpoucke Tony <46611481+TonyVpck@users.noreply.github.com> Date: Sun, 20 Feb 2022 21:10:50 +0100 Subject: [PATCH 01/10] Update M5Stack-Atom.ino --- M5Stack-Atom/M5Stack-Atom.ino | 317 ++++++++++++++++++++-------------- 1 file changed, 183 insertions(+), 134 deletions(-) diff --git a/M5Stack-Atom/M5Stack-Atom.ino b/M5Stack-Atom/M5Stack-Atom.ino index f4bdade..6a6f605 100644 --- a/M5Stack-Atom/M5Stack-Atom.ino +++ b/M5Stack-Atom/M5Stack-Atom.ino @@ -1,29 +1,31 @@ /** - * @file CarteM5StackAtom.ino - * @author Julie Brindejont (julie.brindejont@gmail.com) - * @brief Projet CO² - * @version 1.0.0 - * @date 2022-01-14 - * - * - * Projet sympatique menant sur la détection de CO² - * - * Pour cela, nous avons une carte M5Stack atom conncecté en Serial avec le capteur de CO² (Senseair S8). - * Le capteur de CO² communique avec le protocol Modbus. - * - * Après avoir reçus les infos du capteur, les led s'allumeront d'une certainne couleur. - * Blanc su CO² == 0 (en attente de la 1ère lecture.) - * Vert si CO² < 800ppm - * Orange si entre 800ppm et 1000 - * Rouge si supérieur à 1000 - * Rouge clignotant si Erreur détecter. - * - * Problématique n°1, je ne peut pas créer une interruption directement en gérant un appui de 3sec. - * @copyright Copyright (c) 2021 - */ + @file CarteM5StackAtom.ino + @author Julie Brindejont (julie.brindejont@gmail.com) + @contributor : Pierre-André Souville, Tony Vanpoucke. + @brief Projet CO² + @version 1.0.5 + @date 2022-02-12 + + Projet sympatique menant sur la détection de CO² + + Pour cela, nous avons une carte M5Stack atom conncecté en Serial avec le capteur de CO² (Senseair S8). + Le capteur de CO² communique avec le protocol Modbus. + + Après avoir reçus les infos du capteur, les led s'allumeront d'une certainne couleur. + Vert si CO² est bon + Orange si CO² est moyen + Rouge si CO² est mauvais + Rouge clignotant si CO² est très mauvais. + + Blanc au démarrage du capteur + Bleu au calibrage du capteur + "Neige" noir et blanc si le capteur est en défaut (branchement ou calibrage) + + @CC-BY-SA - 2022 +*/ #ifndef ARDUINO_M5Stack_ATOM - #error "Ce code est supporter uniquement sur les cartes m5stack atom." +#error "Ce code est supporter uniquement sur les cartes m5stack atom." #endif #include "SenseairS8.h" @@ -36,16 +38,17 @@ // ============================================================================================== //Définition des broches nécessaire au bon fonctionnement du code -#define PIN_SERIAL_RX 25 //Allant sur le port UART TxD du capteur -#define PIN_SERIAL_TX 21 //Allant sur le port UART RxD du capteur +#define PIN_SERIAL_RX 21 //Allant sur le port UART TxD du capteur +#define PIN_SERIAL_TX 25 //Allant sur le port UART RxD du capteur //Définition des seuil qualité de l'air +#define LIMITE_BASSE 300 #define AIR_MOYEN 800 #define AIR_MEDIOCRE 1000 #define AIR_VICIE 1500 //converti directement les secondes en milisecondes. -#define ATTENTE_CHECK_CO2 10 * 1000 //nb secondes * (milisecondes dans une secondes) +#define ATTENTE_CHECK_CO2 1 * 1000 //nb secondes * (milisecondes dans une secondes) //Temps (milisecondes) nécessaire à l'utilisateur pour demander une calibration du capteur #define TEMPS_BTN_APPUYER 3 * 1000 @@ -53,15 +56,17 @@ //Temps (milisecondes) pour clignoter si nécessaire les leds. #define TEMPS_CLIGNOTEMENT_LED 1 * 1000 -//Création d'une énumération pour définire la couleur des led's. -typedef enum { - White = 0xffffff, - Green = 0x00ff00, - Red = 0xff0000, - Orange = 0xff7f00 - -} ColorLeds; +//Tempo des animations du capateur (milisecondes, 15 par défaut)). +#define TEMPO_ANIMATION 15 +//Fourchette de tolérance graphique (plus cette valeur est petite plus le changement de couleur "collera" au niveau seuil) +#define ANIMATION_OFFSET 150 + +//Couleur du capteur lors d'un calibrage (0 = rouge / 100 = vert / 150 = bleu). +#define COULEUR_CALIBRATION 150 + +//Couleur du capteur lors d'un calibrage (0 = rouge / 100 = vert / 150 = bleu). +#define TEMPS_DEMARRAGE 5 // ============================================================================================== // == == @@ -70,12 +75,14 @@ typedef enum { // ============================================================================================== /** - * @brief dernier temps connue du controle de co² - * - */ + @brief dernier temps connue du controle de co² + +*/ unsigned long lastTimeCheckCO2 = 0; +unsigned long lastBlinkLedWarning = 0; -bool calibrationRequested = 0; +bool AnimSequence; +bool calibrationRequested; // ============================================================================================== // == == @@ -85,21 +92,21 @@ bool calibrationRequested = 0; //------------------------------- Prototype concernant le capteur ------------------------------- /** - * @brief Fonction émettant une requete basé sur le protocol Modbus, - * puis ce met en attente d'une réponse provenant du capteur CO² - * Cette fonction est un condancé des fonction 'send_Request', 'read_Response', et 'get_value' - * Elle renvoie le taux de CO² - * - * @return taux de CO² ou 99 si erreur. - */ + @brief Fonction émettant une requete basé sur le protocol Modbus, + puis ce met en attente d'une réponse provenant du capteur CO² + Cette fonction est un condancé des fonction 'send_Request', 'read_Response', et 'get_value' + Elle renvoie le taux de CO² + + @return taux de CO² ou 99 si erreur. +*/ // unsigned long getCO2(); void sendRequestCalibration(); /** - * @brief Controle le niveau de CO² - * - */ + @brief Controle le niveau de CO² + +*/ void checkCO2(unsigned long co2); //Fonction d'une boucle infinie faisant clignoter la led en cas d'erreur de branchement. @@ -107,15 +114,15 @@ void displayError(); //------------------------------- Prototype des fonctions appellée par le programme. ------------------------------- /** - * @brief Fonction nécessaire pour l'initialisation de l'arduino - * Dans notre cas cette fonction initialisera le capteur CO² - */ + @brief Fonction nécessaire pour l'initialisation de l'arduino + Dans notre cas cette fonction initialisera le capteur CO² +*/ void setup(); /** - * @brief Fonction nécessaire qui est appelé en boucle par le programme après le passage dans la fonction setupe - * Un peut comme le jeu du ping pong, le 'capteur' sera en écoute, et attend ces instruction. - */ + @brief Fonction nécessaire qui est appelé en boucle par le programme après le passage dans la fonction setupe + Un peut comme le jeu du ping pong, le 'capteur' sera en écoute, et attend ces instruction. +*/ void loop(); @@ -126,100 +133,142 @@ void loop(); // ============================================================================================== void sendRequestCalibration() { - //Serial.println("Demande calibration"); - byte stateLed = LOW; - unsigned long lastBlinkLedWarning = 0; - - while(senseairS8.progressCalibration()){ - //Vérification si des erreur ont été détecter pendant le calibrage. - if(senseairS8.checkError()) { - displayError(); - } else if(millis() - lastBlinkLedWarning >= TEMPS_CLIGNOTEMENT_LED ) { - if(stateLed == HIGH) { - M5.dis.clear(); - stateLed = LOW; - } else { - M5.dis.fillpix(ColorLeds::Orange); - stateLed = HIGH; - } - lastBlinkLedWarning = millis(); + //Serial.println("Demande calibration"); + byte stateLed = LOW; + + while (senseairS8.progressCalibration()) { + //Vérification si des erreur ont été détecter pendant le calibrage. + if (senseairS8.checkError()) { + displayError(); + } else { + //Animation du capteur durant le calibrage. + for (int i = 100; i < 200; i++) { + for (int j = 0; j < 25; j++) { + M5.dis.drawpix( j, CHSV( COULEUR_CALIBRATION, 255, i)); } + delay(TEMPO_ANIMATION); + } + for (int i = 200; i > 100; i--) { + for (int j = 0; j < 25; j++) { + M5.dis.drawpix( j, CHSV( COULEUR_CALIBRATION, 255, i)); + } + delay(TEMPO_ANIMATION); + } } - Serial.println("Calibration terminer sans erreur."); + } + Serial.println("Calibration terminée sans erreurs."); } void checkCO2(unsigned long co2) { - Serial.print("Qualiter de l'air : Air "); - if (co2 == 0) { - M5.dis.fillpix(ColorLeds::White); - Serial.println("En attente."); - } else if (co2 == 99) { - //Mettre les led dans un état de clignotement à l'infinie si une erreur est survenue. - displayError(); - } else if (co2 < AIR_MOYEN) { - //Permet d'afficher toute les led du m5stack atom en vert - M5.dis.fillpix(ColorLeds::Green); - Serial.println("Excellent."); - } else if (co2 >= AIR_MOYEN && co2 < AIR_MEDIOCRE) { - //Permet d'afficher toute les led du m5stack atom en orange - M5.dis.fillpix(ColorLeds::Orange); - Serial.println("Moyen."); - }else if (co2 >= AIR_MEDIOCRE && co2 < AIR_VICIE) { - //Permet d'afficher toute les led du m5stack atom en rouge - M5.dis.fillpix(ColorLeds::Red); - Serial.println("Mediocre."); - } else { - M5.dis.fillpix(ColorLeds::Red); - Serial.println("Vicie."); + Serial.print("Qualité de l'air : "); + + if (co2 < LIMITE_BASSE) { + //Mettre les led dans un état de clignotement à l'infinie si une erreur est survenue. + Serial.println("[Erreur de calibrage capteur]"); + displayError(); + + } else if (co2 >= LIMITE_BASSE && co2 < (AIR_MOYEN - ANIMATION_OFFSET) ) { + //Permet d'afficher toute les led du m5stack atom en vert + for (int i = 0; i < 25; i++) { + M5.dis.drawpix( i, CHSV( 100, 255, 255)); + } + Serial.println("Excellent."); + + } else if (co2 >= (AIR_MOYEN - ANIMATION_OFFSET) && co2 < (AIR_MEDIOCRE + ANIMATION_OFFSET) ) { + //Permet d'afficher toute les led du m5stack atom en orange + + int Co2Scale = map(co2, (AIR_MOYEN - ANIMATION_OFFSET), (AIR_MEDIOCRE + ANIMATION_OFFSET), 100, 0); + + for (int i = 0; i < 25; i++) { + M5.dis.drawpix( i, CHSV( Co2Scale, 255, 255)); + } + Serial.println("Moyen."); + + } else if (co2 >= (AIR_MEDIOCRE + ANIMATION_OFFSET) && co2 < AIR_VICIE) { + //Permet d'afficher toute les led du m5stack atom en rouge + for (int i = 0; i < 25; i++) { + M5.dis.drawpix( i, CHSV( 0, 255, 255)); + } + Serial.println("Mediocre."); + + } else { + Serial.println("Vicié."); + //Permet d'afficher une animation de led rouge cligonttante (seuil haut dépassé). + if (AnimSequence == 1) { + AnimSequence = 0; + for (int i = 0; i < 25; i++) { + M5.dis.drawpix( i, CHSV( 0, 0, 0)); + } } + else if (AnimSequence == 0) { + AnimSequence = 1; + for (int i = 0; i < 25; i++) { + M5.dis.drawpix( i, CHSV( 0, 255, 255)); + } + } + } } + void displayError() { - while(1) { - M5.dis.fillpix(ColorLeds::Red); - delay(TEMPS_CLIGNOTEMENT_LED); - M5.dis.clear(); - delay(TEMPS_CLIGNOTEMENT_LED); - } + while (1) { + //Permet d'afficher une animation infinie d'erreur (nécéssitera de redébrancher le capteur). + int PixNum = random(0, 25); + int NoisePix = random(20, 200); + M5.dis.drawpix( PixNum, CHSV( 0, 0, NoisePix)); + delay(TEMPO_ANIMATION); + } } void setup() { - // ports série et de communication capteur - M5.begin(true,false,true); - //M5.Btn - Serial1.begin(9600, SERIAL_8N1, PIN_SERIAL_RX, PIN_SERIAL_TX); - checkCO2(0); //Mise de la led en attente. - //attachInterrupt(39, eventInterruptPushButton, FALLING); + // ports série et de communication capteur + M5.begin(true, false, true); + //M5.Btn + Serial1.begin(9600, SERIAL_8N1, PIN_SERIAL_RX, PIN_SERIAL_TX); + Serial.println("En attente."); + //Animation du capteur à son démarrage. + for (int x = 0; x < TEMPS_DEMARRAGE; x++) { + for (int i = 120; i < 255; i++) { + for (int j = 0; j < 25; j++) { + M5.dis.drawpix( j, CHSV( 0, 0, i)); + } + delay(TEMPO_ANIMATION); + } + for (int i = 255; i > 120; i--) { + for (int j = 0; j < 25; j++) { + M5.dis.drawpix( j, CHSV( 0, 0, i)); + } + delay(TEMPO_ANIMATION); + } + } } - void loop() { - - //Récupération du taux de CO² toutes les 10 secondes définis sur la constante 10000 - //millis actuelle - dernier temps connus >= 10000 - if(millis() - lastTimeCheckCO2 >= ATTENTE_CHECK_CO2 && !calibrationRequested) { - //Récupération du taux de CO² - unsigned long co2 = senseairS8.reqCO2(); - Serial.println("CO² = " + String(co2)); - - //Controle du co2 - checkCO2(co2); - lastTimeCheckCO2 = millis(); - - } else if(calibrationRequested) { - //Demande de calibration - sendRequestCalibration(); - calibrationRequested = 0; - //M5.update();//Forcer la mise à jour de façon précose affin d'empêcher une 2 - } - //Cette instruction met à jour l'état du boutton. - M5.update(); - - //Si le boutton est appuyer pendant plus de x secondes alors, nous demandons une calibration du capteur. - if(M5.Btn.pressedFor(TEMPS_BTN_APPUYER) && !calibrationRequested) { - Serial.println("Calibration du capteur demander"); - calibrationRequested = 1; - } -} \ No newline at end of file + //Récupération du taux de CO² toutes les x secondes définis sur la constante 10000 + //millis actuelle - dernier temps connus >= 10000 + if (millis() - lastTimeCheckCO2 >= ATTENTE_CHECK_CO2 && !calibrationRequested) { + //Récupération du taux de CO² + unsigned long co2 = senseairS8.reqCO2(); + Serial.println("CO² = " + String(co2)); + + //Controle du co2 + checkCO2(co2); + lastTimeCheckCO2 = millis(); + + } else if (calibrationRequested) { + //Demande de calibration + sendRequestCalibration(); + calibrationRequested = 0; + } + + //Cette instruction met à jour l'état du boutton. + M5.update(); + + //Si le boutton est appuyer pendant plus de x secondes alors, nous demandons une calibration du capteur. + if (M5.Btn.pressedFor(TEMPS_BTN_APPUYER) && !calibrationRequested) { + Serial.println("Calibration du capteur demandée"); + calibrationRequested = 1; + } +} From 96f4b8c09dab6f30e536c9892582fdca464a4715 Mon Sep 17 00:00:00 2001 From: Vanpoucke Tony <46611481+TonyVpck@users.noreply.github.com> Date: Sun, 20 Feb 2022 21:36:17 +0100 Subject: [PATCH 02/10] Update M5Stack-Atom.ino From 6e6046477074845c041a141596c2dfab0a444d08 Mon Sep 17 00:00:00 2001 From: Vanpoucke Tony <46611481+TonyVpck@users.noreply.github.com> Date: Tue, 22 Feb 2022 21:02:08 +0100 Subject: [PATCH 03/10] Update M5Stack-Atom.ino --- M5Stack-Atom/M5Stack-Atom.ino | 239 +++++++++++++++++++--------------- 1 file changed, 132 insertions(+), 107 deletions(-) diff --git a/M5Stack-Atom/M5Stack-Atom.ino b/M5Stack-Atom/M5Stack-Atom.ino index 6a6f605..336dd0f 100644 --- a/M5Stack-Atom/M5Stack-Atom.ino +++ b/M5Stack-Atom/M5Stack-Atom.ino @@ -6,26 +6,26 @@ @version 1.0.5 @date 2022-02-12 - Projet sympatique menant sur la détection de CO² + Projet sympathique menant sur la détection de CO² - Pour cela, nous avons une carte M5Stack atom conncecté en Serial avec le capteur de CO² (Senseair S8). + Pour cela, nous avons une carte M5Stack atom conncectée en Serial avec le capteur de CO² (Senseair S8). Le capteur de CO² communique avec le protocol Modbus. - Après avoir reçus les infos du capteur, les led s'allumeront d'une certainne couleur. + Après avoir reçu les infos du capteur, les led s'allumeront d'une certaine couleur. Vert si CO² est bon Orange si CO² est moyen - Rouge si CO² est mauvais + Rouge si CO² est mauvais Rouge clignotant si CO² est très mauvais. Blanc au démarrage du capteur Bleu au calibrage du capteur "Neige" noir et blanc si le capteur est en défaut (branchement ou calibrage) - + @CC-BY-SA - 2022 */ #ifndef ARDUINO_M5Stack_ATOM -#error "Ce code est supporter uniquement sur les cartes m5stack atom." +#error "Ce code est supporté uniquement sur les cartes m5stack atom." #endif #include "SenseairS8.h" @@ -33,55 +33,60 @@ // ============================================================================================== // == == -// == CONSTANTES == +// == VARIABLES == // == == // ============================================================================================== -//Définition des broches nécessaire au bon fonctionnement du code +//Définition des broches nécessaires au bon fonctionnement du code #define PIN_SERIAL_RX 21 //Allant sur le port UART TxD du capteur #define PIN_SERIAL_TX 25 //Allant sur le port UART RxD du capteur -//Définition des seuil qualité de l'air -#define LIMITE_BASSE 300 -#define AIR_MOYEN 800 -#define AIR_MEDIOCRE 1000 -#define AIR_VICIE 1500 +//Définition des seuils de qualité de l'air +#define LIMITE_BASSE 300 // Si en dessous passe le capteur en erreur (air extérieur 400 PPM en moyenne) +#define AIR_MOYEN 800 // Capteur en vert avant cette limite de PPM +#define AIR_MEDIOCRE 1000 // Capteur en orange avant cette limite de PPM +#define AIR_VICIE 1500 // Capteur en rouge avant cette limite de PPM (au delà il clignotte) -//converti directement les secondes en milisecondes. -#define ATTENTE_CHECK_CO2 1 * 1000 //nb secondes * (milisecondes dans une secondes) +//converti directement les secondes en millisecondes. +#define ATTENTE_CHECK_CO2 1 * 1000 //nb secondes * (milisecondes dans une secondes) //Temps (milisecondes) nécessaire à l'utilisateur pour demander une calibration du capteur #define TEMPS_BTN_APPUYER 3 * 1000 -//Temps (milisecondes) pour clignoter si nécessaire les leds. +//Temps (milisecondes) pour faire clignoter si nécessaire les leds. #define TEMPS_CLIGNOTEMENT_LED 1 * 1000 -//Tempo des animations du capateur (milisecondes, 15 par défaut)). +//Tempo des animations du capteur (milisecondes, 15 par défaut)). #define TEMPO_ANIMATION 15 -//Fourchette de tolérance graphique (plus cette valeur est petite plus le changement de couleur "collera" au niveau seuil) +//Fourchette de tolérance graphique (plus cette valeur est petite, plus le changement de couleur "collera" au niveau seuil) #define ANIMATION_OFFSET 150 //Couleur du capteur lors d'un calibrage (0 = rouge / 100 = vert / 150 = bleu). #define COULEUR_CALIBRATION 150 -//Couleur du capteur lors d'un calibrage (0 = rouge / 100 = vert / 150 = bleu). -#define TEMPS_DEMARRAGE 5 +//Temps de démarrage du capteur en "tour d'animations" (1 = 4secondes / 5 = 20 secondes). +#define TEMPS_DEMARRAGE 5 // ============================================================================================== // == == -// == VARIABLES == +// == CONSTANTES == // == == // ============================================================================================== /** - @brief dernier temps connue du controle de co² - + @brief dernier temps connu du contrôle de co² */ unsigned long lastTimeCheckCO2 = 0; -unsigned long lastBlinkLedWarning = 0; +/** + @brief permet le clignotement des animations +*/ bool AnimSequence; + +/** + @brief dernier temps connu du contrôle de co² +*/ bool calibrationRequested; // ============================================================================================== @@ -90,40 +95,40 @@ bool calibrationRequested; // == == // ============================================================================================== -//------------------------------- Prototype concernant le capteur ------------------------------- +//------------------------------- Prototype des fonctions appellée par le programme. ------------------------------- /** - @brief Fonction émettant une requete basé sur le protocol Modbus, - puis ce met en attente d'une réponse provenant du capteur CO² - Cette fonction est un condancé des fonction 'send_Request', 'read_Response', et 'get_value' - Elle renvoie le taux de CO² + @brief Fonction nécessaire pour l'initialisation de l'arduino + Dans notre cas cette fonction initialisera le capteur CO² +*/ +void setup(); - @return taux de CO² ou 99 si erreur. +/** + @brief Fonction nécessaire qui est appelée en boucle par le programme après le passage dans la fonction setup + Un peu comme le jeu du ping pong, le 'capteur' sera en écoute, et attend ses instructions. */ -// unsigned long getCO2(); +void loop(); -void sendRequestCalibration(); +//------------------------------- Prototype concernant le capteur ------------------------------- /** - @brief Controle le niveau de CO² - + @brief Fonction émettant une requête basée sur le protocol Modbus, + puis se met en attente d'une réponse provenant du capteur CO² + Cette fonction est un condensé des fonctions 'send_Request', 'read_Response', et 'get_value' + Elle renvoie le taux de CO² + @return taux de CO² ou 99 si erreur. */ -void checkCO2(unsigned long co2); -//Fonction d'une boucle infinie faisant clignoter la led en cas d'erreur de branchement. -void displayError(); +void sendRequestCalibration(); -//------------------------------- Prototype des fonctions appellée par le programme. ------------------------------- /** - @brief Fonction nécessaire pour l'initialisation de l'arduino - Dans notre cas cette fonction initialisera le capteur CO² + @brief Contrôle le niveau de CO² */ -void setup(); +void checkCO2(unsigned long co2); /** - @brief Fonction nécessaire qui est appelé en boucle par le programme après le passage dans la fonction setupe - Un peut comme le jeu du ping pong, le 'capteur' sera en écoute, et attend ces instruction. + @brief Fonction d'une boucle infinie en cas d'erreur de branchement. */ -void loop(); +void displayError(); // ============================================================================================== @@ -132,12 +137,71 @@ void loop(); // == == // ============================================================================================== +// ======================== CONFIGURATION CAPTEUR : VOID SETUP ======================== // + +void setup() { + // ports série et de communication capteur + M5.begin(true, false, true); + //M5.Btn + Serial1.begin(9600, SERIAL_8N1, PIN_SERIAL_RX, PIN_SERIAL_TX); + Serial.println("En attente."); + //Animation du capteur à son démarrage. + for (int x = 0; x < TEMPS_DEMARRAGE; x++) { + for (int i = 120; i < 255; i++) { + for (int j = 0; j < 25; j++) { + M5.dis.drawpix( j, CHSV( 0, 0, i)); + } + delay(TEMPO_ANIMATION); + } + for (int i = 255; i > 120; i--) { + for (int j = 0; j < 25; j++) { + M5.dis.drawpix( j, CHSV( 0, 0, i)); + } + delay(TEMPO_ANIMATION); + } + } +} + +// ======================== FONCTIONNEMENT CAPTEUR : VOID LOOP ======================== // + +void loop() { + + //Récupération du taux de CO² toutes les x secondes défini sur la constante 10000 + //milliseconde actuelle - dernier temps connu >= 10000 + if (millis() - lastTimeCheckCO2 >= ATTENTE_CHECK_CO2 && !calibrationRequested) { + //Récupération du taux de CO² + unsigned long co2 = senseairS8.reqCO2(); + Serial.println(); + Serial.println("CO² = " + String(co2)); + + //Controle du co2 + checkCO2(co2); + lastTimeCheckCO2 = millis(); + + } else if (calibrationRequested) { + //Demande de calibration + sendRequestCalibration(); + calibrationRequested = 0; + } + + //Cette instruction met à jour l'état du bouton. + M5.update(); + + //Si le bouton est appuyé pendant plus de x secondes, alors nous demandons une calibration du capteur. + if (M5.Btn.pressedFor(TEMPS_BTN_APPUYER) && !calibrationRequested) { + Serial.println("Calibration du capteur demandée"); + calibrationRequested = 1; + } +} + +// ======================== CALIBRATION DU CAPTEUR CO2 ======================== // + void sendRequestCalibration() { - //Serial.println("Demande calibration"); + byte stateLed = LOW; while (senseairS8.progressCalibration()) { - //Vérification si des erreur ont été détecter pendant le calibrage. + //Vérification si des erreurs ont été détectées pendant le calibrage. if (senseairS8.checkError()) { displayError(); } else { @@ -156,27 +220,35 @@ void sendRequestCalibration() { } } } - Serial.println("Calibration terminée sans erreurs."); + Serial.println("Calibration terminée sans erreur."); } +// ======================== INTERPRETATION DU CAPTEUR CO2 ======================== // + void checkCO2(unsigned long co2) { Serial.print("Qualité de l'air : "); + // ============ CAPTEUR : EN ERREUR // code couleur : "neige" noir et blanc ==== // + if (co2 < LIMITE_BASSE) { - //Mettre les led dans un état de clignotement à l'infinie si une erreur est survenue. + //Mettre les leds dans un état de clignotement à l'infini si une erreur est survenue. Serial.println("[Erreur de calibrage capteur]"); displayError(); + // ============ CAPTEUR : AIR EXCELLENT // code couleur : vert ==== // + } else if (co2 >= LIMITE_BASSE && co2 < (AIR_MOYEN - ANIMATION_OFFSET) ) { - //Permet d'afficher toute les led du m5stack atom en vert + //Permet d'afficher toutes les leds du m5stack atom en vert for (int i = 0; i < 25; i++) { M5.dis.drawpix( i, CHSV( 100, 255, 255)); } Serial.println("Excellent."); + // ============ CAPTEUR : AIR MOYEN // code couleur : orange ==== // + } else if (co2 >= (AIR_MOYEN - ANIMATION_OFFSET) && co2 < (AIR_MEDIOCRE + ANIMATION_OFFSET) ) { - //Permet d'afficher toute les led du m5stack atom en orange + //Permet d'afficher toutes les leds du m5stack atom en orange int Co2Scale = map(co2, (AIR_MOYEN - ANIMATION_OFFSET), (AIR_MEDIOCRE + ANIMATION_OFFSET), 100, 0); @@ -185,16 +257,19 @@ void checkCO2(unsigned long co2) { } Serial.println("Moyen."); + // ============ CAPTEUR : AIR MAUVAIS // code couleur : rouge ==== // + } else if (co2 >= (AIR_MEDIOCRE + ANIMATION_OFFSET) && co2 < AIR_VICIE) { - //Permet d'afficher toute les led du m5stack atom en rouge + //Permet d'afficher toutes les leds du m5stack atom en rouge for (int i = 0; i < 25; i++) { M5.dis.drawpix( i, CHSV( 0, 255, 255)); } - Serial.println("Mediocre."); + Serial.println("Médiocre."); + + // ============ CAPTEUR : AIR TRES MAUVAIS // code couleur : rouge clignotant ==== // } else { - Serial.println("Vicié."); - //Permet d'afficher une animation de led rouge cligonttante (seuil haut dépassé). + //Permet d'afficher une animation de led rouge clignotante (seuil haut dépassé). if (AnimSequence == 1) { AnimSequence = 0; for (int i = 0; i < 25; i++) { @@ -207,9 +282,12 @@ void checkCO2(unsigned long co2) { M5.dis.drawpix( i, CHSV( 0, 255, 255)); } } + Serial.println("Vicié."); } } +// ======================== ERREUR DU CAPTEUR CO2 ======================== // + void displayError() { while (1) { //Permet d'afficher une animation infinie d'erreur (nécéssitera de redébrancher le capteur). @@ -219,56 +297,3 @@ void displayError() { delay(TEMPO_ANIMATION); } } - -void setup() { - // ports série et de communication capteur - M5.begin(true, false, true); - //M5.Btn - Serial1.begin(9600, SERIAL_8N1, PIN_SERIAL_RX, PIN_SERIAL_TX); - Serial.println("En attente."); - //Animation du capteur à son démarrage. - for (int x = 0; x < TEMPS_DEMARRAGE; x++) { - for (int i = 120; i < 255; i++) { - for (int j = 0; j < 25; j++) { - M5.dis.drawpix( j, CHSV( 0, 0, i)); - } - delay(TEMPO_ANIMATION); - } - for (int i = 255; i > 120; i--) { - for (int j = 0; j < 25; j++) { - M5.dis.drawpix( j, CHSV( 0, 0, i)); - } - delay(TEMPO_ANIMATION); - } - } -} - - -void loop() { - - //Récupération du taux de CO² toutes les x secondes définis sur la constante 10000 - //millis actuelle - dernier temps connus >= 10000 - if (millis() - lastTimeCheckCO2 >= ATTENTE_CHECK_CO2 && !calibrationRequested) { - //Récupération du taux de CO² - unsigned long co2 = senseairS8.reqCO2(); - Serial.println("CO² = " + String(co2)); - - //Controle du co2 - checkCO2(co2); - lastTimeCheckCO2 = millis(); - - } else if (calibrationRequested) { - //Demande de calibration - sendRequestCalibration(); - calibrationRequested = 0; - } - - //Cette instruction met à jour l'état du boutton. - M5.update(); - - //Si le boutton est appuyer pendant plus de x secondes alors, nous demandons une calibration du capteur. - if (M5.Btn.pressedFor(TEMPS_BTN_APPUYER) && !calibrationRequested) { - Serial.println("Calibration du capteur demandée"); - calibrationRequested = 1; - } -} From 939948872c63d22735ee1e036330e42a583b35ab Mon Sep 17 00:00:00 2001 From: Vanpoucke Tony <46611481+TonyVpck@users.noreply.github.com> Date: Sat, 26 Feb 2022 19:45:09 +0100 Subject: [PATCH 04/10] Add files via upload --- M5Stack-Atom/MatrixDisplayNumbers.h | 136 ++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 M5Stack-Atom/MatrixDisplayNumbers.h diff --git a/M5Stack-Atom/MatrixDisplayNumbers.h b/M5Stack-Atom/MatrixDisplayNumbers.h new file mode 100644 index 0000000..0e5e104 --- /dev/null +++ b/M5Stack-Atom/MatrixDisplayNumbers.h @@ -0,0 +1,136 @@ +/** + * @file MatrixDisplayNumbers.h + * @author Pierro + * @brief Projet CO² Labfab + * @contributor : Tony Vanpoucke (animations). + * @version 1.1.0 + * @date 2022-02-24 + * + * Affichage de chiffres aux dimensions 3x5 leds + * + * @CC-BY-SA - 2022 + */ + +#include "M5Atom.h" + +#define TEMPO_AFFICHAGE 400 //Le temps d'affichage d'un chiffre en millisecondes +#define ENTRE_CHIFFRES 75 //Le temps de la pause entre chaque chiffre en millisecondes + +void displayMatrix(String co2,int colorVal) { + int co2Length = co2.length(); + + for(int i = 0; i < co2Length; i++) + { + char currentChar = co2.charAt(i); + + if(currentChar == '0') { + M5.dis.clear(); + delay(ENTRE_CHIFFRES); + M5.dis.drawpix( 0, CHSV( 0, 0, 0)); M5.dis.drawpix( 1, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 2, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 3, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 4, CHSV( 0, 0, 0)); + M5.dis.drawpix( 5, CHSV( 0, 0, 0)); M5.dis.drawpix( 6, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 7, CHSV( 0, 0, 0)); M5.dis.drawpix( 8, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 9, CHSV( 0, 0, 0)); + M5.dis.drawpix( 10, CHSV( 0, 0, 0)); M5.dis.drawpix( 11, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 12, CHSV( 0, 0, 0)); M5.dis.drawpix( 13, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 14, CHSV( 0, 0, 0)); + M5.dis.drawpix( 15, CHSV( 0, 0, 0)); M5.dis.drawpix( 16, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 17, CHSV( 0, 0, 0)); M5.dis.drawpix( 18, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 19, CHSV( 0, 0, 0)); + M5.dis.drawpix( 20, CHSV( 0, 0, 0)); M5.dis.drawpix( 21, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 22, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 23, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 24, CHSV( 0, 0, 0)); + delay(TEMPO_AFFICHAGE); + } + else if(currentChar == '1') + { + M5.dis.clear(); + delay(ENTRE_CHIFFRES); + M5.dis.drawpix( 0, CHSV( 0, 0, 0)); M5.dis.drawpix( 1, CHSV( 0, 0, 0)); M5.dis.drawpix( 2, CHSV( 0, 0, 0)); M5.dis.drawpix( 3, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 4, CHSV( 0, 0, 0)); + M5.dis.drawpix( 5, CHSV( 0, 0, 0)); M5.dis.drawpix( 6, CHSV( 0, 0, 0)); M5.dis.drawpix( 7, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 8, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 9, CHSV( 0, 0, 0)); + M5.dis.drawpix( 10, CHSV( 0, 0, 0)); M5.dis.drawpix( 11, CHSV( 0, 0, 0)); M5.dis.drawpix( 12, CHSV( 0, 0, 0)); M5.dis.drawpix( 13, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 14, CHSV( 0, 0, 0)); + M5.dis.drawpix( 15, CHSV( 0, 0, 0)); M5.dis.drawpix( 16, CHSV( 0, 0, 0)); M5.dis.drawpix( 17, CHSV( 0, 0, 0)); M5.dis.drawpix( 18, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 19, CHSV( 0, 0, 0)); + M5.dis.drawpix( 20, CHSV( 0, 0, 0)); M5.dis.drawpix( 21, CHSV( 0, 0, 0)); M5.dis.drawpix( 22, CHSV( 0, 0, 0)); M5.dis.drawpix( 23, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 24, CHSV( 0, 0, 0)); + delay(TEMPO_AFFICHAGE); + } + else if(currentChar == '2') + { + M5.dis.clear(); + delay(ENTRE_CHIFFRES); + M5.dis.drawpix( 0, CHSV( 0, 0, 0)); M5.dis.drawpix( 1, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 2, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 3, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 4, CHSV( 0, 0, 0)); + M5.dis.drawpix( 5, CHSV( 0, 0, 0)); M5.dis.drawpix( 6, CHSV( 0, 0, 0)); M5.dis.drawpix( 7, CHSV( 0, 0, 0)); M5.dis.drawpix( 8, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 9, CHSV( 0, 0, 0)); + M5.dis.drawpix( 10, CHSV( 0, 0, 0)); M5.dis.drawpix( 11, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 12, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 13, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 14, CHSV( 0, 0, 0)); + M5.dis.drawpix( 15, CHSV( 0, 0, 0)); M5.dis.drawpix( 16, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 17, CHSV( 0, 0, 0)); M5.dis.drawpix( 18, CHSV( 0, 0, 0)); M5.dis.drawpix( 19, CHSV( 0, 0, 0)); + M5.dis.drawpix( 20, CHSV( 0, 0, 0)); M5.dis.drawpix( 21, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 22, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 23, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 24, CHSV( 0, 0, 0)); + delay(TEMPO_AFFICHAGE); + } + else if(currentChar == '3') + { +M5.dis.clear(); + delay(ENTRE_CHIFFRES); + M5.dis.drawpix( 0, CHSV( 0, 0, 0)); M5.dis.drawpix( 1, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 2, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 3, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 4, CHSV( 0, 0, 0)); + M5.dis.drawpix( 5, CHSV( 0, 0, 0)); M5.dis.drawpix( 6, CHSV( 0, 0, 0)); M5.dis.drawpix( 7, CHSV( 0, 0, 0)); M5.dis.drawpix( 8, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 9, CHSV( 0, 0, 0)); + M5.dis.drawpix( 10, CHSV( 0, 0, 0)); M5.dis.drawpix( 11, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 12, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 13, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 14, CHSV( 0, 0, 0)); + M5.dis.drawpix( 15, CHSV( 0, 0, 0)); M5.dis.drawpix( 16, CHSV( 0, 0, 0)); M5.dis.drawpix( 17, CHSV( 0, 0, 0)); M5.dis.drawpix( 18, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 19, CHSV( 0, 0, 0)); + M5.dis.drawpix( 20, CHSV( 0, 0, 0)); M5.dis.drawpix( 21, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 22, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 23, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 24, CHSV( 0, 0, 0)); + delay(TEMPO_AFFICHAGE); + } + else if(currentChar == '4') + { +M5.dis.clear(); + delay(ENTRE_CHIFFRES); + M5.dis.drawpix( 0, CHSV( 0, 0, 0)); M5.dis.drawpix( 1, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 2, CHSV( 0, 0, 0)); M5.dis.drawpix( 3, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 4, CHSV( 0, 0, 0)); + M5.dis.drawpix( 5, CHSV( 0, 0, 0)); M5.dis.drawpix( 6, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 7, CHSV( 0, 0, 0)); M5.dis.drawpix( 8, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 9, CHSV( 0, 0, 0)); + M5.dis.drawpix( 10, CHSV( 0, 0, 0)); M5.dis.drawpix( 11, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 12, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 13, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 14, CHSV( 0, 0, 0)); + M5.dis.drawpix( 15, CHSV( 0, 0, 0)); M5.dis.drawpix( 16, CHSV( 0, 0, 0)); M5.dis.drawpix( 17, CHSV( 0, 0, 0)); M5.dis.drawpix( 18, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 19, CHSV( 0, 0, 0)); + M5.dis.drawpix( 20, CHSV( 0, 0, 0)); M5.dis.drawpix( 21, CHSV( 0, 0, 0)); M5.dis.drawpix( 22, CHSV( 0, 0, 0)); M5.dis.drawpix( 23, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 24, CHSV( 0, 0, 0)); + delay(TEMPO_AFFICHAGE); + } + else if(currentChar == '5') + { +M5.dis.clear(); + delay(ENTRE_CHIFFRES); + M5.dis.drawpix( 0, CHSV( 0, 0, 0)); M5.dis.drawpix( 1, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 2, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 3, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 4, CHSV( 0, 0, 0)); + M5.dis.drawpix( 5, CHSV( 0, 0, 0)); M5.dis.drawpix( 6, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 7, CHSV( 0, 0, 0)); M5.dis.drawpix( 8, CHSV( 0, 0, 0)); M5.dis.drawpix( 9, CHSV( 0, 0, 0)); + M5.dis.drawpix( 10, CHSV( 0, 0, 0)); M5.dis.drawpix( 11, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 12, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 13, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 14, CHSV( 0, 0, 0)); + M5.dis.drawpix( 15, CHSV( 0, 0, 0)); M5.dis.drawpix( 16, CHSV( 0, 0, 0)); M5.dis.drawpix( 17, CHSV( 0, 0, 0)); M5.dis.drawpix( 18, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 19, CHSV( 0, 0, 0)); + M5.dis.drawpix( 20, CHSV( 0, 0, 0)); M5.dis.drawpix( 21, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 22, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 23, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 24, CHSV( 0, 0, 0)); + delay(TEMPO_AFFICHAGE); + } + else if(currentChar == '6') + { +M5.dis.clear(); + delay(ENTRE_CHIFFRES); + M5.dis.drawpix( 0, CHSV( 0, 0, 0)); M5.dis.drawpix( 1, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 2, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 3, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 4, CHSV( 0, 0, 0)); + M5.dis.drawpix( 5, CHSV( 0, 0, 0)); M5.dis.drawpix( 6, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 7, CHSV( 0, 0, 0)); M5.dis.drawpix( 8, CHSV( 0, 0, 0)); M5.dis.drawpix( 9, CHSV( 0, 0, 0)); + M5.dis.drawpix( 10, CHSV( 0, 0, 0)); M5.dis.drawpix( 11, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 12, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 13, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 14, CHSV( 0, 0, 0)); + M5.dis.drawpix( 15, CHSV( 0, 0, 0)); M5.dis.drawpix( 16, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 17, CHSV( 0, 0, 0)); M5.dis.drawpix( 18, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 19, CHSV( 0, 0, 0)); + M5.dis.drawpix( 20, CHSV( 0, 0, 0)); M5.dis.drawpix( 21, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 22, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 23, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 24, CHSV( 0, 0, 0)); + delay(TEMPO_AFFICHAGE); + } + else if(currentChar == '7') + { +M5.dis.clear(); + delay(ENTRE_CHIFFRES); + M5.dis.drawpix( 0, CHSV( 0, 0, 0)); M5.dis.drawpix( 1, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 2, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 3, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 4, CHSV( 0, 0, 0)); + M5.dis.drawpix( 5, CHSV( 0, 0, 0)); M5.dis.drawpix( 6, CHSV( 0, 0, 0)); M5.dis.drawpix( 7, CHSV( 0, 0, 0)); M5.dis.drawpix( 8, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 9, CHSV( 0, 0, 0)); + M5.dis.drawpix( 10, CHSV( 0, 0, 0)); M5.dis.drawpix( 11, CHSV( 0, 0, 0)); M5.dis.drawpix( 12, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 13, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 14, CHSV( 0, 0, 0)); + M5.dis.drawpix( 15, CHSV( 0, 0, 0)); M5.dis.drawpix( 16, CHSV( 0, 0, 0)); M5.dis.drawpix( 17, CHSV( 0, 0, 0)); M5.dis.drawpix( 18, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 19, CHSV( 0, 0, 0)); + M5.dis.drawpix( 20, CHSV( 0, 0, 0)); M5.dis.drawpix( 21, CHSV( 0, 0, 0)); M5.dis.drawpix( 22, CHSV( 0, 0, 0)); M5.dis.drawpix( 23, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 24, CHSV( 0, 0, 0)); + delay(TEMPO_AFFICHAGE); + } + else if(currentChar == '8') + { +M5.dis.clear(); + delay(ENTRE_CHIFFRES); + M5.dis.drawpix( 0, CHSV( 0, 0, 0)); M5.dis.drawpix( 1, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 2, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 3, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 4, CHSV( 0, 0, 0)); + M5.dis.drawpix( 5, CHSV( 0, 0, 0)); M5.dis.drawpix( 6, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 7, CHSV( 0, 0, 0)); M5.dis.drawpix( 8, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 9, CHSV( 0, 0, 0)); + M5.dis.drawpix( 10, CHSV( 0, 0, 0)); M5.dis.drawpix( 11, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 12, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 13, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 14, CHSV( 0, 0, 0)); + M5.dis.drawpix( 15, CHSV( 0, 0, 0)); M5.dis.drawpix( 16, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 17, CHSV( 0, 0, 0)); M5.dis.drawpix( 18, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 19, CHSV( 0, 0, 0)); + M5.dis.drawpix( 20, CHSV( 0, 0, 0)); M5.dis.drawpix( 21, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 22, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 23, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 24, CHSV( 0, 0, 0)); + delay(TEMPO_AFFICHAGE); + } + else if(currentChar == '9') + { +M5.dis.clear(); + delay(ENTRE_CHIFFRES); + M5.dis.drawpix( 0, CHSV( 0, 0, 0)); M5.dis.drawpix( 1, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 2, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 3, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 4, CHSV( 0, 0, 0)); + M5.dis.drawpix( 5, CHSV( 0, 0, 0)); M5.dis.drawpix( 6, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 7, CHSV( 0, 0, 0)); M5.dis.drawpix( 8, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 9, CHSV( 0, 0, 0)); + M5.dis.drawpix( 10, CHSV( 0, 0, 0)); M5.dis.drawpix( 11, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 12, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 13, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 14, CHSV( 0, 0, 0)); + M5.dis.drawpix( 15, CHSV( 0, 0, 0)); M5.dis.drawpix( 16, CHSV( 0, 0, 0)); M5.dis.drawpix( 17, CHSV( 0, 0, 0)); M5.dis.drawpix( 18, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 19, CHSV( 0, 0, 0)); + M5.dis.drawpix( 20, CHSV( 0, 0, 0)); M5.dis.drawpix( 21, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 22, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 23, CHSV( colorVal, 255, 255)); M5.dis.drawpix( 24, CHSV( 0, 0, 0)); + delay(TEMPO_AFFICHAGE); + } + } +} From d939c2c68861ced63ab3708607eb5a1eccf12ed9 Mon Sep 17 00:00:00 2001 From: Vanpoucke Tony <46611481+TonyVpck@users.noreply.github.com> Date: Sat, 26 Feb 2022 19:45:39 +0100 Subject: [PATCH 05/10] Update M5Stack-Atom.ino --- M5Stack-Atom/M5Stack-Atom.ino | 70 +++++++++++++++++++++++++---------- 1 file changed, 50 insertions(+), 20 deletions(-) diff --git a/M5Stack-Atom/M5Stack-Atom.ino b/M5Stack-Atom/M5Stack-Atom.ino index 336dd0f..2d7c949 100644 --- a/M5Stack-Atom/M5Stack-Atom.ino +++ b/M5Stack-Atom/M5Stack-Atom.ino @@ -1,10 +1,10 @@ /** @file CarteM5StackAtom.ino @author Julie Brindejont (julie.brindejont@gmail.com) - @contributor : Pierre-André Souville, Tony Vanpoucke. + @contributor : Pierre-André Souville (affichage PPM), Tony Vanpoucke (animations). @brief Projet CO² - @version 1.0.5 - @date 2022-02-12 + @version 1.1.0 + @date 2022-02-24 Projet sympathique menant sur la détection de CO² @@ -29,6 +29,7 @@ #endif #include "SenseairS8.h" +#include "MatrixDisplayNumbers.h" #include // ============================================================================================== @@ -74,21 +75,21 @@ // == == // ============================================================================================== -/** - @brief dernier temps connu du contrôle de co² -*/ +// @brief dernier temps connu du contrôle de co² unsigned long lastTimeCheckCO2 = 0; -/** - @brief permet le clignotement des animations -*/ +// @brief c'est ici qu'est stockée la couleur du capteur +int colorVal; + +// @brief permet le clignotement des animations bool AnimSequence; -/** - @brief dernier temps connu du contrôle de co² -*/ +// @brief Variable pour savoir si une calibration est demandée bool calibrationRequested; +// @brief Variable pour savoir si un affichage du PPM est demandée +bool showMePPM; + // ============================================================================================== // == == // == PROTOTYPE DES FONCTIONS == @@ -182,15 +183,42 @@ void loop() { //Demande de calibration sendRequestCalibration(); calibrationRequested = 0; + } else if (showMePPM) { + //Animation de "fade-out" lors de l'affichage du CO2 + for (int i = 10; i > 0; i--) { + for (int j = 0; j < 25; j++) { + M5.dis.drawpix( j, CHSV( colorVal, 255, i*25)); + } + delay(TEMPO_ANIMATION); + } + //Afficher le taux de CO2 sur la matrice de LED + unsigned long co2 = senseairS8.reqCO2(); + displayMatrix(String(co2),colorVal); + + //Animation de "fade-in" lors de l'affichage du CO2 + for (int i = 0; i < 20; i++) { + for (int j = 0; j < 25; j++) { + M5.dis.drawpix( j, CHSV( colorVal, 255, i*12)); + } + delay(TEMPO_ANIMATION); + } + showMePPM = 0; } //Cette instruction met à jour l'état du bouton. M5.update(); + if (M5.Btn.isPressed() && !calibrationRequested && !showMePPM) { + Serial.println(); + Serial.println("Affichage des PPM demandée"); + showMePPM = 1; + } //Si le bouton est appuyé pendant plus de x secondes, alors nous demandons une calibration du capteur. - if (M5.Btn.pressedFor(TEMPS_BTN_APPUYER) && !calibrationRequested) { + else if (M5.Btn.pressedFor(TEMPS_BTN_APPUYER) && !calibrationRequested) { + Serial.println(); Serial.println("Calibration du capteur demandée"); calibrationRequested = 1; + showMePPM = 0; } } @@ -241,19 +269,19 @@ void checkCO2(unsigned long co2) { } else if (co2 >= LIMITE_BASSE && co2 < (AIR_MOYEN - ANIMATION_OFFSET) ) { //Permet d'afficher toutes les leds du m5stack atom en vert for (int i = 0; i < 25; i++) { - M5.dis.drawpix( i, CHSV( 100, 255, 255)); + colorVal = 100; //selectionnez la couleur verte + M5.dis.drawpix( i, CHSV( colorVal, 255, 255)); } Serial.println("Excellent."); // ============ CAPTEUR : AIR MOYEN // code couleur : orange ==== // } else if (co2 >= (AIR_MOYEN - ANIMATION_OFFSET) && co2 < (AIR_MEDIOCRE + ANIMATION_OFFSET) ) { + //selectionnez une teinte de orange en fonction de l'état du CO2 + colorVal = map(co2, (AIR_MOYEN - ANIMATION_OFFSET), (AIR_MEDIOCRE + ANIMATION_OFFSET), 100, 0); //Permet d'afficher toutes les leds du m5stack atom en orange - - int Co2Scale = map(co2, (AIR_MOYEN - ANIMATION_OFFSET), (AIR_MEDIOCRE + ANIMATION_OFFSET), 100, 0); - for (int i = 0; i < 25; i++) { - M5.dis.drawpix( i, CHSV( Co2Scale, 255, 255)); + M5.dis.drawpix( i, CHSV( colorVal, 255, 255)); } Serial.println("Moyen."); @@ -262,6 +290,7 @@ void checkCO2(unsigned long co2) { } else if (co2 >= (AIR_MEDIOCRE + ANIMATION_OFFSET) && co2 < AIR_VICIE) { //Permet d'afficher toutes les leds du m5stack atom en rouge for (int i = 0; i < 25; i++) { + colorVal = 0; //selectionnez la couleur rouge M5.dis.drawpix( i, CHSV( 0, 255, 255)); } Serial.println("Médiocre."); @@ -269,17 +298,18 @@ void checkCO2(unsigned long co2) { // ============ CAPTEUR : AIR TRES MAUVAIS // code couleur : rouge clignotant ==== // } else { + colorVal = 0; //selectionnez la couleur rouge //Permet d'afficher une animation de led rouge clignotante (seuil haut dépassé). if (AnimSequence == 1) { AnimSequence = 0; for (int i = 0; i < 25; i++) { - M5.dis.drawpix( i, CHSV( 0, 0, 0)); + M5.dis.drawpix( i, CHSV( colorVal, 0, 0)); } } else if (AnimSequence == 0) { AnimSequence = 1; for (int i = 0; i < 25; i++) { - M5.dis.drawpix( i, CHSV( 0, 255, 255)); + M5.dis.drawpix( i, CHSV( colorVal, 255, 255)); } } Serial.println("Vicié."); From 06754540f99845d45badc66c7b99a2d95cfe4113 Mon Sep 17 00:00:00 2001 From: Vanpoucke Tony <46611481+TonyVpck@users.noreply.github.com> Date: Sat, 26 Feb 2022 19:46:14 +0100 Subject: [PATCH 06/10] Update SenseairS8.h --- M5Stack-Atom/SenseairS8.h | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/M5Stack-Atom/SenseairS8.h b/M5Stack-Atom/SenseairS8.h index 283c884..350c669 100644 --- a/M5Stack-Atom/SenseairS8.h +++ b/M5Stack-Atom/SenseairS8.h @@ -1,11 +1,12 @@ + /** * @file SenseairS8.h * @author Julie Brindejont (julie.brindejont@gmail.com) - * @brief Projet CO² - * @version 1.0.0 - * @date 2022-01-14 + * @brief Projet CO² Labfab + * @version 1.1.0 + * @date 2022-02-24 * - * @copyright Copyright (c) 2022 + * @CC-BY-SA - 2022 * * Fichier source contenant le nécessaire pour dialoguer avec le capteur de CO² (SenseairS8) * Pour plus de clarté et de facilité, j'ai créer une classe (SenseairS8). @@ -366,4 +367,4 @@ unsigned long ClassSenseairS8::_get_Value(int RS_len) ClassSenseairS8 senseairS8; -#endif /* SENSEAIR_S8*/ \ No newline at end of file +#endif /* SENSEAIR_S8*/ From bd2f9d421c46ae10d4ff935738c61f83e04d34ea Mon Sep 17 00:00:00 2001 From: Vanpoucke Tony <46611481+TonyVpck@users.noreply.github.com> Date: Sat, 26 Feb 2022 20:12:25 +0100 Subject: [PATCH 07/10] Update M5Stack-Atom.ino --- M5Stack-Atom/M5Stack-Atom.ino | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/M5Stack-Atom/M5Stack-Atom.ino b/M5Stack-Atom/M5Stack-Atom.ino index 2d7c949..09fc1ec 100644 --- a/M5Stack-Atom/M5Stack-Atom.ino +++ b/M5Stack-Atom/M5Stack-Atom.ino @@ -67,7 +67,7 @@ #define COULEUR_CALIBRATION 150 //Temps de démarrage du capteur en "tour d'animations" (1 = 4secondes / 5 = 20 secondes). -#define TEMPS_DEMARRAGE 5 +#define TEMPS_DEMARRAGE 5 // ============================================================================================== // == == @@ -187,18 +187,18 @@ void loop() { //Animation de "fade-out" lors de l'affichage du CO2 for (int i = 10; i > 0; i--) { for (int j = 0; j < 25; j++) { - M5.dis.drawpix( j, CHSV( colorVal, 255, i*25)); + M5.dis.drawpix( j, CHSV( colorVal, 255, i * 25)); } delay(TEMPO_ANIMATION); } //Afficher le taux de CO2 sur la matrice de LED unsigned long co2 = senseairS8.reqCO2(); - displayMatrix(String(co2),colorVal); + displayMatrix(String(co2), colorVal); //Animation de "fade-in" lors de l'affichage du CO2 for (int i = 0; i < 20; i++) { for (int j = 0; j < 25; j++) { - M5.dis.drawpix( j, CHSV( colorVal, 255, i*12)); + M5.dis.drawpix( j, CHSV( colorVal, 255, i * 12)); } delay(TEMPO_ANIMATION); } @@ -212,7 +212,7 @@ void loop() { Serial.println(); Serial.println("Affichage des PPM demandée"); showMePPM = 1; - } + } //Si le bouton est appuyé pendant plus de x secondes, alors nous demandons une calibration du capteur. else if (M5.Btn.pressedFor(TEMPS_BTN_APPUYER) && !calibrationRequested) { Serial.println(); @@ -225,7 +225,7 @@ void loop() { // ======================== CALIBRATION DU CAPTEUR CO2 ======================== // void sendRequestCalibration() { - + byte stateLed = LOW; while (senseairS8.progressCalibration()) { @@ -301,12 +301,26 @@ void checkCO2(unsigned long co2) { colorVal = 0; //selectionnez la couleur rouge //Permet d'afficher une animation de led rouge clignotante (seuil haut dépassé). if (AnimSequence == 1) { + //Animation de "fade-out" lors du clignottement + for (int i = 20; i > 0; i--) { + for (int j = 0; j < 25; j++) { + M5.dis.drawpix( j, CHSV( colorVal, 255, i * 12)); + } + delay(TEMPO_ANIMATION); + } AnimSequence = 0; for (int i = 0; i < 25; i++) { M5.dis.drawpix( i, CHSV( colorVal, 0, 0)); } } else if (AnimSequence == 0) { + //Animation de "fade-in" lors du clignottement + for (int i = 0; i < 20; i++) { + for (int j = 0; j < 25; j++) { + M5.dis.drawpix( j, CHSV( colorVal, 255, i * 12)); + } + delay(TEMPO_ANIMATION); + } AnimSequence = 1; for (int i = 0; i < 25; i++) { M5.dis.drawpix( i, CHSV( colorVal, 255, 255)); From a3edf801df80ee08f2351ce9f62a2d6e2beb95e1 Mon Sep 17 00:00:00 2001 From: Vanpoucke Tony <46611481+TonyVpck@users.noreply.github.com> Date: Sat, 4 Jun 2022 16:04:54 +0200 Subject: [PATCH 08/10] Update M5Stack-Atom.ino --- M5Stack-Atom/M5Stack-Atom.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/M5Stack-Atom/M5Stack-Atom.ino b/M5Stack-Atom/M5Stack-Atom.ino index 09fc1ec..0d7ddcd 100644 --- a/M5Stack-Atom/M5Stack-Atom.ino +++ b/M5Stack-Atom/M5Stack-Atom.ino @@ -39,8 +39,8 @@ // ============================================================================================== //Définition des broches nécessaires au bon fonctionnement du code -#define PIN_SERIAL_RX 21 //Allant sur le port UART TxD du capteur -#define PIN_SERIAL_TX 25 //Allant sur le port UART RxD du capteur +#define PIN_SERIAL_RX 25 //Allant sur le port UART TxD du capteur +#define PIN_SERIAL_TX 21 //Allant sur le port UART RxD du capteur //Définition des seuils de qualité de l'air #define LIMITE_BASSE 300 // Si en dessous passe le capteur en erreur (air extérieur 400 PPM en moyenne) From 86dcda8ecfd6e36dac559dc2358e1b0df87cbfb0 Mon Sep 17 00:00:00 2001 From: Vanpoucke Tony <46611481+TonyVpck@users.noreply.github.com> Date: Wed, 10 Jul 2024 10:30:20 +0200 Subject: [PATCH 09/10] Update M5Stack-Atom.ino --- M5Stack-Atom/M5Stack-Atom.ino | 1 + 1 file changed, 1 insertion(+) diff --git a/M5Stack-Atom/M5Stack-Atom.ino b/M5Stack-Atom/M5Stack-Atom.ino index 0d7ddcd..899072c 100644 --- a/M5Stack-Atom/M5Stack-Atom.ino +++ b/M5Stack-Atom/M5Stack-Atom.ino @@ -41,6 +41,7 @@ //Définition des broches nécessaires au bon fonctionnement du code #define PIN_SERIAL_RX 25 //Allant sur le port UART TxD du capteur #define PIN_SERIAL_TX 21 //Allant sur le port UART RxD du capteur +#define PIN_CAL 33 //Allant sur le port CAL du capteur //Définition des seuils de qualité de l'air #define LIMITE_BASSE 300 // Si en dessous passe le capteur en erreur (air extérieur 400 PPM en moyenne) From 2c7f68e2f91abba2db031e87e78b8e272a2cf6a6 Mon Sep 17 00:00:00 2001 From: Vanpoucke Tony <46611481+TonyVpck@users.noreply.github.com> Date: Wed, 10 Jul 2024 11:12:08 +0200 Subject: [PATCH 10/10] Update M5Stack-Atom.ino calibration reapair --- M5Stack-Atom/M5Stack-Atom.ino | 65 +++++++++++++++-------------------- 1 file changed, 27 insertions(+), 38 deletions(-) diff --git a/M5Stack-Atom/M5Stack-Atom.ino b/M5Stack-Atom/M5Stack-Atom.ino index 899072c..ae4dde1 100644 --- a/M5Stack-Atom/M5Stack-Atom.ino +++ b/M5Stack-Atom/M5Stack-Atom.ino @@ -39,18 +39,17 @@ // ============================================================================================== //Définition des broches nécessaires au bon fonctionnement du code -#define PIN_SERIAL_RX 25 //Allant sur le port UART TxD du capteur -#define PIN_SERIAL_TX 21 //Allant sur le port UART RxD du capteur -#define PIN_CAL 33 //Allant sur le port CAL du capteur +#define PIN_SERIAL_RX 25 //Allant sur le port UART TxD du capteur +#define PIN_SERIAL_TX 21 //Allant sur le port UART RxD du capteur //Définition des seuils de qualité de l'air -#define LIMITE_BASSE 300 // Si en dessous passe le capteur en erreur (air extérieur 400 PPM en moyenne) -#define AIR_MOYEN 800 // Capteur en vert avant cette limite de PPM -#define AIR_MEDIOCRE 1000 // Capteur en orange avant cette limite de PPM -#define AIR_VICIE 1500 // Capteur en rouge avant cette limite de PPM (au delà il clignotte) +#define LIMITE_BASSE 300 // Si en dessous passe le capteur en erreur (air extérieur 400 PPM en moyenne) +#define AIR_MOYEN 800 // Capteur en vert avant cette limite de PPM +#define AIR_MEDIOCRE 1000 // Capteur en orange avant cette limite de PPM +#define AIR_VICIE 1500 // Capteur en rouge avant cette limite de PPM (au delà il clignotte) //converti directement les secondes en millisecondes. -#define ATTENTE_CHECK_CO2 1 * 1000 //nb secondes * (milisecondes dans une secondes) +#define ATTENTE_CHECK_CO2 1 * 1000 //nb secondes * (milisecondes dans une secondes) //Temps (milisecondes) nécessaire à l'utilisateur pour demander une calibration du capteur #define TEMPS_BTN_APPUYER 3 * 1000 @@ -151,13 +150,13 @@ void setup() { for (int x = 0; x < TEMPS_DEMARRAGE; x++) { for (int i = 120; i < 255; i++) { for (int j = 0; j < 25; j++) { - M5.dis.drawpix( j, CHSV( 0, 0, i)); + M5.dis.drawpix(j, CHSV(0, 0, i)); } delay(TEMPO_ANIMATION); } for (int i = 255; i > 120; i--) { for (int j = 0; j < 25; j++) { - M5.dis.drawpix( j, CHSV( 0, 0, i)); + M5.dis.drawpix(j, CHSV(0, 0, i)); } delay(TEMPO_ANIMATION); } @@ -188,7 +187,7 @@ void loop() { //Animation de "fade-out" lors de l'affichage du CO2 for (int i = 10; i > 0; i--) { for (int j = 0; j < 25; j++) { - M5.dis.drawpix( j, CHSV( colorVal, 255, i * 25)); + M5.dis.drawpix(j, CHSV(colorVal, 255, i * 25)); } delay(TEMPO_ANIMATION); } @@ -199,7 +198,7 @@ void loop() { //Animation de "fade-in" lors de l'affichage du CO2 for (int i = 0; i < 20; i++) { for (int j = 0; j < 25; j++) { - M5.dis.drawpix( j, CHSV( colorVal, 255, i * 12)); + M5.dis.drawpix(j, CHSV(colorVal, 255, i * 12)); } delay(TEMPO_ANIMATION); } @@ -235,17 +234,8 @@ void sendRequestCalibration() { displayError(); } else { //Animation du capteur durant le calibrage. - for (int i = 100; i < 200; i++) { - for (int j = 0; j < 25; j++) { - M5.dis.drawpix( j, CHSV( COULEUR_CALIBRATION, 255, i)); - } - delay(TEMPO_ANIMATION); - } - for (int i = 200; i > 100; i--) { - for (int j = 0; j < 25; j++) { - M5.dis.drawpix( j, CHSV( COULEUR_CALIBRATION, 255, i)); - } - delay(TEMPO_ANIMATION); + for (int j = 0; j < 25; j++) { + M5.dis.drawpix(j, CHSV(COULEUR_CALIBRATION, 255, 255)); } } } @@ -267,22 +257,22 @@ void checkCO2(unsigned long co2) { // ============ CAPTEUR : AIR EXCELLENT // code couleur : vert ==== // - } else if (co2 >= LIMITE_BASSE && co2 < (AIR_MOYEN - ANIMATION_OFFSET) ) { + } else if (co2 >= LIMITE_BASSE && co2 < (AIR_MOYEN - ANIMATION_OFFSET)) { //Permet d'afficher toutes les leds du m5stack atom en vert for (int i = 0; i < 25; i++) { - colorVal = 100; //selectionnez la couleur verte - M5.dis.drawpix( i, CHSV( colorVal, 255, 255)); + colorVal = 100; //selectionnez la couleur verte + M5.dis.drawpix(i, CHSV(colorVal, 255, 255)); } Serial.println("Excellent."); // ============ CAPTEUR : AIR MOYEN // code couleur : orange ==== // - } else if (co2 >= (AIR_MOYEN - ANIMATION_OFFSET) && co2 < (AIR_MEDIOCRE + ANIMATION_OFFSET) ) { + } else if (co2 >= (AIR_MOYEN - ANIMATION_OFFSET) && co2 < (AIR_MEDIOCRE + ANIMATION_OFFSET)) { //selectionnez une teinte de orange en fonction de l'état du CO2 colorVal = map(co2, (AIR_MOYEN - ANIMATION_OFFSET), (AIR_MEDIOCRE + ANIMATION_OFFSET), 100, 0); //Permet d'afficher toutes les leds du m5stack atom en orange for (int i = 0; i < 25; i++) { - M5.dis.drawpix( i, CHSV( colorVal, 255, 255)); + M5.dis.drawpix(i, CHSV(colorVal, 255, 255)); } Serial.println("Moyen."); @@ -291,40 +281,39 @@ void checkCO2(unsigned long co2) { } else if (co2 >= (AIR_MEDIOCRE + ANIMATION_OFFSET) && co2 < AIR_VICIE) { //Permet d'afficher toutes les leds du m5stack atom en rouge for (int i = 0; i < 25; i++) { - colorVal = 0; //selectionnez la couleur rouge - M5.dis.drawpix( i, CHSV( 0, 255, 255)); + colorVal = 0; //selectionnez la couleur rouge + M5.dis.drawpix(i, CHSV(0, 255, 255)); } Serial.println("Médiocre."); // ============ CAPTEUR : AIR TRES MAUVAIS // code couleur : rouge clignotant ==== // } else { - colorVal = 0; //selectionnez la couleur rouge + colorVal = 0; //selectionnez la couleur rouge //Permet d'afficher une animation de led rouge clignotante (seuil haut dépassé). if (AnimSequence == 1) { //Animation de "fade-out" lors du clignottement for (int i = 20; i > 0; i--) { for (int j = 0; j < 25; j++) { - M5.dis.drawpix( j, CHSV( colorVal, 255, i * 12)); + M5.dis.drawpix(j, CHSV(colorVal, 255, i * 12)); } delay(TEMPO_ANIMATION); } AnimSequence = 0; for (int i = 0; i < 25; i++) { - M5.dis.drawpix( i, CHSV( colorVal, 0, 0)); + M5.dis.drawpix(i, CHSV(colorVal, 0, 0)); } - } - else if (AnimSequence == 0) { + } else if (AnimSequence == 0) { //Animation de "fade-in" lors du clignottement for (int i = 0; i < 20; i++) { for (int j = 0; j < 25; j++) { - M5.dis.drawpix( j, CHSV( colorVal, 255, i * 12)); + M5.dis.drawpix(j, CHSV(colorVal, 255, i * 12)); } delay(TEMPO_ANIMATION); } AnimSequence = 1; for (int i = 0; i < 25; i++) { - M5.dis.drawpix( i, CHSV( colorVal, 255, 255)); + M5.dis.drawpix(i, CHSV(colorVal, 255, 255)); } } Serial.println("Vicié."); @@ -338,7 +327,7 @@ void displayError() { //Permet d'afficher une animation infinie d'erreur (nécéssitera de redébrancher le capteur). int PixNum = random(0, 25); int NoisePix = random(20, 200); - M5.dis.drawpix( PixNum, CHSV( 0, 0, NoisePix)); + M5.dis.drawpix(PixNum, CHSV(0, 0, NoisePix)); delay(TEMPO_ANIMATION); } }