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

Из этой статьи вы узнаете, как можно подключить к Arduino несколько кнопок, используя лишь один порт.

Иногда бывает, что на проект не хватает портов. Решить эту проблему можно по-разному: можно взять плату с большим числом портов (Arduino Mega), использовать сдвиговый регистр либо что-то еще. Но иногда количество занятых портов можно сократить, ничего не меняя в аппаратной части.

Есть возможность подключить несколько кнопок (и не только) к аналоговому входу. При этом каждой нажатой кнопке будет соответствовать свое значение сигнала.

Ниже представлена схема подключения 4-х кнопок к порту A0. Для подключения используются резисторы сопротивлением 1 КОм.

connection

Загрузите код в Arduino.

Откройте монитор последовательного порта и просмотрите значения. Каждой кнопке соответствует свое значение:

1 — ~255

2 — ~340

3 — ~510

4 — ~1023

Подключите 4 светодиода к портам 5, 6, 7 и 8. Напишем программу, в которой каждая кнопка будет зажигать соответствующий светодиод. Если же никакая кнопка не нажата, все светодиоды должны быть погашены.

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

3 Комментарии

  1. анатолий

    Попробовал Ваш пример. Смотрел реакцию в мониторе порта.

    не понравилось что реакция не мгновенная и не однозначная.
    после нажатия кнопки пишет в монитор и несколько кнопок и разные.

    (реализовал 4ре кнопки (10,20,30,40ком. и шунтирующий 1ком). Вход А0.

    Мультиметр на каждой кнопики выдает: 10.9, 20.9, 30.9, 40.9.
    код пробывал такой:
    вариант 1.

    void setup() {
    Serial.begin(9600);
    }
    void loop() {
    int sensorValue = analogRead(A0);
    if (sensorValue ==10) Serial.println(«key_-_1»);
    if (sensorValue ==20) Serial.println(«key_-_21»);
    if (sensorValue ==30) Serial.println(«key_-_31»);
    if (sensorValue ==40) Serial.println(«key_-_41»);
    delay(20);
    }

    вариант 2.
    if (sensorValue >= 9 && sensorValue = 19 && sensorValue = 29 && sensorValue =39 && sensorValue <= 41) Serial.println("key_-_4");

    вообщем нет четкого срабатывания и идентификация кнопки. что я делаю неправильно?

    1. Denis_K (Автор записи)

      Пробовали смотреть, какое значение выводится при считывании с порта A0? Выведите на экран значение sensorValue и посмотрите что там и дальше отталкивайтесь от этих значений.

  2. Андрей

    делаю се5йчас меню изучаю МК.

    5 кнопок на пин А0
    все кнопки идут на землю через резисторы, первый ближний резистор 50 ом второй 10 ом третий 3,5 ом четвертый 1 ом пятый 330 ом. выдают напряжение в интервалах указанныъ в условиях функции обработчика нажатий.

    int flag=0;

    #define TotalMenu 4 //Количество меню в главном меню делаем на 1 больше, для 4х меню делаем значение 5
    #define TotalSubMenu 6 //Количество меню в главном меню

    const byte NONE_MENU= 0; // не нажата ни одна кнопка выводим морду
    const byte LEFT_MENU=1;//В лево, либо выход
    const byte RIGHT_MENU = 2;//В право либо вход
    const byte UP_MENU=3; //ВНИЗ
    const byte DOWN_MENU=4;//ВВЕРХ
    const byte SELECT_MENU=5;//Функция выбора или окей

    const byte keypadPin = A5; //Номер аналогового пина для кнопок меню.
    byte button_key = 0; //Начальное значение переменной байт
    // Функция нажатий кнопок перехода по меню, в цикле колесом.
    void funcmenu(int outblok, int CountMenu)
    {
    button_key = getKey(); // Получить номер от нажатой кнопки. от 1 до 4

    if(button_key==1&&flag==0)//если нажата кнопка в низ то прибавить 1
    {
    block++;
    flag=1;
    //это нужно для того что бы с каждым нажатием кнопки
    //происходило только одно действие
    // плюс защита от «дребезга» 100%
    if(block > CountMenu ){block=1; }
    }

    // Уменьшает значение на 1 еденицу
    if(button_key==2&&flag==0)//если кнопка нажата
    {
    block—;
    flag=1;
    if( 1 > block) {block=CountMenu;}
    }

    if(button_key==0&&flag==1) { flag=0; } //обнуляем переменную flag если кнопка НЕ нажата
    outblok = block;

    }

    //Функция обработчик меню
    byte getKey()
    {
    int val_analog = 0;
    byte button_key = 0;
    val_analog = analogRead(keypadPin);

    //В данный блок можно добавлять сколько угодно меню.

    if ( val_analog = 35) && (val_analog = 100) && (val_analog = 200) && (val_analog = 580) && (val_analog = 900) { button_key=NONE_MENU;} // По умолчанию если не нажали ни одной кнопки
    return button_key;
    }

    Подскажите как использовать Функция нажатий кнопок перехода по меню, в цикле колесом.
    при входе в меню.

    тоест работаем в главном меню затем вошли в подменю и работаем этими же кнопками в нутри.

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *