<div dir="ltr"><div><div><div>I am adding a quadrature encoder to a project I am working on, but having a problem understanding why this is not working.<br><br></div>I have used quadrature encoders before, implementing them with 0, 1, and 2 interrupt lines.  In this case, I only have one interrupt line available so I am interrupting on one channel and checking the other.<br><br></div>I know this is possible, but I have a bug in the code below and I can't seem to find it.<br><br></div>What am I missing?<br><br><br>/*<br> * Simple quadrature encoder implementation.  I only have one interrupt available (as I<br> *    am using the other for another purpose on this project), so I can only watch one<br> *    of the two encoder pins.  While this reduces the number of transitions per revolution<br> *    that is okay for this purpose.<br> *<br> * When running this, I only see a stream of 0 and 1 values for the encoderValue - what am<br> *    I doing wrong?<br> */<br>#include "Arduino.h"<br><br>int encoderA = 3;   // This one is an interrupt pin<br>int encoderB = 4;   // This is a standard (not interrupt) pin<br><br>volatile int  lastB = 0;<br>volatile long encoderValue = 0;<br><br>void updateEncoder(void);<br><br>/*<br> * Setup the input pins and attach our interrupt vector<br> */<br>void setup() {<br>   Serial.begin(9600);<br>   <br>   // Set both quadrature channels to input and turn on pullup resistors<br>   pinMode(encoderA, INPUT); <br>   pinMode(encoderB, INPUT);<br>   digitalWrite(encoderA, HIGH);<br>   digitalWrite(encoderB, HIGH);<br><br>   // invoke interrupt routine on each falling edge of encoderA<br>   attachInterrupt(1, updateEncoder, FALLING);<br>}<br><br><br>/*<br> * Simply print out the encoder value (at a reasonable rate)<br> */<br>void loop() {<br><br>  Serial.println(encoderValue);<br>  delay(100);<br>}<br><br><br>/*<br> * This interrupt routine is called on each falling edge of encoder channel A. We<br> *   look at the B edge to to determine if we are counting up, down, or staying in<br> *   the same location.<br> * Note if we only looked at the current B (and not the previous B), we would get<br> *   duplicate up/down counts on every transition due to non-debounced quadrature<br> *   signals.<br> */<br>void updateEncoder(void) {<br>  <br>  // read the current encoderB value<br>  int newB = (digitalRead(encoderB) & 0x1);<br><br>  // create the 'transition' variable - show both old and new states - if 00 or 11<br>  //    this is a duplicate falling edge (not moved), but if 01 or 10, we have moved<br>  int transition = (lastB << 1) | newB;<br>  <br>  // are we counting up, down, or staying the same location?<br>  switch (transition) {<br>      // transitioned from a 0 -> 1 edge, so counting up<br>      case B01: <br>           encoderValue++; <br>           break;<br>      // transitioned from a 1 -> 0 edge, so counting down<br>      case B10: <br>           encoderValue--; <br>           break;<br>  }<br><br>   // Save current encoderB value for next transition variable<br>   lastB = newB;<br>}<br></div>