Предисловие автора


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


Как определить полярность светодиода


На данный момент большинство светодиодов делают так, чтоб упростить процесс определения полярности. У светодиода есть две ножки, одна из которых будет длиннее другой. Длинная ножка – это плюс (анод). Короткая ножка — это минус (катод). Но что же делать если выводы светодиода одинакового размера? Иногда вывод катода отмечают точкой или небольшим срезом на корпусе. Также узнать полярность можно путём внимательного рассмотрения кристалла. Плюс имеет гораздо меньший размер внутри линзы по сравнению с минусом. Контакт минуса, в свою очередь, напоминает флажок, на котором размещается кристалл. Также можно определить полярность источником питания. Для этого необходимо источник тока (с напряжением от 3 до 6 вольт), резистор (с сопротивлением 220 – 470 Ом) и сам светодиод. Сначала соедините одну ножку светодиода с резистором. Затем коснитесь светодиодом контактов источника питания. Дотрагиваясь анодом к плюсу, а катодом к минусу, светодиод будет светиться (если он исправен).


Продвигаемся далее в изучении Arduino


В прошлой статье мы научились подключать и зажигать светодиод а также мерцать им. А что если нам надо управлять этим светодиодом. Или мы хотим сделать подобие светильника. Тут нам поможет кнопка или переключатель. Но сегодня мы рассмотрим именно кнопку. Они на самом деле могут быть полезными в разных проектах. Приступим.


Необходимые компоненты и подключение


Для подключения кнопки необходимо:


  • контроллер Arduino
  • кнопка
  • резистор (10 кОм)
  • макетная плата
  • перемычки/провода
    Сама схема подключения выглядит так:

image


Пишем код


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


int Led = 13; 
int Button = 2; // номер пина, подключенного к кнопке
void setup(){
    pinMode(Led, OUTPUT); 
        pinMode(Button, INPUT);
}
void loop(){
        if(digitalRead(Button) == HIGH){ // если кнопка нажата
                digitalWrite(Led, HIGH); // светодиод горит
        }
        else{ // если не нажата (иначе)
                digitalWrite(Led, LOW); // светодиод не горит
        }   
}

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


bool But = true; // проверка на кнопку
bool Light = false; // проверка на свет
int Led = 13; 
int Button = 2; // номер пина, подключенного к кнопке
void setup(){
    pinMode(Led, OUTPUT); 
        pinMode(Button, INPUT);
}
void loop(){
        bool Now = digitalRead(Button); // состояние кнопки прямо сейчас
        if(But && !Now)
        {
                delay(10); // небольшая задержка
                Now = digitalRead(Button);
                if(!Now)
                {
                        Light = !Light;
                        digitalWrite(Led, Light);
                }
        }
        But = Now;
}

В этом коде Вы могли заметить Light = !Light. Сейчас объясню. Мы считываем была ли кнопка опущена. Далее небольшой задержкой определяем не было ли это ошибкой и если кнопка действительно была нажата инвертируем сигнал светодиода. То есть если светодиод горел – он перестанет гореть. И наоборот.


Дребезг контактов


Очень хорошо, когда всё идеально. Но к сожалению всё на так и идеально. И с кнопками та же проблема. Механические контакты кнопки не могут замыкаться/размыкаться мгновенно. Это называется «дребезг контактов». Как это понять. На вход микроконтроллера поступают импульсы. Но вместо того чтоб просто получить 1 или 0 из-за данного явления на вход поступает целая кучка импульсов. Это может создать ложные сигналы. И именно поэтому мы делаем небольшую задержку в нашей программе. На скорость это особо не повлияет, но обеспечит нас от ошибки.


image


На этом у нас конец второй части. Спасибо за внимание.

Комментарии (9)


  1. GennPen
    10.05.2018 00:54

    Хорошо бы для новичков на блок-схеме показывать как работает программа. А то все эти "if(But && !Now)" "if(!Now) { Light = !Light;" "But = Now;" сильно сбивают с толку своей непонятностью. И желательно писать предназначение переменных более понятно, например "checkButton" "checkLight" "pinButton" "pinLed".


  1. Alexeyslav
    10.05.2018 09:19

    Плюс имеет гораздо меньший размер внутри линзы по сравнению с минусом.

    Далеко не правило, бывает по-разному.


  1. EreminD
    10.05.2018 10:29
    +2

    Мне, как максимально новичку в ардуино (да и электротехнике) не понятно, как мы приходим к тому, что вот здесь мне нужен резистор. И на не просто какой-то, а конкретно на 10 кОм.
    Не на 20 и не на 5
    Было бы круто, если бы автор писал, как именно мы приходим к тому, что нам нужны сторонние элементы в цепи
    спасибо


    1. dmsav
      10.05.2018 12:06

      Это подтягивающий резистор. Когда кнопка разомкнута, на дискретный вход подается минус с GND. Нужен он для того, чтобы не было ложных срабатываний, из-за наводок например, когда вы подносите руку к Arduino. Номинал обычно выбирается из стандартных: 10, 15 или 20 кОм.


      1. Alexeyslav
        10.05.2018 14:43

        Вообще, тут показана плохая практика с кнопкой, когда она коммутирует "+" на вывод контроллера. Разницы по электрическим причинам то нет, но когда дело доходит до практики на плате кнопку очень неудобно вешать на тонкий проводок подводящий "+" к ней. Общий же провод обычно предоставлен по всей плате в виде большого полигона, риска оторвать тонкую дорожку к которой припаяна SMD или обычная кнопка во время эксплуатации гораздо меньше.
        Номинал выбирается из справочника Стеля. Слишком маленький номинал — будет большой ток во время нажатия кнопки, что для батарейного устройства как бы довольно плохо. Слишком большой номинал — будут пролазить наводки электростатические… вот и выходит на практике в качестве компромисса номинал в 10кОм +- лапоть. Иногда этого мало и нужно уменьшать номинал(соседство с силовыми цепями с крутыми фронтами), а иногда ровно наоборот — нужно увеличивать номинал т.к. батарейка не бесконечная а кнопка предполагается очень долго нажатой. Вплоть до того что подтяжка включается ТОЛЬКО на время проверки состояния кнопки.


        1. dmsav
          10.05.2018 14:54

          Немного не понял, что плохого в подаче "+" на дискрет Arduino, и причем здесь разводка платы, проводки и риск оторвать тонкую дорожку.
          Справочник Потолковского тоже сгодится.


    1. MaxxONE
      10.05.2018 17:19

      Я не автор, но могу сказать, что к этим вещам приходят на основе понимания электротехники…

      Я про резистор и диод вот что могу сказать
      Если говорить о диоде и резисторе, то надо знать, что на диоде падает примерно постоянное напряжение. А напряжение питания мы прикладываем немного больше, чем надо. Весь излишек напряжения упадет на резисторе или на соединительных проводах (кои тоже можно считать за очень маленький резистор). У резистора есть сопротивление (которое мы вольны выбирать), есть остаток напряжения, который упадет на нем — что из этого получается (для человека, у которого закон Ома в подкорке, это очевидно)? Да ток же, который обтекает все элементы схемы — и резюк, и источник питания, и наш ненаглядный диод. Вот так, вооружившись законом Ома, мы подбираем сопротивление резистора — который определяет ток, текущий через всю схему. Не просто там абы как ограничивает, а именно определяет — мы задаем вполне конкретный ток, питающий диод.
      Почему нельзя превышать ток через диод? Потому что от него напрямую зависит мощность, выделяемая на диоде. Если мощность превысит некий предел, диод сгорит к едрене-фене.
      Как то вот так, если упрощенно.


  1. dmsav
    10.05.2018 12:08

    Делал похожее, но только нужен был запуск цикла по кнопке, без её удержания.
    Статья интересная, хорошо написана, как раз для начинающих.


    1. Yuliasha Автор
      10.05.2018 15:25

      Спасибо за отзыв.