/*
Codigo alterado do site: https://www.upesy.com/blogs/tutorials/rotary-encoder-esp32-with-arduino-code#
(Updated at 01/20/2023)
Modificado por: Mario Parente
*/
#include "AiEsp32RotaryEncoder.h"
#define CLK 25
#define DT 26
#define SW 27
#define VCC_PIN -1
#define Passos 4 //Para aceleração de passos (setAcceleration)
AiEsp32RotaryEncoder Encoder = AiEsp32RotaryEncoder(DT, CLK, SW, VCC_PIN, Passos);
void rotary_onButtonClick(){
static unsigned long lastTimePressed = 0; // Soft debouncing
if (millis() - lastTimePressed < 500)
{
return;
}
lastTimePressed = millis();
Serial.print("botão pressionado ");
Serial.print(millis());
Serial.println(" milissegundos após reiniciar");
}
void rotary_loop(){
//não imprime nada a menos que o valor seja alterado
if (Encoder.encoderChanged()){
Serial.print("Valor: ");
Serial.println(Encoder.readEncoder());
}
if (Encoder.isEncoderButtonClicked()){
rotary_onButtonClick();
}
}
void IRAM_ATTR readEncoderISR(){
Encoder.readEncoder_ISR();
}
void setup(){
Serial.begin(115200);
//Inicinando o rotary encoder
Encoder.begin();
Encoder.setup(readEncoderISR);
//definir limites e se os valores devem circular ou não
int ValorMin = 0; //Valor Minino do encoder
int ValorMax = 10; //Valor Maximo do encoder
bool Circular = true; //true|false Se o valor vai circular ou para no valor maximo/minino
//(Se ativadovamor Maximo sera o mesmo do minino )
Encoder.setBoundaries(ValorMin, ValorMax, Circular);
/*Rotary acceleration introduced 25.2.2021.
caso o intervalo a selecionar seja grande, por exemplo - selecione um valor entre 0 e 1000 e queremos 785
sem aceleração você precisa de muito tempo para chegar a esse número
Usando a aceleração, quanto mais rápido você virar, mais rápido o valor aumentará.
Para ajuste fino, diminua a velocidade.*/
//rotaryEncoder.disableAcceleration(); //a aceleração agora está habilitada por padrão - desative se não precisar
Encoder.setAcceleration(250); //ou defina o valor - número maior = mais aceleração; 0 ou 1 significa aceleração desabilitada
}
void loop(){
//in loop call your custom function which will process rotary encoder values
rotary_loop();
delay(50); //or do whatever you need to do...
}