je suis sur un arduino pro et je veux introduire les interruptions. La première serait par exemple: au bout d'une minute, mettre l'arduino en veille si il n'y a pas d’interaction avec la carte.
La deuxième interruption serait à l'aide d'un bouton poussoir, relancer le programme là ou il s'était arrêté avec les mêmes variables actionnées.
Est ce réalisable ?
Quelle est l'interruption à utiliser pour mettre en veille et quelle est l'interruption pour réactivé le programme ?
mettre en veille, c'est pas une interruption, c'est une instruction (sleep_cpu en l'occurrence)
T'as juste à activer l'IT de ton GPIO, ça réveillera ton processeur, dans l'IT, tu acquitte l'IT (si c'est pas déjà fait par la couche arduino) et tu laisse le proc revenir à la tâche de fond.
merci pour ta réponse. J'ai utilisé le lien que tu m'as proposé et il m'a aidé. J'ai pu créer l'interruption mais je n'ai pas réussi à mettre mon arduino pro en veille. C'est à dire que lorsque je change l'état de la pin 2(pin d'interruption externe), le programme exécute le bout de code interruption_externe() que j'ai créé.
Seulement, il ne se met pas en veille avec la fonction sleep_cpu();(il passe la ligne normal). J'ai également vu dans le lien qu'il y a cinq modules qui peuvent être activé ou désactivé mais je voulais savoir si ils sont activées ou non par défaut ?
Y'a t-il une autre solution pour le mettre en veille ?
volatile int state = LOW; // déclartion d'une variable volatile
void setup()
{display.begin();
display.setContrast(50);
pinMode(pin, OUTPUT);
attachInterrupt(0, interruption, FALLING); // attache l'interruption externe n°1 à la fonction interruption
}
void loop()
{
digitalWrite(pin, state); // la LED reflète l'état de la variable
display.clearDisplay();// efface le lcd
display.print("a");
display.display();// affiche la lettre
delay(2500);// une pause pour prendre le temps de voir ce qui est affiché à l'écran.
sleep_cpu();
display.clearDisplay();
display.print("b");
display.display();
delay(2500);
}
void interruption() // la fonction appelée par l'interruption externe n°0
{
button_time = millis();
if (button_time - last_button_time > debounce)
{
state = !state; // inverse l'état de la variable
last_button_time = button_time;
}
display.clearDisplay();
display.print("boucle interruption");
display.display();
delay(2500);
}
Voila le bout de code sur lequel je m’exerce pour la mise en veille et la sortie de veille de mon arduino.
Avec ce code en l'état, j'ai la lettre "a" et la lettre "b" qui apparait sur l'ecran et "boucle interruption" quand j'appuie sur le bouton poussoir. En même temps, la lcd sur la carte arduino change d'état.
une bonne pratique sur les forums d'informatique, ou d'électronique programmée consiste à poster son code entre des balises code, qui comme leur nom l'indique, servent à poster du code. ça rend le code lisible, garde l'indentation et la coloration syntaxique, ça rend compacte un peu, bref ça rend le code plus lisible, et du coup, c'est devenu un usage obligatoire. pour ce faire, tu peux copier ton code dans le presse-papier depuis ton IDE, cliquer sur le bouton qui ressemble à ça: [</>], dans la petite fenêtre qui s'ouvre, sélectionner le langage qui correspond à ton code (le code arduino peut se confondre à du C++ en terme de syntaxe, donc choisis C++), coller ton code , et cliquer sur le bouton insérer (il est vert, tu peux pas le rater).
je vais le faire pour toi pour cette fois, mais à l'avenir, pense à le faire, ça coûte rien, et ça donne moins envie à la personne qui aide de quitter la page.
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <avr/sleep.h>
// pin 7 - Serial clock out (SCLK)
// pin 6 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 4 - LCD chip select (CS)
// pin 3 - LCD reset (RST)
Adafruit_PCD8544 display = Adafruit_PCD8544(3,4,5,7,6);
int pin = 13;
volatile unsigned long button_time = 0;
volatile unsigned long last_button_time = 0;
int debounce = 250; // debounce latency in ms
volatile int state = LOW; // déclartion d'une variable volatile
void setup()
{display.begin();
display.setContrast(50);
pinMode(pin, OUTPUT);
attachInterrupt(0, interruption, FALLING); // attache l'interruption externe n°1 à la fonction interruption
}
void loop()
{
digitalWrite(pin, state); // la LED reflète l'état de la variable
display.clearDisplay();// efface le lcd
display.print("a");
display.display();// affiche la lettre
delay(2500);// une pause pour prendre le temps de voir ce qui est affiché à l'écran.
sleep_cpu();
display.clearDisplay();
display.print("b");
display.display();
delay(2500);
}
void interruption() // la fonction appelée par l'interruption externe n°0
{
button_time = millis();
if (button_time - last_button_time > debounce)
{
state = !state; // inverse l'état de la variable
last_button_time = button_time;
}
display.clearDisplay();
display.print("boucle interruption");
display.display();
delay(2500);
}
voilà, c'est tout pour moi, je vais jeter un oeil à tout ça quand j'aurai un peu plus de temps.
oui. non. enfin je regarde et je te dis.
Arduino: les interruptions
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
oui. non. enfin je regarde et je te dis.