Снять показания с потенциометра одним нажатием кнопки?

Привет, я пытаюсь заставить свой код Arduino Uno работать с a определенным образом, когда, если я нажму кнопку, Arduino прочитает необработанное значение потенциометра один раз, и если я не нажму его, ничего не произойдет.

https://imgur.com/M7qGvtC

int switchState = 0 
int switchPin = 2
int potPin = A0;

void setup() {
pinMode (potPin, OUTPUT);
pinMode (switchPin, INPUT);
Serial.begin (9600);

}

void loop() {
switchState = digitalRead(2);
if (switchState == High) {
Potval = analogRead(potPin);
Serial.print("potval:");
Serial.Println(Potval);
delay(200);
}

else {
(switchState == LOW);
while (Potval);
}
}

, 👍2

Обсуждение

какой у вас вопрос по поводу arduino? ... вопрос в вашем названии на самом деле не связан с arduino, и он имеет ответ `да"., @jsotola

Что это должно делать: (switchState == LOW); while (Potval);? Первая строка ничего не делает, так как это выражение не находится внутри какой-либо команды управления потоком. Вторая строка будет зацикливаться вечно (блокируя код на неопределенный срок), когда Potval не равен нулю. Мне это не кажется подходящим. Зачем ты вообще это делаешь?, @chrisl

Имейте в виду, что язык Arduino (C ++) чувствителен к регистру: "Println" - это не то же самое, что "println", "High" - это не то же самое, что HIGH., @Edgar Bonet


3 ответа


-5

Я считаю, что вы получаете много показаний, когда кнопка нажата, но ничего, когда отпущена. Эта ссылка должна решить вашу проблему.

,

я думаю, вы забыли ссылку, @Matt

Нам не нравятся ответы только по ссылкам (а в вашем случае вы забыли ссылку). Ответы здесь должны стоять сами по себе. Ссылки, идущие вниз, - это вещь, и действительно довольно распространенная вещь., @Nick Gammon

Нет никакой связи., @DragonflyRobotics

Ссылка была удалена. Я сделал ссылку вместо копирования и вставки нескольких страниц текста., @Gil


1

У меня была очень похожая проблема: вы не настраиваете свою кнопку как INPUT_PULLUP. Когда вы нажимаете кнопку, вы посылаете через нее 5 В или землю в зависимости от вашей схемы. Но тогда он не будет сброшен при выпуске. Вот почему вы можете поставить физический резистор, как показано на схеме здесь:

или вы можете просто изменить инициализацию кнопки на INPUT_PULLUP.

,

1

С вашим кодом было несколько проблем:

  • Он не будет компилироваться из-за некоторых отсутствующих точек с запятой (строки 1 и 2);
  • Предложение 'else' в вашей функции loop() не сделало ничего полезного;
  • Если ваш код не попал в петлю в предложении "else" (вероятно, так оно и будет!), Он будет печататься многократно до тех пор, пока вы НЕ нажмете кнопку, так как вы подключили кнопку к чтению LOW при нажатии (что совершенно нормально, но ваш код должен принять это во внимание).
  • Кнопки, по-видимому, подпрыгивают (электрически), когда вы нажимаете или отпускаете их. Они не переключаются один раз и не остаются такими. Они переключаются несколько раз, прежде чем успокоиться, из-за шероховатых контактных поверхностей, скользящих друг по другу. Код также должен учитывать это.
  • Аналоговый вывод не должен быть настроен на вывод, если вы хотите читать аналог с его помощью.

Вот пересмотренная версия вашего кода, скомпилированная и протестированная. Вы найдете примечания в комментариях, где я внес изменения:

int switchState = 0;            // (';' отсутствовал)
int switchPin = 2;          // (';' отсутствовал)
int potPin = A0;
int Potval = 0;             // (это объявление отсутствовало)
bool didPrint = false;      // true если мы напечатали на этой кнопке-push
// предотвращает многопечатную печать, пока кнопка остается высокой

void getSwitch();               // объявить новую функцию


void setup() {
  // pinMode (potPin, OUTPUT); // не выводится для аналогового чтения
  pinMode (switchPin, INPUT_PULLUP);  // требуется подтягивание или чтение может быть ненадежным
  pinMode (13, OUTPUT); digitalWrite(13, LOW); //ОТЛАДКА
  Serial.begin (9600);

}

void loop() {
  getSwitch();
  if (switchState == LOW ) {        // pressed == LOW так, как вы его подключили

    if (!didPrint) {
      Potval = analogRead(potPin);
      Serial.print("potval:");
      Serial.println(Potval);

      didPrint = true;      // запретить повторную печать до тех пор, пока кнопка не будет отпущена
    }
  }
  else if  (switchState == HIGH) {
    didPrint = false;       // печать разрешена при следующем нажатии кнопки
  }
}


void getSwitch() {
  switchState = digitalRead(switchPin);
  delay(30);                // ждет, пока кнопка уляжется - возможно, придется это подправить
}
,