Працюємо з 09:00 до 19:00 Пн-Сб
Київ біля ТЦ Квадрат бул.Перова

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

В интернете блуждает множество схем подключения кнопок к дискретным входам Arduino. На них чаще всего предлагается кнопку соединить с нулём питания и дискретным входом, к которому ещё подвести резистор 10 кОм, соединенный с плюсом питания 5 В. Этот резистор позволяет контроллеру однозначно идентифицировать отсутствие нажатия на кнопку. Иначе без резистора на входе может появляться неоднозначный логический уровень, особенно при нестабильном источнике питания или длинных кабелях, соединяющих кнопку с контроллером. При возникновении таких негативных факторов, на входе вообще может возникать пульсирующее напряжение.

Но зачем же использовать лишние внешние резисторы, если можно использовать предусмотренные внутренние. Производители современных контроллеров предусматривают необходимость таких подтягивающих резисторов и внедряют их прямо в кристалл. Активировать их можно программым путем. В микроконтроллерах STM, например, доступны для активации два резистора по 10 кОм: подтягивающий на ноль питания и подтягивающий на плюс питания. А разработчики Arduino решили, что пользователям хватит и одного, подтягивающего к плюсу резистора (20 ... 50 кОм у всех контроллеров по разному). При таком выборе из одного резистора нам доступна только обратная логика дискретного входа для кнопки (если нажали на кнопку то получаем логический ноль).



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


const int button = 5;     // вывод контроллера для кнопки
int count = 0;         // переменная для подсчета нажатий на кнопку
int button_old = 1;    // предидущее значение входа для отлавливания момента нажатия
void setup() {
  //инициализация связи с монитором порта
  Serial.begin(9600);
  //конфигурация входа контроллера и подключение внутреннего подтягивающего резистора
  pinMode(button, INPUT_PULLUP);
}
void loop() {
  if ((digitalRead(button)==LOW)&&(button_old==1))
  { 
    count = count + 1;
    Serial.println(count);
  }
  button_old = digitalRead(button); 
  
  delay(10);
}


При нажимании на кнопку в монитор порта добавляется новая строчка с увеличенной цифрой.

Связка кнопки с контроллером Arduino UNO при такой реализации показала завидную стабильность и безотказность. Как я ни пробовал сбить контроллер с толку, нажимая то слишком коротко, то слишком долго, дребезга так и не добился. И был просто удивлен точностью отработки. Не было ни разу так, чтобы при нажатии единица не добавилась или добавилось несколько единиц. И учитывая то, что передо мной совсем недавно возникали задачи сделать ручные счётчики для спортивных подсчетов (количество угловых, фолов... на минифутбольном матче), а я посоветовал заказчику купить механические счётчики, не доверяя стабильности отработки кнопок, сейчас я уже больше доверял бы электронным кнопкам с Arduino.

Написать отзыв

Примечание: HTML разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Как освободить память Arduino?

Как освободить память Arduino?

Программируя контроллеры Arduino мы часто попадаем в ситуацию, когда компилятор ругается на нехватку..

Универсальная плата под микросхемы SOP20, SSOP20

Универсальная плата под микросхемы SOP20, SSOP20

Универсальная монтажная плата, позволяет проводить монтаж различных микросхем с поверхностным монтаж..

11.70грн.

Уроки Arduino константы для начинающих

Уроки Arduino константы для начинающих

Здравствуйте друзья! Я рад, презентовать вам новый урок под названием Arduino константы! ..

Измерение уровня шума Arduino Nano

Измерение уровня шума Arduino Nano

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

Модуль Ethernet ENC28J60 с питанием 3,3 В

Модуль Ethernet ENC28J60 с питанием 3,3 В

Ethernet модуль с коммуникацией SPI с питанием 3,3 В на основе микросхемы ENC28J60Применяется д..

107.25грн.