99 lines
2.8 KiB
C++
99 lines
2.8 KiB
C++
/*
|
|
Copyright (c) 2014-2015 NicoHood
|
|
See the readme for credit to other people.
|
|
|
|
PinChangeInterrupt_TickTock
|
|
Demonstrates how to use the library
|
|
|
|
Connect a button/cable to pin 10/11 and ground.
|
|
The value printed on the serial port will increase
|
|
if pin 10 is rising and decrease if pin 11 is falling.
|
|
|
|
PinChangeInterrupts are different than normal Interrupts.
|
|
See readme for more information.
|
|
Dont use Serial or delay inside interrupts!
|
|
This library is not compatible with SoftSerial.
|
|
|
|
The following pins are usable for PinChangeInterrupt:
|
|
Arduino Uno/Nano/Mini: All pins are usable
|
|
Arduino Mega: 10, 11, 12, 13, 50, 51, 52, 53, A8 (62), A9 (63), A10 (64),
|
|
A11 (65), A12 (66), A13 (67), A14 (68), A15 (69)
|
|
Arduino Leonardo/Micro: 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI)
|
|
HoodLoader2: All (broken out 1-7) pins are usable
|
|
Attiny 24/44/84: All pins are usable
|
|
Attiny 25/45/85: All pins are usable
|
|
Attiny 13: All pins are usable
|
|
Attiny 441/841: All pins are usable
|
|
ATmega644P/ATmega1284P: All pins are usable
|
|
*/
|
|
|
|
#include "PinChangeInterrupt.h"
|
|
|
|
// choose a valid PinChangeInterrupt pin of your Arduino board
|
|
#define pinTick 10
|
|
#define pinTock 11
|
|
|
|
volatile long ticktocks = 0;
|
|
|
|
void setup()
|
|
{
|
|
// start serial debug output
|
|
Serial.begin(115200);
|
|
Serial.println(F("Startup"));
|
|
|
|
// set pins to input with a pullup
|
|
pinMode(pinTick, INPUT_PULLUP);
|
|
pinMode(pinTock, INPUT_PULLUP);
|
|
|
|
// attach the new PinChangeInterrupts and enable event functions below
|
|
attachPinChangeInterrupt(digitalPinToPinChangeInterrupt(pinTick), tick, RISING);
|
|
attachPinChangeInterrupt(digitalPinToPinChangeInterrupt(pinTock), tock, FALLING);
|
|
}
|
|
|
|
void loop() {
|
|
// integer to count the number of prints
|
|
static int i = 0;
|
|
delay(1000);
|
|
|
|
// print values
|
|
Serial.print(i, DEC);
|
|
Serial.print(F(" "));
|
|
Serial.println(ticktocks);
|
|
|
|
// abort if we printed 100 times
|
|
if (i >= 100) {
|
|
Serial.println(F("Detaching Interrupts."));
|
|
detachPinChangeInterrupt(digitalPinToPinChangeInterrupt(pinTick));
|
|
detachPinChangeInterrupt(digitalPinToPinChangeInterrupt(pinTock));
|
|
return;
|
|
}
|
|
else
|
|
i++;
|
|
|
|
// Temporary pause interrupts
|
|
if (ticktocks > 500) {
|
|
Serial.println(F("Disabling Tick Interrupt."));
|
|
disablePinChangeInterrupt(digitalPinToPinChangeInterrupt(pinTick));
|
|
enablePinChangeInterrupt(digitalPinToPinChangeInterrupt(pinTock));
|
|
}
|
|
else if (ticktocks < -500) {
|
|
Serial.println(F("Disabling Tock Interrupt."));
|
|
disablePinChangeInterrupt(digitalPinToPinChangeInterrupt(pinTock));
|
|
enablePinChangeInterrupt(digitalPinToPinChangeInterrupt(pinTick));
|
|
}
|
|
else {
|
|
enablePinChangeInterrupt(digitalPinToPinChangeInterrupt(pinTick));
|
|
enablePinChangeInterrupt(digitalPinToPinChangeInterrupt(pinTock));
|
|
}
|
|
}
|
|
|
|
void tick(void) {
|
|
// increase value
|
|
ticktocks++;
|
|
}
|
|
|
|
void tock(void) {
|
|
// decrease value
|
|
ticktocks--;
|
|
}
|