// include the EnableInterrupt library - see the links in the related topics section above for details #define EI_ARDUINO_INTERRUPTED_PIN // to enable pin states functionality #include //DEBUG settings #define DEBUG 1 // 0 - no debug // Assign your channel in pins #define CHANNEL1_IN_PIN 2 #define CHANNEL2_IN_PIN 3 #define CHANNEL3_IN_PIN 4 #define CHANNEL4_IN_PIN 5 #define CHANNEL5_IN_PIN 6 #define CHANNEL6_IN_PIN 7 #define CHANNEL7_IN_PIN 8 #define CHANNEL8_IN_PIN 9 volatile uint16_t interruptCountA=0; // The count will go back to 0 after hitting 65535. volatile uint16_t PinStateSumB=0; // The count will go back to 0 after hitting 65535. // shared variables are updated by the ISR and read by loop. // In loop we immediatley take local copies so that the ISR can keep ownership of the // shared ones. To access these in loop // we first turn interrupts off with noInterrupts // we take a copy to use in loop and the turn interrupts back on // as quickly as possible, this ensures that we are always able to receive new signals volatile uint8_t InterruptedPinShared; volatile uint8_t PinStateShared; void setup() { if (DEBUG !=0) { Serial.begin(9600); Serial.println("setup started "); } enableInterrupt(CHANNEL1_IN_PIN, interruptFunction,CHANGE); enableInterrupt(CHANNEL2_IN_PIN, interruptFunction,CHANGE); if (DEBUG !=0) { Serial.println(" setup completed "); } } void loop() { static uint8_t InterruptedPin; static uint8_t PinState; noInterrupts(); // turn interrupts off quickly while we take local copies of the shared variables InterruptedPin = InterruptedPinShared; PinState = PinStateShared; interrupts(); // we have local copies of the inputs, so now we can turn interrupts back on // as soon as interrupts are back on, we can no longer use the shared variables here //Printing if (DEBUG !=0) { Serial.print("interruptCountA:"); Serial.print(interruptCountA); Serial.println(""); Serial.print("PinStateSumB:"); Serial.print(PinStateSumB); Serial.println(""); Serial.print("InterruptedPin:"); Serial.print(InterruptedPin); Serial.println(""); Serial.print("PinState:"); Serial.print(PinState); Serial.println(""); } }// end of loop void interruptFunction() { //interruptCountA increased each time interrupt called interruptCountA++; //save values to use them outside the interrupt function InterruptedPinShared=arduinoInterruptedPin; PinStateShared=arduinoPinState; //PinStateSumB increased each time arduinoPinState=1 detected PinStateSumB=PinStateSumB + arduinoPinState ; }