Уроки Arduino #6 - отработка нажатия кнопки при помощи флажков
ฝัง
- เผยแพร่เมื่อ 10 ก.พ. 2025
- В этом уроке научимся работать с флажками и сделаем расширенную отработку нажатия кнопки с защитой от дребезга контактов.
▼ Скетчи из урока ▼
alexgyver.ru/ar...
▼ OneButton library ▼
github.com/mat...
▼ Огромный стартовый набор GyverKIT ▼
kit.alexgyver.ru/
▼ Уроки Arduino на сайте ▼
alexgyver.ru/l...
▼ Модули и датчики с Али ▼
alexgyver.ru/ar...
▼ Страница "Заметок Ардуинщика" ▼
alexgyver.ru/ar...
Теги: #arduino #уроки #ардуино #alexgyver
●●●●●●●●●●●●●●●●●●●●
► Основной канал: / alexgyvershow
► Поддержать автора alexgyver.ru/s...
► Официальный сайт: alexgyver.ru/
► Почта: alex@alexgyver.ru
Спасибо! На основе этого урока сделал себе простой сигнализатор наполнения ванны =)
Взял 1 Arduino Nano, 1 спикер от ПК и из кусочка старого текстолита сделал "датчик дождя".
Выяснилось что спикер тихий и взял у жены старую круглую моно-колонку.
Сваял все это дело так, разъем Jack 3.5 землю к земле Arduino, левый и правый канал замкнул на пин D3 (3 pin), далее "датчик дождя" по принципу кнопки, 1 контакт к земле Arduino, 2 к пину A5 (19 pin).
Код из этого урока с не большыми поправками:
#define b 3 //3 pin спикера
if (button1H) {
Serial.println("hold");
tone (b, 500); //Пищание с частотой 500 Hz
delay(100); //Задержка
tone(b, 1000);
delay(100);
button1H = 0;
}
void setTone(int pin, int note, int duration) {
tone(pin, note, duration);
delay(duration);
noTone(pin); //Прекращение пищания
}
Коробку потом из под Тик-Так возьму =)
А вообще с ESP8266 или с RFками можно зацепить к "умному" проекту как "датчик дождя", сырости или наполнения резервуара.
Незнание о существовании некоторых библиотек благоприятно влияет на умственное развитие)
Золотые слова!
Со смыслом
Жиза
@@anon3696 САС МЫСЛОМ ПРАВИЛЬНО
Life Good 🤣🤣🤣 извиняюсь
Интересные знания, четкое изложение, лаконичность, понятность и точнось и качество монтажа. Супер. Спасибо.
С каждым уроком становится только интереснее и сам материал разобран практически до мелочи, всё очень доходчиво))
Спасибо автору!!!
Огромное спасибо автору за работу, очень круто. Лучшие уроки на русском ютубе!
Человек, ты просто молодец!!!! Я пока ничерта в этом не соображаю, но мне ОЧЕНЬ ИНТЕРЕСНО!!!!
Тоже начал осваивать язык ардуино. Спасибо автору за интересные ролики и доступное объяснение! Заметил один нюанс (возможно тут уже кто то об этом писал). Код с millis(); отрабатывает антидребезг только при нажатии на кнопку но не при отпускании (что при отпускамии у меня приводило к ложным срабатываниям). Антидребезг при отпускании устранился дописыванием той же конструкции (- last_press > 50 и last_press = millis();) во второй оператор if.
Воот, а я думал, это кнопка у меня такая задолбанная, что ей надо 200мс прописывать. Оказалось, тоже отпускание шумит. Спасибо за комментарий!
Полезно читать комменты. Мне)) дописАл код. Спасибо
Автор! Твои уроки просто замечательны! все легко и понятно, формат помогает полностью усвоить все что ты говоришь и показываешь! Продолжай в том же духе! Ты красавчик)
Лучшие уроки по ардуинке:)
Уважаемый автор! Большое вам спасибо за ваши уроки!
Спасибо за труд. Подача материала на высоте, благодаря этим урокам, рискнул взяться за освоение Ардуино
Прекрасные уроки. Всё по делу, куча полезного материала в единицу времени, приятный голос и музыкальное сопровождение. Вы талантливый преподаватель.
Спасибо большое за твои уроки, очень хорошо помогли быстро разобраться во всем и решить поставленную задачу)
сколько книг с темами по запоминанию состояния кнопки прочитал, это видео - самое понятное и эффективное объяснение! Молодчина, Алекс!
Эмммм, мне кажется, что вы слегка преувеличиваете. КНИГ (!) по запоминанию состояния кнопки.
пошел вон
Все доступно, понятно, лаконично - максимум информации за минимум времени. Наглядно и качественно. Подписка, лайки и пожелание всех благ. Не останавливайтесь!!!
Как всегда коротко, но при этом детально разобран вопрос. Спасибо!
Капец! Как же это интересно!
Как и в остальных Уроках: четко, последовательно и обстоятельно. Великолепно!
я вот ожидал шутки "батт-флаг - баттплаг". но я с годами, видимо, стал слишком пошлым :-) а вообще хорошее дело делаешь. я ради интереса смотрю, как второй канал любимого автора, хотя мне, к примеру, учиться тут особо нечему, ибо пишу давно и приходилось на дельфи, сишарпе, разных скриптах пилить код. даже клятые ладдеры копать приходилось :-) а со временем привыкаешь, что синтаксис - дело десятое, главное алгоритм :-) но очень многим без опыта поможет. респект!
спасибо =) А шутка и правда лучше моей
Спасибо, что в описании всё оставил!
боже, Гайвер спасибо огромное! Только тут нашёл то, что искал 10 часов! СПАСИБО!
if aa_old a^= digitalRead(); Функция XOR; С помощью нее можно взвести и сбросить флаг. Сократив цикл if.
if это не цикл)
Вот умеет же человек обьяснить, просто и по делу.
Шикарные уроки, ждём продолжения!
Как всегда лайк лучшему ардуинщику ютуба!
Но... Есть проблемка... Такой обработчик кнопок отвалится через 49 (49,71026961805556) дней непрерывной работы устройства.
Расковырял библиотеку - та же фигня, переход millis через 0 она не отрабатывает.
Так что если устройство должно работать нонстоп (у меня это контроллер отопления на даче), то придется корчить сволй обработчик.
Вот для примера счетчик секунд, можно и обработчик кнопок аналогично сделать ;) Кстати, пойду сделаю, я сюда именно в расчете на него и залез )
void loop(){
if(!isNewMillis && millis() > nextSec){
newSecond();
}
else if(isNewMillis && millis() < oldSec && millis() > nextSec){
newSecond();
}
}
void newSecond(){
oldSec = nextSec; //задаем значение текущей секунды
nextSec += 1000; //вычисляем следующую секунду
if(nextSec < oldSec){ //проверяем будет ли следующая меньше текущей (таймер обнулился)
isNewMillis = true;
}
else{
isNewMillis = false;
}
}
Молодец. Видео приятно посмотреть, несмотря на то, что ты это всё давно уже знаешь. )
Очень классно всё объясняешь!! Спасибо!
Как всегда просто и полезно! С кнопками уже разобрался, но всё равно полезно иметь такую напоминалку =D
самое нормальное объяснение, которое я только смог найти, не то что хрень типа debounce прописаная в setup
Нужно больше видео!!!
Все оч. круто!!!!Жду с нетерпение обещанный урок по спящему режиму ардуино.
Алекс предлагаю идейку для проекта на ардуинке. Предлагаю сделать сигналку для дома, дачи квартиры. Канала так на четыре для возможности подключить разные датчики дым ,газ ,вода ,движение. Ну и конечно с оповещением на телефон что за лини сработала.
Было бы классно твои видосы внедрить в школы на уроки информатики, потому что там сейчас полный агхтунг! Пейнт, Карл, пейнт ещё самый первый((((( Ты не думал об этом?
а кто там препода1ёт информатику? Зп начинающего учителя 12 000 р. Теперь к зарплате начиначиющего учителя добавь зп начинающего программиста хотя бы. В школе не должны учить программированию. Это прирагатива специализированных кафедр в вузах
nyan band Герман совершенно прав. Ардуино вообще было придумано именно для студентов. А если внедрять это на уроках информатики - это уже уклон в одну сторону... или нужно все уроки усложнить до такого уровня... ммм... литература на уровне первых курсов филфака...
в конце 90х в школе было то же самое, примитивные рисовалки в винде, примитивная печать текста в текстовых редакторах, немного электронных таблиц + бейсик. К сожалению многие даже этого не тянули. Ардуино в школе можно рассматривать как дополнительный кружок по интересам робототехники\моделирования
программирование в среде паскаль с 7-9 класс
программированию надо учить начиная с детского сада. Никто ж не заставляет учить С++
very well, please keep going in this way :)
Качественно, доходчиво, понятно!!!! КЛАС
Спасибо за классные видео
Спасибо за уроки, очень все классно. Единственная проблема у меня - качество моих кнопок такое, что время на устранение дребезга близко к времени, когда уже HOLD надо принимать))))
Хорошо было бы если ты разобрал в видео функции и команды отдельно ,а уже потом показывал их применение .
ахахахах Библиотека)))) Я об этом не знал, но инженерное мышление подсказало как регистрировать и нажатие, и удержание, и двойное нажатие без всяких библиотек. Теперь такая гордость из за этого.
Расскажи пожалуйста про это.
Когда кнопка нажата, запускается цикл, который каждые 100 мс добавляет 1 к переменной, потом когда кнопка отпущена, цикл заканчивается. Затем можно задавать параметры для интервала этой переменной. То есть в ней записано сколько времени кнопка была нажата.
Ochen bistro kommentiruesh i pechataesh, dlya novichkov ochen tiazhelo za toboi uspevat. ne vse zhe programmers like you.
Pause
Первые два правила интернетов не забывай. Отсылка, конечно, хороша, но названия переменных и флагов в уроке хорошо было-бы использовать разными по звучанию, очень легко запутаться.
Цитата с сайта alexgyver.ru/lessons/arduino-libraries/ "oneButton - библиотека для расширенной работы с кнопкой. На мой взгляд неудобная".
А в видео говорится, что ЗАМЕЧАТЕЛЬНАЯ. За уроки СПАСИБО!!!
Спасибо за видео. Переработаю свой код кнопки в проекте бортового компьютера для игры ETS2. На языке С не писал до ардуино, так что в новинку некоторые вещи.
А Com-порт использую не только для дебага, но и для двухстороннего обмена ардуино с программой на Perl в проекте, в частности надо отслеживать нажатие кнопки.
Спасибо за урок ! - КРУТО !!!
Спасибо!!! Очень интересное видео!
Спасибо за видео. Вы лучший
как всегда все понятно.
Имхо, дебаунс лучше писать в блоке отпускания кнопки, а не в блоке нажатия, чтобы МК не видел именно отпускание. А если писать в блоке нажатия, то в случае дребезга и удерживания кнопки дольше продолжительности антидребезга состояние светодиода изменится
Просто ОФИГЕННЫЙ УРОК !!!!!!!!
Чувак самый что есть крутяк.
УВАЖУХА
Oh, yeees! Touch mu butt harder!
А вообще, крайне рекомендую или полностью писать button, или хотя бы btn - это более широко известное сокращение, чтобы не было таких казусов)
Вместо hold рекомендую события up/down. И в коде программы уже принимать решения как с ними быть. Хоть холд, хоть просто обработка нажатия.
Лайк за отсылку к флагштоку =)
Я взял этот скетч.... Флажки - хорошо, но почему-то путает иногда двойное нажатие с одиночным, подумал, подумал, решил сам написать свою программку обработки и ура, всё работает. ( я решил, что выполнение кода всё время пока зажата кнопка не нужно и не добавлял это, а главное, если понадобится можно всегда дописать )
+MrKpoT а скинь на почту :3 адрес на странице о канале, для коммерческих вопросов
было бы неплохо начинать названия логических переменных со слова is. например isButtonPressed. повышает читаемость
Крутой канал все понятно и доступно, уважение !!!!!!!!!!!!!!!!!!!!!!!
так держать, тебя ждет большое успех!!!! Когда следующие видосы ?
+David Poshelyk осенью
Спасибо за видео и советы
Класс,наслаждение от видоса)
Как подключить хотя бы 10 кнопок на один цифровой вход? Делаю кабину для авиасимулятора на pro micro, сейчас занимаюсь рудами, потом планирую делать фмс, там 69 кнопок, контактов свободных мало останется, мне нужно информация как подключить 10 - 69 кнопок на один цифровой вход?
большое спасибо тебе даже мне школьнику всё ясно
Пасиба, решил свою задачу.
Но дописал удобную функцию, чтоб меньше руками писать.
Мою функцию вставить после конца главного цикла
...
bool btn1=false;
bool btn1_flag=false;
void loop{
//Здесь ваш код
if(btn1 && !btn1_flag && cooldown() )
{
btn1_flag=true;
}
//
}
//
//
//Отсюда начинается
//моя функция
//
unsigned long last_press=millis();
unsigned long Time=0;
bool cooldown(){
Time=millis()-last_press;
bool x=Time>50;
//50 можно заменить на
//любую свою задержку
//в миллисекундах
last_press=millis();
return x;
}
Суть в том, что функция отработает задержку сама если ее вызвать в виде if(A&& cooldown())
,где
А - ваши проверки кнопок или чего-нибудь ещё
cooldown () - проверка как в играх откат способности. Тот же смысл и здесь. Проверка на возможность использования части кода в данный момент времени
Есть возможность добавить аргумент по умолчанию в функцию для указания времени задержки.
Но после этого функция сразу потребовала указывать себя до основного кода. Поэтому сюда не привёл.
СПАСИБО ЗА УРОК
Кстати, скорее всего , что надо устанавливать задержку на антидребезг и для отжатия состояния. Т.к. если нажать кнопку и удерживать ее дольше времени на антидребезг, то может проскочить дребезжание при отжатии кнопки. как-то так.
Delay - бичёвская команда! )
Delay team...
спасибо все понятно.РАБОТАЕТ!!!
А сколько пинов подтянуты внутренним резистором? Т.е. могу ли я подключить например 5-7 кнопок и все их подтянуть внутренним резистором?
Понял все. Спасибо!
Код в конце видео не спасает от дребезга. Дребезг срабатывает, через указанную millis. Если задержку поставить в секунду, то дребезг и сработает через секунду. Флаг меняется в цикле if, тоесть, сработает после задержки millis. Хорошо только то, что срабатывает повторно, если совпадет условие после дребезга кнопки, а не 5-10 раз как дребезжит кнопка. =)) Надеюсь поняли))) Если попробовать двойной if сделать, в первом меняется логика кнопки, во втором, если задержка меньше - игнорировать, если больше - выполнить код в if. Что-то наподобие вот этого:
if (butt == 1 && butt_flag == 0) {
butt_flag = 1;
if (millis() - last_press > 1000)
{
releOn = !releOn;
digitalWrite(rele1, releOn);
Serial.println("Button pressed");
last_press = millis();
}
else {
Serial.println("drebezggg");
}
}
Но это не точно. У меня этот код вроде работает. У меня всё на реле завязано, поэтому подписано реле ))
В целом код мне нравится, попробовал сделать включение нескольких источников на 4 кнопки, задержку миллис поставил в секунду. Мне нравится, да и эта миллис просто открытие для меня, не то, что этот делей))
Проверку (millis() - last_press>0) надо вставить на отпускание кнопки:
if( !butt && butt_flag && millis() - last_press>0)
в примере возможно неточность, т.к. там проверяется время повторного нажатия, что бессмысленно (нажатие уже зафиксировано в butt_flag ).
СПАСИБО! НАКОНЕЦТО КНОПКА ЗАРАБОТАЛА
дребезг можно легко убирать программно.
if(digitalRead(0) == 0){
//делаем что-то
while (digitalRead(0) == 0); // не даем программе выйти пока кнопка держится)
}
спасибо, работает
Смотрю Ваши уроки. Возник вопрос с переключанием светодиода.
Зачем писать состояние светодиода? Его разве нельзя считать через digitalRead? К примеру, когда кнопка нажата выполнять digitalRead пина, к которому подключен светодиод, и если там LOW, то ставить HIGH и наоборот. Или я что-то не так понимаю?
Помогите!)) На Ардуино уно данный скетч не работает как надо... То есть при работе с консолью всё как положено: выводит надписи в соответствии с нажатием/отпусканием кнопки, а при попытке влепить туда управление светодиодом - кнопка срабатывает один раз, при чём сразу на нажатие и отпускание (даже если кнопку нажал и не отпускал) и на этом всё зависает. При этом если из кода исключить управление светодиодом, то в консоли кнопка работает согласно коду (уроку). В чём может быть проблема?
пробовал как свой код, так и Alex_Gyver (который скачал и не менял) - результат одинаковый
Привет. Ты так классно все разжевываешь! Можешь запилить видео по созданию суточного таймера для включения-выключения света на несколько каналов? Таких видео много, но они какие-то неполные.. Авторы показывают конечный результат, и только...
2:53 первое условие выполняется кнопка нажата, флаг не поднят -> поднимаем флаг ( в этот момент пользователь отпускает кнопку и мы попадаем на второе условие конопка отпущена флаг поднят мы попадаем во второе условие и снимаем флаг... тут вместо if + if должно быть else if или elseif в зависимости от языка...
спасибо за урок
Алекс, привет!
Хочу предложить тебе крутую идею для нового видео.
В чем суть: прибор на ардуино который будет считать витки, сделанные намоточным станком и выводить их на экран, но при кручении намоточной болванки в одну сторону ардуино будет прибавлять витки, а при кручении в обратную отнимать их.
Я думал об этом и вот, к чему дошёл:
Появилась идея использовать 2 датчика холла таким образом, чтобы при считывании последовательного сигнала сначала с первого датчика, а потом з второго ардуина понимала , что нужно прибавить виток, а если наоборот (сначала с второго а потом с первого), то убавить.
Или как-нибудь механически передавать информацию о стороне кручения болванки на ардуину.
Думаю эта идея тебе понравиться. Отпиши мне что думаешь об этом. (или помоги советом))))
Надеюсь на твою помощь.
спасибо теперь надо сообразить как работает гирлянда и попытаться повторить в качестве урока
Отсылку оценил, спасибо :D
Спасибо! Всё супер!
Класс! Спасибо большое!
Здравствуйте. Помогите пожалуйста правильно написать часть скетча:
Такое условие работает отлично
if(temp < 25)digitalWrite(rele, HIGH);
else digitalWrite(rele, LOW);
но мне нужно включать реле по условию температуры, а выключать кнопкой S1. Но самое важное - условие будет повторяться с другой температурой и нужно включать это же реле, а вот отключить потом реле нужно уже кнопкой S2.
Классно, более понятно, а возможно написать код, что бы был реверс двигателя, ну к примеру нажал кнопку без фиксации мотор закрутился в одну строну, отжал он остановился, снова нажимаем эту же кнопку, но он уже крутиться в другую сторону?! двигатель на 12 вольт, ну или кулер от компа
Расскажи, пожалуйста, как самому написать библиотеку для ардуино.Думаю, многим будет интересно.
Так вот чем ардуинщики в воскресенье утром занимаются:)
Это вчера вечером под пивко, а выложено утром :-)
Владимир Белов возможно 😉
Автор, хотелось бы еще увидеть переключение команд (режимов работы) одной кнопкой , ну к примеру, нажал кнопку, бегущий огонь, еще раз нажал кнопку бегущая тень и так далее, почему-то многие, кто делает подобные обучающие ролики эту функцию игнорируют.
Потому, что это задача для вас. Ну тривиально же. Создаём ещё одну переменную с числовым значением, которая будет в себе хранить статус ващей программы 0 - Огоньки выключены, 1 - Моргают, 2 - бегают. Далее в функции loop по нажатию кнопки меняем значение переменной, а ещё ниже в loop чекаем if'ом в каком состоянии сейчас переменная и ведём себя соответственно (ну а как сами режимы сделать я надеюсь вы знаете. Можно например по времени отсчитывать и т.д). Да, я не рассказал про прерывания, захотите, сами найдёте. Но начинайте с этого.
Вопрос статус пин при первом нажатии передается условию второму что кнопка нажата и программа выводит вкл выкл?. Пришлось сбрасывать в первом условий butt = 0.
а второе условие сделать if(butt==1 && butt_flag ==1) . Что условие пришлось поменять второе это и за аппаратного исполнения. А вот по чему статус нажатой кнопки он протаскивает через весь loop вот это интересно.
Спасибо за классное видео. А как обрабатывать несколько разных кнопок?
На разные порты подключать кнопки от земли, либо можно помучаться и сделать все кнопки на аналоговый порт(разное напряжение - разный сигнал)
Я не понял, а зачем замарачиваться с millis() если можно тупо прописать в оба условия инвертировать значение флага светодиода ( led_flag = !led_flag; digitalWrite(3, led_flag); ) ? Так все нормально работает)
Здравствуйте. А где взять этот черновик по отработке нажатий, ссылка под видео не открывается. Спасибо.
Спасибо.
Скопировал с экрана код, но поменял контакты местами. Вывел кнопку на А0, а светодиод 5 вольтовый, кинул на А5.
Так при удерживании кнопки оно мигает, если отпустить, то тут смотря в какой момент отпустишь, сверкает или потухнет. Если разово коснуться кнопки, то срабатывает точно как вкл и выкл.
в 23:30 что-то уже поплатилось, утром, после обеда вечером разберусь = )
у тебя можно многому научиться у тебя всё понятно но к ардуино можно подключать не только датчики но и LCD display 2004А и выводить на них разную информацию . Если будет время то вот одна идея для следующего урока.
Привет из Люберец :)
вот сейчас снова удивил! на кнопке 3 команды!
блин это только кнопу тыкаем )) а что же дальше !
Сделай пожалуйста видео про графику.Что-бы ардуино по желанию могла рисовать на экране.
Супер!!!
По моему мнению в втором условии заместо if лучше использовать else if. Хотя в данном случае в прицепе все равно.
дякую
Уважаемый Алекс! Ваши уроки - очень классные!!! Не могли бы вы когда-нибудь рассказать в отдельном видео как вы все это снимаете? Какие проги, режиссура, озвучка, анимация. Просто у вас так это здорово все выглядит, звучит и толково, что хочется и тут понять и научиться как делается. Большое спасибо! ВЫ МОЛОДЕЦ!
+contentex спасибо) думаю после цикла уроков я сделаю такой ролик, типо завершающий
Уважаемый Алекс! Ваши уроки - очень классные!!! Не могли бы вы когда-нибудь рассказать в отдельном видео как вы все это снимаете? Какие проги, режиссура, озвучка, анимация. Просто у вас так это здорово все выглядит, звучит и толково, что хочется и тут понять и научиться как делается. Большое спасибо! ВЫ МОЛОДЕЦ!
Алекс покажи пожалуйста как соединить 3 ардуинки нано для увеличения числа каналов (P.S. можно сделать гексакоптер с зажиганием ракет )
Звучит по экстремистски.
у меня вопрос возник, зачем мы ввели переменную last_press? какую роль он там выполняет? Разве программа не будет работать если просто оставить millis() > 50?