Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const int PinA = 14; // Used for generating interrupts using CLK signal
- const int PinB = 12; // Used for reading DT signal
- const int PinSW = 13; // Used for the push button switch
- int lCnt = 0; // Keep track of last rotary value
- volatile int vPos = 0; // Updated by the ISR (Interrupt Service Routine)
- void isr_event () {
- static unsigned long lIsrTmr = 0; // Last Interrupt time
- unsigned long IsrTmr = millis(); // Interrupt time
- // If interrupts come faster than 5ms, assume it's a bounce and ignore
- if (IsrTmr - lIsrTmr > 5) {
- if (digitalRead(PinB) == LOW)
- {
- vPos++ ; // Could be +5 or +10
- }
- else {
- vPos-- ; // Could be -5 or -10
- }
- // Restrict value from 0 to +100
- vPos = min(10, max(0, vPos));
- // Keep track of when we were here last (no more than every 5ms)
- lIsrTmr = IsrTmr;
- }
- }
- void setup()
- {
- Serial.begin(9600);
- // Rotary pulses are INPUTs
- pinMode(PinA, INPUT);
- pinMode(PinB, INPUT);
- pinMode(PinSW, INPUT_PULLUP); // Switch is floating so use the in-built PULLUP so we don't need a resistor
- attachInterrupt(digitalPinToInterrupt(PinA), isr_event, LOW); // Attach the routine to service the interrupts
- Serial.println(F("Starting...")); // Ready to go!
- }
- void loop()
- {
- // Is someone pressing the rotary switch?
- if ((!digitalRead(PinSW))) {
- vPos = 0;
- while (!digitalRead(PinSW))
- delay(10);
- }
- // If the current rotary switch position has changed then update everything
- if (vPos != lCnt) {
- // Write out to serial monitor the value and direction
- Serial.println(vPos);
- // Keep track of this new value
- lCnt = vPos ;
- }
- }
Add Comment
Please, Sign In to add comment