Сохранение значения одним кликом

У меня есть поворотный энкодер и 2 кнопки для a. Сохраните значение энкодера b. Сбросьте значение энкодера на 0. Кнопки сброса работают нормально, проблема связана с кнопкой установки/сохранения. Где значение меняется и без нажатия кнопки. Любая помощь приветствуется.

int encoderPin1 = 2;
int encoderPin2 = 3;

volatile int lastEncoded = 0; 
volatile double encoderValue = 0;
long lastencoderValue = 0;

int lastMSB = 0;
int lastLSB = 0;

// кнопки
int resetPin = 43;
int settPin = 22; 
int val = 0;
int val2 = 0;

//сброс-установка
double setValue = 0.0;
double resetValue = 0.0;

void setup() { 
  Serial.begin (9600);
  
  pinMode(encoderPin1, INPUT);
  pinMode(encoderPin2, INPUT);
  
  digitalWrite(encoderPin1, HIGH); 
  digitalWrite(encoderPin2, HIGH); 

  attachInterrupt(0, updateEncoder, CHANGE); 
  attachInterrupt(1, updateEncoder, CHANGE);

  //кнопки
  pinMode(resetPin, INPUT);
  pinMode(settPin, INPUT);

  pinMode(LED_BUILTIN, OUTPUT);

}
void loop(){
  //Serial.println(encoderValue); //Распечатать
  delay(1000); 

  //
val = digitalRead(settPin);
if (val == HIGH){
  set();
  digitalWrite(LED_BUILTIN, HIGH);
}

/*val2 = digitalRead(resetPin);
if (val2 == HIGH){
  //перезагрузить
  encoderValue = resetValue;
  Serial.println(encoderValue);
  Serial.print("reset");
  delay(100);
}*/

}

void set(){
  // устанавливаем значение
  setValue = encoderValue;
  Serial.println(setValue);
  Serial.print("setValue");
  delay(100);
}

 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;
  }

, 👍1

Обсуждение

в чем проблема с вашим кодом? ... вы получаете ошибки?, @jsotola

Используете ли вы внешние подтягивающие резисторы?, @chrisl

энкодер не требует прерывания на обоих сигнальных контактах ... разрешить прерывание при подъеме (или опускании) на одном сигнальном контакте ... состояние другого контакта во время прерывания указывает направление вращения, @jsotola


1 ответ


1

Спасибо за ваше предложение. Проблема не в коде, а в кнопке. Я поменял кнопку и все заработало. Спасибо за помощь!

,