Нетипичные кнопки

flickster
Offline
Зарегистрирован: 09.06.2021

sadman41 пишет:
case B1HOLD: { digitalWrite(led1, HIGH); Serial.println("B1HOLD"); flags = B1TO; timer1 = millis(); } break; ... case B1TO: { if (millis() - timer1 >= 4000) { digitalWrite(led1, LOW); flags = 0; Serial.println("B1TO"); } break; ...

 

т.е. после нажатия кнопки взводится таймер, затем кейс со светодиодом его проверят, а flag=0 сбрасывает?

sadman41
Offline
Зарегистрирован: 19.10.2016

Нелогично?

И ничего там не взводится. Гайверофорум засерает всем мозги.
Запоминается момент времени.

flickster
Offline
Зарегистрирован: 09.06.2021

b707 пишет:

flickster пишет:

Первым делом я бегло пробежался по первым 5-7 страницам форума в нужном разделе и оставил там полезный комент относительно Notepad++ для тех же новичков 

я видел. Комент типично новичковый - наивный и немного смешной. Если чо - подсветка синтаксиса есть практически в любом редакторе кода, а не только в Нотепаде. Вы Удивитесь - но она даже в Ардуино ИДЕ есть

Notepad++ подсвечивает линией блоки которые которые включены в знак {}. Это чуть более наглядно. И опять ж  мы смотрим на ситуацию с разных колоколен) Мне как новичку кажется, что новичкам это полезно будет)

flickster
Offline
Зарегистрирован: 09.06.2021

sadman41 пишет:
Нелогично?

я не оспариваю логичность)

Просто для меня это было не совсем очевидно т.к. не имею должного опыта =( А так это логичнее и гораздо проще

flickster
Offline
Зарегистрирован: 09.06.2021

Если я объявлю #define DEBOUNCE 300, а затем в лупе 

if (!btn1 && flags && (millis() - timer1 > DEBOUNCE)) {
timer1 = millis();
if (!btn2 && flags && (millis() - timer2 > DEBOUNCE)) {
timer1 = millis();

я же смогу так антидребезг организовать?

 

b707
Offline
Зарегистрирован: 26.05.2017

flickster пишет:

Если я объявлю #define DEBOUNCE 300, а затем в лупе 

if (!btn1 && flags && (millis() - timer1 > DEBOUNCE)) {
timer1 = millis();
if (!btn2 && flags && (millis() - timer2 > DEBOUNCE)) {
timer1 = millis();

я же смогу так антидребезг организовать?

 

btn1 у вас равен 11. в чем смысл выражения ! btn1 ?

да и остальные части выражения не больно осмысленные

flickster
Offline
Зарегистрирован: 09.06.2021

b707 пишет:

flickster пишет:

Если я объявлю #define DEBOUNCE 300, а затем в лупе 

if (!btn1 && flags && (millis() - timer1 > DEBOUNCE)) {
timer1 = millis();
if (!btn2 && flags && (millis() - timer2 > DEBOUNCE)) {
timer1 = millis();

я же смогу так антидребезг организовать?

 

btn1 у вас равен 11. в чем смысл выражения ! btn1 ?

кнопка подтянута через резистор. И если я правильно понял это состояние "нажата"

flickster
Offline
Зарегистрирован: 09.06.2021

b707 пишет:

flickster пишет:

Если я объявлю #define DEBOUNCE 300, а затем в лупе 

if (!btn1 && flags && (millis() - timer1 > DEBOUNCE)) {
timer1 = millis();
if (!btn2 && flags && (millis() - timer2 > DEBOUNCE)) {
timer1 = millis();

я же смогу так антидребезг организовать?

 

btn1 у вас равен 11. в чем смысл выражения ! btn1 ?

да и остальные части выражения не больно осмысленные

Если кнопка нажата, флаг активен и таймер больше 300 то мы.... сбрасываем таймер

пора спать идти. Почти 4 ночи =(

flickster
Offline
Зарегистрирован: 09.06.2021

за сим разрешите откланяться. Всем спасибо, продолжу уже завтра.

И как говорил сократ "В споре рождается истина..." =)

b707
Offline
Зарегистрирован: 26.05.2017

flickster пишет:

если я правильно понял это состояние "нажата"

состояние нажата - это ! digitalRead(btn1); А btn1 - это номер пина. Почувствуйте разницу...

Идите спать индид

flickster
Offline
Зарегистрирован: 09.06.2021

нашел первый недочет

Если, пока кейс B1HOLD не успел перейти в B1TO нажать B2HOLD, то логика уходит в другой кейс, а это рушит мое ТЗ. Т.е. мне нужен еще и таймер на задержку перехода между кейсам получается. Завтра буду думать.

Похоже все же придется снимать показания со светодиодов и делать логику еще и с ними

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

flickster пишет:

нашел первый недочет

Если, пока кейс B1HOLD не успел перейти в B1TO нажать B2HOLD, то логика уходит в другой кейс, а это рушит мое ТЗ. Т.е. мне нужен еще и таймер на задержку перехода между кейсам получается. Завтра буду думать.

Похоже все же придется снимать показания со светодиодов и делать логику еще и с ними

Вооот, это верное направление. И делается это просто - вместо проверки нажатости второй кнопки делать проверку состояния светодиода.

if (!digitalRead(btn1) && !digitalRead(led2))
  flags = B1HOLD;
else if (!digitalRead(btn2) && !digitalRead(led1))
  flags = B2HOLD;

Так реакция на кнопку будет только при условии, что противоположный светодиод не горит.

А вообще вы действительно неправильно работаете с кнопками. Вам нужно отлавливать момент нажатия, а вы вместо этого выдаете постоянный сигнал "Нажато" ))

ЗЫ: 300 мс для антидребезга - это безумно много, обычно делается не более 50 мс 

flickster
Offline
Зарегистрирован: 09.06.2021

v258 пишет:

flickster пишет:

нашел первый недочет

Если, пока кейс B1HOLD не успел перейти в B1TO нажать B2HOLD, то логика уходит в другой кейс, а это рушит мое ТЗ. Т.е. мне нужен еще и таймер на задержку перехода между кейсам получается. Завтра буду думать.

Похоже все же придется снимать показания со светодиодов и делать логику еще и с ними

Вооот, это верное направление. И делается это просто - вместо проверки нажатости второй кнопки делать проверку состояния светодиода.

if (!digitalRead(btn1) && !digitalRead(led2))
  flags = B1HOLD;
else if (!digitalRead(btn2) && !digitalRead(led1))
  flags = B2HOLD;

Так реакция на кнопку будет только при условии, что противоположный светодиод не горит.

А вообще вы действительно неправильно работаете с кнопками. Вам нужно отлавливать момент нажатия, а вы вместо этого выдаете постоянный сигнал "Нажато" ))

ЗЫ: 300 мс для антидребезга - это безумно много, обычно делается не более 50 мс 


Благодарю, за наводку. А как отлавливать? ДиджиталРид разве не это делает?
У меня кнопки от старых ПК и 50 было мало. Опытным путем к 300 пришёл
И если я в будущем светодиоды захочу поменять на led модули, не будет проблем с "ловлей сигнала"?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

flickster пишет:

b707 пишет:

flickster пишет:

Оптимизация кода для меня еще не скоро откроется)

тут нет никакой оптимации, это всего лишь логическое выражение

оно сокращено в 1 строку = оптимизированно

Отнюдь.

Оно и не сокращено и не оптимизировано.

Для оптимизации - необходим критерий.

А сокращенное - содержало бы меньше операций, например, так:

if (!(flags || digitalRead(btn1))) flags = B1HOLD;

sadman41
Offline
Зарегистрирован: 19.10.2016

Вроде уже показал, как сделать - все без толку. Для чего писал...

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

flickster пишет:

Благодарю, за наводку. А как отлавливать? ДиджиталРид разве не это делает?

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

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

flickster пишет:

И если я в будущем светодиоды захочу поменять на led модули, не будет проблем с "ловлей сигнала"?

Без разницы, проверяется не сам светодиод, а состояние пина, к которому он подключен

sadman41
Offline
Зарегистрирован: 19.10.2016

LED-модуль может оказаться сборкой на 595 или пиксельным светодиодом. Там ничего на пине не будет.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

На пине, к которому подключен модуль, будет либо HIGH, либо LOW, соответственно - либо включен, либо выключен. А чем конкретно управляет пин несущественно

b707
Offline
Зарегистрирован: 26.05.2017

Если сделать как описал Садман, не нужно будет проверять состояния диодов.
Тс, выкладывайте последний получившийся код, вы опять чего-то не поняли

sadman41
Offline
Зарегистрирован: 19.10.2016

v258 пишет:
На пине, к которому подключен модуль, будет либо HIGH, либо LOW, соответственно - либо включен, либо выключен. А чем конкретно управляет пин несущественно

Т.е. после вывода на страйп нужно будет ещё принудительно ногу переводить в какое-то состояние вместо того, чтобы один байт в памяти изменить? Ну типа круто, чо.  PHP-style.

b707
Offline
Зарегистрирован: 26.05.2017

V258, дорогой, я понимаю что ТС нихера не догоняет, но вы то?
Посмотрите внимательно на строчки, приведенные Садманом в #42. Эти строчки при верном применении полностью исключают тот "недочет", о котором пишет ТС.
Из этого вывод - он опять что-нибудь не так поправил в коде. Не надо ему советовать читать состояние светодиодов, для правильной работы кода это не нужно.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Вот когда дойдет до страйпов, тогда и будет разговор

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

b707 пишет:
V258, дорогой, я понимаю что ТС нихера не догоняет, но вы то?
Посмотрите внимательно на строчки, приведенные Садманом в #42. Эти строчки при верном применении полностью исключают тот "недочет", о котором пишет ТС.
Из этого вывод - он опять что-нибудь не так поправил в коде. Не надо ему советовать читать состояние светодиодов, для правильной работы кода это не нужно.

ТС этот код использовал? Вот то то ж ))
А так да, вариантов может быть много

b707
Offline
Зарегистрирован: 26.05.2017

v258 пишет:

ТС этот код использовал? Вот то то ж ))
А так да, вариантов может быть много

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

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Человеку не нужен готовый код, он хочет понимать, что делает. До понимания того кода он, видимо, еще не дорос. А пояснять Садман не стал ))

flickster
Offline
Зарегистрирован: 09.06.2021

v258 пишет:
Человеку не нужен готовый код, он хочет понимать, что делает. До понимания того кода он, видимо, еще не дорос. А пояснять Садман не стал ))

Человек просто ночью почему то проигнорировал то сообщение.... каюсь. Сейчас доберусь до дома и сяду пробовать.

flickster
Offline
Зарегистрирован: 09.06.2021

sadman41 пишет:
В конце концов это придавит все :

if (!flags && !digitalRead(btn1)) flags = B1HOLD;
if (!flags && !digitalRead(btn2)) flags = B2HOLD;


Видимо спящий мозг напугало слово придавит)
Я верно понимаю: если флаг поднят и на пине btn1 HIGH, то менять флаг на b1hold?

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

flickster пишет:
sadman41 пишет:
В конце концов это придавит все :

if (!flags && !digitalRead(btn1)) flags = B1HOLD;
if (!flags && !digitalRead(btn2)) flags = B2HOLD;


Видимо спящий мозг напугало слово придавит)
Я верно понимаю: если флаг поднят и на пине btn1 HIGH, то менять флаг на b1hold?

В точности до наоборот - если флаг опущен, т.е. равен нулю, и на пину кнопки LOW, т.е. нажата, то менять флаг...

sadman41
Offline
Зарегистрирован: 19.10.2016

Это буквальное толкование.

Смысловое: в первой строке - если система не находится в каком-либо состоянии кроме безделья, то анализируется состояние входа и состояние системы изменяется при обнаружении его активности. Во второй строке система уже не будет находится в состоянии безделья, если было зафиксировано нажатие кнопки #1. И наоборот.

Вроде как я применил те же приёмы и ТС. Это должно было ему быть понятно.

flickster
Offline
Зарегистрирован: 09.06.2021

sadman41 пишет:
Это буквальное толкование.

Смысловое: в первой строке - если система не находится в каком-либо состоянии кроме безделья, то анализируется состояние входа. Во второй строке система уже не будет находится в состоянии безделья, если было зафиксировано нажатие кнопки #1. И наоборот.

Вроде как я применил те же приёмы и ТС. Это должно было ему быть понятно.


Так, я что то запутался. У меня стоит резистор на плате. Я читал, что если ставить его, то нужно инвертировать значения через !.
Но так же я сделал подтяжку програмно, что видимо сделало мой резистор бессмысленно выставленных. И это меня запутало и инвертировало моё понимание логики.
Получается моя логика из сообщения выше была бы справедлива для pinmode input и резистора на плате. Верно?

b707
Offline
Зарегистрирован: 26.05.2017

flickster пишет:
просто ночью почему то проигнорировал то сообщение.... каюсь. Сейчас доберусь до дома и сяду пробовать.

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

У вас есть очень вредное на данном этапе заблуждение, что вы разбираетесь в коде... в то время как это сильно преувеличено :)

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

flickster пишет:
sadman41 пишет:
Это буквальное толкование.

Смысловое: в первой строке - если система не находится в каком-либо состоянии кроме безделья, то анализируется состояние входа. Во второй строке система уже не будет находится в состоянии безделья, если было зафиксировано нажатие кнопки #1. И наоборот.

Вроде как я применил те же приёмы и ТС. Это должно было ему быть понятно.


Так, я что то запутался. У меня стоит резистор на плате. Я читал, что если ставить его, то нужно инвертировать значения через !.
Но так же я сделал подтяжку програмно, что видимо сделало мой резистор бессмысленно выставленных. И это меня запутало и инвертировало моё понимание логики.
Получается моя логика из сообщения выше была бы справедлива для pinmode input и резистора на плате. Верно?

Да, при программной подтяжке резистор не нужен. И да, состояние Пина кнопки будет инвертировано, LOW - нажата, HIGH - отпущена

b707
Offline
Зарегистрирован: 26.05.2017

flickster пишет:
Получается моя логика из сообщения выше была бы справедлива для pinmode input и резистора на плате. Верно?

это здесь вообще не при чем

b707
Offline
Зарегистрирован: 26.05.2017

v258, сорри вторично, но ветка просто переполнена вашими сообщениями ни к месту. Старайтесь все-таки вникать в дискуссию

рассуждения ТС о подтяжке не имеют РОВНО НИКАКОГО ОТНОШЕНИЯ к логике, описанной Садманом. ТС надо указать на это, а не пускаться с ним в дискуссию о резисторах...

Ладно, мне на работу пора...

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

b707 пишет:

v258, сорри вторично, но ветка просто переполнена вашими сообщениями ни к месту. Старайтесь все-таки вникать в дискуссию

рассуждения ТС о подтяжке не имеют РОВНО НИКАКОГО ОТНОШЕНИЯ к логике, описанной Садманом. ТС надо указать на это, а не пускаться с ним в дискуссию о резисторах...

Ладно, мне на работу пора...


Имеет - он реально не понимает ни про подтяжку, ни про логику работы с кнопками. Что вы ему пытаетесь объяснить, если он не понимает даже, зачем в коде восклицательные знаки стоят?

b707
Offline
Зарегистрирован: 26.05.2017

v258 пишет:
Что вы ему пытаетесь объяснить, если он не понимает даже, зачем в коде восклицательные знаки стоят?

ну ОК, прощу простить за резкость.

Соглашусь, что про подтяжку ему тоже надо обьяснять.

Ему вообще почти каждую запятую в этом коде еще только предстоит понять... Наш ТС сейчас в самом неудачном месте кривой Крюгера - на левом пике :)

flickster
Offline
Зарегистрирован: 09.06.2021

v258 пишет:
b707 пишет:

v258, сорри вторично, но ветка просто переполнена вашими сообщениями ни к месту. Старайтесь все-таки вникать в дискуссию

рассуждения ТС о подтяжке не имеют РОВНО НИКАКОГО ОТНОШЕНИЯ к логике, описанной Садманом. ТС надо указать на это, а не пускаться с ним в дискуссию о резисторах...

Ладно, мне на работу пора...

Имеет - он реально не понимает ни про подтяжку, ни про логику работы с кнопками. Что вы ему пытаетесь объяснить, если он не понимает даже, зачем в коде восклицательные знаки стоят?

От части вы правы. Выше я написал почему так получилось. 

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

flickster
Offline
Зарегистрирован: 09.06.2021

b707 пишет:

v258 пишет:
Что вы ему пытаетесь объяснить, если он не понимает даже, зачем в коде восклицательные знаки стоят?

ну ОК, прощу простить за резкость.

Соглашусь, что про подтяжку ему тоже надо обьяснять.

Ему вообще почти каждую запятую в этом еще только предстоит понять... Наш ТС сейчас в самом неудачном месте кривой Крюгера - на левом пике :)

о нееет) оттуда я свалился когда пошел дальше урока "нажали кнопку загорелся светодиод" xD

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

Ямы страдания я с Windows уже 10 лет испытываю)

b707
Offline
Зарегистрирован: 26.05.2017

flickster пишет:

Ямы страдания я с Windows уже 10 лет испытываю)

"Да забей!" (с)

flickster
Offline
Зарегистрирован: 09.06.2021

Достаю из коробочки модуль mp3 плеера и запасаюсь кофе xD