3 вывода. работа с переключателем (не кнопка). возможно ли ?
- Войдите на сайт для отправки комментариев
{преамбула}: всё описание сточки зрения логики/алгоритма. возможно гдето у меня ошибка и какаято часть не реализуемма программно а какаято хардверно. укажите плиз.
данно: переключатель. т.е. три вывода один из которых общий. т.е. имеем либо 1-2 состояние либо 2-3. {и если я не ошибаюсь} обозначим это, замкнут 1 тогда pin1 = hi. pin3 = low. замкнут 3 тогда pin1=low pin3=hi
алгоритм:
- при старте ардуино замкнут либо 1-2 либо 2-3 выводы переключателя. заранее нам неизвестно что будет замкнуто и это и не важно для алгоритма
- к примеру со старта замкнуто 2-3, тогда pin1=low pin3=hi, тогда как только состояние изменится на противоположное (в даном примере на pin1=hi/pin3=low) то зажечь диод на 1 минуту.
- если во время этой минуты опять срабатывает переключатель, сбрасываем время диода на начало (опять добавится минуту). если переключатель не сработал то через минуту после последнего срабатывания переключателя диод погаснет.
- также нужно учесть сброс mils через `50 дней чтоб диод не горел 50 дней
если сделать одну тактильную кнопку то я примерно понимаю какой должен быть код, но вот как обрабатывать переключатель, непредставляю. возможно это как то закодить на ардуино ?
если сделать одну тактильную кнопку то я примерно понимаю какой должен быть код, но вот как обрабатывать переключатель, непредставляю. возможно это как то закодить на ардуино ?
Представьте этот переключатель в виде двух кнопок. Смысл тот же - два пина, на которых меняется логический уровень. Единственное отличие переключателя от двух кнопок - на пинах не может быть одновременно два одинаковых уровня (при физической исправности переключателя и проводов).
НО, как ниже сказал andriano, в этом нет смысла. Достаточно использовать один из двух крайних контактов переключателя (например pin1).
1. То, что у Вас в "дано" немножко неоптимально. Традиционно подтяжка используется "вверх" и в Ардуино только такая встроенная подтяжка. Т.е. при замыкании кнопки на соответствующем выводе LOW, а не HIGH. Т.е. либо Вы меняете логику работы на противоположную, либо понадобятся дополнительные детали.
2. По сути у Вас две контактные группы и два входа реализуют лишь два состояния. Это явно избыточно. Целесообразнее использовать единственную контактную группу и единственный вход. Этого вполне достаточно для Ваших хотелок.
3. В свете 2 код должен быть в точности такой же, как и для одиночной кнопки.
andriano
я и понял п2 и нет. в том плане что переключатель трех выводной и мы можем реагировать на него в обоих положениях. т.е. диод может гореть как и в верхнем положении переключателя так и в нижнем. в случае же использования простой кнопки (он же выключатель) диод будет гореть только в нижнем положении выключателя - что мне не приемлимо. тк. выключатель придется переводить в исходное положение (т.е. 2 переключения вместого одного в случае с переключателем). если я не прав поправьте плиз меня?
вот я подумал и набросал код. пока что в случае c pull down. мне так легче разобраться. если все правильно подумаем как перевести в pull up :)
код написан с учетом того что - всё что не 0 и не false является true. если это не так в ардуино плиз подскажите как красиво переделать. и вообще плиз посмотрите на мой код как еще можно больше его упростить и/или облагародить?
только про 50 дней пока не придумал как учитывать :\
alexbmd, из исходного сообщения я понял, что светодиод должен загораться по любому изменению состояния переключателя и гореть в течение минуты с последнего изменения. Это так?
Если так, то абсолютно безразлично, где там LOW, а где HIGH, т.к. прибор должен реагировать исключительно на переключения, безразлично из какого состояния в какое.
если сделать одну тактильную кнопку то я примерно понимаю какой должен быть код, но вот как обрабатывать переключатель, непредставляю. возможно это как то закодить на ардуино ?
Считайте, что у вас переключатель это кнопка с фиксацией и все. Дребезг присутсвует и в "кнопке с фиксацией".
А так все тоже самое скетч здесь https://yadi.sk/d/WKaKvxrX3APTwN
Головной файл выкладываю для просмотра .
Если так, то абсолютно безразлично, где там LOW, а где HIGH, т.к. прибор должен реагировать исключительно на переключения, безразлично из какого состояния в какое.
да это так. немогли бы вы подсказать /подправить мой код/ как это реализовать. у меня в голове только на включение "работают" мозги :)
alexbmd, Вам не нужно считывать оба пина переключателя (pin1 и pin3). Достаточно считать только один из них (любой, например pin1). Зачем считывать воторй пин (например pin3), если и так известно, что его состояние всегда противоположное первому пину?
да это так. немогли бы вы подсказать /подправить мой код/ как это реализовать. у меня в голове только на включение "работают" мозги :)
1. Объявляете глобальную перемиенную для хранения состояния пина (строго говоря, еще одну - для времени).
2. Заносите в нее состояние пина в setup().
3. В loop() читаете состояние пина. Если изменилось:
3.1. Зажечь светодиод.
3.2. Запомеить в той же переменной новое состояние.
3.3. Запомнить текущее время (во второй переменной).
4. Проверить, не пора ли выключать светодиод.
Самое главное, алгоритм абсолютно нечувствителен к тому, где LOW, а где HIGH, и порядок действий в п.3 не зависит от того, включен ли светодиод.
andriano - сейчас посмотрю ваш алгоритм, а пока улучшил свой
qwone "Дребезг присутсвует" - а так ?
andriano
если я правильно понял ваш алгоритм он очень близок к моему ?
qwone "Дребезг присутсвует" - а так ?
Вы напоминаете мне чукчу из анекдота
Как борятся с дребезгом. Ждут пока изменится уровень, потом пауза на дребезг и уже снимают уровень. А у вас все наоборот , сначало снимаете уровень, а потом ждете.
qwone
[не обращайте внимание на сек, мсек и примем что скетчи у нас делают одно и тоже кроме способа зажигания и проверки дребезга]
да в моем случе мы сразу выполняем необходимое действие по нажатию кнопки, но тут же защищаем себя от дребезга, т.е. диод зажгется сразу на N секунде [время нажатия кнопки]. а второй раз мы его сможем зажечь только на N+5 секунде.
в вашем же примере мы зажигаем диод на N+5 секунде. т.е. при прочих равных в вашем варианте диод загорится на 5 секунд позже чем у меня и всё остальное одинаково.
и теперь главный вопрос - в чем выигрыш [чем лучше] зажигать на 5 секунд позже ? когда все остальное у нас одинаково
alexbmd, я не хочу доказывать вам что-то. Я не хочу быть вам бесплатным репетитором. Работает ваша программа, вас она устраивает. Меня это устраивает. А то что мой скетч зажигает на 5 минут позже, то скорее вы (1) не так собрали схему, (2) не так настроили программу и т д. И просвещать как и почему , на это у меня нет времени.
qwone
так схемы програмы и прочее у нас одинаково (для простоты понимания) разница только в коде дребезга.
исходя из вашего кода вы производите действие только после 5. && millis() - past_2 >= 5
и я не осуждал и не спорил с вами а только спросил - чем это лучше ? что мы не сразу стартуем (как у меня) а с задержкой?
Ну а вдруг на пине помеха, короткий импульс меньше нажатия. По вашему коду будет подсчет, а у меня игнор. Для маленьких программ это не критично. А вот ловить глюки в большом и сложном тяжеловато. Вы заметили, что я пытаюсь создавать классы в подключаемых файлах. Это упрощает отладку программы.
разница только в коде дребезга.
не в коде проблема, а в ясной формулировке алгоритма фильтра дребезга.
"если фильтр дребезга неактивен"
фильтр программный или железный и что значит неактивен ?
если мы говорим о программном то что в моем коде что у qwone и джае в велосипеде он всегда активен (для того они и были рождены), поту неясна формулировка
Клапауций не захотел отвечать, ну да ладно. прито что логика во всех трех случаях (из кода выше, из кода qwone,и из велосипеда) абсолютно одинаково. о какой ясной формулировке говорилось :)
qwone andriano спасибо за наводку.
а есть элегантное решение/хитрость победить сброс millis при переполнении ?
Удален неуместный политизированный комментарий.
Модератор
А тут я просто хамил, а модератор, редиска, стер.
а есть элегантное решение/хитрость победить сброс millis при переполнении ?
Есть элегантное решение его (сброс) не замечать (см. blink without delay).
andriano
если я правильно понял в случае unsigned он не будет уходить в exception когда вычетаемое больше а коректно считает, вы это имели ввиду ? нет компилятора сейчас под рукой.
а то я во избежание exception дополнительные проверки нагородил а оказывается если я правильно понял все просто :)
alexbmd, unsigned тут ни при чем. Просто арифметические операции нужно записывать инвариантно относительно потери старшего разряда при переполнении. Т.е. если между двумя отсчетами счетчика возникло переполнение, чтобы оно было скомпенсировано последующей арифметической операцией.
andriano
что значит инвариантно ?
я в компиляторе с++ (ардуины нету пока) провел вычетание (такое же как обычно когда вычетаемое меньше 60000-59990) но когда вычетаемое больше (5-6550 а-ля переполнение) и получил правильный ответ а не отрицательное число или exception как я предпологал до этого. если также в ардуино то проблемма решена :)
alexbmd, так компилятор-то один и тот же. Да и двоичная арифметика тоже одна и та же. Так что чему удивляться?
ну лучше уточнить чем потом не понимать где проблемма :)
спасибо за помощь
ну лучше уточнить чем потом не понимать где проблемма :)
в ДНК проблема