Печатать только тогда, когда кнопка нажата и больше не нажимается
У меня есть Arduino и микропереключатель, который я хочу использовать, чтобы знать, когда переключатель изначально нажат (получите «OnsetTime» на последовательном) и когда переключатель больше не нажимается (получите «OffsetTime» на последовательном).
Представьте себе птицу, сидящую на выключателе. Я хочу получить вывод "OnsetTime", когда птица впервые садится на переключатель, и вывод "OffsetTime", когда птица улетает от переключателя.
Сейчас у меня есть вывод, который постоянно выводит "OnsetTime" при нажатии переключателя. Я был бы признателен, если бы кто-нибудь помог мне понять, как я могу реализовать приведенный ниже код, чтобы получать выходные данные только тогда, когда переключатель первоначально нажат и больше не нажимается.
void setup() {
pinMode(7, INPUT);
Serial.begin(9600);
}
void loop() {
if (digitalRead(7) == HIGH) {
Serial.println("OnsetTime");
}
}
//Serial.println("GetOffsetTime");
@John, 👍1
2 ответа
Если вы хотите быть проще, вы можете использовать эту библиотеку. Код будет
#include <ezButton.h>
ezButton button(7); // создаем объект Button, который подключается к контакту 7;
void setup() {
Serial.begin(9600);
button.setDebounceTime(100); // устанавливаем время устранения дребезга на 100 миллисекунд
}
void loop() {
button.loop(); // ДОЛЖЕН сначала вызвать функцию loop()
if(button.isPressed())
Serial.println("OnsetTime");
if(button.isReleased())
Serial.println("GetOffsetTime");
}
Если вы хотите разобраться в деталях, вы можете ознакомиться с кодом и инструкциями в этом руководстве
Вы можете сохранить прочитанное значение переключателя, чтобы сравнить его в следующем цикле. Так вы сможете обнаруживать изменения.
int lastValue;
void setup() {
pinMode(7, INPUT);
lastValue= digitalRead(7);
Serial.begin(9600);
}
void loop() {
int currentValue = digitalRead(7);
if (lastValue != currentValue) {
lastValue = currentValue;
if (currentValue == HIGH) {
Serial.println("OnsetTime");
} else {
Serial.println("OffsetTime");
}
}
}
Обратите внимание, что переключатели дребезжат. Если вы видите несколько сообщений при каждом механическом изменении, вставьте delay(...)
.
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Использовать все контакты как цифровые входы/выходы
- Float печатается только 2 десятичных знака после запятой
- Arduino как USB HID
- Serial1' was not declared in this scope
- Очень простая операция Arduino Uno Serial.readString()
- AT-команда не отвечает на последовательный монитор
Привет. Это дает мне ошибку: «Кнопка класса» не имеет члена с именем «setDebounceTime»., @John
Вы установили библиотеку ezButton? если нет, следуйте [этой инструкции](https://arduinogetstarted.com/tutorials/arduino-button-library), чтобы установить libraray, @Rozona Zoro
Да. Это необычный случай, поэтому я немного смущен. Вы пробовали это, и это работает?, @John
Да пробовал, работает. Я думаю, вы можете установить несколько библиотек кнопок. Пожалуйста, проверь это. Или запустите пример кода из библиотеки. Если все же произошло, какой Arduino вы используете?, @Rozona Zoro
Вы имеете в виду, что я хотел бы удалить другие библиотеки кнопок, если они у меня есть? Я использую Ардуино Уно., @John
Я попытался удалить другие библиотеки кнопок, и теперь код работает. Благодарю вас!, @John