Files
2024-07-20 22:09:06 +08:00

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--;
}