Много кнопок на одном пине. Урок 20. Ардуино

Много кнопок на одном пине
Много кнопок на одном пине
Много кнопок на одном пине

Привет! Как контролировать много кнопок на одном пине Ардуино. И как много кнопок можно подключить. Как разделить нажатия разных кнопок. Попробуем собрать схему и написать программу для такого разделения.

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

Для того, чтобы выполнить этот урок нам понадобиться.

  • Ардуино UNO
  • Макетная плата
  • Перемычки
  • Кнопки
  • 7х резистор 220 Ом
  • Конденсатор 220mF
  • Кабель USB

Много кнопок на одном пине

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

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

Поэтому сегодня попробуем собрать схему и написать программу для подключения нескольких кнопок к одному пину. И запрограммируем нажатия на разные кнопки.

Резисторы
Резисторы

Дребезг кнопки

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

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

Принципиальная схема исключения дребезга кнопки
Принципиальная схема исключения дребезга кнопки
График нажатия кнопки через конденсатор
График нажатия кнопки через конденсатор

Подключим несколько кнопок

Разделить кнопки в программе можно по различным показаниям напряжения на аналоговом пине. Чтобы этого добиться, подключим кнопки через резисторы последовательно и считаем показания на аналоговом пине. Таким образом, чем ближе кнопка к делителю напряжения, тем большие показания напряжения будут считаны.

Принципиальная схема подключения многих кнопок и график нажатий
Принципиальная схема подключения многих кнопок и график нажатий

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

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

График нажатий на кнопки
График нажатий на кнопки

Прерывание

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

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

Напишем функцию, которая определит показания на аналоговом пине и выведет в монитор порта соответствующую подпись.

void setup() {
  Serial.begin(9600);
  pinMode(buttonPin, INPUT);

  attachInterrupt(0, swap, RISING);
}

void swap(){
  buttonState = analogRead(buttonPin);

  if (buttonState >= 1000){str = "Кнопка 6";}
  if (buttonState >= 513 && buttonState < 1000){str = "Кнопка 5";}
  if (buttonState >= 300 && buttonState < 500){str = "Кнопка 4";}
  if (buttonState >= 250 && buttonState < 300){str = "Кнопка 3";}
  if (buttonState >= 200 && buttonState < 250){str = "Кнопка 2";}
  if (buttonState >= 150 && buttonState < 200){str = "Кнопка 1";}
  Serial.println(str);
}

Показания для каждой кнопки вы можете посмотреть в мониторе порта.

Полный текст программы

Финальная схема будет выглядеть таким образом.

Принципиальная схема с прерыванием
Принципиальная схема с прерыванием

А программа таким

const int buttonPin = 0;
int buttonState = 0;
String str;

void setup() {
  Serial.begin(9600);
  pinMode(buttonPin, INPUT);

  attachInterrupt(0, swap, RISING);
}

void swap(){
  buttonState = analogRead(buttonPin);

  if (buttonState >= 1000){str = "Кнопка 6";}
  if (buttonState >= 513 && buttonState < 1000){str = "Кнопка 5";}
  if (buttonState >= 300 && buttonState < 500){str = "Кнопка 4";}
  if (buttonState >= 250 && buttonState < 300){str = "Кнопка 3";}
  if (buttonState >= 200 && buttonState < 250){str = "Кнопка 2";}
  if (buttonState >= 150 && buttonState < 200){str = "Кнопка 1";}
  Serial.println(str);
}

void loop() {
  //buttonState = analogRead(buttonPin);
  //Serial.println(buttonState);
  //delay(50);
}

Заключение

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

Где купить

Добавить комментарий

Ваш адрес email не будет опубликован.