Добрый день! Смысл вложил такой: на сервопривод установлена дверь, когда она открыта gates.write (0) должен загореться зелёный светодиод, когда закрыта, то красный. Серво работает, но светодиоды не загораются (проблемы с условием). Пожалуйста, помогите сообразить с этим if-ом)
Ну и сам по себе код бессмысленный, т.е. вы на каждой итерации:
Сначала открываете ворота (0).
Потом закрываете (180).
А потом пытаетесь зажечь один из светодиодов.
Т.е. у вас, даже если пропишете условия корректно, никогда не загорится лампочка открытых ворот.
P.S.: и светодиоды надо через резисторы подключать, wokwi на это внимания не обращает и просто светит ими (если питание подать), в реальности же светодиод просто сгорит.
В общем, я пока сам только начал изучать тему. У меня вот так получилось.
Хотя, это тоже не совсем корректно, т.к. сервоприводы потребляют большой ток, а потому питать их напрямую от платы нежелательно (разве что один и совсем слабый).
Для хранения времени последнего открытия/закрытия “ворот”. Это вместо ‘delay’. Т.е. запоминаем последнее время переключения ворот и далее не выполняем следующее переключение (проверка в ‘loop’) пока не пройдёт какое-то время (в данном случае 2000ms).
Да ну!
В принципе можно написать программу еще сложнее, но возникает вопрос - а кто даёт команду на открытие ворот? Дед Семен или Вы? Если Вы, то кто Вам мешает вместе с подачей команды на открытие ворот включить или выключить светодиод? Не надо плодить сучностей, их и так выше крыши.
Так это ведь не совсем корректное поведение будет. Я привёл упрощённый пример под конкретную задачу. В реальной же ситуации с воротами надо будет:
Подать команду на открытие ворот. Светодиод оставить красным, т.к. ворота ещё не открыты.
Проконтролировать (через какие-то датчики) процесс открытия. Они могут секунд 15-20 открываться. Они могут и не открыться, т.к. кто-то/что-то механически помешает этому, т.к. мотор заклинит или ещё что-нибудь.
И только после того, как ворота реально откроются и проезд будет возможен, отключить красный светодиод и включить зелёный.
Ну т.е. индикация должна ориентироваться на реальное состояние, а не на предполагаемое.
Это упрощённый пример согласно изначальной задаче.
Ну и в целом суть не изменится. Просто сейчас там только два состояния, которые переключаются по таймеру. А в реальном управлении воротами переключение будет не по таймеру, а по сигналам с каких-то датчиков, ну и состояний побольше будет.
Хотя, если более чисто реализовывать, то да, надо вовсе убрать вызов ‘updateLeds’ из ‘switchGate’ и перенести его ‘loop’, т.е. чтобы включение/отключение светодиодов вообще никак не зависело от подачи команды на открытие/закрытие и ориентировалось именно на реальное состояние ворот.
Да хоть 100500 состояний. Каждое из них описываете … и всё.
И не надо жаловаться на “сложность программирования” или “непонимание Вашей душевной организации”". Не прокатит. Надо написать алгоритм и перевести его на выбранный язык программирования.
И, Вы не поверите, и всё…заработает.