Снять показания с потенциометра одним нажатием кнопки?
Привет, я пытаюсь заставить свой код 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);
}
}
@Matt, 👍2
Обсуждение3 ответа
Я считаю, что вы получаете много показаний, когда кнопка нажата, но ничего, когда отпущена. Эта ссылка должна решить вашу проблему.
я думаю, вы забыли ссылку, @Matt
Нам не нравятся ответы только по ссылкам (а в вашем случае вы забыли ссылку). Ответы здесь должны стоять сами по себе. Ссылки, идущие вниз, - это вещь, и действительно довольно распространенная вещь., @Nick Gammon
Нет никакой связи., @DragonflyRobotics
Ссылка была удалена. Я сделал ссылку вместо копирования и вставки нескольких страниц текста., @Gil
У меня была очень похожая проблема: вы не настраиваете свою кнопку как INPUT_PULLUP. Когда вы нажимаете кнопку, вы посылаете через нее 5 В или землю в зависимости от вашей схемы. Но тогда он не будет сброшен при выпуске. Вот почему вы можете поставить физический резистор, как показано на схеме здесь:
или вы можете просто изменить инициализацию кнопки на INPUT_PULLUP.
С вашим кодом было несколько проблем:
- Он не будет компилироваться из-за некоторых отсутствующих точек с запятой (строки 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); // ждет, пока кнопка уляжется - возможно, придется это подправить
}
- ШИМ-управление, как остановить мерцание светодиода?
- Замените несколько потенциометров кнопками и одиночными потенциометрами.
- Включение потенциометра/кнопки с цифровым выводом
- Как регулировать светодиод на плате?
- Определение того, была ли нажата и отпущена кнопка
- Как эмулировать аналоговый потенциометр с помощью ШИМ
- Хорошая кнопка debouncing/Библиотека StateChange
- Остановить мигание светодиодов
какой у вас вопрос по поводу arduino? ... вопрос в вашем названии на самом деле не связан с arduino, и он имеет ответ `да"., @jsotola
Что это должно делать:
(switchState == LOW); while (Potval);
? Первая строка ничего не делает, так как это выражение не находится внутри какой-либо команды управления потоком. Вторая строка будет зацикливаться вечно (блокируя код на неопределенный срок), когдаPotval
не равен нулю. Мне это не кажется подходящим. Зачем ты вообще это делаешь?, @chrislИмейте в виду, что язык Arduino (C ++) чувствителен к регистру: "Println" - это не то же самое, что "println", "High" - это не то же самое, что
HIGH
., @Edgar Bonet