//Arduino Code - Rotary Encoder w push button
#include <BfButton.h>
int btnPin=7; //GPIO #3-Push button on encoder
int DT=6; //GPIO #4-DT on encoder (Output B)
int CLK=5; //GPIO #5-CLK on encoder (Output A)
BfButton btn(BfButton::STANDALONE_DIGITAL, btnPin, true, LOW);
int counter = 0;
int angle = 0;
int aState;
int aLastState;
boolean stato=false;
//Button press hanlding function
void pressHandler (BfButton *btn, BfButton::press_pattern_t pattern) {
switch (pattern) {
case BfButton::SINGLE_PRESS:
Serial.println("Single push");
break;
case BfButton::DOUBLE_PRESS:
Serial.println("Double push");
break;
case BfButton::LONG_PRESS:
Serial.println("Long push");
break;
}
}
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Serial.println(angle);
pinMode(CLK,INPUT_PULLUP);
pinMode(DT,INPUT_PULLUP);
aLastState = digitalRead(CLK);
//Button settings
btn.onPress(pressHandler)
.onDoublePress(pressHandler) // default timeout
.onPressFor(pressHandler, 1000); // custom timeout for 1 second
}
void loop() {
// put your main code here, to run repeatedly:
//Wait for button press to execute commands
btn.read();
aState = digitalRead(CLK);
//Encoder rotation tracking
if (aState != aLastState){
if (digitalRead(DT) != aState) {
//counter ++;
//angle ++;
stato=true;
}
else {
//counter--;
//angle --;
stato=false;
}
if (counter >=100 ) {
counter =100;
}
if (counter <=-100 ) {
counter =-100;
}
Serial.println(stato);
}
aLastState = aState;
}
/*
Utilizzare un encoder rotativo con Arduino
Autore : Andrea Lombardo
Web : http://www.lombardoandrea.com
Post : https://wp.me/p27dYH-PP
//Definizione pin
const unsigned int pinClk = 5; // Pin che utilizzeremo per conteggiare le variazioni di stato
const unsigned int pinDt = 6; // Pin che utilizzeremo per calcolare la direzione
// Conserva stato ultima posizione encoder
int prevClk;
int prevDt;
// Variabile per mantenere il valore del contatore di esempio
int contatore;
void setup() {
Serial.begin(250000);
pinMode(pinClk, INPUT);
pinMode(pinDt, INPUT);
// Esegui prima lettura dei valori sui pin
prevClk = digitalRead(pinClk);
prevDt = digitalRead(pinDt);
//Inizializzo variabile contatore
contatore = 0;
}
void loop() {
// Leggi valori dai pin dell'encoder
int currClk = digitalRead(pinClk);
int currDt = digitalRead(pinDt);
// Se la lettura corrente è diversa dall'ultima memorizzata
if (currClk != prevClk) {
//Serial.print("[prevClk, prevDt | currClk, currDt] = ");
//Serial.print(prevClk);
//Serial.print(" ");
//Serial.print(prevDt);
//Serial.print(" | ");
//Serial.print(currClk);
//Serial.print(" ");
//Serial.print(currDt);
//Se il valore di dt è uguale al valore corrente di clk
if (currDt == currClk) {
//Serial.print(" -");
contatore --;
} else {
//Serial.print(" +");
contatore ++;
}
// Mostra lo stato del contatore
//Serial.print(" = ");
//Serial.println(contatore);
//Aggiorna valori
prevClk = currClk;
prevDt = currDt;
Serial.println(contatore);
}
}
*/