Проект с кнопкой и светодиодами
- Войдите на сайт для отправки комментариев
Втр, 01/03/2016 - 15:27
Элементы проекта
- 3 светодиода
- arduino uno
- кнопка
Задача:
1. Первое нажатие кнопки > на 10 сек включается led1 > постоянно мигает led2
2. Второе нажатие кнопки > на 10 сек включается led3 > постоянно горит led2
Вопрос:
- некоректно работает кнопка (может срабатывать с первого раза а может и с третего а может и с пятого)
- как сохранить состояние led2 после перепадов напряжения?
const int buttonPin = 2; const int ledPin1 = 8; const int ledPin2 = 7; const int ledPin3 = 4; void setup(){ pinMode(ledPin1, OUTPUT); pinMode(ledPin2, OUTPUT); pinMode(ledPin3, OUTPUT); pinMode(buttonPin, INPUT); } void loop(){ digitalRead(buttonPin); delay(20); while(!digitalRead(buttonPin)){} delay(20); digitalWrite(ledPin1, HIGH); delay(500); digitalWrite(ledPin1, LOW); digitalWrite(ledPin2, HIGH); while(digitalRead(buttonPin)){} delay(20); do { digitalWrite(ledPin2, HIGH); delay(500); digitalWrite(ledPin2, LOW); delay(500); } while(!digitalRead(buttonPin)); delay(20); digitalWrite(ledPin3, HIGH); delay(500); digitalWrite(ledPin3, LOW); while (digitalRead(buttonPin)){} delay(20); digitalWrite(ledPin2, HIGH); }
Вопрос:
- некоректно работает кнопка (может срабатывать с первого раза а может и с третего а может и с пятого)
Разве это вопрос? Это утверждение.
Правильно делает, что так работает. Если Ваше нажатие пришлось на "delay()" то оно будет проигнорировано. Именно это Вы и наблюдаете.
- как сохранить состояние led2 после перепадов напряжения?
Что Вы понимаете под "перепадами" - выключение и включение вновь? Если так, то пишите в постоянную память (EEPROM) (см. https://www.arduino.cc/en/Reference/EEPROM )
Разве это вопрос? Это утверждение.
Правильно делает, что так работает. Если Ваше нажатие пришлось на "delay()" то оно будет проигнорировано. Именно это Вы и наблюдаете.
И как подскажете с этим боротся? спасибо
Что Вы понимаете под "перепадами" - выключение и включение вновь? Если так, то пишите в постоянную память (EEPROM) (см. https://www.arduino.cc/en/Reference/EEPROM )
да выключение и включение вновь.
The page "" doesn't exist.
И как подскажете с этим боротся? спасибо
Вариантов много. Можно избавиться от делэев, а можно посадить кнопку на прерывание и тогда она и при делэе нормально срабатывать будет.
The page "" doesn't exist.
Сорри, конечно, но привыкайте смотреть на линки - тут часто какой-нибудь дебильный проблем в линку затешется. Достаточно его удалить. Вот и в данном случае - пробел в конце :(
https://www.arduino.cc/en/Reference/EEPROM
Спасибо за delay. Я просто начитался что есть дребежание контактов и натыкал delay.
Все тот же проэкт
Разобрался как записать и прочитать байт с eeprom но не понятно как записать в eeprom постоянное свечение или мигание светодиода и востановить его состояние после вкл/выкл платы. Буду очень признателен за подсказки. СПС
и всt таки не понимаю как реализовать. Я уже сделал переменную которой присваивается определенное значение в зависимости от состояния клапана. А вот как записать это значение в EEPROM и считать его после отключения и включения питания... ?
тебе не состояние клапана нужно запоминать, а булевое значение переменной, которую ты меняешь кнопкой и при её изменении пишешь в EEPROM.
состояние клапана, поддерживаешь равным переменной, считанной из EEPROM
выбрось нахрен циклы и делаи из кода, если сложно самому, то пользуйся готовым класс титановый велосипед для тактовой кнопки.
Та пускай будут эти дилеи они мне не мешают.
Мне важнее всего востановить последнее состояние механизма при отключении.
Вот тут у меня просто затык!!! Если не сложно хоть примерчик приблизительный. Спасибо.
и Энгельс, и Троцкий, и даже товарищ Сталин согласны, что делеи с кнопками не дружат...
Та пускай будут эти дилеи они мне не мешают.
они тебе мешают.
Мне важнее всего востановить последнее состояние механизма при отключении.
Вот тут у меня просто затык!!! Если не сложно хоть примерчик приблизительный. Спасибо.
блин. куда уж проще.
блин. куда уж проще.
Да но если светодиод мигает то как это мигание загнать в значение которое нужно подставлять вместо pin?
Как записать в EEPROM мигание?
Подкоректировал
блин. куда уж проще.
Да но если светодиод мигает то как это мигание загнать в значение которое нужно подставлять вместо pin?
Как записать в EEPROM мигание?
включить мозги и прекратить пороть чушь.
*хрен поймёшь, то клапан у него открывается кнопкой, то светодиод неуправляемо мигает.
Это не чушь все предельно ясно :)
Мне нужно как то запомнить последнее состояние светодиода. Записать его в EEPROM и потом при перезагрузке контролера прочитать из EEPROM последнее записаное состояние светодиода и запустить (или мигание или постоянное свечение.)
Не вижу бреда:)
Постоянное свечение светодиода еще как то понимаю как записать (и то не до конца), а вот мигание никак не пойму.
Постоянное свечение светодиода еще как то понимаю как записать (и то не до конца),
тебе русский язык родной или ты, просто, невнимательный - сосредоточься #7 #10
а вот мигание никак не пойму.
именно это - бред.
Хорошо упрощу вопрос )
Как в переменную можно записать мигание светодиода?
Хорошо упрощу вопрос )
Как в переменную можно записать мигание светодиода?
Вы сами себя запутали. Рекомендую сделать паузу, погулять, например. Или выспаться.
Светодиод мигает не сам по себе, а в соответствии с заложенным в микроконтроллер алгоритмом. Именно алгоритм хранит состояние устройства - что именно нужно делать со светодиодом. Т.е. схематично должно быть так:
* Объявляем переменную для хранения информации о состоянии устройства:
* При загрузке, т.е в функции сетап читаем значение из EEPROM в переменную status
* В основном цикле программы, т.е в фунции луп делаем две вещи:
1. Организуем мигание или горение светодиода в зависимости от значения в переменной status
2. Проверяем нажатие клавиши, при нажатии присваиваем переменной status новое значение и сразу же сохраняем это значение в EEPROM
* Объявляем переменную для хранения информации о состоянии устройства:
скорее всего
* Объявляем переменную для хранения информации о состоянии устройства:
скорее всего
У ТС задействовано целых три светодиода, что как-бы намекает, на то, что состояний может потребоваться больше чем два.
* Объявляем переменную для хранения информации о состоянии устройства:
скорее всего
У ТС задействовано целых три светодиода, что как-бы намекает, на то, что состояний может потребоваться больше чем два.
ТС и тебя запутал... думаю, это заразно.
Как записать в EEPROM мигание?
Тщательно изучение даташита показало, что никак. Байты записать можно, один или больше - на сколько EEPROMа хватит, и мигание туда не записывается. Про мигание в даташите вообще ни разу не упоминается.
Придётся с этим жить.
* Объявляем переменную для хранения информации о состоянии устройства:
скорее всего
У ТС задействовано целых три светодиода, что как-бы намекает, на то, что состояний может потребоваться больше чем два.
ТС и тебя запутал... думаю, это заразно.
Посмотрите на самый первый пост. Требуемое поведение описывается пятью состояниями:
а1 - led1 выкл, led2 выкл, led3 выкл
а2 - led1 горит, led2 мигает, led3 выкл
а3 - led1 выкл, led2 мигает, led3 выкл
а4 - led1 выкл, led2 горит, led3 горит
а5 - led1 выкл, led2 горит, led3 выкл
Переходы:
а1 (начальное)
а1 --> а2 (нажатие кнопки)
а2 --> а3 (по таймеру 10 сек)
а2 --> а4 (нажатие кнопки)
а3 --> а4 (нажатие кнопки)
а4 --> а5 (по таймеру 10 сек)
а5 (финальное)
Так что ни изначальная задача, ни её обсуждение на форуме не предполагало автомата с двумя состояниями.
Посмотрите на самый первый пост. Требуемое поведение описывается пятью состояниями:
а1 - led1 выкл, led2 выкл, led3 выкл
а2 - led1 горит, led2 мигает, led3 выкл
а3 - led1 выкл, led2 мигает, led3 выкл
а4 - led1 выкл, led2 горит, led3 горит
а5 - led1 выкл, led2 горит, led3 выкл
ок. я же говорил, что заразно - теперь вместе с ТС думай, как в EEPROM записать мигание. :D
*помнишь анекдот про сгоревшую лампочку? - то потухнет, то погаснет, сука.
ок. я же говорил, что заразно - теперь вместе с ТС думай, как в EEPROM записать мигание. :D
*помнишь анекдот про сгоревшую лампочку? - то потухнет, то погаснет, сука.
Не понимаю я этого сарказма. У меня проблем с программированием Ардуино нет, хоть с EEPROM, хоть без.
В каком направлении двигаться ТС, я написал в 16-м сообщении.
Не понимаю я этого сарказма. У меня проблем с программированием Ардуино нет, хоть с EEPROM, хоть без.
и, я не понимаю, зачем делать один int из двух и более boolean
и, я не понимаю, зачем делать один int из двух и более boolean
Для каждого светодиода свой boolean что-ли?
Ну так int более универсален и ближе к тому что называют конечным автоматом.
Как с помоющью логических переменных записать и сохранить состояния вида:
* при нажатии на кнопку светодиод горит
* при повторном нажатии светодиод быстро мигает (0,5 сек. на состояние)
* при последующем нажатии светодитод меделенно мигает (2 сек. на состояние)
* при последующем нажатии светодиод выключается
Тем более что даже в обсуждаемом примере у каждого светодиода не два, а три состояния (выключен, горит, мигает), как с помощью логических переменных описать каждое из состояний {а1, а2, а3, а4, а5} из поста 21 ?
Для каждого светодиода свой boolean что-ли?
да. ты экономишь EEPROM?
Как с помоющью логических переменных записать и сохранить состояния вида:
* при нажатии на кнопку светодиод горит
* при повторном нажатии светодиод быстро мигает (0,5 сек. на состояние)
* при последующем нажатии светодитод меделенно мигает (2 сек. на состояние)
* при последующем нажатии светодиод выключается
это не состояния, а условия, которые прописаны в коде - после считывания из EEPROM состояний светодиодов код обрабатывает ифы.
Тем более что даже в обсуждаемом примере у каждого светодиода не два, а три состояния (выключен, горит, мигает), как с помощью логических переменных описать каждое из состояний {а1, а2, а3, а4, а5} из поста 21 ?
сначала: у светодиода два состояния горит&погашен. во время записи в EEPROM возможна запись одного из этих состояний.
а1 - led1 выкл, led2 выкл, led3 выкл
а2 - led1 горит, led2 мигает, led3 выкл
а3 - led1 выкл, led2 мигает, led3 выкл
а4 - led1 выкл, led2 горит, led3 горит
а5 - led1 выкл, led2 горит, led3 выкл
я сказал, что это заразно, т.к.:
led2 мигает - является производной базовых состояний выкл&горит
попытка слить булевые переменные в некую общую инт ведёт к потере информации о состоянии автомата во время записи в EEPROM. т.к. состояние led2 мигает не несёт информации о логическом состоянии пина светодиода.
нужно:
Для каждого светодиода свой boolean что-ли?
да. ты экономишь EEPROM?
Ни в коем случае. Нагромождение из нескольких булевых переменных усложняет код. Без выигрыша хоть в чем-нибудь.
Как с помоющью логических переменных записать и сохранить состояния вида:
* при нажатии на кнопку светодиод горит
* при повторном нажатии светодиод быстро мигает (0,5 сек. на состояние)
* при последующем нажатии светодитод меделенно мигает (2 сек. на состояние)
* при последующем нажатии светодиод выключается
это не состояния, а условия, которые прописаны в коде - после считывания из EEPROM состояний светодиодов код обрабатывает ифы.
Чтобы внести ясность. Тут слово "состояние" мною использовано в двух разных значениях:
- состояние абстрактного конечного автомата, реализуемого алгоритмом
- состояние мигающего светодиода (включен / выключен)
Виноват, если запутал. Тем не менее Ваш ответ понять не смог.
я сказал, что это заразно, т.к.:
led2 мигает - является производной базовых состояний выкл&горит
попытка слить булевые переменные в некую общую инт ведёт к потере информации о состоянии автомата во время записи в EEPROM. т.к. состояние led2 мигает не несёт информации о логическом состоянии пина светодиода.
А, так вот оно как. Вопрос в том, что считать "состоянием автомата" и с какой точностью восстанавливать его состояние. У меня сложилось впечатление, что ТС интересовал вопрос как сохранить в памяти "мигание" и не более того. Сохранять текущее состояние пина отвечающего за мигание в таком случае излишне.
Врочем, это уже дело ТС. Подход к вопросу сохранения состояний это не меняет.
....
....
...
У меня сложилось впечатление, что ТС интересовал вопрос как сохранить в памяти "мигание" и не более того. Сохранять текущее состояние пина отвечающего за мигание в таком случае излишне.
Вы правы самый главный вопрос был сохранить в EEPROM и востановить из EEPROM мигание светодиода. Сегодня попробую вашу методику с status. спасибо