Advertisement
bipping

step motor_V3

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