Упрощенное подключение кнопки к Arduino!
Подключить кнопку к Arduino не так уж сложно. Но что, если у вас мало резисторов? Что делать, если вы хотите запустить логику только один раз за нажатие? Давайте сделаем это более упрощенно!
Зачем использовать резисторы?
Если вы не добавите резистор в свою цепь, вы увидите много шума, и ваши показания будут повсюду! В учебнике Arduino, связанном выше, они используют тягу 10 кОм, чтобы уменьшить шум.
Я не собираюсь слишком углубляться в закон Ома, просто знаю, что чем выше значение, тем меньше энергии тратится впустую, но шумоподавление будет больше.
Используйте встроенный подтягивающий резистор!
Arduino имеет встроенные резисторы Pull Up, вам просто нужно включить их! Есть внутренние резисторы 20 кОм, используемые для подведения напряжения 5В. Но обратите внимание, эта конфигурация заставляет вход читать HIGH, когда переключатель разомкнут, и LOW, когда он замкнут.
//setting Pinmode to INPUT_PULLUP, instead of basic INPUT
pinMode(BUTTON_PIN, INPUT_PULLUP);
Наша схема стала немного проще!
Обработка нажатий кнопок
Если вы прочитаете контакт кнопки в вашей петле, вы получите поток показаний, когда вы нажимаете на нее. Это может быть здорово, если вы хотите что- то сделать, пока кнопка нажата. Но как насчет запуска только одного действия на «press»?
У меня подключены три кнопки, мы просто отследим, нажата ли одна, и очистим настройки примерно через две секунды.
#define RED_BTN 10
#define YLW_BTN 11
#define GRN_BTN 12
unsigned long lastRead = 0;
unsigned int readOffset = 1000; //max MS between resets
int lastButtonPressed = 0;
int buttonTimeout = 0;
void setup()
{
Serial.begin(9600);
pinMode(RED_BTN, INPUT_PULLUP);
pinMode(YLW_BTN, INPUT_PULLUP);
pinMode(GRN_BTN, INPUT_PULLUP);
}
void loop()
{
buttonLogic(); //check for a press event every loop
if (millis() - lastRead > readOffset) //run this part every 1000 milliseconds
{
// Record read time
lastRead = millis();
if (--buttonTimeout < 0) {
lastButtonPressed = 0; // reset button press after button timeout is hit
buttonTimeout = 0;
}
}
}
void buttonLogic() {
if (buttonPressed(RED_BTN)) {
Serial.println("Red, Stop!");
}
if (buttonPressed(YLW_BTN)) {
Serial.println("Yellow, hurry up!");
}
if (buttonPressed(GRN_BTN)) {
Serial.println("Green, Go time!");
}
}
const int PRESSED = LOW; // LOW means pressed when using INPUT_PULLUP
bool buttonPressed(int btn) {
//Check if button is being pressed
int state = digitalRead(btn);
if (state == PRESSED) {
// Check if first time pressed or different button
if (lastButtonPressed != btn) {
// Track which button was last pressed, set timeout cycles and return true
lastButtonPressed = btn;
buttonTimeout = 2;
return true;
}
}
// when button is not being pressed,
// or the same button has already been pressed, return false
return false;
}
Эта логика будет выводить на последовательность только один раз за нажатие (или каждые две секунды, если вы удерживаете его).