Подключение кнопок к одному аналоговому входу

Интернет-магазин

Новости Arduino

16 декабря 2013г.
Flutter - платформа разработки, основанная на Arduino
01 марта 2013г.
TV-выход на Arduino
08 февраля 2013г.
Raspberry Pi медиацентр своими руками
08 ноября 2012г.
Пополнение в библиотеке - Bionic Arduino на русском языке
04 июля 2012г.
Сонар для слепых на базе Arduino Mini Pro
30 мая 2012г.
Новости Raspberry Pi или шесть мучительных недель
16 мая 2012г.
Подключение датчика движения к Ардуино
14 февраля 2012г.
Arduino Pong - игровая платформа

Контактные данные

Телефон:
(093) 503-26-13
Электронная почта:

 

Главная Библиотека Arduino Arduino проекты Подключение кнопок к одному аналоговому входу

Подключение кнопок к одному аналоговому входу

Библиотека Arduino Arduino проекты

 

Цель этой статьи – показать как подключить несколько кнопок (для пользовательского ввода), использую только один аналоговый вход. Это позволит оставить остальные цифровые I/O пины для других задач, например, для подключения LCD дисплея и т.д.

Для этого прежде всего нужно знать как использовать функцию analogRead ().

В этой статье мы покажем как считывать отдельные нажатия кнопок.

Напомним, контакт аналогового входа подключен к аналого-цифровому преобразователю (АЦП) в микроконтроллере Arduino. Он имеет разрядность десять бит, и может возвращать численное значение от 0 до 1023, которое связано с аналоговым напряжением от 0 до 5 вольт.

Код:

#include <LiquidCrystal.h>

LiquidCrystal lcd (12, 11, 5, 4, 2, 3);

int a=0;

void setup ()

{

lcd.begin (20, 4);

pinMode (A5, INPUT);

}

void loop ()

{

a = analogRead (5);

lcd.clear ();

lcd.setCursor (0,0);

lcd.print (» analogRead ()»);

lcd.setCursor (0,1);

lcd.print (» value is:»);

lcd.print (a);

delay (250);

}

 

Вы можете просмотреть видео, которое показывает как контроллер измеряет напряжение на переменном резисторе 10 кОм и выводит на дисплей значения от 0 до 1023.

С уменьшением сопротивления потенциометра, значение, возвращенное analogRead () увеличивается. Поэтому при определенных значениях сопротивления, analogRead () вернет определенные числовые значения.

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

 

Схема подключения кнопок:

Подключение кнопок к одному аналоговому входу


На видео вы можете увидеть как это работает на практике:


Откуда берется ток? При использовании pinMode (А5, INPUT); в цепь включается внутренний подтягивающий резистор в микроконтроллере, который дает нам ~ 4,8 В.

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

Как показано в видео, значения, которые возвращает analogRead ():

  • 1023 не нажата кнопка (по умолчанию)

  • 454 кнопка один

  • 382 кнопки два

  • 291 кнопка три

  • 168 для кнопки четыре

  • 0 для кнопки пять

 

Так что для нашего проекта при нажатии на кнопку должно считывать определенное значение, возвращенного с помощью analogRead (). Выбор одинаковых резисторов дает нам довольно широкий разброс между значениями АЦП. Однако эти показания могут незначительно изменяться из-за теплового коэффициента или паразитных сопротивлений цепи.

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

Пример, который показывает, как выводить номер кнопки на дисплей:

#include <LiquidCrystal.h>

LiquidCrystal lcd (12, 11, 5, 4, 2, 3);

int a=0;

void setup ()

{

lcd.begin (20, 4);

pinMode (A5, INPUT_PULLUP); // sets analog pin for input } int readButtons (int pin) // returns the button number pressed, or zero for none pressed // int pin is the analog pin number to read {

int b,c = 0;

c=analogRead (pin); // get the analog value if (c>1000)

{

b=0; // buttons have not been pressed

} else

if (c>440 && c<470)

{

b=1; // button 1 pressed

} else

if (c<400 && c>370)

{

b=2; // button 2 pressed

} else

if (c>280 && c<310)

{

b=3; // button 3 pressed

} else

if (c>150 && c<180)

{

b=4; // button 4 pressed

} else

if (c<20)

{

b=5; // button 5 pressed

}

return b;

}

void loop ()

{

a=readButtons (5);

lcd.clear ();

if (a==0) // no buttons pressed

{

lcd.setCursor (0,1);

lcd.print ( «Press a button»);

} else

if (a>0) // someone pressed a button!

{

lcd.setCursor (0,2);

lcd.print ( «Pressed button»);

lcd.print (a);

}

delay (1000); // give the human time to read LCD

}
На видео показана работа программы.
Оценка:

подключение кнопок к одному аналоговому входу, функция analogRead()

10.01.2012, 32794 просмотра.

Комментарии

найдена ошибка в скетче!
Приведенный здесь скетч отказывается воспринимать правильно нажатия, а вместо этого значения скачут как им вздумается от 0 до 1023. Автор забыл включить подтягивающие резисторы, о которых в тексте идет речь. Правильно инициализировать порт так: pinMode (A5, INPUT_PULLUP); Всем удачи!
Оценка:
Lenin Vladimir Ilyich · 04.01.2015 01:15:58 · ответить · #
Имя

E-mail

Телефон

Тема

Комментарий

Оценка


Контрольные цифры *

Введите число, которое указано выше.

Ошибка в скетче исправлена!
Благодарим Владимира Ильича за подсказку! Исправлено!
Admin · 22.02.2015 14:21:49 · ответить · #
Имя

E-mail

Телефон

Тема

Комментарий

Оценка


Контрольные цифры *

Введите число, которое указано выше.

Корзина пуста

Перейдите в каталог, выберите требуемый товар и добавьте его в корзину.

Метки