const int pinA = 2; // Pin A collegato a D2
const int pinB = 3; // Pin B collegato a D3
const int outputPin1 = A0; // Uscita digitale 1
const int outputPin2 = A1; // Uscita digitale 2
volatile int lastEncoded = 0;
volatile long encoderValue = 0;
void setup() {
Serial.begin(9600);
pinMode(pinA, INPUT);
pinMode(pinB, INPUT);
pinMode(outputPin1, OUTPUT);
pinMode(outputPin2, OUTPUT);
// Abilita il pull-up interno
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
// Interruzioni sui pin A e B
attachInterrupt(digitalPinToInterrupt(pinA), updateEncoder, CHANGE);
attachInterrupt(digitalPinToInterrupt(pinB), updateEncoder, CHANGE);
}
void loop() {
static long oldEncoderValue = 0;
if (encoderValue != oldEncoderValue) {
if (encoderValue > oldEncoderValue) {
Serial.println("01"); // Ruotato a destra
digitalWrite(outputPin1, LOW);
digitalWrite(outputPin2, HIGH);
} else {
Serial.println("10"); // Ruotato a sinistra
digitalWrite(outputPin1, HIGH);
digitalWrite(outputPin2, LOW);
}
oldEncoderValue = encoderValue;
} else {
Serial.println("00"); // Nessun aggiornamento
digitalWrite(outputPin1, LOW);
digitalWrite(outputPin2, LOW);
}
delay(10); // Attendere un po' prima di inviare il prossimo stato
}
void updateEncoder() {
int MSB = digitalRead(pinA); // Most Significant Bit
int LSB = digitalRead(pinB); // Least Significant Bit
int encoded = (MSB << 1) | LSB; // Costruisce il nuovo valore codificato
int sum = (lastEncoded << 2) | encoded; // Combina i valori
if (sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue++;
if (sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue--;
lastEncoded = encoded; // Aggiorna l'ultimo valore codificato
}