Il existe des pins d'interruption qui permette de déclancher une action quand un pin est changé grâce à une fonction :
attach interrupt : https://www.arduino....ttachinterrupt/
Sur l'arduino uno ces pins d'interruptions sont aux nombre de 2 il s'agit des pins 2 et 3.
Sur l'arduino mega ces pins d'interruptions sont aux nombre de 6 ce sont les pins 2, 3, 18, 19, 20 et 21
cependant 4 de ces pins ont d'autre fonctionnalités qu'il peut être dérangeant de sacrifier :
18 et 19 sont les pins RX3 et TX3
20 et 21 sont les pins SDA et SCL pour l'i2C ...
Du coup si on a besoin de tous nos ports série et de l'I2c et de plus de deux interruptions est ce qu'on est coincé pour autant ?
Non car il existe les Pin Change Interrupt => https://playground.a...hangeInterrupt/
Pin Change Interrupt permet de déclencher des interruptions sur n'importe quel pin de l'arduino uno ou sur certains pins de l'arduino mega.
Un seul détail : Il n'y a que 3 fonctions d'interruption qui peuvent être déclenchée de cette façon et donc une même interruption et générée par plusieurs groupes de pins.
Ces trois fonctions sont : PCINT0 , PCINT1 et PCINT2
Sur une uno :
PCINT0 est lancé par un changement sur les pins D8 à D13 (PORT B : B0 à B5)
PCINT1 est lancé par un changement sur les pins A0 à A5 (PORT C : C0 à C5)
PCINT2 est lancé par un changement sur les pins D0 à D7 (PORT D : D0 à D7)
Sur une arduino Mega :
PCINT0 est lancé par un changement sur les pins PIN 53 52 51 50 10 11 12 13 ( PORT B : B0 à PB7)
PCINT1 est lancé par un changement sur des pins qui ne sont pas accessible par défaut
PCINT2 est lancé par un changement sur les pins A8 à A15 (PORT K : K0 à K7)
On notera que sur la mega les pins 50 -53 sont utilisé pour le SPI : MISO MOSI SCK SS
Il y a déjà un exemple simple de code utilisant les pin change interrupt pour une uno ici : https://playground.a...hangeInterrupt/
Donc je vais poster qu'une structure de code adapté à la mega que vous pourrez utiliser si vous avec besoin de Pin Change interrupt :
// Example of code using Pin change interrupt on arduino Mega provided by Mike118 // helpfull documentation : // Arduino Mega Pinout https://www.arduino.cc/en/Hacking/PinMapping2560 // Arduino Mega PCINT Pinout table : https://github.com/NicoHood/PinChangeInterrupt/blob/master/Readme.md // Arduino uno simple PCINT example : https://playground.arduino.cc/Main/PinChangeInterrupt/ void pciSetup(byte pin) { *digitalPinToPCMSK(pin) |= bit (digitalPinToPCMSKbit(pin)); // enable pin PCIFR |= bit (digitalPinToPCICRbit(pin)); // clear any outstanding interrupt PCICR |= bit (digitalPinToPCICRbit(pin)); // enable interrupt for the group } // ISR Routine to handle each group ISR (PCINT0_vect) // handle pin change interrupt for PB0 to PB7 (PIN 53 52 51 50 10 11 12 13) { // Do what you want here, it will be triggered whenever one of the eight pins change. } /* PCINT1 is not usable by default on arduino mega ISR (PCINT1_vect) { } */ ISR (PCINT2_vect) // handle pin change interrupt for PK0 to PK7 ( PIN A8 to A15) { // Do what you want here, it will be triggered whenever one of the eight pins change. } void setup() { // init all pin change interrupt pin available for (int i=10; i<=13; i++) { pinMode( i, INPUT); // INPUT is already on by default but ... digitalWrite(i,HIGH); // set pullups, if necessary ... pciSetup(i); // enable interrupt for pin... } for (int i=50; i<=53; i++) { pinMode( i, INPUT); // INPUT is already on by default but ... digitalWrite(i,HIGH); // set pullups, if necessary ... pciSetup(i); // enable interrupt for pin... } for (int i=A8; i<=A15; i++) { pinMode( i, INPUT); // INPUT is already on by default but ... digitalWrite(i,HIGH); // set pullups, if necessary... pciSetup(i); // enable interrupt for pin... } } void loop() { // Do your usual stuff here }
Ce genre des chose peut particulièrement être utile quand vous souhaitez lire la valeur de plusieurs signaux sur une arduino comme lire plusieurs signaux RC sur une radiocommande ou bien lire des encodeurs et faire un seul et même traitement quelque soit le pin qui a changé.
Si vous avez uniquement besoin de déclencher une fonction donnée quand un des pins donné parmi les pin change interrupt change dans ce cas soit vous faites vous même la petite routine qui permet de savoir quel pin à déclencher l'interruption pour savoir quel fonction appeler, soit vous utiliser des petites librairies toute faites qui font cela pour vous comme :
enableInterrupt ou pinChangeInterrupt .