Perchè mai debbo complicarmi la vita usando un encoder rotativo?
Se devo impostare un valore posso usare un comune potenziometro o due pulsanti UP e DOWN.
Di seguito un listato. Necessita di due resistense da 10Kohm fra + Vcc ed i pin dell'encoder.
Nello sketch non c'è, ma ci vuole perchè è pur sempre un dispositivo meccanico, l'antirimbalzo.
#include <LiquidCrystal.h> LiquidCrystal lcd(8, 9, 10, 11, 12, 13); int encoderPin1 = 2; int encoderPin2 = 3; int ledPin1 = 5; volatile int lastEncoded = 0; volatile long encoderValue = 0; long lastencoderValue = 0; int lastMSB = 0; int lastLSB = 0; void setup() { pinMode(encoderPin1, INPUT); pinMode(encoderPin2, INPUT); pinMode(ledPin1, OUTPUT); digitalWrite(encoderPin1, HIGH); digitalWrite(encoderPin2, HIGH); analogWrite (ledPin1,LOW); attachInterrupt(0, updateEncoder, CHANGE); attachInterrupt(1, updateEncoder, CHANGE); lcd.begin(16, 2); Serial.begin (9600); } void loop(){ // delay(200); Serial.println(encoderValue); lcd.setCursor(0, 0); lcd.print(encoderValue); if ( encoderValue > 255 ) { encoderValue = 255; lcd.clear(); delay (20); } if ( encoderValue < 0 ) { encoderValue = 0; lcd.clear(); delay(20);} analogWrite(ledPin1,encoderValue); Serial.println(encoderValue); } //--------------- Fine LOOP------------------- void updateEncoder(){ int MSB = digitalRead(encoderPin1); int LSB = digitalRead(encoderPin2); int encoded = (MSB << 1) |LSB; int sum = (lastEncoded << 2) | encoded; if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue ++; if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue --; lastEncoded = encoded; }
Nessun commento:
Posta un commento