I have a Rotary Encoder code. It complies on my Arduino IDE with a Raspberry Pi Pico and Arduino Micro board. I need to add one button to this and I am having problems adding one button function. I am new to Arduino code. l am more familiar with G-Code. But, I have successfully unloaded an adapter code and got it to work. Below is the Rotary Encoder code I have for my project. If you could help me that would be great. I need input pullups added to my code as well. I added some button function code to the sketch from the forums, but I was unable to get it going properly.
I need to know what to add and where in the void set-up and void loop a button needs to be placed in order to work. If you could add the parts to the code, I would greatly appreciate it. And then instruct me on where to use this. It is simple and probably very easy to solve. I would just like to learn how. And what libraries I may need. I plan on getting a Arduino Micro for this project due to me using a Rotary Encoder because I will use the interrupt pins. Thank you for having such awesome boards, IDE and support.
Below is the rotary encoder code I have without any button function added.
// Define rotary encoder pins
#define ENC_A 2
#define ENC_B 3
unsigned long _lastIncReadTime = micros();
unsigned long _lastDecReadTime = micros();
int _pauseLength = 25000;
int _fastIncrement = 10;
volatile int counter = 0;
void setup() {
// Set encoder pins and attach interrupts
pinMode(ENC_A, INPUT_PULLUP);
pinMode(ENC_B, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(ENC_A), read_encoder, CHANGE);
attachInterrupt(digitalPinToInterrupt(ENC_B), read_encoder, CHANGE);
// Start the serial monitor to show output
Serial.begin(115200);
}
void loop() {
static int lastCounter = 0;
// If count has changed print the new value to serial
if(counter != lastCounter){
Serial.println(counter);
lastCounter = counter;
}
}
void read_encoder() {
// Encoder interrupt routine for both pins. Updates counter
// if they are valid and have rotated a full indent
static uint8_t old_AB = 3; // Lookup table index
static int8_t encval = 0; // Encoder value
static const int8_t enc_states[] = {0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0}; // Lookup table
old_AB <<=2; // Remember previous state
if (digitalRead(ENC_A)) old_AB |= 0x02; // Add current state of pin A
if (digitalRead(ENC_B)) old_AB |= 0x01; // Add current state of pin B
encval += enc_states[( old_AB & 0x0f )];
// Update counter if encoder has rotated a full indent, that is at least 4 steps
if( encval > 3 ) { // Four steps forward
int changevalue = 1;
if((micros() - _lastIncReadTime) < _pauseLength) {
changevalue = _fastIncrement * changevalue;
}
_lastIncReadTime = micros();
counter = counter + changevalue; // Update counter
encval = 0;
}
else if( encval < -3 ) { // Four steps backward
int changevalue = -1;
if((micros() - _lastDecReadTime) < _pauseLength) {
changevalue = _fastIncrement * changevalue;
}
_lastDecReadTime = micros();
counter = counter + changevalue; // Update counter
encval = 0;
}
}