Advertisement
bipping

step motor_V3.2

Apr 17th, 2024
383
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 23.21 KB | Science | 0 0
  1. #include <avr/interrupt.h>
  2. #include <Arduino.h>
  3. #include <Wire.h>
  4. #include <rgb_lcd.h>
  5. #include <EEPROM.h>
  6.  
  7. //#define SDA A4
  8. //#define SLC A5
  9. #define NOTE_CS6 1109
  10. #define NOTE_DS6 1245
  11.  
  12. rgb_lcd lcd;
  13.  
  14. // Variables globales
  15. const uint8_t VAL_RGB_R = 255;                  // Valeur R pour LED RGB
  16. const uint8_t VAL_RGB_G = 0;                    // Valeur G pour LED RGB
  17. const uint8_t VAL_RGB_B = 0;                    // Valeur B pour LED RGB
  18. const int8_t PIN_SWITCH = 2;                    // Pin pour l'interrupteur à bascule
  19. const int8_t PIN_COURANT_COUPURE = 3;           // Pin pour détecter une coupure de courant
  20. const int8_t PIN_LED_ROUGE = 5;                 // Pin pour LED PIN_LED_ROUGE
  21. const int8_t PIN_LED_VERT = 6;                  // Pin pour LED PIN_LED_VERTe
  22. const int8_t PIN_LED_ORANGE = 7;                // Pin pour LED PIN_LED_ORANGE
  23. const int8_t PIN_MOTEUR_DIR = 8;                // Pin pour la direction du moteur
  24. const int8_t PIN_MOTEUR_PUL = 9;                // Pin pour les impulsions du moteur
  25. const int8_t PIN_MOTEUR_ENA = 10;               // Pin pour activer/désactiver le moteur
  26. const int8_t PIN_BUZZER = 11;                   // Pin pour le Buzzer
  27. const uint16_t PIN_POTARD = A0;                 // Pin pour le potentiometre
  28. const int8_t NUM_TIMERS = 10;                   // Nombre total de timers
  29. const int8_t TIMER_SWITCH = 7;                  // Timer pour l'interrupteur
  30. const int8_t TIMER_POTARD = 8;                  // Timer pour le potentiometre
  31. const int8_t TIMER_LED_Orange = 0;              // Timer pour LED PIN_LED_ORANGE
  32. const int8_t TIMER_LED_Vert = 1;                // Timer pour LED PIN_LED_VERTe
  33. const int8_t TIMER_LED_Rouge = 3;               // Timer pour LED PIN_LED_ROUGE
  34. const int8_t TIMER_MOTOR = 2;                   // Timer pour le moteur
  35. const int8_t TIMER_LCD_Origine = 4;             // Timer pour l'affichage LCD (origine)
  36. const int8_t TIMER_LCD_avance = 5;              // Timer pour l'affichage LCD (avance)
  37. const int8_t TIMER_LCD_toggle = 6;              // Timer pour l'affichage LCD (alternance)
  38. const int8_t TIMER_ETAT = 9;                    // Timer pour l'état
  39. uint16_t timerPrecedents[NUM_TIMERS];           // Temps précédent pour chaque timer
  40. const uint16_t INTERVAL_BASE = 3130;            // interval de temps pour une action quelconque
  41. const uint16_t INTERVAL_X3 = 9390;              // interval de temps pour une action quelconque
  42. const uint32_t INTERVAL_X78 = 244140;           // interval de temps pour une action quelconque
  43. const uint32_t INTERVAL_X156 = 488280;          // interval de temps pour une action quelconque
  44. const uint32_t LIMITEPASMAX = 120000;           // Nombre maximal de pas du moteur
  45. volatile uint32_t nombreDePas = 0;              // Compteur de pas du moteur
  46. volatile bool signalPWM  = false;               // État du signal PWM
  47. volatile bool estCoupureCourant;                // État de la coupure de courant
  48. bool etatSwitch = false;                        // État virtuel de l'interupteur, défini sur enclancher (false)
  49. bool sense = false;                             // direction du moteur
  50. bool estInitOrigineEffectue = false;            // Indique si la fonction initOrigine a été exécutée
  51. bool conditionEtatBascule = false;              // Indique si les conditions d'initialisation de 'ETAT_AVANCE' ou 'ETAT_TOGGLE' sont remplies
  52.  
  53. byte L[8] = { 0b00000, 0b11000, 0b01100, 0b00100, 0b01100, 0b10010, 0b10001, 0b00000 }; // Motif personnalisé pour écran LCD
  54.  
  55. // Énumération pour les différents états
  56. enum Etat {    ETAT_ORIGINE,    ETAT_AVANCE,    ETAT_TOGGLE,    ETAT_FAIL };
  57.  
  58. Etat etatActuel; // Variable stockant l'état actuel du système
  59.  
  60. // Interruption de minuterie pour gérer le signal PWM et compter les pas
  61. ISR(TIMER1_COMPA_vect){  
  62.   if(signalPWM  == true){                    // Vérifie si le signal PWM est actif
  63.     toggle(PIN_MOTEUR_PUL);                  // Bascule l'état du pin moteur
  64.     nombreDePas++;                           // Incrémente le compteur de pas
  65.   }
  66. }
  67.  
  68. // Sauvegarde les données essentielles dans EEPROM en cas de coupure de courant
  69. void interruptionCoupure(volatile bool estCoupureCourant, volatile uint32_t &nombreDePas) {
  70.   if (!estCoupureCourant) {                    // Vérifie si une coupure de courant a eu lieu
  71.     EEPROM.update(0, nombreDePas);             // Sauvegarde le nombre de pas
  72.     EEPROM.update(4, false);                   // Réinitialise le flag de coupure de courant
  73.     etatActuel = ETAT_FAIL;                    // Change l'état à défaut
  74.   } // Utilise une procédure d'interruption déclarée dans setup
  75. }// Fin de interruptionCoupure
  76.  
  77. // Récupération des données après une coupure de courant
  78. void recuperation(volatile bool estCoupureCourant, volatile uint32_t &nombreDePas, bool &sense) {
  79.   if (!estCoupureCourant) {                    // Si aucune coupure n'a eu lieu
  80.     EEPROM.get(0, nombreDePas);                // Récupère le nombre de pas de EEPROM
  81.     sense = true;                              // Réinitialise la direction du moteur
  82.     etatActuel = ETAT_TOGGLE;                  // Change l'état pour le retour à l'origine
  83.     EEPROM.update(4, true);                    // Indique que la récupération est faite
  84.   }
  85. }// Fin de recuperation
  86.  
  87. // Lecture et mise à l'échelle de la valeur du potentiomètre
  88. const uint16_t potard() {
  89.     return map(analogRead(PIN_POTARD), 0, 1023, 11200, 11300); // Map la lecture analogique à la plage désirée
  90. } // Fin de potard
  91.  
  92. void Lambda(){
  93.   OCR1A = potard();                           // mets à jour le rapport de cycle du PWM
  94. }
  95.  
  96. // Fonction pour basculer l'état d'une broche
  97. void toggle(int8_t pin) {
  98.     digitalWrite(pin, !digitalRead(pin));      // Bascule l'état de la broche
  99. } // Fin de toggle
  100.  
  101. // Exécute une fonction à intervalle régulier basé sur un timer
  102. void checkTimerAndUpdate(uint16_t &previousTime, uint32_t intervalAction, void (*func)(bool*, int8_t*), bool etatSwitch, int8_t ledPin) {
  103.   if (micros() - previousTime >= intervalAction ) {
  104.       previousTime = micros();                 // Réinitialise le temps précédent
  105.       func(&etatSwitch, &ledPin);              // Appelle la fonction passée en paramètre
  106.   }
  107. }// Fin de checkTimerAndUpdate
  108.  
  109. // Met à jour l'état de l'interrupteur
  110. void updateSwitchState(bool *etatSwitch, int8_t *ledPin) {
  111.     if (digitalRead(*ledPin) != *etatSwitch) {
  112.         *etatSwitch = !(*etatSwitch);  // Bascule l'état en utilisant la valeur pointée
  113.     }
  114. }// Fin de updateSwitchState
  115.  
  116. // Actionne le moteur et décompte les pas
  117. void toggle_PIN_MOTOR(bool *etatSwitch, int8_t *ledPin) {
  118.   toggle(PIN_MOTEUR_PUL);                      // Bascule le pin du moteur
  119.   noInterrupts();                              // Désactive les interruptions
  120.   nombreDePas--;                               // Décrémente le compteur de pas
  121.   interrupts();                                // Réactive les interruptions
  122. }// Fin de toggle_PIN_MOTOR
  123.  
  124. // Bascule l'état de la LED
  125. void toggle_PIN_LED(bool *etatSwitch, int8_t pin) {
  126.   toggle(pin);                                 // Bascule l'état de la pin LED
  127. }// Fin de toggle_PIN
  128.  
  129. // Fait varier la luminosité de la LED Rouge
  130. void modulate_PIN_LED_ROUGE(bool *etatSwitch, int8_t *ledPin) {
  131.   static uint8_t i = 1;                         // Initialise l'intensité de la LED
  132.   static bool estIncrement = true;             // Initialise la direction de l'incrémentation
  133.   analogWrite(PIN_LED_ROUGE, i);               // Applique la luminosité à la LED
  134.   i = estIncrement ? i + 1 : i - 1;            // Incrémente ou décrémente la luminosité
  135.   if(i == 255 || i == 0) {                     // Inverse la direction si les limites sont atteintes
  136.     estIncrement = !estIncrement;
  137.   }
  138. }// Fin de modulate_PIN_LED_ROUGE
  139.  
  140. // Exécute une action LED en fonction de l'état de l'interrupteur
  141. void checkTimerBasedOnState(bool &etatSwitch, uint16_t *timerPrecedents, void (*toggle_PIN_LED)) {
  142.   uint16_t *timerValue = etatSwitch ? &timerPrecedents[TIMER_LED_Vert] : &timerPrecedents[TIMER_LED_Orange];
  143.   static int8_t ledPin = etatSwitch ? PIN_LED_VERT : PIN_LED_ORANGE;
  144.   if(digitalRead(!etatSwitch ? PIN_LED_VERT : PIN_LED_ORANGE) == HIGH) { // Si la LED non-active est allumée
  145.     digitalWrite(!etatSwitch ? PIN_LED_VERT : PIN_LED_ORANGE, LOW); // Éteint cette LED
  146.   }
  147.   checkTimerAndUpdate(*timerValue, INTERVAL_X156, toggle_PIN_LED, etatSwitch, ledPin); // Vérifie le timer et met à jour l'état
  148. }// Fin de checkTimerBasedOnState
  149.  
  150. // Vérifie les conditions d'arrêt du moteur et exécute l'arrêt si nécessaire
  151. void CheckSortieAvance() {
  152.   if (!etatSwitch || (nombreDePas >= LIMITEPASMAX)) { // Si l'état du switch est désactivé ou le nombre de pas dépasse la limite
  153.     digitalWrite(PIN_LED_VERT, LOW);                  // Éteint la LED verte
  154.     sense = true;                                     // Inverse le sens de rotation
  155.     signalPWM = false;                                // Désactive le signal PWM
  156.   }                                                   // Fin de condition et bloc if
  157. }                                                     // Fin de la fonction CheckSortieAvance
  158.  
  159. // Vérifie si le moteur a atteint l'origine et réinitialise certains états
  160. void CheckSortieToggle () {
  161.   if(nombreDePas == 0) {                              // Si le nombre de pas est à zéro
  162.     estCoupureCourant = true;                         // Active l'indicateur de coupure de courant
  163.     sense = false;                                    // Réinitialise le sens de rotation
  164.     estInitOrigineEffectue = false;                   // Indique que l'init origine n'est pas effectuée
  165.     digitalWrite(PIN_LED_ORANGE, LOW);                // Éteint la LED orange
  166.     digitalWrite(PIN_LED_VERT, LOW);                  // Éteint la LED verte
  167.   }                                                   // Fin de condition et bloc if
  168. }                                                     // Fin de la fonction CheckSortieToggle
  169.  
  170. // Prépare le système pour retourner à l'origine
  171. void initOrigine() {
  172.   if (!estInitOrigineEffectue) {                      // Si l'init d'origine n'est pas effectuée
  173.     recuperation(estCoupureCourant, nombreDePas, sense); // Appelle la fonction de récupération en cas de coupure
  174.     digitalWrite(PIN_LED_ORANGE, LOW);                // Éteint la LED orange
  175.     digitalWrite(PIN_LED_VERT, LOW);                  // Éteint la LED verte
  176.     digitalWrite(PIN_LED_ROUGE, HIGH);                // Allume la LED rouge
  177.     digitalWrite(PIN_MOTEUR_ENA, HIGH);               // Désactive le frein du moteur
  178.     tone(PIN_BUZZER, NOTE_CS6, 80);                   // Joue la note CS6
  179.     delay(100);                                       // Pause de 100ms
  180.     tone(PIN_BUZZER, NOTE_DS6, 80);                   // Joue la note DS6
  181.     delay(100);                                       // Pause de 100ms
  182.     tone(PIN_BUZZER, NOTE_DS6, 160);                  // Joue la note DS6 plus longue
  183.     signalPWM = false;                                // Désactive le signal PWM
  184.     delay(250);                                       // Pause de 250ms
  185.     digitalWrite(PIN_LED_ROUGE, LOW);                 // Éteint la LED rouge
  186.     estInitOrigineEffectue = true;                    // Marque l'initialisation d'origine comme effectuée
  187.   }                                                   // Fin de condition et bloc if
  188. }                                                     // Fin de la fonction initOrigine
  189.  
  190. // Prépare le système pour avancer vers une position cible
  191. void initAvance() {
  192.   if (!conditionEtatBascule) {                        // Si la condition pour basculer n'est pas remplie
  193.     estCoupureCourant = false;                        // Réinitialise l'indicateur de coupure de courant
  194.     signalPWM = true;                                 // Active le signal PWM
  195.     digitalWrite(PIN_MOTEUR_DIR, LOW);                // Définit le sens de rotation du moteur
  196.     digitalWrite(PIN_MOTEUR_ENA, LOW);                // Active le moteur
  197.     digitalWrite(PIN_LED_VERT, HIGH);                 // Allume la LED verte
  198.     digitalWrite(PIN_LED_ORANGE, LOW);                // Éteint la LED orange
  199.     digitalWrite(PIN_LED_ROUGE, LOW);                 // Éteint la LED rouge
  200.     conditionEtatBascule = true;                      // Change l'état de conditionEtatBascule
  201.   }                                                   // Fin de condition et bloc if
  202. }                                                     // Fin de la fonction initAvance
  203.  
  204. // Initialise la bascule pour le retour à la position cible
  205. void initToggle() {
  206.   if (conditionEtatBascule) {                         // Si la condition de bascule est remplie
  207.     digitalWrite(PIN_MOTEUR_DIR, HIGH);               // Change le sens de rotation du moteur
  208.     digitalWrite(PIN_MOTEUR_ENA, LOW);                // Active le moteur
  209.     digitalWrite(PIN_LED_ROUGE, HIGH);                // Allume la LED rouge
  210.     conditionEtatBascule = false;                     // Change l'état de conditionEtatBascule
  211.   }                                                   // Fin de condition et bloc if
  212. }                                                     // Fin de la fonction initToggle
  213.  
  214. void LCD_Update(const char* state, const char* line0ExtraText, uint8_t line0ExtraPos,
  215.                       uint8_t line1ExtraPos, bool createSpecialChar) {
  216.   lcd.clear();                                        // Nettoie l'écran LCD
  217.   lcd.home();                                         // Réinitialise le curseur
  218.   lcd.print(state);                                   // Affiche l'état fourni en paramètre
  219.   if (line0ExtraText != NULL) {                       // Si du texte supplémentaire est fourni pour la ligne 0
  220.     lcd.setCursor(line0ExtraPos, 0);                  // Définit la position du curseur
  221.     lcd.print(line0ExtraText);                        // Affiche le texte supplémentaire
  222.   }
  223.   lcd.setCursor(1, 1);                                // Place le curseur en (1,1)
  224.   lcd.print(nombreDePas);                             // Affiche le compteur de pas
  225.   lcd.setCursor(10, 1);                               // Place le curseur en (10,1)
  226.   lcd.print(potard());                                // Affiche la valeur du potentiomètre
  227.   if (createSpecialChar) {                            // Si un caractère spécial doit être créé
  228.     lcd.createChar(1, L);                             // Crée un caractère spécial
  229.     lcd.setCursor(line1ExtraPos, 1);                  // Place le curseur pour le caractère spécial
  230.     lcd.write(byte(1));                               // Affiche le caractère spécial
  231.   }
  232. }
  233.  
  234. void etatFailSafe() {
  235.   signalPWM = false;                                  // Arrête le moteur
  236.   digitalWrite(PIN_MOTEUR_PUL, LOW);                  // Désactive les impulsions
  237.   digitalWrite(PIN_MOTEUR_ENA, HIGH);                 // Coupe l'alimentation du moteur
  238.   digitalWrite(PIN_LED_ROUGE, HIGH);                  // Allume la LED d'urgence
  239.   etatActuel = ETAT_FAIL;
  240. }                                                     // Gère l'état de défaillance du système
  241.  
  242. void updateEtatActuel() {
  243.   if ((nombreDePas == 0 && sense == false && etatSwitch == false) && (etatActuel == ETAT_TOGGLE || etatActuel == ETAT_ORIGINE)) {
  244.     etatActuel = ETAT_ORIGINE;                         // Définit l'état à ORIGINE
  245.   } else if ((nombreDePas < LIMITEPASMAX && sense == false && etatSwitch == true) && (etatActuel != ETAT_FAIL)) {
  246.     etatActuel = ETAT_AVANCE;                          // Définit l'état à AVANCE
  247.   } else if ((nombreDePas > 0 && sense == true) && (etatActuel == ETAT_TOGGLE || etatActuel == ETAT_AVANCE)) {
  248.     etatActuel = ETAT_TOGGLE;                          // Définit l'état à TOGGLE
  249.   }else {
  250.     etatActuel = ETAT_FAIL;                          // Définit un état échec
  251.   }
  252. }                                                      // Met à jour l'état actuel du système
  253.  
  254. void setup() {
  255.   Serial.begin(115200);                                // Démarre la communication série à 115200 bps
  256.   lcd.begin(16, 2);                                    // Initialise l'écran LCD avec 16 colonnes et 2 lignes
  257.   lcd.setRGB(VAL_RGB_R, VAL_RGB_G, VAL_RGB_B);         // Définit la couleur de rétroéclairage de l'écran LCD
  258.   lcd.print("initialization");                         // Affiche le message d'initialisation sur l'écran LCD
  259.  
  260.   // Configuration des pins pour les LEDs et les sorties
  261.   pinMode(PIN_LED_ORANGE, OUTPUT);                     // Config. la LED orange en sortie
  262.   pinMode(PIN_LED_VERT, OUTPUT);                       // Config. la LED verte en sortie
  263.   pinMode(PIN_LED_ROUGE, OUTPUT);                      // Config. la LED rouge en sortie
  264.  
  265.   // Configuration des pins pour les entrées
  266.   pinMode(PIN_POTARD, INPUT);                                  // Définit le pin A0 comme entrée pour le potentiomètre
  267.   pinMode(PIN_SWITCH, INPUT_PULLUP);                   // Active la résistance de pull-up sur le pin du bouton
  268.   pinMode(PIN_MOTEUR_DIR, OUTPUT);                     // Config. la direction du moteur en sortie
  269.   pinMode(PIN_MOTEUR_PUL, OUTPUT);                     // Config. le pin de pulsation du moteur en sortie
  270.   pinMode(PIN_MOTEUR_ENA, OUTPUT);                     // Config. le pin d'activation du moteur en sortie
  271.   pinMode(PIN_BUZZER, OUTPUT);                         // Config. le pin du buzzer en sortie
  272.   pinMode(PIN_COURANT_COUPURE, INPUT_PULLUP);          // Active la résistance de pull-up pour la coupure de courant
  273.  
  274.   // Configuration initiale de l'état des sorties
  275.   digitalWrite(PIN_BUZZER, LOW);                       // Éteint le buzzer
  276.   digitalWrite(PIN_SWITCH, HIGH);                      // Initialise le PIN_SWITCH à l'état haut
  277.   digitalWrite(PIN_LED_VERT, HIGH);                    // Allume la LED verte
  278.   digitalWrite(PIN_LED_ORANGE, HIGH);                  // Allume la LED orange
  279.   digitalWrite(PIN_LED_ROUGE, HIGH);                   // Allume la LED rouge
  280.  
  281.   // Signal sonore d'initialisation
  282.   tone(PIN_BUZZER, NOTE_DS6, 500);                     // Joue un ton sur le buzzer
  283.   delay(500);                                          // Attend 500 ms
  284.  
  285.   // Éteint toutes les LEDs après le signal sonore
  286.   digitalWrite(PIN_LED_VERT, LOW);                     // Éteint la LED verte
  287.   digitalWrite(PIN_LED_ROUGE, LOW);                    // Éteint la LED rouge
  288.   digitalWrite(PIN_LED_ORANGE, LOW);                   // Éteint la LED orange
  289.  
  290.   // Initialisation des valeurs de temps pour les timers
  291.   timerPrecedents[TIMER_ETAT] = micros();              // Initialise le timer pour
  292.   timerPrecedents[TIMER_LCD_toggle] = micros();        // Initialise le timer pour le mode toggle LCD
  293.   timerPrecedents[TIMER_LCD_avance] = micros();        // Initialise le timer pour le mode avance LCD
  294.   timerPrecedents[TIMER_LCD_Origine] = micros();       // Initialise le timer pour le mode origine LCD
  295.   timerPrecedents[TIMER_LED_Orange] = micros();        // Initialise le timer pour la LED orange
  296.   timerPrecedents[TIMER_LED_Vert] = micros();          // Initialise le timer pour la LED verte
  297.   timerPrecedents[TIMER_LED_Rouge] = micros();         // Initialise le timer pour la LED rouge
  298.   timerPrecedents[TIMER_SWITCH] = micros();            // Initialise le timer pour le bouton switch
  299.   timerPrecedents[TIMER_POTARD] = micros();            // Initialise le timer pour le bouton switch
  300.   timerPrecedents[TIMER_MOTOR] = micros();             // Initialise le timer pour le moteur
  301.  
  302.   // Configuration initiale de l'état du système
  303.   Etat etatActuel = ETAT_ORIGINE;                      // Définit l'état actuel comme origine
  304.  
  305.   // Vérifie et récupère l'état de coupure de courant depuis l'EEPROM
  306.   EEPROM.get(4, estCoupureCourant);                    // Récupère l'état de coupure de courant de l'EEPROM
  307.  
  308.   // Configuration des interruptions
  309.   attachInterrupt(digitalPinToInterrupt(PIN_COURANT_COUPURE), interruptionCoupure, FALLING); // Interruption sur coupure de courant
  310.  
  311.   // Configuration de Timer1 pour le mode CTC (Clear Timer on Compare Match)
  312.   TCCR1A = 0;                                          // Réinitialise TCCR1A pour la configuration
  313.   TCCR1B = (1 << WGM12) | (1 << CS11);                 // Configure le mode CTC et le prescaler pour Timer1
  314.   OCR1A = potard();                          // Configure OCR1A pour correspondre à la valeur du potentiomètre
  315.   TIMSK1 |= (1 << OCIE1A);                             // Active l'interruption de comparaison du Timer1
  316.  
  317.   delay(800);                                          // Court délai avant d'activer les interruptions
  318.   sei();                                               // Active les interruptions globales
  319. }
  320.  
  321. void loop() {
  322.   // Vérifie et met à jour l'état du switch toutes les 244.140 ms
  323.   checkTimerAndUpdate(timerPrecedents[TIMER_SWITCH], INTERVAL_X78, updateSwitchState, etatSwitch, PIN_SWITCH);
  324.  
  325.   // Structure de contrôle principale basée sur l'état actuel
  326.   switch (etatActuel) {
  327.     case ETAT_ORIGINE:
  328.       // Initialisations pour l'état d'origine
  329.       initOrigine();
  330.       // Mise à jour LED rouge toutes les 9.390 ms
  331.       checkTimerAndUpdate(timerPrecedents[TIMER_LED_Rouge], INTERVAL_X3, modulate_PIN_LED_ROUGE, NULL, PIN_LED_ROUGE);
  332.       // Mise à jour LCD pour l'état d'origine toutes les 244.140 ms
  333.       checkTimerAndUpdate(timerPrecedents[TIMER_LCD_Origine], INTERVAL_X78, [] (bool*, int8_t*) { LCD_Update("Origine", NULL, 0, 11, true); }, NULL, NULL);
  334.       //commentaire
  335.       checkTimerAndUpdate(timerPrecedents[TIMER_POTARD], INTERVAL_X78, Lambda, NULL, PIN_POTARD);
  336.       break;
  337.  
  338.     case ETAT_AVANCE:
  339.       // Initialisations pour l'état d'avance
  340.       initAvance();
  341.       // Mise à jour LCD pour l'état d'avance toutes les 244.140 ms
  342.       checkTimerAndUpdate(timerPrecedents[TIMER_LCD_avance], INTERVAL_X78, [] (bool*, int8_t*) { LCD_Update("Programme", "Lambda", 10, 15, true); }, NULL, NULL);
  343.       // Mise à jour de l'action du moteur toutes les 5.625 ms (par default) via ISR*
  344.       // checkTimerAndUpdate(timerPrecedents[TIMER_MOTOR], Lambda, toggle_PIN_MOTOR, NULL, NULL);
  345.       // Vérifie la condition de sortie de l'état d'avance
  346.       CheckSortieAvance();
  347.       break;
  348.  
  349.     case ETAT_TOGGLE:
  350.       // Initialisations pour l'état de toggle
  351.       initToggle();
  352.       // Mise à jour LCD pour l'état de toggle toutes les 244.140 ms
  353.       checkTimerAndUpdate(timerPrecedents[TIMER_LCD_toggle], INTERVAL_X78, [] (bool*, int8_t*) { LCD_Update("toggle", "Lambda", 10, 15, true); }, NULL, NULL);
  354.       // Mise à jour de l'action du moteur toutes les 3.130 ms
  355.       checkTimerAndUpdate(timerPrecedents[TIMER_MOTOR], INTERVAL_BASE, toggle_PIN_MOTOR, NULL, PIN_MOTEUR_PUL);
  356.       // Vérifie l'état du switch et agit sur les LEDs selon un délai
  357.       checkTimerBasedOnState(etatSwitch, timerPrecedents, toggle_PIN_LED);      
  358.       // Vérifie la condition de sortie de l'état de toggle
  359.       CheckSortieToggle();
  360.       break;
  361.  
  362.     case ETAT_FAIL:
  363.       // Exécute la séquence d'arrêt d'urgence
  364.       etatFailSafe();
  365.       break;
  366.  
  367.     default: // ETAT_FAIL:
  368.       // Exécute la séquence d'arrêt d'urgence
  369.       etatFailSafe();
  370.       break;
  371.   }
  372.   // Met à jour l'état actuel basé sur les conditions actuelles
  373.   checkTimerAndUpdate(timerPrecedents[TIMER_ETAT], INTERVAL_BASE, updateEtatActuel, NULL, NULL);
  374. }
  375.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement