Программа, позволяющая обойти дребезг контактов кнопки: drive.google.com/drive/folders/1Km0pM3WdDM947XMnONF4SkD8ls-V4UeB?usp=sharing Краткая выжимка из видео: - Что такое аппаратные прерывания и как они работают (0:33) - Смотрим информацию о прерываниях в datasheet на микроконтроллер ATmega328p (2:38) - Пишем программу для внешнего прерывания по кнопке (6:24) - Наблюдаем дребезг контактов на графике осциллографа (14:47) - Пишем простую программу для борьбы с дребезгом контактов (16:00) - Получаем домашнее задание (22:30)
@jaroslavfrunt5 жыл бұрын
ИМХО лучше выкладывать на гитхаб Там можно просто посмотреть код А с диска обязательно скачивать надо
@НиязРустемов-р3ц2 жыл бұрын
19:53 void button(){ if (millis() - timerPrew >= 200){ timerPrew = millis(); countInterrupt++; } } countOn тут незачем... Если нужный интервал пройден, то сразу считаем количество нажатий. Я могу ошибаться, так как пришёл сюда узнать, как сделать прерывание по кнопке, но при этом показалось, что флажок тут избыточен. Если я заблуждаюсь, буду признателен за критику.
@ded_pihor3 жыл бұрын
Мне кажется это лучшее объяснение прерываний на ардуино в ютубе
@НиязРустемов-р3ц2 жыл бұрын
Вам не кажется. Так оно и есть.
@starkrim97053 жыл бұрын
Многое узнал, до чего самостоятельно трудно догадаться, спасибо!
@ShadySt3 жыл бұрын
23 минуты пролетели как мгновение. Очень увлекательно!
@НиязРустемов-р3ц2 жыл бұрын
Особенно на скорости 2х. Большое спасибо за хороший урок.
Сложные темы, а как просто и доходчиво объясняются. Здорово!
@alexandrkontsedalov36134 жыл бұрын
Прекрасно, образцово подготовлен материал, четкая подача и прекрасная русская речь. Спасибо. Репект!
@AndriiNikolaiev5 жыл бұрын
Спасибо. Приятно и полезно смотреть твои видео!
@aradivil5 жыл бұрын
Спасибо. Просто о сложном. Замечательная подача информации.
@PrUveTGoogl11 ай бұрын
Хороший обучащий канал жаль перестали выходить новые видео
@oOcitizenOo5 жыл бұрын
Ты вернулся, ура!)
@Dimoven4 жыл бұрын
Отлично объясняешь. Еще бы урок по работе и выбору осцилографа. По каким параметрам выбирать, чтобы можно было прицениться по соотношению цена/качество/функции. Ну и первичный урок как пользоваться и как не нужно подключать устройства к нему.
@loopleet47504 жыл бұрын
20:48 по мне так лучше бы приучил зрителей объявлять переменные через вот такую форму записи " int16_t " так сразу видно какое количество бит и бай в числе. А какое количество бит в long нужно запомнить. и иногда они могут отличаться. в разных микроконтроллерах или языках. да и увеличить(переименовать) переменную int8_t до int16_t гораздо чем менять bute в int
@aleksivanov91374 жыл бұрын
Спасибо большое за вашу проделанную огромную работу.Все понятно,легко и доступно объясняете.Есть просьба к Вам,сделайте пожалуйста разные курсы.Как примерно в школе,первый класс это азбука а здесь знакомство с ардуино ну а далее по нарастающей в средних классах хотелось бы увидеть уже письменность на C++ ну там и дальше.Спасибо удачных Вам проектов.
@TDMLab5 жыл бұрын
Спасибо, подкинул хорошие идейки👍
@agood90004 жыл бұрын
Отличная подача учебного материала ! именно в связке millis() и прерывания ! материал можно сказать уникальный (именно в связке больше не нашёл ни у кого). Автору огромный респект !!! На хейтеров не обращай внимания они сейчас есть везде . Многие пишут просто откровенную ерунду сами не понимая что. Люди, разберитесь для начала с более простыми вещами . Сам в своё время убил уйму времени на разбор как работать с millis(). А какой резистор поставил автор и как его подтянул ... не об этом тема была =) В функции прерывания не работает delay() ибо задействован один и тот же таймер и нужно работать с millis() , а вы пишете про форму записи и прочую ерунду, он АВТОР и ОН ТАК ВИДИТ =) кому не нравится сами свой контент делайте =)
@ФаильАйсулов4 жыл бұрын
Хорошие уроки. Можно сделать еще один урок с акцентом на приоритет прерываний. Допустим собрать часы на ардуино и семисегментнике. На второй счетчик повесить часики, на первый счетчик динамическую индикацию, на нулевой счетчик опрос кнопок. Заметили что мало уроков по ардуино о том как сделать простые часы с будильником, а все потому что милис сидит на нулевом прерывании, а звук сидит на первом прерывании. Тоесть пока играет будильник, часы отстают. Пояснить что на внешнее прерывание желательно вешать только сверхсрочное, какой ни будь датчик аварии, но никак не кнопки. Ну и понятное дело, если тикают часы на таймере, глобально запрещать прерывания нельзя.
@АлексейВоликов-е9я4 жыл бұрын
Так держать, побольши вапускай сваи ролики очень помогают. СПОСИБА
@Dimoven4 жыл бұрын
Для обучалки все ок. Хорошо бы в обучении обращать внимание на переполнение таймера. Скажем, если кто-то делает для себя девайс с долгим включением, то через 70 дней пользователь получит мертвый функционал. И также если значение разницы выходит за int 32768, то на конце числа нужно ставить латинскую Л нижнего регистра, обозначающую сравнение в long
@dobriychel75844 жыл бұрын
Хорошо подготовился. Спасибо за старание.
@avtomatik68934 жыл бұрын
Спокойное и познавательное видео! Класс!
@Ardbot5 жыл бұрын
Узнал много нового. Спасибо
@Сергеймиролюбов-э6г3 жыл бұрын
Спасибо за интересное и полезное видео.
@KJIaBogaB Жыл бұрын
Спасибо!!! Очень познавательно. Я с этим Delay проект бросил вполне рабочий, т.к. не знал как используются в Ардуино прерывания!!! А если мне нужно 3-5 датчиков удара подключить? Как переинициализировать всего 2 пина для прерываний на 5 пинов аналоговых ? Я делал интерактивный тир, где использовал библиотеки чтения SD карт и воспроизведения аудио: #include // Библиотека для SD Card. #include // Библиотека TMRpcm audio 1.6.1 ). При попадании по панели с приклеенным сзади пьзо-элементом воспроизводится Wav-файл звуковой. Настроил аналоговые А0-А4 входы как сенсоры, подключив к ним пьезоэлементы через подтягивающие резисторы каждый около 1МОм (пьезы для ударного воздействия пульки NERF). И в цикле это всё использовал просто проверяя условия, когда произойдет на том или ином датчике. После срабатывания датчика, звук мишени естественно звучит некоторое время, которое я и задавал через Delay (и ещё, толи библиотека дебильная, толи у меня лыжи не едут - если звук воспроизводился, его действие не прекращалось даже после того, как он проиграет и другой звуковой файл по другому действию не воспроизводится). Кое как нарыл в описании, что надо делать audio.disable() после выдержки времени по delay - расчитывал время звучания каждого звука): void loop() { int val0= analogRead(sensorPin0); int val1= analogRead(sensorPin1); int val2= analogRead(sensorPin2); int val3= analogRead(sensorPin3); int val4= analogRead(sensorPin4); if (val1 > 200) // попадание в тело мишени1 { audio.play("hit1.wav"); // издаём истошные звуки погибели первой мишени delay(3000); audio.disable(); // выключить таймер на выводе и остановить воспроизведение } if (val2 > 200) // попадание в тело мишени2 { audio.play("hit2.wav"); // издаём истошные звуки погибели второй мишени delay(3000); audio.disable(); // выключить таймер на выводе и остановить воспроизведение } // и т.д. по остальные 3 мишеням } Дак вот, во время работы по второй мишени после попадания в первую - вторая мишень не срабатывала именно из-за Delay по воспроизведению звука по первой :( приходится долго ждать пока она пробубнит свою траурную бубню. Возможно ещё и срабатывал "дребезг" контактов, т.к. пьезо полюбому должен дребежжать :) Потом я искал как это обойти, понял что нужны прерывания - но к тому времени не нашел подобное видео и забросил. Сейчас можно продолжать :) Спасибо! А то сын поиграл и всё понравилось, но мне не понравилось такая работа и я разобрал дальше ковырять - в результате забросил.
@Boka-and-Joka5 жыл бұрын
Очень хорошие уроки. Спасибо
@ОлегХристофор-р5ж4 жыл бұрын
Спасибо, очень полезно.
@tovarish-214 ай бұрын
Дуже сподобалось дякую
@Pasha4ur3 жыл бұрын
Плохая обработка дребезка. Если много кликать, то работа кода по включению и выключению LED по CHANGE периодически инвертируется. 31 led13State: 1 32 led13State: 0 33 led13State: 1 34 led13State: 0 34 led13State: 0 35 led13State: 1 35 led13State: 1
@andreiserov55254 жыл бұрын
Зачем подключать подтягивающий резистор внешне, если можно использовать внутренний подтягивающий резистор функцией pinMode(1, INPUT_PULLUP)?
@MrYurAlex2 жыл бұрын
Это правила "хорошего тона" для схемотехников.
@АндрейЛенин-п2у3 жыл бұрын
на сколько функция attachinterrupt медленнее, чем настройка таймеров регистрами
@alekskapitonov273810 ай бұрын
Спасибо.
@Nikita_Pro893 жыл бұрын
Круто 👍
@vpetevotov5 жыл бұрын
Под timerPrew имелось в виду previous timer?)
@feoktant3 жыл бұрын
Какие есть рекомендации - прерывание, или опрос в loop?
@ВалентинВладимирович-й4х5 жыл бұрын
Добрый день или вечер!!! Уважаемый, Вы можете в другом скетче, доработать еще два канала, ролики Ваши просто чудо, но программирование для меня пенсионера очень сложно, спаять схему нет проблем. Заранее спасибо.
@ОлегТопчий-у2у2 жыл бұрын
Добрый день. Подскажите пожалуйста решение задачи. Esp8266 подключается к локальной сети, проверяет PING устройства в сети, когда не получает ответ ЭХО , перепроверяет еща 3 раза, и если ответа нет, передергивает питание. Но в это же время веб страница с возможностью в ручную вкл/выкл. Реле.... кончно жэ тормозит. Подскажите как можно решить эту проблему?
@КлайвСинклер-е6ю2 жыл бұрын
Если резистор ставят для поддтяжки к минусу его называют "стягивающим"
@НиколайКапитан-ф8л3 жыл бұрын
спасибо
@АндрійПрокопович-х6х2 жыл бұрын
Извините я читал что функции времени таких как millis, delay, micros не работают в обработчике прерываний.
@ГеннадийГром-в8ю2 жыл бұрын
Немного не так! 😲 millis и micros ничего *особенного* не делают, они лишь выдают значение счётчиков в мс и мкс, прошедшее с начала работы МК, вот только во время работы подпрограммы прерывания счётчик-то не будут изменяться! 😳 И delay тоже будет работать, но какбэ необычно... Он может подвесить МК «навсегда» так как, опять же, счётчик времени у нас не меняется... 🤔 И вообще делать что-то долговременное в обработчике прерываний - это тяжкий моветон! Основная задача там - взвести какой-нить флаг, что бы основная программа узнала - у нас произошло какое-то событие, и уже там производить всякие долговременные «операции», иначе логика работы проца и остальной периферии может основательно покоситься и мы можем получить совсем не тот результат, на который рассчитывали! В начале своего «програмно/аппаратного пути» я долго не мог понять, почему моя прога делает совсем не то, что я «замыслил»?!? 🤔 И лишь доскональное заучивание мануала, да ещё пошаговая «пробежка» в отладчике «вправляли» моск на своё законное место! 👍😁🤪
@micromaster4405 Жыл бұрын
@@ГеннадийГром-в8ю во первых, с чего бы в прерывании не работали функции времени? Во вторых, выполнение основного кода в прерывании - стандарт для систем жёсткого реального времени, особенно в тех МК, где есть приоритеты прерываний
@ГеннадийГром-в8ю Жыл бұрын
@@micromaster4405 Во первых, а с чего им там работать, если в п/п обработки каких-то прерываний обычно выставляется флаг запрета прерываний! Каждая статья в эту тему, да и все, скажем так, гуру от Ардуины на каждом шагу говорят - функции времени в прерывании не работают! Об этом уже столько баталий было, столько копий переломано в сражениях, типа: «а почему у меня в прерывании не работает то-то и это?»! А, во вторых, в *Ардуине стоит ATmega328* , и мы щаз, какбэ, про него говорим... В других МК, да и неМК тоже, может быть всё по другому! Поэтому, я ещё раз повторюсь, что только «заучивание наизусть» руководства пользователя по программированию позволит получить от МК именно той реакции, которую мы «задумали», вернее «заставить» делать то, что мы хотим! Тщательно читаем и «запоминаем» все доки и маны от «нашего» МК, чтобы не было потом «дурацких» вопросов: - а почему это моя Ардуинка считает неправильно, не видит кнопки, таймер не обрабатывает, АЦП не считает?! Вы вот зайдите на профильные форумы по STM32, там такие вопросы всплывают, что мама не горюй, а всё из-за того, что кто-то что-то не дочитал, а маны там в разы больше чем по Ардуне, или разработчики не подправили доки или софт по разработке, при выпуске новой версии МК! И да, что такое «выполнение основного кода в прерывании» я не понял, от слова - никак! 🤔 Это что, выполнение двух разных команд, в одно и то же время, одним ядром процессора?! 😲
@beenmayer77003 жыл бұрын
Здравствуйте. Подскажите пожалуйста как сделать прерывания больше чем с двумя кнопками в моем случае надо 4 кнопки?
@МастерКаратель4 жыл бұрын
Не пойму, почему millis - timerPrew всегда точно будет больше 200 через 200мс, а если в момент включения прерывания в миллис набежало уже много часов? Или при срабатывании прерывания миллис начинает тикать с нуля?
@alexandr_845 жыл бұрын
👍
@Relevantium2 жыл бұрын
Спасибо понятно, но проще было бы INPUT PULLUP или же резистором вручную подтянуть и дребезг уйдет
@LabRazum2 жыл бұрын
Нет, дребезг останется, т.к. происходит он из-за контактов, которые несколько раз замыкаются между собой. А подтяжка всего лишь делает стабильным 0 или 1 - нажато/отпущено, без помех.
@Relevantium2 жыл бұрын
@@LabRazum все этим пользуются, а вы пытаетесь опровергнуть, говорю же работает
@LabRazum2 жыл бұрын
@@Relevantium я с такой логикой спорить не буду, но вы бы хоть загуглили для чего нужна подтяжка :)
@Relevantium2 жыл бұрын
@@LabRazum я знаю для чего она нужна, но с дребезгом тоже помогает, иначе бы не советовал
@LabRazum2 жыл бұрын
@@Relevantium если вы так настаиваете, тогда можете коротко пояснить, как это происходит? Или дать ссылку хоть на одну статью или пример где об этом рассказано?)
@borysg70905 жыл бұрын
Спасибо
@drollery63993 жыл бұрын
То есть прошло 1.5 месяца и прерывания перестали работать :-) Хакер? Для МК 1.5 месяца, как мгновение, особенно если он в каком-нибудь девайсе с постоянным питанием.
@MrHazur5 жыл бұрын
Слишком много переменных. Не проще по прерыванию отключить само прерывание, и через n мелисикунд снова опросить кнопку? Если на кнопке логический 0 - включить заново прерывание.
@spin36023 жыл бұрын
Спасибо, много чего узнал о прерываниях, но столкнулся с проблемкой, помогите её решить, думаю много кому поможет. В проекте есть кнопка (на внешнее прерывание), модуль приёмника 433мгц (на внешнее прерывание), шаговый двигатель с драйвером DIR-STEP и другие датчики для опроса, желательно на внешнее прерывание. Как решить такую задачу, на что смотреть для написания скетча? Ведь у NANO только 2 и 3 нога для прерывания. Только ардуино UNO в помощь? или есть библиотеки какие. Жаль нет видео отличия int от pcint
@LabRazum3 жыл бұрын
Я бы задействовал дополнительные пины для каждого датчика, и так же направил бы их на один пин прерывания. То есть прерывание на 3 пине регистрируется и обработчик начинает проверять три пина датчиков, которые выдают сигнал. Вот нашёл подобное обсуждение (goo-gl.me/4jiNM ), почитайте, может будет полезным. А вообще я бы не увлекался прерываниями и старался делать быструю программу, в цикле которой успевают отслеживаться все ваши события.
@spin36023 жыл бұрын
@@LabRazum Спасибо, я тут почитал чем отличается PCINT* от INT* на ногах, получается как у Вас на видео графики, INT на 2 и 3 ноге, остальные подчти все грубо на кнопки можно сажать для прерывания. Неувлекаясь конечно же.
@ManOleg384 жыл бұрын
Артикул лампы на струбцине скажи пожалуйста.
@LabRazum4 жыл бұрын
Покупал у местного магазина здесь: danomsk.ru/shop/12-gotovye-izdeliya/22-payalnoe-oborudovanie/141-vspomogatelnoe-oborudovanie/163560-lupa-nastolnaya-ma-1503i-3d-s-podsvetkoy-kh1-75-190kh155-mm-dve-energosberegyushchie-lampy-moshchnos/
@viktormezler39384 жыл бұрын
17:59 Если countOn, можно было сбросить вместе с countInterrupt, то зачем нужна вся это возня с таймером? Дребезг длится где-то 5мс.
@rogo73304 жыл бұрын
Если я правильно понял, вы предлагаете сделать следующее: ... void button() { if(countOn == 0) { countIpt++; countOn = 1; } } ... void loop() { ... cli() int countButton = countIpt; countIpt = 0; countOn = 0; sei() ... } Впринципе это может сработать, но тогда вы привязываете сброс кнопки к скорости, с которой у вас будет повторяться этот сброс. Если loop будет повторяться достаточно часто (например если убрать из этой программы delay), то переменная countOn будет сбрасываться всё ещё чаще, чем надо. Даже чаще 5 мс.
@Fil0sOFF2 жыл бұрын
Дребезг длится не 5мс) чаще всего надо ставить 50мс, но есть и такие хреновые кнопки которым и 200мс мало.
@viktormezler39382 жыл бұрын
@@Fil0sOFF Странно у меня не больше 10 мс. Ну а с 200мс это уже перебор! Там не кнопка дребезжит, а руки трясутся! 🤣🤣
@reodos35 жыл бұрын
Зачем подтягивающий резистор, если у ардуино есть встроенный резистор?
@LabRazum5 жыл бұрын
Посмотрите на размеры и мощность выводного резистора и подумайте о надежности встроенного в микроконтроллер микро-резистора - они очень любят выгорать при наводках и не надежны, поэтому я в любых проектах использую только внешнюю подтяжку.
@LabRazum5 жыл бұрын
@@zhuk462 ну дак вы подтверждайте доказательствами, что это ерунда :) Например, здесь в разделе о подключении кнопок об этом тоже говорят: easyelectronics.ru/podklyuchenie-mikrokontrollera-likbez.html и здесь тоже: www.radiokot.ru/forum/viewtopic.php?p=1431616
@СерегаБуба-ж3ц5 жыл бұрын
@@zhuk462 как только понимаешь, что ляпнул "ерунду" начинаешь переобувается на ходу)))) тебе же автор ясно и понятно объяснил, что предпочитает надежность, а ты флудить начинаешь и тут же говоришь о предпочтениях. Если не нравиться не грузи автора глупостями у него не так много времени чтобы тратить его на таких как ты.
@СерегаБуба-ж3ц5 жыл бұрын
@@zhuk462 что значит "спалиш порт что так что эдак"? Если в твоей схеме резистор подобран соответствующего номинала как же ты порт спалиш))) или опять переобуваться будешь на ходу)))
@Unregistered335 жыл бұрын
@@СерегаБуба-ж3ц тоже заметил))) крутится как уж на сковородке. сначала шлепнет языком, потом оправдывается. и дизлайк единственный он и поставил )))
@3DSpaceX4 жыл бұрын
Здравствуйте, подскажите а как сделать что бы после нажатия кнопки светодиод загорался с нужной мне задержкой ну допустим с опаданием в 1.5сек? но при отпускании что б срабатывало без задержек уже.
@grieschagriegorjev34534 жыл бұрын
При нажатии на кнопку ставишь(включаешь) флаг и начинаешь отсчёт, по завешению отсчёта выключаешь флаг и запускаешь программу (ну твой диод загорелся), и как дополнительное условие, если флаг включен и кнопка отпущена, программа выполняется сразу, в момент отпускания кнопки.
@Денис-д3м1о3 жыл бұрын
Какой смысл писать если вы ни кому не отвечаете
@Drak0sha1311 ай бұрын
Или автор дает очень упрощённое понятие volatile, или сам не до конца понимает его использование. Например, если переменная используется только в прерывании, то volatile не нужно ставить.
@criterrors3 жыл бұрын
Насколько я знаю, современные компьютеры не используют прерывания для работы с мышью
@СашкаБелый-ч6м Жыл бұрын
Ну и почему под роликом нет ссылки на первое видео про прерывания, раз уж его рекомендуете. Несерьёзно относитесь к своей работе :(
@LabRazum Жыл бұрын
Потому что научитесь пользоваться подсказками/рекомендуемыми видео, там я специально в момент, когда говорю об этой части, закрепил видео на первую часть.
@СашкаБелый-ч6м Жыл бұрын
@@LabRazum Ура, в этот раз я смогу вам кое что интересное и новое рассказать! :) То что вы назвали «подсказки/рекомендованные видео» можно увидеть только на стационарном компьютере, и то только в том случае если у вас в настройке включена опция «Аннотации». И в этом случае подсказка выскочит лишь на секунду. Стоило тебе отвернуться и ты уже не знаешь о том что там что-то было. А если опция «Аннотации» выключена - то я и не узнаю что были какие-то подсказки. Но я смотрю ютьюб с планшета iPad (он рекламу только 1 раз показывает перед видео, а не каждые 5-7 минут как на стационарном компе), и там в мобильной версии вообще никогда не выпадают подсказки, а в настройках даже раздела «Аннотации» не усуществует. В общем ни пользователи компьютеров, ни планшетов/смартфонов ваши подсказки не видят (за исключением тех кто включит эту опцию на ПК). Гораздо логичней если вы на что-то ссылаетесь - прописать это в ссылках под видео, как это делают все остальные...
@LabRazum Жыл бұрын
@@СашкаБелый-ч6м хорошо, спасибо, буду прописывать! Есть еще раздел «другие видео», если нажать на шестеренку, в самом низу. Там я обычно смотрю все предложенные видео автором. Это и с ipad и с телефона работает.