DevGang
Авторизоваться

Упрощенное подключение кнопки к 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;
}

Эта логика будет выводить на последовательность только один раз за нажатие (или каждые две секунды, если вы удерживаете его).

Источник:

#Автоматизация
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

Поделитесь своим опытом, расскажите о новом инструменте, библиотеке или фреймворке. Для этого не обязательно становится постоянным автором.

Попробовать

Сделайте первый шаг к новой профессии

Получить скидку