Bonjour à tous !
Ce bout de code ci-après, extrait d'un programme de 800 lignes environ, est celui qui pose problème.
L'électronique associée à la platine Arduino Nano
- Un bouton-poussoir relié, via un trigger, à la pin d'interruption D3.
- La DEL D13 intégrée à la platine Arduino.
Le problème
Une fois le programme lancé, un appui sur le bouton envoie (via un trigger) du 5V à la pin d'interruption D3 (interruption n°1).
Depuis le loop(), le programme passe alors de 'runStandByMode()' à 'runActivatedMode()'.
Après un temps variable (de 20 minutes à 71 minutes), une interruption est activée sans raison apparente et le programme repasse alors de 'runActivatedMode()' à 'runStandByMode()'.
La platine testée avec une alimentation prise du PC ou spécifique change systématiquement d'état.
La platine n'est pas dans un environnement électriquement perturbé.
Un déclenchement intempestif pouvant se produire après 60 minutes, j'ai déjà passé beaucoup de temps à tenter de cerner et de trouver le problème.
Ma demande d'aide
Je ne vois vraiment plus où peut se trouver le bug.
Merci pour votre aide.
Le code (extrait fonctionnel)
Nota : les 'Serial.print' servent pour la recherche du bug à afficher les horodatages d'activation des deux fonctions appelées.
#define STDBY_MODE 2
#define ACTIVATED_MODE 5
volatile int menuSelected = STDBY_MODE;
volatile bool isCentralUnitActivated;
const int LED_PIN = 13;
void setup() {
Serial.begin (9600);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
attachInterrupt(1, setCentralUnitStatus, RISING); // La fonction 'setCentralUnitStatus' est appelée
isCentralUnitActivated = false;
}
void loop() {
if (isCentralUnitActivated == false) {
runStandByMode();
}
else {
runActivatedMode();
}
}
void runStandByMode() {
digitalWrite(LED_PIN, LOW);
Serial.print("Entrée de StandByMode : ");
Serial.println(millis());
while (menuSelected == STDBY_MODE)
{
// Code supprimé remplacé par delay(50) pour ce test.
delay(50);
}
}
void runActivatedMode() {
unsigned long currentTime = 0;
unsigned long previousTime = 0;
digitalWrite(LED_PIN, LOW);
bool ledState = false;
Serial.print("Entrée de ActivatedMode : ");
Serial.println(millis());
while (menuSelected == ACTIVATED_MODE)
{
// Normalement, du taf ici...
// ...et clignotement d'une DEL d'affichage d'état.
currentTime = millis();
if((currentTime - previousTime) > 1000)
{
previousTime = currentTime;
ledState = !ledState;
digitalWrite(LED_PIN, ledState);
}
}
Serial.print("Sortie de ActivatedMode : ");
Serial.println(millis());
menuSelected = STDBY_MODE;
}
// Fonction appelée par l'interruption n°1.
void setCentralUnitStatus()
{
if (isCentralUnitActivated == false) {
Serial.print("menuSelected = ACTIVATED_MODE : ");
Serial.println(millis());
menuSelected = ACTIVATED_MODE;
}
else {
Serial.print("menuSelected = STDBY_MODE : ");
Serial.println(millis());
menuSelected = STDBY_MODE;
}
isCentralUnitActivated = !isCentralUnitActivated;
}