КАК УСТРАНИТЬ ДРЕБЕЗГ КОНТАКТОВ [Уроки Arduino #8]

Sdílet
Vložit
  • čas přidán 21. 02. 2016
  • Канал 100otvetov: czcams.com/users/100otveto...
    __________________________________________________
    В уроке использовались следующие компоненты:
    1) Плата Arduino Uno + USB-кабель: ali.pub/q0tku
    2) Кнопки, 100 шт: ali.pub/5gtfd
    2) Breadboard (макетная плата): ali.pub/ned59
    3) Перемычки, 40 шт:
    4) Светодиоды, 30 шт: ali.pub/6lc3w
    5) Резисторы + Светодиоды, 50 шт: ali.pub/2dgio
    В следующих уроках вам может потребоваться:
    Набор Aurdino для начинающих: ali.pub/uftro
    ______________________________________
    Группа в ВК: goo.gl/pE36V9
    Реклама на канале: goo.gl/r9jM6p
    Почта (для сотрудничества): daymon911@mail.ru
    В этом выпуске вы узнаете: что такое дребезг контактов у кнопок, как устранить дребезг контактов в проектах ардуино с кнопками
    ___
    Смотрите наши видео, в которых мы простым языком рассказываем о радиотехнике, электронике и радиоэлектронике!
    Наши уроки будут особенно полезны для начинающих радиолюбителей и студентов радиотехнических ВУЗов.
    В видеороликах мы даём основы электроники: определения, описания, схемы и принцип работы различных элементов радиотехники.
    В наших видео вы узнаете: что такое транзистор, диод, конденсатор, резистор, микросхема, электрический ток и много других разных интересных вещей и явлений, связанных с электроникой.
  • Věda a technologie

Komentáře • 210

  • @maksymkrokhmaliuk7719
    @maksymkrokhmaliuk7719 Před 3 lety +13

    Тримайте Скетч
    int led = 9;
    int button = 2;
    boolean lastButton = LOW;
    boolean currentButton = LOW;
    boolean ledOn = false;
    void setup() {
    pinMode(led, OUTPUT);
    }
    boolean debounce(boolean last){
    boolean current = digitalRead(button);
    if(last != current){
    delay(5);
    current = digitalRead(button);
    return current;
    }
    }
    void loop() {
    currentButton = debounce(lastButton);
    if(lastButton == LOW && currentButton ==HIGH){
    ledOn = !ledOn;
    }
    lastButton = currentButton;
    digitalWrite(led, ledOn);
    }

    • @virzik9729
      @virzik9729 Před rokem +1

      дякую бо не міг розібратись

  • @maksymnepomiashchyi6529
    @maksymnepomiashchyi6529 Před 8 lety +60

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

    • @inqurity
      @inqurity Před 3 lety

      А всё итак понятно

    • @inqurity
      @inqurity Před 3 lety

      Да и при желании можно найти, что делает та или иная функция

  • @anlaz1
    @anlaz1 Před 5 lety +6

    Согласен с теми, кто критикует отсутствие схемы. Есть еще одна просьба, в описании показывать текст программы и писать побольше комментариев в операциям программы, это очень облегчит усвоение материала тем, кто никогда не писал программы. Спасибо за работу.

  • @user-vp9ib4lv3p
    @user-vp9ib4lv3p Před 8 lety +38

    Спасибо автору за интересный и познавательный канал, часто смотрю Ваши видео.
    Но не смог удержаться от критики данного "урока":
    - в части касающейся устранения дребезга контактов - это не урок, а скороговорка по мотивам Блюма (урок создаётся чтобы научить, здесь же НЕ программисту абсолютно ничего не понятно);
    - постарайтесь правильно произносить транскрипции английских слов (раз уж видео относится к категории НАУКА и техника), реально режет слух;
    - повторюсь, не торопитесь, для Вас это может очень просто, но когда начинающий слышит "многоновыхслов" ещё и с не правильной транскрипцией, получается каша в голове.

  • @egor_manakovv
    @egor_manakovv Před 7 lety +19

    Оставляйте ссылку на скетч в описании!

  • @jeqoner
    @jeqoner Před 8 lety +26

    в функции debounce вне тела if{ } следует добавить return, иначе при last == current тело if { } не выполнится и функция не будет иметь возвращаемый параметр

  • @aras_mileska
    @aras_mileska Před 6 lety +14

    Спасибо за урок. Очень быстро описываете программный код и очень трудно понять. :(

  • @Bk-qw5tg
    @Bk-qw5tg Před 7 lety +27

    Давайте попробую объяснить откуда что взялось.
    Ниже код и построчно порядок его выполнения:
    пропустим выполнение присвоения значений переменным (тут думаю всё понятно), начнём с цикла:
    const int LED=9;
    const int BUTTON=2;
    boolean lastButton = LOW;
    boolean currentButton = LOW;
    boolean ledOn = false;
    void setup ()
    {
    pinMode(LED,OUTPUT);
    pinMode(BUTTON,INPUT);
    }
    boolean debounce(boolean last) // (2) Начало функции debounce, в скобках объявляется новая переменная last, так же как они прописывались в самом начале кода, этой переменной сразу задаётся значение lastButton, переданное из первого пункта (значение LOW)
    {
    boolean current = digitalRead(BUTTON); // (3) Объявляется новая переменная current, ей присваивается значение считанное с контакта кнопки, если мы её нажали то значение HIGH
    if (last != current) // (4) Проверка на выполнение условия - Если last (значение LOW) не равно current (значение HIGH), а в нашем примере это так то выполняется следующий код в фигурных скобках
    {
    delay (5); // (5) задержка 5 мсек, за это время дребезг кнопки успокаивается
    current = digitalRead(BUTTON); // (6) переменной current задаётся значение с кнопки (значение HIGH)
    return current; // (7) эта строчка передаёт значение переменной current как значение функции debounce, возвращаемся к первому пункту (на пункт 8)
    }
    }
    void loop()
    {
    currentButton = debounce(lastButton); // (1) переменной currentButton присваивается значение lastButton, после выполнения функции debounce. Для этого программа переходит выполнять функцию debounce и передаёт в неё значение в скобках - lastButton.
    // (8) теперь когда выполнилась функция debounce - она фактически приняла значение переменной current (значение HIGH), то есть currentButton = debounce(lastButton) = current = HIGH
    if (lastButton == LOW && currentButton == HIGH) // (9) Проверка на выполнение условия: если lastButton(значение LOW) равно LOW и если currentButton (значение HIGH) = HIGH то выполняется то выполняется следующий код в фигурных скобках
    {
    ledOn = ! ledOn; // (10) Значение переменной ledOn становится противоположным, в данном случае оно было false(пер. - "ложное", выключен, LOW), становится true (пер. "правда", включено, HIGH)
    }
    lastButton = currentButton; // (11) переменной lastButton (значение LOW) присваивается значение currentButton (значение HIGH)
    digitalWrite(LED, ledOn); // (12) передает на контакт с номером LED значение переменной ledOn (значение true, тоже самое что HIGH), диод загорается.
    }
    Поправьте знатоки если что не так, сам учусь, тоже трудно понять было, хорошо что есть кому объяснить.

    • @Bk-qw5tg
      @Bk-qw5tg Před 7 lety +2

      код лучше скопировать в компилятор, там всё цветами выделено, проще сориентироваться.

    • @user-co3bz3kg9x
      @user-co3bz3kg9x Před 7 lety +2

      Спасибо, комментарий всё разъяснил

    • @user-bl8mr2xm2w
      @user-bl8mr2xm2w Před 7 lety +5

      Алексей, вот ты пишешь:
      boolean debounce(boolean last) // (2) Начало функции debounce, в скобках объявляется новая переменная last, так же как они прописывались в самом начале кода, этой переменной сразу задаётся значение lastButton, переданное из первого пункта (значение LOW)
      Не совсем понятно каким образом переменной last присвоилось значение LOW переменной lastButton. Можешь этот нюанс пояснить, а то чёт не доходит......((

    • @Bk-qw5tg
      @Bk-qw5tg Před 7 lety +2

      Никита Владимирович когда в цикле обращаешься к функции то пишешь название функции и в скобках пишешь число или переменную которую передаёшь в эту функцию. Там где написана программа функции пишешь название функции и в скобках переменную которая принимает значение переданное в функцию из цикла.

    • @user-hl2hp6wk2t
      @user-hl2hp6wk2t Před 7 lety +6

      но откуда программа знает, что last это lastButton?

  • @EugeneFe
    @EugeneFe Před 8 lety

    Спасибо за видосы, объясняешь достаточно просто) лайк и ждем новых выпусков

  • @HobbiesofValdemar
    @HobbiesofValdemar Před 8 lety +1

    Спасибо! Как всегда познавательно и интересно)

  • @nahatakobato8412
    @nahatakobato8412 Před 7 lety +18

    Ооочень быстро говорит, я не успеваю осмыслить сказанное((

  • @Dizel169
    @Dizel169 Před 5 lety +3

    Так тоже можно:
    const int LED=9;
    const int BUTTON=2;
    bool isWork = false;
    bool isReady = true;
    void setup ()
    {
    pinMode (LED, OUTPUT);
    pinMode (BUTTON, INPUT);
    }
    void loop()
    {
    if(digitalRead(BUTTON)==HIGH && isReady == true)
    {
    delay(5);
    isWork = !isWork;
    digitalWrite(LED,isWork);
    isReady = false;
    }
    else if (digitalRead(BUTTON)==LOW && isReady == false)
    {
    isReady = true;
    }
    }

    • @bibri_k
      @bibri_k Před 6 měsíci +1

      чел спасибо тебе огромное а то у меня ошибки были в скобках!

    • @bibri_k
      @bibri_k Před 6 měsíci

      чел спасибо тебе огромное а то у меня ошибки были в скобках!

  • @MrSploker
    @MrSploker Před 8 lety +2

    у меня вопрос по "функции сглаживания дребезга" : там вместо введенных переменных currentButton и lastButton пишет просто current и last, это их сокращенный вид, который тоже понятен программе? или я что-то не понимаю?

  • @_agroman_
    @_agroman_ Před 8 lety

    Спасибо за видос,отличный контент!!лайк

  • @916363
    @916363 Před 6 lety +2

    Я просто паял "кандик" параллельно с кнопкой. Пока кнопка не нажата, кандик заряжен, когда нажимаем, мы закорачиваем контакты и сбрасываем заряд. Т.к. заряд не пополняется мгновенно, то пока идет дребезг контактов кнопки кандик все еще разряжен(точнее не до заряжен). Когда кнопка отпущена полностью идет зарядка и выполняется действие от кнопки.
    Если коротко, то срабатывание кнопки происходит не по нажатию, а по отпусканию.

  • @starwind7056
    @starwind7056 Před 3 lety

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

  • @vladchernov4279
    @vladchernov4279 Před 4 lety +2

    "ожидаем 5 секунд". Я понимаю что автор возможно оговорился, но в delay() значения задаются в мс, и поэтому есть немного разница между 5с и 5мс. Но в целом видео очень полезное.

  • @user-ss5ku5yl5w
    @user-ss5ku5yl5w Před 7 lety +1

    Уважаемые радиолюбители, подскажите, пожалуйста, почему файлы-sketch для Arduino могут иметь различные расширения: одни файлы имеют расширение INO (.ino), а другие - PDE (.pde)? В чём отличие таких файлов? Каким образом в программном обеспечении Arduino можно изменить по умолчанию тип расширения сохраняемого файла-sketch? Спасибо! С уважением, Валерий.

  • @RN6LLV
    @RN6LLV Před 8 lety

    Спасибо за видео, лайк!

  • @Daniel-lg9rg
    @Daniel-lg9rg Před 8 lety

    Продолжай в том же духе)

  • @user-en1eg2dw3z
    @user-en1eg2dw3z Před 6 lety +1

    объясните пож-та boolean debounce(boolean last) для чего это нужно?

  • @movsarayubov479
    @movsarayubov479 Před 5 měsíci +1

    Здравствуйте. Не могли бы вы пояснить мне некоторый момент из данного урока. После первого нажатия кнопки удовлетворяется условие (lastButton == LOW && currentButton == HIGH) из цикла loop() и переменная ledOn приобретает значение HIGH и светодиод загорается, это понятно. Но почему после второго нажатия происходит присвоение переменной ledOn значения LOW, ведь для этого нет никаких видимых причин?

    • @hunterlive2434
      @hunterlive2434 Před 4 měsíci

      Добрый вечер! В момент нажатия кнопки мы приобретаем режим HIGH и если предыдущее значение было LOW, то он изменит состояние светодиода. Так как кнопка меняет свое состояние сразу после прекращения нажатия, то когда мы ее отпустим переменная lastButton изменится на LOW и при следущем нажатие на кнопку мы вновь получим currentButton == HIGH и попадем в условие где опять изменим состояние диода. Еще я добавил в функции debounce дефолтно возвращаемый результат если if() не отработал, что бы возвращал lastButton, иначе насколько понимаю логика странная, но может и правильная

  • @blyatriver
    @blyatriver Před 6 lety

    Хотелось бы увидеть как сделать и запрограммировать джойстик на Ардуинке.

  • @user-tp9we2bs3x
    @user-tp9we2bs3x Před 7 lety

    Здравствуйте! Очень нужна помощь. Нужно собрать схему управления шаговым двигателем namo 17. Необходимо подлючить кнопки и цифровой двухстрочный дисплейчик. Нужно, чтобы скорость двигателя отображалась на дисплее, а кнопками можно было изменять скорость. контроллер ARDUINO NANO

  • @mettaraff4701
    @mettaraff4701 Před 7 lety

    подскажите, как через эту команду подключить сразу 2 кнопки и 2 светодиода?

  • @KKKompot
    @KKKompot Před 8 lety

    Вроде всё доступно и просто.
    Хочется отметить однако, что использование функции бесполезного простоя delay() не есть труъ в общем случае, ведь камушек остаётся не занят ничем, а только ждёт столько, сколько скажут.
    Для простых задач быстрого кодинга прокатит, но для более сложных всё-таки хочется обработку нажатия кнопок с учётом дребезга вывести на прерывания. Самым простым и эффективным мне видятся прерывания по таймеру (~ 1 ms) с использованием сдвигового регистра для набора статистики нажатия на кнопку. Для таких кнопок работает на ура. Но бывают и более проблемные варианты, когда используется, например, плёночная клавиатура, для которой в любой момент времени во время нажатия может прийти ложный сигнал отпускания с длительностью до 5 ms. В этом случае приходится использовать счётчики нажатия с условиями по нажатию и отпусканию. Это весьма усложняет механизм, зато делает возможным анализ и таких вещей, как двойное нажатие, длительное удержание и другие более экзотические варианты.

  • @OlegPogodaev
    @OlegPogodaev Před 7 lety

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

  • @mkfk52
    @mkfk52 Před 7 lety

    Аппаратно можно подавить дребезг с помощью микросхемы триггера Шиитта а уже в программе или возможно ещё какой то микрухой выставить задержку

  • @zlodes01
    @zlodes01 Před 8 lety +7

    "return current" нужно поместить после блока if.

    • @ViGvo
      @ViGvo Před 6 lety

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

  • @hunterlive2434
    @hunterlive2434 Před 4 měsíci

    если кому надо чуть подправленный код у меня работает стабильно, иначе через пол минуты слушаться переставал диод
    const int LED = 9;
    const int BUTTON = 2;
    boolean previousButton = LOW;
    boolean currentButton = LOW;
    boolean ledOn = false;
    void setup() {
    pinMode(LED, OUTPUT);
    pinMode(BUTTON, INPUT);
    }
    boolean debounce(boolean previousButton){
    boolean current = digitalRead(BUTTON);
    if (previousButton != current){
    delay(5);
    current = digitalRead(BUTTON);
    return current;
    }
    return previousButton;
    }
    void loop() {
    currentButton = debounce(previousButton);
    if(previousButton == LOW && currentButton == HIGH){
    ledOn = !ledOn;
    }
    previousButton = currentButton;
    digitalWrite(LED, ledOn);
    }

  • @ilyapudychev2319
    @ilyapudychev2319 Před 8 lety +3

    Выпусти скетч в описание. Я написал как у тебя, но всё равно пишет какую то ошибку

  • @buildmaker
    @buildmaker Před 4 lety +1

    Почему бы const не заменить на #define ?

  • @giorgiparkaia4888
    @giorgiparkaia4888 Před 8 lety

    кто нибудь даст ответ ? как включить 2 led из 2 кнопка ( BUTTON) ? чтобы независимо друг другу включить.

  • @user-qq1ee3yt8o
    @user-qq1ee3yt8o Před 7 lety

    как с тобой связаться?

  • @user-tf2en9cj8c
    @user-tf2en9cj8c Před 6 lety

    Подскажите пожалуйста! Для не опытных как определять нужные функции, значения и их названия, для применения в определенных условиях? И почему функции прописываются строчными буквами, а например LED-заглавными? Или куда залезть, чтобы узнать эти основы? Спасибо!

    • @user-hz7vm8uh1e
      @user-hz7vm8uh1e Před rokem

      Как можно и как нельзя называть переменные - читаем это для языка с++. Например, начинать с цифры нельзя. Более детальные правила для языка есть в справочниках. По поводу регистра - вообще он не влияет ни на что, кроме того что при обращении требуется учитывать написание. Однако есть для каждого языка свои стандарты и некие правила, а так же принципы написания названия из более одного слова. Например, digitalRead это camelCase - все слова пишутся слитно, но каждое новое с большой буквы, исключая первое слово. Есть PascalCase - тут как в прошлом, но первая тоже большая. Есть snake_case, kebab-case, и несколько совсем извращенных вариантов. Вы можете изучить нынешние стандарты для нужного языка (тут с++), а можете для начала соблюдать лишь часть из них. Можно и без этого вовсе. Для простоты - функции и переменные в camelCase, а объекты в PascalCase. То, что у автора есть переменная где все заглавные - в некоторых языках так по традиции именуют константы, но это как обычно не обязательно.
      tproger.ru/translations/stanford-cpp-style-guide/ можно тут для плюсов глянуть, как вариант. Или в англоязычных источниках.
      Но: существующие функции и переменные нужно вызывать в том кейсе, как они созданы. DiGiTaLwRiTe() по идее должен вас послать.
      Так же есть языки не чувствительные к регистру имён переменных и функций.

  • @cep9249
    @cep9249 Před 8 lety

    Отлично!

    • @cep9249
      @cep9249 Před 8 lety +2

      Но все-таки не очень понятно.

  • @StoriedGnome
    @StoriedGnome Před 8 lety

    я не могу продолжить написание программы после
    const int LED=9;
    const int BUTTON=2;
    boolean lastButton = LOW;
    boolean currenButton = LOW;
    boolean ledon = false;
    void setup
    {
    pinMode(LED,OUTPUT);
    pinMode(BUTTON,INPUT);
    }
    boolean debounce(boolean last)
    {
    boolean current = digitalRead(BUTTON);
    if (last != current)
    (
    delay(5);
    current = digitalRead(BUTTON);
    return current;
    )
    }
    помоги напиши пожалусто

  • @donfedor007
    @donfedor007 Před 11 měsíci

    Добрый день! А если условие в функции debounce не выполнелось, она что возвращает?

    • @hunterlive2434
      @hunterlive2434 Před 4 měsíci

      я добавил логику возвращать принимаемое значение. Вроде бы могут быть баги если не указать возвращаемое значение явно.

  • @ppenguin1442
    @ppenguin1442 Před 11 měsíci

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

  • @user-qj7mx7ym1d
    @user-qj7mx7ym1d Před 8 lety +1

    int LEDpin = 9; // Светодиод на входе 9
    int switchPin = 2; // выключатель на порту 2, замыкает на землю
    boolean running = false;
    void setup()
    {
    pinMode(LEDpin, OUTPUT);
    pinMode(switchPin, INPUT);
    digitalWrite(switchPin, HIGH); // включаем подтягивающий резистор
    }
    void loop()
    {
    if (digitalRead(switchPin) == LOW)
    { // выключатель нажат, т.к. подтягивающий резистор будет давайть HIGH на входе, если не замкнут напрямую на землю
    delay(500); // ждем 0.5сек
    running = !running; // меняем значение булевой переменной
    digitalWrite(LEDpin, running); // включаем или выключаем светодиод.
    }
    }
    Делэй решает проблему дребезг контактов.

    • @andreimengel4979
      @andreimengel4979 Před 7 lety

      У меня просто моргает. На кнопку не реагирует.

  • @samantafox4311
    @samantafox4311 Před 8 lety +1

    ..затем ожидаем 5 секунд - Неверно!!! 5 милисекунд! Оговорился!!!

  • @lemonnekislo2981
    @lemonnekislo2981 Před 7 lety

    Как в этом скетче сделать, чтобы светодиод мигал? нужен код для поворотников (2 кнопки, 2 светодиода)

  • @CCCP2074
    @CCCP2074 Před 7 lety

    прикольно за тобой исправлять ошибки,. объявляешь одно значение boolean lastBUTTON а void loop() значение изменяешь lastButton.

  • @user-bm6qd8ku1h
    @user-bm6qd8ku1h Před 8 lety

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

  • @neskashev
    @neskashev Před 4 lety

    Функция debounce произносится как дибаунс, ударение на '' а''

  • @user-qu2zn7bd1d
    @user-qu2zn7bd1d Před 2 lety

    Я вот не понял почему
    currentButton = debounce (lastButton)
    Типо почему не
    debounce ( currentButton)
    Объясните пж

  • @user-bd4kv9lb6q
    @user-bd4kv9lb6q Před 8 lety +1

    Мдя, ну если ты уж начал с элементарного (как зажечь СД итд...) то ты наверное решил делать видео для чайников, что в общем-то правильно. НО это видео, после предыдущих, непонятно совершенно. Такое ощущение что перед этим уроком нужно было бы сделать еще парочку. А так как будто что-то важное пропустил и начал с середины))

  • @MrFantomast
    @MrFantomast Před 8 lety

    вот еще бы текст кода крепить в коменты, было бы супер

  • @user-od4tq9hw5b
    @user-od4tq9hw5b Před 8 lety

    Никто не подскажет, что такое может быть.
    Программу написал, но почему то в начальном положении светодиод горит.
    Задаю boolean ledOn=true , и светодиод в начальном состоянии не горит

  • @user-yx9sc6lj2m
    @user-yx9sc6lj2m Před 4 lety

    класно :)

  • @giorgiparkaia4888
    @giorgiparkaia4888 Před 8 lety

    пожалуйста давай добавим ishio paru diod i knopka

  • @diod-
    @diod- Před 7 lety

    Вот бы ещё ссылка на код программы в описание была. Перепечатывать лень :)

  • @Delightfull_
    @Delightfull_ Před 8 lety

    Можно схему выложить?

  • @StoriedGnome
    @StoriedGnome Před 8 lety +4

    все смог вот сама программа
    const int LED=9;
    const int BUTTON=2;
    boolean lastButton = LOW;
    boolean currenButton = LOW;
    boolean ledon = false;
    void setup
    {
    pinMode(LED,OUTPUT);
    pinMode(BUTTON,INPUT);
    }
    boolean debounce(boolean last)
    {
    boolean current = digitalRead(BUTTON);
    if (last != current)
    (
    delay(5);
    current = digitalRead(BUTTON);
    return current;
    )
    }
    void loop()
    {
    currentButton = debounce(lasttButont);
    if (lasttButont == LOW && currentButton == HIGH)
    {
    ledOn = ! ledOn;
    }
    lastButton = currentButton;
    digitalWrite(LED, ledOn);
    }

    • @narrgoor468
      @narrgoor468 Před 8 lety

      +Даниил Карибеков красавчик выложил скетч

    • @StoriedGnome
      @StoriedGnome Před 8 lety

      С сарказмом чтоли

    • @HDArialRYTP
      @HDArialRYTP Před 8 lety

      сколько ошибок, ебаааать

  • @maksimb4935
    @maksimb4935 Před 4 lety

    Я так и не понял последовательность выполнения программы !

  • @user-vz7ch4ot1c
    @user-vz7ch4ot1c Před 8 lety

    сделай видео как подключить к Arduino экран

  • @user-dz5gl1ru9l
    @user-dz5gl1ru9l Před 8 lety

    а можно объяснить по проще)) а как мы мы сделали так) что кнопка теперь работает вот так по другому)?

  • @Foonikulyor
    @Foonikulyor Před 5 lety

    скетч без функции устранения дребезга кнопок:
    const int LED=9;
    const int BUTTON=2;
    boolean lastButton = LOW;
    boolean currentButton = LOW;
    boolean ledOn = false;
    void setup()
    {
    pinMode (LED, OUTPUT);
    pinMode (BUTTON, INPUT);
    }
    void loop()
    {
    currentButton = digitalRead(BUTTON);
    if (lastButton == LOW && currentButton == HIGH)
    {
    ledOn = !ledOn;
    }
    lastButton = currentButton;
    digitalWrite(LED, ledOn);
    }

  • @whswow1274
    @whswow1274 Před 8 lety

    Больше уроков

  • @TheMikki1982
    @TheMikki1982 Před 8 lety

    Не легче ли просто мажоритарный алгоритм применить?
    ru.wikipedia.org/wiki/Мажоритарный_элемент

  • @user-vz7ch4ot1c
    @user-vz7ch4ot1c Před 8 lety

    сделай видео как подключить монитор

  • @gromitwoll6907
    @gromitwoll6907 Před 7 lety +1

    Вот более простой способ. Лучше бы на этом примере для начала объяснил.
    Правда при этом способе если зажать кнопку то светодиод начнет моргать.
    int LEDpin = 9; // Светодиод на входе 9
    int switchPin = 2; // выключатель на порту 2, замыкает на землю
    boolean running = false;
    void setup()
    {
    pinMode(LEDpin, OUTPUT);
    pinMode(switchPin, INPUT);
    digitalWrite(switchPin, HIGH); // включаем подтягивающий резистор
    }
    void loop()
    {
    if (digitalRead(switchPin) == LOW)
    { // выключатель нажат, т.к. подтягивающий резистор будет давайть HIGH на входе, если не замкнут напрямую на землю
    delay(100); // ждем 0.1сек
    running = !running; // меняем значение булевой переменной
    digitalWrite(LEDpin, running) ; // включаем или выключаем светодиод.
    delay(100);
    }
    }

    • @CoolS1990
      @CoolS1990 Před 7 lety +1

      Я вот так вообще написал))
      void setup() {
      pinMode(LED, OUTPUT);
      pinMode(BUTTON, INPUT);
      }
      void loop() {
      if(digitalRead(BUTTON) == HIGH){
      delay(200);
      cur++;
      }
      if((cur % 2) == 0 ){
      ON = 0;
      }else{
      ON = 1;
      }
      if(ON == 0){
      digitalWrite(LED, LOW);
      }else{
      digitalWrite(LED, HIGH);
      }
      }

  • @user-uu3mx3rp5t
    @user-uu3mx3rp5t Před 7 lety

    Эта тема немного сложнее, но пока нормально. А для тех, кто матюки пишет, скажу:"Читайте первоисточники".

  • @totllb.b.3002
    @totllb.b.3002 Před 5 lety +1

    Если в коде присутствует оператор delay() то этот код сразу на удаление. Не надо прививать новичкам плохие манеры.

    • @user-ht1xr3tr8d
      @user-ht1xr3tr8d Před 2 lety

      Ебать, может нахуй это программирования, а то тут какие то ещё неправильные операторы

  • @sergeydudukin4214
    @sergeydudukin4214 Před 4 lety

    Не знаю актуально ли еще кому то но это плоховатый стиль тормозить программу задержками. А если у тебя 100 кнопок что каждую ждать по 100 мс? Для такого применения в функции debounce лучше сделать счетчик и инкрементировать его в каждом цикле когда текущее состояние сигнала равно состоянию сигнала предыдущего цикла. Функции можно передавать в качестве входного параметра сколько циклов вы хотите чтобы сигнал не менялся прежде чем выход поменяет значение. Таким образом выполнение программы нет необходимости тормозить задержками. Конечно для этого учебного примера и так сойдет но для реального применения лучше с задержками не делать.

  • @WRSPRO
    @WRSPRO Před 7 lety

    const int led=9;
    const int button=2;
    boolean lastbutton=LOW;
    boolean currentbutton=LOW;
    boolean ledON=false;
    void setup() {
    pinMode(led,OUTPUT);
    pinMode(button,INPUT);
    }
    boolean debounce(boolean last)
    {
    boolean current= digitalRead(button);
    if(last != current)
    {
    delay(5);
    current=digitalRead(button);
    return current;
    }
    void loop()
    {
    currentbutton = debounce(lastbutton);
    if(lastbutton==LOW && currentbutton==HIGH);
    {
    ledON=!ledON;
    }
    lastButton=currentbutton;
    digitalWrite(led, ledON);
    }

  • @user-vn2ih5cn1r
    @user-vn2ih5cn1r Před 7 lety

    так куда уж проще:
    const int Led = 9;
    const int Button = 2;
    boolean isButton; {текущее состояние кнопки}
    void setup()
    {
    pinMode(Led, OUTPUT);
    pinMode(Button, INPUT);
    }
    void loop()
    {
    if(isButton) {если нажата кнопка}
    {
    delay(5);
    if(digitalRead(Button))
    digitalWrite(Led, 1);
    else
    digitalWrite(Led, 0);
    }
    isButton = 0;
    }

  • @xp4901
    @xp4901 Před 6 lety

    Ладно, допустим с этим все понятно. А что делать если кнопок не одна, а больше? Что кому передавать и что кому возвращать?

  • @romanshirobokov1642
    @romanshirobokov1642 Před 3 lety

    Код крупнее плиз. На телефоне не видно ничего. Спасибо.

  • @vincentmarcella3677
    @vincentmarcella3677 Před 7 lety +3

    как понимать эту строчку: boolean debounce (boolean last) ?

    • @varyaflower6773
      @varyaflower6773 Před 6 lety +13

      Написав "boolean debounce" мы создаем функцию с именем "debounce", которая возвращает значение типа boolean.
      Попробуем разобраться, как так получается?
      Простейшую функцию можно изобразить так:
      void debounce ();
      {
      //действия, которые должна произвести функция
      }
      debounce - это имя функции, по которому ее можно будет вызвать в любом другом месте программы.
      void означает, что функция не будет возвращать никакой информации в результате своей работы, просто молча выполнять свое предназначение =)
      () - пустые скобочки означают, что она никакой информации не принимает.
      Для того же, чтобы функция какие-то данные возвращала, нам нужно заменить void на другой тип, соответствующий тому типу данных, который нам нужно получить на выходе. В данном случае это boolean (т.е. 0 или 1, HIGH или LOW, true или false). Но может быть, и byte, и int и т.д.
      Выглядеть это уже будет так:
      boolean debounce ();
      {
      //действия, которые должна произвести функция
      }
      Чтобы вызвать эту функцию в другом месте программы, достаточно написать ее название в нужном блоке, например в loop:
      void loop () {
      debounce ();
      }
      Итак, у нас есть функция, которая может возвращать значение типа boolean. Но нам этого мало, надо еще заставить ее какую-то информацию принимать. Для этого в скобочках создадим переменную типа boolean с именем "last".
      boolean debounce(boolean last)
      {
      //какие-нибудь действия с переменной last
      }
      Тогда при вызове функции в другой части нашего кода мы каждый раз должны будем указать нужное значение переменной, которую функция будет использовать в своей работе:
      void loop () {
      debounce (1);
      debounce (0);
      }
      В этом случае мы вызываем нашу debounce, в которой переменная last будет равна единичке. И затем опять вызываем эту же функцию, но с переменной last, равной нулю.
      Посмотрим, как вызывают эту функцию в коде:
      void loop() {
      currentButton = debounce(lastButton);
      Здесь в скобочках стоит не ноль или единичка, как в прошлом примере, а переменная lastButton, значение которой в функции используется как значение переменной last.
      Надеюсь, понятно, правда старалась разжевать :3

    • @jagerk.7553
      @jagerk.7553 Před 6 lety +6

      Varya Flower У Вас нет своего канала? Я бы на Вас подписался. Без иронии и сарказма. Ваша отзывчивость и спокойное понимание того, что восприятие и уровень базовых знаний у всех разный - очень подкупают.

    • @jagerk.7553
      @jagerk.7553 Před 6 lety

      Varya Flower Пользуясь случаем, хочу тоже задать вопрос, если не затруднит. Для чего такое количество типов переменных?. К примеру, "int" сама по себе достаточно универсальна, и (по моим скромным наблюдениям) запросто заменяет и "const", и "boolean" и т.д. только в менее "урезанном" по своим возможностям варианте. Так если, вся нагрузка обозначения типов переменных заключается только в том, чтобы их объявить, не проще сделать это в менее конкретизированном варианте, чтобы одновременно не ломать голову над тем, какой тип применить и оставить себе более широкое "поле для маневров"?

    • @user-lt4qx3vn3w
      @user-lt4qx3vn3w Před 3 lety

      @@varyaflower6773 лучшего ответа я наверное еще пока не видал)

  • @aleksejsohotnikovs1124
    @aleksejsohotnikovs1124 Před 7 lety +3

    Смотрим на скорости 0.75

  • @anlaz1
    @anlaz1 Před rokem +1

    Здравствуйте, Я с большим трудом продираюсь через дебри программирования.
    У меня к вам просьба.
    Прошу написать несколько строчек кода, которые выполняют следующее:
    На воды D2 и D3 заранее подаются команды в двоичном коде
    00
    01
    10
    11
    Как заставить скетч на каждое из этих двоичных чисел выполнять различные части программы.
    Каждая из этих частей мне уже покорилась, и работает. Нужна возможность выбора одной из них, без препрошивки скетча :)
    Спасибо большое.

  • @OlegPogodaev
    @OlegPogodaev Před 8 lety +2

    А есть ли не программные решения для борьбы с дребезгом?

    • @guest7329
      @guest7329 Před 8 lety +2

      или просто поставь сглажующий конденсатор параллельно кнопки

    • @Danila4929
      @Danila4929 Před 8 lety

      +Олег Погодаев дроссель

  • @user-st7hj3pv2x
    @user-st7hj3pv2x Před 6 lety +1

    Всё было хорошо до этого урока и куска предыдущего, в котором наглядно не была разобрана тема оттягивающей кнопки. А тут не понятно, что-за предыдущее состояние и текущее состояние? Текущее ещё понятно, но предыдущее перед чем? Контроллер запрограммирован, кнопка находится в текущем состоянии, а предыдущего нету, потому что он только вылупился на свет и того, что прежде у него ещё не было, он в текущем состоянии. Вот такая ерунда у меня в голове, потомучто это для меня новый мир и я не знаю, с чем мне проводить аналогию, объясняй пожалуйста суть всех деталей, иначе на дальнейших уроках будет идти все как снежный ком. Тут недопонял, а там чтобы понять нужно знать, что было тут и т.д. А так спасибо большое за предыдущие уроки, они были шикарными. Я с удовольствием пересматривал по несколько раз, чтобы до мелочей понять суть всего и запомнить

    • @user-st7hj3pv2x
      @user-st7hj3pv2x Před 6 lety

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

  • @Cool-iv6uo
    @Cool-iv6uo Před 8 lety +2

    -можете скинуть скетч

  • @user-ss5ku5yl5w
    @user-ss5ku5yl5w Před 7 lety

    Добрый день, уважаемые радиолюбители! При загрузке sketch в Arduino UNO возникла ошибка компиляции и программа выдала следующее сообщение: "switch3.pde:37:28: error: 'pinMode2' was not declared in this scope (то есть операторы "pinMode3" и другие подобные не были объявлены в данной области). Как правильно надо объявлять операторы внутри функции void setup() ???Ниже приведен фрагмент программы, которую я пытался написать:void setup()
    {
    pinMode2(switchPinD5, INPUT);
    pinMode3(switchPinD3, INPUT);
    pinMode10(switchPinD6, INPUT);
    pinMode11(switchPinD4, INPUT);
    pinMode12(switchPinD7, INPUT);
    pinMode13(switchPinD8, INPUT);
    pinMode7(ledPin7, OUTPUT);
    pinMode8(ledPin8, OUTPUT);
    pinMode5(ledPin5, OUTPUT);
    pinMode4(ledPin4, OUTPUT);
    pinMode9(ledPin9, OUTPUT);
    pinMode6(ledPin6, OUTPUT);
    }boolean debounceD5(boolean lastD5)
    boolean debounceD3(boolean lastD3)
    boolean debounceD6(boolean lastD6)
    boolean debounceD4(boolean lastD4)
    boolean debounceD7(boolean lastD7)
    boolean debounceD8(boolean lastD8){
    boolean currentD5 = digitalRead(switchPinD5);
    if (lastD5 != currentD5)
    {Заранее благодарен Вам за Ваши рекомендации и Вашу помощь.С уважением,Валерий.

  • @UU5JPP
    @UU5JPP Před 6 lety

    Даже текст описания кода проговорил не свой, а с книги Джереми Блум

  • @bukx3464
    @bukx3464 Před 7 lety

    глупый код, постоянно delay(5): это вообще к чему ? нужно кнопку другую применить on-off-on и два элемента "или не"

  • @astoa100
    @astoa100 Před 8 lety +1

    Я не смог разглядеть на экране чтобы переписать оператор логического "И".
    Какие это символы?
    Скетчи я переписываю с экрана и вот тут никак не могу разглядеть :-(

  • @user-en1eg2dw3z
    @user-en1eg2dw3z Před 6 lety

    и что конкретно делает return current?)

    • @user-ne9hw2xk1n
      @user-ne9hw2xk1n Před 3 lety

      тоже не понял, а что она делает?

  • @BlackCode198317
    @BlackCode198317 Před 8 lety +10

    Зачем плагиатом заниматься? :/
    Не проще ли ссылку на уроки бросить в переводе амперки?

    • @sciencelegondary
      @sciencelegondary Před 8 lety

      +Кирилл Дубинкин Спасибо за канал Амперки, подписался)

    • @OlegPogodaev
      @OlegPogodaev Před 8 lety +9

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

    • @BlackCode198317
      @BlackCode198317 Před 8 lety +1

      +Oleg Pogodaev вот именно! Про школу похоже сам не понял, что сказал((

  • @KobalyanTV
    @KobalyanTV Před 5 lety

    а если дребезг у потенциометра? тогда что?

  • @aumolotok
    @aumolotok Před 7 lety +4

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

  • @alex-and-er
    @alex-and-er Před 8 lety

    Произношение англ. слов для автора ролика:
    low - лоу
    debounce - дебаунс

  • @user-du1js3zb8r
    @user-du1js3zb8r Před 6 měsíci

    Здравствуйте, в коде ошибка но это к лучшему я хоть смог все изучить детально и исправил хорошое задание на логику😁

    • @laromi8908
      @laromi8908 Před 5 měsíci

      Лучший, я просто за с++ не шарю. Ток на пайтоне,
      Переписываю код просто(

    • @user-du1js3zb8r
      @user-du1js3zb8r Před 5 měsíci

      @@laromi8908 с++ не так сложен, если собрать более 10 схем разных то сами заметите что все одно и тоже если писать самому а не копировать😃

  • @xeither289
    @xeither289 Před 2 lety +1

    ☦❤🙏

  • @fish3467
    @fish3467 Před 7 lety

    на русском напишу, а не на c++)))) Так можно сделать? Если светодиод горит(т.е. выход 9=high), то туши его(выход 9=low) а иначе зажигай(выход 9=high)!!!?????))) Так же покороче вроде будет. Я еще не покупал ардуино, просто интересуюсь пока что, но хотелось бы узнать будет работать по-такому коду?

    • @user-hn4kb7fr2u
      @user-hn4kb7fr2u Před 2 lety

      Нет. Русские команды не понимает не один современный, востребованный язык программирования.
      Если на счет логики, то: 1) как будет считывать горит или нет светодиод?
      2) при такой логике зачем тогда кнопка?

  • @kuznetsov_ilya
    @kuznetsov_ilya Před 8 lety +1

    Триггер Шмитта

  • @andriimaksymchuk8773
    @andriimaksymchuk8773 Před 2 lety

    а схема роботи?

  • @user-hl2hp6wk2t
    @user-hl2hp6wk2t Před 7 lety +1

    last и lastButton, current и currentButton - одно и тоже?
    да проще конденсатор параллельно на землю въе6ть..

  • @user-fw1go1qm5x
    @user-fw1go1qm5x Před 3 lety

    Хрен знает, я ещё до выхода этого ролика сам прописал после:
    ...
    }
    else
    {
    digitalWrite(LED, HIGH);
    delay(5000); }
    } например 5 секунд и хоть до поноса на кнопку жми и отпускай, светодиод всё это заданное время горит себе спокойно. Как то так!

  • @TrueDigitalStories
    @TrueDigitalStories Před 5 lety

    Как вариант
    const int button = 2;
    const int lamp = 9;
    boolean running = false;
    void setup() {
    pinMode(button, INPUT);
    pinMode(lamp, OUTPUT);
    pinMode(lamp, LOW);
    }
    void loop() {
    if (isPushed(button) > 0) {
    running = !running;
    }
    digitalWrite(lamp, running ? HIGH : LOW);
    }
    boolean isPushed(int port) {
    bool isPushed = false;
    if(digitalRead(port) == HIGH) {
    while(true){
    delay(10);
    if(digitalRead(port) == LOW) {
    isPushed = true;
    break;
    }
    }
    }
    return isPushed;
    }

    • @TrueDigitalStories
      @TrueDigitalStories Před 5 lety

      Еще один вариант, типа "закос" под асинхронность, но надо будет доработать в будущем
      const int button = 2;
      const int lamp = 9;
      boolean running = false;
      void setup() {
      pinMode(button, INPUT);
      pinMode(lamp, OUTPUT);
      pinMode(lamp, LOW);
      }
      void loop() {
      if (isPushed() == true) {
      running = !running;
      }
      if (running) {
      digitalWrite(lamp, digitalRead(lamp) == HIGH ? LOW : HIGH);
      delay(200);
      } else {
      digitalWrite(lamp, LOW);
      }
      }
      boolean isPushed() {
      static int prevState;
      int currentState;
      boolean isPushed = false;
      currentState = digitalRead(button);
      if (currentState == LOW && prevState == HIGH) {
      isPushed = true;
      }
      prevState = currentState;
      if (isPushed) {
      delay(5);
      }
      return isPushed;
      }

  • @user-se5hb5yb8d
    @user-se5hb5yb8d Před 5 lety

    Дурной тон использовать программное устранение дребезга. Про delay() вообще молчу. Гораздо продуктивнее использовать аппаратное решение. Вот тебе тема для следующего видео.

  • @muckertv9960
    @muckertv9960 Před 7 lety +1

    извините, на 4:07 ожидаем 5 милисекунд

  • @neskashev
    @neskashev Před 4 lety

    LOW произносится ЛОУ по английски, не ЛАУ

  • @404Negative
    @404Negative Před 8 lety

    программа не просто не сложная, она элементарная.

    • @user-ht1xr3tr8d
      @user-ht1xr3tr8d Před 2 lety

      Для меня это вынос мозга. Может я просто долбаёб и амёба, но как знать

    • @404Negative
      @404Negative Před 2 lety

      @@user-ht1xr3tr8d главное чтоб девки давали. остальное не важно

  • @veterfpv4974
    @veterfpv4974 Před 7 lety

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

  • @nikolaysamsonov8110
    @nikolaysamsonov8110 Před 6 lety

    Зачем было прописывать current = digitalRead(BUTTON) второй раз в условном блоке?

    • @coungard
      @coungard Před 6 lety

      необходимая проверка , учитывает состояние кнопки уже после 5 миллисекунд (то есть дребезга )

    • @nikolaysamsonov8110
      @nikolaysamsonov8110 Před 6 lety

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

  • @votzephak7703
    @votzephak7703 Před 3 lety +1

    Джереми Блум "Изучаем Ардуино" . Хоть бы на первоисточник ссылался

  • @new6082
    @new6082 Před rokem

    а почему кнопку нельзя просто ставить в разрыв на 9 пин .зачем её прописывать
    смысл?