В этом руководстве мы прочитаем состояние того, нажат переключатель или нет, используя цифровой ввод.

"Оглавление"

Компоненты

  • Raspberry Pi Pico - 1 шт.
  • Макетная плата - 1 шт.
  • Тактильный переключатель - 1 шт.
  • Провода-перемычки (тип М-М)

Тактильный переключатель - это очень простой переключатель, который соединяет два контакта при нажатии кнопки. Вы можете легко найти эти переключатели во многих электронных устройствах вокруг нас. Тактильный переключатель обычно имеет 4 контакта, верхний и нижний контакты слева соединены друг с другом, а верхний и нижний правые контакты соединены друг с другом. Итак, при подключении к цепи вы должны использовать один левый (что-либо верхнее или нижнее) и одно правое (что-либо верхнее или нижнее).

Цифровой вход

Все контакты, поддерживающие GPIO, могут использоваться для цифрового вывода, но также могут использоваться для цифрового ввода. Чтобы проверить это, проведем простой эксперимент. Сначала подключим GPIO14 напрямую к 3V3 с помощью перемычки. Затем переключите GPIO14 в режим ввода и прочтите значение.

> pinMode(14, INPUT);
> digitalRead(14);

Это напечатает 1 в терминале. 1 означает HIGH. И наоборот, подключите GPIO14 к GND и прочтите то же самое. Затем будет напечатано 0. 0 означает LOW.

Выпадающий режим

Теперь подключите тактильный переключатель между GPIO14 и 3V3, как показано на рисунке ниже. При нажатии переключателя будет прочитано значение HIGH, потому что GPIO14 и 3V3 подключены. Затем, когда переключатель не нажат, он фактически находится в воздухе, потому что нигде не подключен. Какая будет ценность в этом случае?

Важно помнить, что если переключатель не нажат, GPIO находится в «неизвестном» состоянии, ни HIGH, ни LOW. Фактически, иногда значение HIGH может быть прочитано по некоторым причинам, например из-за шума. Поэтому не позволяйте используемому входному контакту GPIO попадать в это состояние. Итак, когда переключатель не нажат, его нужно принудительно установить в LOW. Это режим раскрывающегося списка (который легко понять в смысле перехода к LOW). Итак, в этом случае вы должны установить его в режим INPUT_PULLDOWN, а не INPUT.

> pinMode(14, INPUT_PULLDOWN);

Таким образом, всегда LOW, когда переключатель не нажат, и всегда HIGH, когда переключатель нажат.

Подтягивающий режим

Если да, всегда ли возможно находиться в HIGH состоянии, когда переключатель не нажат, и в состоянии LOW, когда переключатель нажат? Да, это возможно! Подключите переключатель между GPIO14 и GND, как показано ниже.

Теперь давайте установим GPIO14 в режим подтягивания (что удобно понимать в смысле подтягивания до максимума) и проверим состояние с помощью digitalRead(), когда переключатель нажат, а не нажат. Обычно значение HIGH будет прочитано, но значение LOW будет прочитано только при нажатии переключателя.

> pinMode(14, INPUT_PULLUP);

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

Прослушивание события

Итак, теперь давайте напечатаем clicked! сообщение в терминале при нажатии переключателя. Первое, что приходит в голову, - это использовать бесконечный цикл, как показано ниже. Введите приведенный выше код в IDE и загрузите его в Pico.

Все коды можно найти по ссылке ниже
https://kaluma.io/@niklauslee/phycomjs-examples

Когда переключатель нажат, на терминале будет напечатано сообщение clicked!. Однако проблема в том, что будет напечатана тонна сообщений. Поскольку цикл выполняется очень быстро, независимо от того, насколько быстро я нажимаю переключатель, печатается бесчисленное количество сообщений. Вторая проблема - терминал зависает. Pico обрабатывает бесконечные циклы, поэтому он вообще не может реагировать на ввод с терминала. Если вы хотите остановить выполнение, вы можете остановить его, нажав Ctrl + C в терминале.

Разве сообщение не может быть напечатано только один раз при нажатии переключателя? Просто сохраните предыдущее состояние переключателя в определенной переменной. То есть, если предыдущее состояние - HIGH, а текущее состояние - LOW, можно определить точный момент нажатия переключателя. Однако терминал по-прежнему заклинивает из-за бесконечного цикла. Чтобы легко решить эту проблему, Kaluma предоставляет функцию setWatch(). Использование этого очень кратко решает проблему, как показано ниже, а также терминал вообще работает.

Все коды можно найти по ссылке ниже
https://kaluma.io/@niklauslee/phycomjs-examples

Функция setWatch() вызывает указанную функцию обратного вызова, когда происходит указанное событие при наблюдении за конкретным выводом GPIO. Первый аргумент - это вызываемая функция обратного вызова, а второй аргумент - это номер GPIO, за которым нужно следить. Третий параметр означает тип события, на которое нужно реагировать, и поскольку мы хотим отреагировать на изменение с HIGH на LOW, мы используем событие FALLING. И наоборот, если вы используете режим раскрывающегося списка, вы можете использовать событие RISING, а если вы хотите отреагировать на оба, вы можете использовать событие CHANGE. И последняя четверть - дать время устранения дребезга (10 мс). Это только рассматривается здесь, и для получения дополнительной информации, пожалуйста, обратитесь к справочной документации.

Теперь вспомните предыдущее руководство, а затем создайте схему и код, которые могут включать и выключать светодиод при каждом нажатии переключателя, как показано на рисунке ниже.

Весь исходный код можно найти по ссылке ниже
https://kaluma.io/@niklauslee/phycomjs-examples

В этом руководстве мы узнали о режимах цифрового ввода, подтягивания и раскрытия. Теперь перейдем к следующему уроку и узнаем об аналоговом вводе и выводе.



Больше контента на plainenglish.io