КАК УСТРАНИТЬ ДРЕБЕЗГ КОНТАКТОВ [Уроки Arduino #8]
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
Тримайте Скетч
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);
}
дякую бо не міг розібратись
До этого урока все было понятно. Неплохо было бы прилагать описание всех новых функций или переменных в каждом видео. Спасибо за внимание.
А всё итак понятно
Да и при желании можно найти, что делает та или иная функция
Согласен с теми, кто критикует отсутствие схемы. Есть еще одна просьба, в описании показывать текст программы и писать побольше комментариев в операциям программы, это очень облегчит усвоение материала тем, кто никогда не писал программы. Спасибо за работу.
Спасибо автору за интересный и познавательный канал, часто смотрю Ваши видео.
Но не смог удержаться от критики данного "урока":
- в части касающейся устранения дребезга контактов - это не урок, а скороговорка по мотивам Блюма (урок создаётся чтобы научить, здесь же НЕ программисту абсолютно ничего не понятно);
- постарайтесь правильно произносить транскрипции английских слов (раз уж видео относится к категории НАУКА и техника), реально режет слух;
- повторюсь, не торопитесь, для Вас это может очень просто, но когда начинающий слышит "многоновыхслов" ещё и с не правильной транскрипцией, получается каша в голове.
Ага читает пл книге)
Оставляйте ссылку на скетч в описании!
в функции debounce вне тела if{ } следует добавить return, иначе при last == current тело if { } не выполнится и функция не будет иметь возвращаемый параметр
Чо?
Спасибо за урок. Очень быстро описываете программный код и очень трудно понять. :(
Давайте попробую объяснить откуда что взялось.
Ниже код и построчно порядок его выполнения:
пропустим выполнение присвоения значений переменным (тут думаю всё понятно), начнём с цикла:
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), диод загорается.
}
Поправьте знатоки если что не так, сам учусь, тоже трудно понять было, хорошо что есть кому объяснить.
код лучше скопировать в компилятор, там всё цветами выделено, проще сориентироваться.
Спасибо, комментарий всё разъяснил
Алексей, вот ты пишешь:
boolean debounce(boolean last) // (2) Начало функции debounce, в скобках объявляется новая переменная last, так же как они прописывались в самом начале кода, этой переменной сразу задаётся значение lastButton, переданное из первого пункта (значение LOW)
Не совсем понятно каким образом переменной last присвоилось значение LOW переменной lastButton. Можешь этот нюанс пояснить, а то чёт не доходит......((
Никита Владимирович когда в цикле обращаешься к функции то пишешь название функции и в скобках пишешь число или переменную которую передаёшь в эту функцию. Там где написана программа функции пишешь название функции и в скобках переменную которая принимает значение переданное в функцию из цикла.
но откуда программа знает, что last это lastButton?
Спасибо за видосы, объясняешь достаточно просто) лайк и ждем новых выпусков
Спасибо! Как всегда познавательно и интересно)
Ооочень быстро говорит, я не успеваю осмыслить сказанное((
Это точно
Так тоже можно:
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;
}
}
чел спасибо тебе огромное а то у меня ошибки были в скобках!
чел спасибо тебе огромное а то у меня ошибки были в скобках!
у меня вопрос по "функции сглаживания дребезга" : там вместо введенных переменных currentButton и lastButton пишет просто current и last, это их сокращенный вид, который тоже понятен программе? или я что-то не понимаю?
Спасибо за видос,отличный контент!!лайк
Я просто паял "кандик" параллельно с кнопкой. Пока кнопка не нажата, кандик заряжен, когда нажимаем, мы закорачиваем контакты и сбрасываем заряд. Т.к. заряд не пополняется мгновенно, то пока идет дребезг контактов кнопки кандик все еще разряжен(точнее не до заряжен). Когда кнопка отпущена полностью идет зарядка и выполняется действие от кнопки.
Если коротко, то срабатывание кнопки происходит не по нажатию, а по отпусканию.
Хорошее видео. Ну да, приходится в интернет заходить и смотреть обозначение операторов, функций и всего непонятного))) Зато много читаешь и узнаешь что-то новое. Очень хорошее видео. Код написал и на тебе ошибку))) , а где и что делать. Искал, перечитывал код и когда перечитывал, то и суть кода становится ясна. Да есть свои нюансы, но зато ты их сам исправляешь, а это важно (мыслишь Ты, а не тот кто рассказывает). Скажу от себя, каждый воспринимает информацию по своему, кому-то подавай всё готовое, а кто-то любит что-то сам додумать. У меня знание ПК и всех этих кодов Нулевое, но я всё понимаю, да не с первого раза, не за 6 минут, а за 20. Молодец, так держать.
"ожидаем 5 секунд". Я понимаю что автор возможно оговорился, но в delay() значения задаются в мс, и поэтому есть немного разница между 5с и 5мс. Но в целом видео очень полезное.
Уважаемые радиолюбители, подскажите, пожалуйста, почему файлы-sketch для Arduino могут иметь различные расширения: одни файлы имеют расширение INO (.ino), а другие - PDE (.pde)? В чём отличие таких файлов? Каким образом в программном обеспечении Arduino можно изменить по умолчанию тип расширения сохраняемого файла-sketch? Спасибо! С уважением, Валерий.
Спасибо за видео, лайк!
Продолжай в том же духе)
объясните пож-та boolean debounce(boolean last) для чего это нужно?
Здравствуйте. Не могли бы вы пояснить мне некоторый момент из данного урока. После первого нажатия кнопки удовлетворяется условие (lastButton == LOW && currentButton == HIGH) из цикла loop() и переменная ledOn приобретает значение HIGH и светодиод загорается, это понятно. Но почему после второго нажатия происходит присвоение переменной ledOn значения LOW, ведь для этого нет никаких видимых причин?
Добрый вечер! В момент нажатия кнопки мы приобретаем режим HIGH и если предыдущее значение было LOW, то он изменит состояние светодиода. Так как кнопка меняет свое состояние сразу после прекращения нажатия, то когда мы ее отпустим переменная lastButton изменится на LOW и при следущем нажатие на кнопку мы вновь получим currentButton == HIGH и попадем в условие где опять изменим состояние диода. Еще я добавил в функции debounce дефолтно возвращаемый результат если if() не отработал, что бы возвращал lastButton, иначе насколько понимаю логика странная, но может и правильная
Хотелось бы увидеть как сделать и запрограммировать джойстик на Ардуинке.
Здравствуйте! Очень нужна помощь. Нужно собрать схему управления шаговым двигателем namo 17. Необходимо подлючить кнопки и цифровой двухстрочный дисплейчик. Нужно, чтобы скорость двигателя отображалась на дисплее, а кнопками можно было изменять скорость. контроллер ARDUINO NANO
подскажите, как через эту команду подключить сразу 2 кнопки и 2 светодиода?
Вроде всё доступно и просто.
Хочется отметить однако, что использование функции бесполезного простоя delay() не есть труъ в общем случае, ведь камушек остаётся не занят ничем, а только ждёт столько, сколько скажут.
Для простых задач быстрого кодинга прокатит, но для более сложных всё-таки хочется обработку нажатия кнопок с учётом дребезга вывести на прерывания. Самым простым и эффективным мне видятся прерывания по таймеру (~ 1 ms) с использованием сдвигового регистра для набора статистики нажатия на кнопку. Для таких кнопок работает на ура. Но бывают и более проблемные варианты, когда используется, например, плёночная клавиатура, для которой в любой момент времени во время нажатия может прийти ложный сигнал отпускания с длительностью до 5 ms. В этом случае приходится использовать счётчики нажатия с условиями по нажатию и отпусканию. Это весьма усложняет механизм, зато делает возможным анализ и таких вещей, как двойное нажатие, длительное удержание и другие более экзотические варианты.
У меня проблема. Мне в ваш код нужно добавить, чтобы если светодиод включен, то независибо от нажатой или ненажатой кнопки он гас через 10 секунд. Помогите плиз.
Аппаратно можно подавить дребезг с помощью микросхемы триггера Шиитта а уже в программе или возможно ещё какой то микрухой выставить задержку
"return current" нужно поместить после блока if.
Спасибо тебе, добрый человек, а то бы я всю башку сломал. Все работало, но при запуске светодиод сам включался. Вхожу в отладку, вижу, что в функцию на втором лупе передается last = 161, и включается диод. Никак не мог понять, в чем дело.
если кому надо чуть подправленный код у меня работает стабильно, иначе через пол минуты слушаться переставал диод
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);
}
Выпусти скетч в описание. Я написал как у тебя, но всё равно пишет какую то ошибку
Почему бы const не заменить на #define ?
кто нибудь даст ответ ? как включить 2 led из 2 кнопка ( BUTTON) ? чтобы независимо друг другу включить.
как с тобой связаться?
Подскажите пожалуйста! Для не опытных как определять нужные функции, значения и их названия, для применения в определенных условиях? И почему функции прописываются строчными буквами, а например LED-заглавными? Или куда залезть, чтобы узнать эти основы? Спасибо!
Как можно и как нельзя называть переменные - читаем это для языка с++. Например, начинать с цифры нельзя. Более детальные правила для языка есть в справочниках. По поводу регистра - вообще он не влияет ни на что, кроме того что при обращении требуется учитывать написание. Однако есть для каждого языка свои стандарты и некие правила, а так же принципы написания названия из более одного слова. Например, digitalRead это camelCase - все слова пишутся слитно, но каждое новое с большой буквы, исключая первое слово. Есть PascalCase - тут как в прошлом, но первая тоже большая. Есть snake_case, kebab-case, и несколько совсем извращенных вариантов. Вы можете изучить нынешние стандарты для нужного языка (тут с++), а можете для начала соблюдать лишь часть из них. Можно и без этого вовсе. Для простоты - функции и переменные в camelCase, а объекты в PascalCase. То, что у автора есть переменная где все заглавные - в некоторых языках так по традиции именуют константы, но это как обычно не обязательно.
tproger.ru/translations/stanford-cpp-style-guide/ можно тут для плюсов глянуть, как вариант. Или в англоязычных источниках.
Но: существующие функции и переменные нужно вызывать в том кейсе, как они созданы. DiGiTaLwRiTe() по идее должен вас послать.
Так же есть языки не чувствительные к регистру имён переменных и функций.
Отлично!
Но все-таки не очень понятно.
я не могу продолжить написание программы после
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;
)
}
помоги напиши пожалусто
Добрый день! А если условие в функции debounce не выполнелось, она что возвращает?
я добавил логику возвращать принимаемое значение. Вроде бы могут быть баги если не указать возвращаемое значение явно.
пытаюсь сделать так, чтобы светодиод после нажатия кнопки мигал до следующего нажатия, но чёт не хочет работать как мне надо) может знает кто, как это осуществить?
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); // включаем или выключаем светодиод.
}
}
Делэй решает проблему дребезг контактов.
У меня просто моргает. На кнопку не реагирует.
..затем ожидаем 5 секунд - Неверно!!! 5 милисекунд! Оговорился!!!
Как в этом скетче сделать, чтобы светодиод мигал? нужен код для поворотников (2 кнопки, 2 светодиода)
прикольно за тобой исправлять ошибки,. объявляешь одно значение boolean lastBUTTON а void loop() значение изменяешь lastButton.
Поставь кнопку в разрез питания ардуино чтобы питание не доставаать каждый раз а просто нажал вкл нажал выкл
Функция debounce произносится как дибаунс, ударение на '' а''
Я вот не понял почему
currentButton = debounce (lastButton)
Типо почему не
debounce ( currentButton)
Объясните пж
Мдя, ну если ты уж начал с элементарного (как зажечь СД итд...) то ты наверное решил делать видео для чайников, что в общем-то правильно. НО это видео, после предыдущих, непонятно совершенно. Такое ощущение что перед этим уроком нужно было бы сделать еще парочку. А так как будто что-то важное пропустил и начал с середины))
вот еще бы текст кода крепить в коменты, было бы супер
Никто не подскажет, что такое может быть.
Программу написал, но почему то в начальном положении светодиод горит.
Задаю boolean ledOn=true , и светодиод в начальном состоянии не горит
класно :)
пожалуйста давай добавим ishio paru diod i knopka
Вот бы ещё ссылка на код программы в описание была. Перепечатывать лень :)
Можно схему выложить?
все смог вот сама программа
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);
}
+Даниил Карибеков красавчик выложил скетч
С сарказмом чтоли
сколько ошибок, ебаааать
Я так и не понял последовательность выполнения программы !
сделай видео как подключить к Arduino экран
а можно объяснить по проще)) а как мы мы сделали так) что кнопка теперь работает вот так по другому)?
скетч без функции устранения дребезга кнопок:
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);
}
Больше уроков
Не легче ли просто мажоритарный алгоритм применить?
ru.wikipedia.org/wiki/Мажоритарный_элемент
сделай видео как подключить монитор
Вот более простой способ. Лучше бы на этом примере для начала объяснил.
Правда при этом способе если зажать кнопку то светодиод начнет моргать.
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);
}
}
Я вот так вообще написал))
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);
}
}
Эта тема немного сложнее, но пока нормально. А для тех, кто матюки пишет, скажу:"Читайте первоисточники".
Если в коде присутствует оператор delay() то этот код сразу на удаление. Не надо прививать новичкам плохие манеры.
Ебать, может нахуй это программирования, а то тут какие то ещё неправильные операторы
Не знаю актуально ли еще кому то но это плоховатый стиль тормозить программу задержками. А если у тебя 100 кнопок что каждую ждать по 100 мс? Для такого применения в функции debounce лучше сделать счетчик и инкрементировать его в каждом цикле когда текущее состояние сигнала равно состоянию сигнала предыдущего цикла. Функции можно передавать в качестве входного параметра сколько циклов вы хотите чтобы сигнал не менялся прежде чем выход поменяет значение. Таким образом выполнение программы нет необходимости тормозить задержками. Конечно для этого учебного примера и так сойдет но для реального применения лучше с задержками не делать.
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);
}
так куда уж проще:
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;
}
Ладно, допустим с этим все понятно. А что делать если кнопок не одна, а больше? Что кому передавать и что кому возвращать?
Код крупнее плиз. На телефоне не видно ничего. Спасибо.
как понимать эту строчку: boolean debounce (boolean last) ?
Написав "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
Varya Flower У Вас нет своего канала? Я бы на Вас подписался. Без иронии и сарказма. Ваша отзывчивость и спокойное понимание того, что восприятие и уровень базовых знаний у всех разный - очень подкупают.
Varya Flower Пользуясь случаем, хочу тоже задать вопрос, если не затруднит. Для чего такое количество типов переменных?. К примеру, "int" сама по себе достаточно универсальна, и (по моим скромным наблюдениям) запросто заменяет и "const", и "boolean" и т.д. только в менее "урезанном" по своим возможностям варианте. Так если, вся нагрузка обозначения типов переменных заключается только в том, чтобы их объявить, не проще сделать это в менее конкретизированном варианте, чтобы одновременно не ломать голову над тем, какой тип применить и оставить себе более широкое "поле для маневров"?
@@varyaflower6773 лучшего ответа я наверное еще пока не видал)
Смотрим на скорости 0.75
Здравствуйте, Я с большим трудом продираюсь через дебри программирования.
У меня к вам просьба.
Прошу написать несколько строчек кода, которые выполняют следующее:
На воды D2 и D3 заранее подаются команды в двоичном коде
00
01
10
11
Как заставить скетч на каждое из этих двоичных чисел выполнять различные части программы.
Каждая из этих частей мне уже покорилась, и работает. Нужна возможность выбора одной из них, без препрошивки скетча :)
Спасибо большое.
Привет из будущего
А есть ли не программные решения для борьбы с дребезгом?
или просто поставь сглажующий конденсатор параллельно кнопки
+Олег Погодаев дроссель
Всё было хорошо до этого урока и куска предыдущего, в котором наглядно не была разобрана тема оттягивающей кнопки. А тут не понятно, что-за предыдущее состояние и текущее состояние? Текущее ещё понятно, но предыдущее перед чем? Контроллер запрограммирован, кнопка находится в текущем состоянии, а предыдущего нету, потому что он только вылупился на свет и того, что прежде у него ещё не было, он в текущем состоянии. Вот такая ерунда у меня в голове, потомучто это для меня новый мир и я не знаю, с чем мне проводить аналогию, объясняй пожалуйста суть всех деталей, иначе на дальнейших уроках будет идти все как снежный ком. Тут недопонял, а там чтобы понять нужно знать, что было тут и т.д. А так спасибо большое за предыдущие уроки, они были шикарными. Я с удовольствием пересматривал по несколько раз, чтобы до мелочей понять суть всего и запомнить
Не, парень ну тебя с твоими уроками для начинающих ардуинщиков и уже программистов, сколько раз пересматривал, уже тошнит и злит все это не понимаю и уже не хочу понимать, все просто наляпано как поток какой-то информации лишь бы поскорее закончить этот 6 минутный урок. Не то место я выбрал для изучения, это не для начинающих, это для тех, кто уже обучался программированию
-можете скинуть скетч
Добрый день, уважаемые радиолюбители! При загрузке 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)
{Заранее благодарен Вам за Ваши рекомендации и Вашу помощь.С уважением,Валерий.
Даже текст описания кода проговорил не свой, а с книги Джереми Блум
глупый код, постоянно delay(5): это вообще к чему ? нужно кнопку другую применить on-off-on и два элемента "или не"
Я не смог разглядеть на экране чтобы переписать оператор логического "И".
Какие это символы?
Скетчи я переписываю с экрана и вот тут никак не могу разглядеть :-(
&&
и что конкретно делает return current?)
тоже не понял, а что она делает?
Зачем плагиатом заниматься? :/
Не проще ли ссылку на уроки бросить в переводе амперки?
+Кирилл Дубинкин Спасибо за канал Амперки, подписался)
С такой логикой и в школе на уроках ничего рассказывать нельзя чтобы не обвинили в плагиате, а просто ученикам ссылку на учебники давать нужно!
+Oleg Pogodaev вот именно! Про школу похоже сам не понял, что сказал((
а если дребезг у потенциометра? тогда что?
Ну нормально же объясняет. Но произношение английстких слов......... Поработай чуть над произношением, а то уши может резать
Произношение англ. слов для автора ролика:
low - лоу
debounce - дебаунс
Здравствуйте, в коде ошибка но это к лучшему я хоть смог все изучить детально и исправил хорошое задание на логику😁
Лучший, я просто за с++ не шарю. Ток на пайтоне,
Переписываю код просто(
@@laromi8908 с++ не так сложен, если собрать более 10 схем разных то сами заметите что все одно и тоже если писать самому а не копировать😃
☦❤🙏
на русском напишу, а не на c++)))) Так можно сделать? Если светодиод горит(т.е. выход 9=high), то туши его(выход 9=low) а иначе зажигай(выход 9=high)!!!?????))) Так же покороче вроде будет. Я еще не покупал ардуино, просто интересуюсь пока что, но хотелось бы узнать будет работать по-такому коду?
Нет. Русские команды не понимает не один современный, востребованный язык программирования.
Если на счет логики, то: 1) как будет считывать горит или нет светодиод?
2) при такой логике зачем тогда кнопка?
Триггер Шмитта
а схема роботи?
last и lastButton, current и currentButton - одно и тоже?
да проще конденсатор параллельно на землю въе6ть..
Хрен знает, я ещё до выхода этого ролика сам прописал после:
...
}
else
{
digitalWrite(LED, HIGH);
delay(5000); }
} например 5 секунд и хоть до поноса на кнопку жми и отпускай, светодиод всё это заданное время горит себе спокойно. Как то так!
Как вариант
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;
}
Еще один вариант, типа "закос" под асинхронность, но надо будет доработать в будущем
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;
}
Дурной тон использовать программное устранение дребезга. Про delay() вообще молчу. Гораздо продуктивнее использовать аппаратное решение. Вот тебе тема для следующего видео.
извините, на 4:07 ожидаем 5 милисекунд
LOW произносится ЛОУ по английски, не ЛАУ
программа не просто не сложная, она элементарная.
Для меня это вынос мозга. Может я просто долбаёб и амёба, но как знать
@@user-ht1xr3tr8d главное чтоб девки давали. остальное не важно
если честно, то присвоение переменным значения выводов считаю ненужным в данным момент. только путает и напрягает неадоптированный мозг. проще писать номер контакта и всё!
Зачем было прописывать current = digitalRead(BUTTON) второй раз в условном блоке?
необходимая проверка , учитывает состояние кнопки уже после 5 миллисекунд (то есть дребезга )
Вообще, если задержки будет достаточно, чтобы выждать дребезг и недостаточно, чтобы пользователь за это короткое время изменил состояние кнопки, то я считаю эта строчка не нужна. Если пользователь успевает изменить состояние, то будет твориться дичь, это сложнее чем я думал.
Джереми Блум "Изучаем Ардуино" . Хоть бы на первоисточник ссылался
а почему кнопку нельзя просто ставить в разрыв на 9 пин .зачем её прописывать
смысл?