Раньше с этим кодом, у меня четко работали энкодеры от магнитол, за один щелчек код выдавал 1 такт. Сейчас они закончились, и я купил новые, но в этом коде все энкодеры дают 4 такта за один щелчек. Что изменить в коде, чтобы новый энкодер, который дает 4 такта за один щелчек, отрабатывался как один такт? Код (C++): /* This code is without the push button function These pins can not be changed 2/3 are special pins -> Interrupt */ const uint8_t encoderPin1 = 2; const uint8_t encoderPin2 = 3; volatile int lastEncoded = 0; volatile long encoderValue = 0; long lastencoderValue = 0; uint8_t lastMSB = 0; uint8_t lastLSB = 0; void setup() { Serial.begin (9600); pinMode(encoderPin1, INPUT); pinMode(encoderPin2, INPUT); digitalWrite(encoderPin1, HIGH); //turn pullup resistor on digitalWrite(encoderPin2, HIGH); //turn pullup resistor on /* Call updateEncoder() when any high/low changed seen on interrupt 0 (pin 2), or interrupt 1 (pin 3)*/ attachInterrupt(0, updateEncoder, CHANGE); attachInterrupt(1, updateEncoder, CHANGE); } void loop() { //Do stuff here Serial.println(encoderValue); delay(1000); //just here to slow down the output, and show it will work even during a delay } void updateEncoder() { int MSB = digitalRead(encoderPin1); //MSB = most significant bit int LSB = digitalRead(encoderPin2); //LSB = least significant bit int encoded = (MSB << 1) | LSB; //converting the 2 pin value to single number int sum = (lastEncoded << 2) | encoded; //adding it to the previous encoded value if (sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue ++; if (sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue --; lastEncoded = encoded; //store this value for next time }
Поставить кратковременную задержку, чтобы она срабатывала после первого такта, пока не пройдут остальные три. Или сделать счётчик тактов с помощью кода триггера.
Спасибо, я тоже так думал и делал, вместо: if(sum ==0b1101|| sum ==0b0100|| sum ==0b0010|| sum ==0b1011) encoderValue ++; это: if(sum ==0b1101|| sum ==0b0100|| sum ==0b0010|| sum ==0b1011) encoderValue /4; не работало. А сейчас поменял: Serial.println(encoderValue/4); И заработало!