Кнопки нажимаются в правильном порядке

Я пытаюсь найти лучший способ сделать это, в настоящее время использую кучу запутанных операторов if, которые работают. У меня есть ИК-датчик и три кнопки, которые нужно активировать в правильном порядке. Каждый датчик/кнопка активирует светодиоды и звуковые эффекты. Во-первых, когда датчик 1 становится ВЫСОКИМ, можно кратковременно нажать кнопку 1, затем кнопку 2, затем кнопку 3. Если датчик 1 НИЗКИЙ, то при нажатии кнопок ничего не должно происходить. Когда датчик 1 ВЫСОКИЙ, кнопки должны быть нажаты в правильном порядке для прохождения последовательности. Когда датчик 1 возвращается к НИЗКОМУ, он должен сбросить все и разрешить повторный запуск последовательности, когда ВЫСОКИЙ. Должен ли я искать переключатели регистра для этого?

Спасибо

Джейсон

, 👍-1

Обсуждение

что должно произойти, если кнопки нажаты в неправильном порядке?, @Juraj

Если датчик 1 НИЗКИЙ, то при нажатии кнопок ничего не должно происходить. Когда датчик 1 ВЫСОКИЙ, кнопки следует нажимать в правильном порядке, чтобы выполнить последовательность., @Jason8899

что должно произойти, когда состояние датчика становится низким на полпути к последовательности кнопок? .... пожалуйста, добавьте описание к вашему вопросу ... НЕ пишите комментарий, @jsotola

Должен ли я посмотреть на переключатели case для этого? ... вы можете, если хотите... блок switch/case эквивалентен if else if else if... .... это действительно единственный вопрос, который вы хотите задать?, @jsotola

и некоторые указатели, чтобы научиться кодировать это. Я все еще учусь. Благодарность, @Jason8899


1 ответ


1

Это классическое приложение для конечного автомата, в котором вы отслеживаете, где в данный момент находится ваш процесс в последовательности событий, которые должны произойти. «Состояние» — это просто числовая переменная, значение которой вы меняете всякий раз, когда происходит важное событие.

Вы, вероятно, назначите 0 — исходное состояние, ожидание события (или первого события); 1 - датчик высокий, 2 - кнопка-1 стала высокой, 3 - кнопка-1 стала низкой; ... и т.д.

Всегда полезно набросать конечный автомат на бумаге, нарисовав круг для каждого состояния и стрелки от каждого состояния «x» к тому, каким должно быть следующее состояние, если событие «y» происходит в состоянии «x». . Событиями являются датчики и кнопки, которые переходят в ВЫСОКИЙ или НИЗКИЙ уровень. В определенном состоянии отсутствие стрелки для какого-либо события означает, что вы хотите игнорировать это событие, пока находитесь в этом состоянии.

После того как вы нарисовали карту, вы можете закодировать конечный автомат. Обычный способ кодирования — блок switch-case, по одному case на определенное состояние. Внутри каждого блока case вы тестируете только те события, для которых есть стрелка, ведущая из одного состояния в другое.

При добавлении новых условий (например, "Что должно произойти, если датчик перейдет в состояние низкого уровня после нажатия кнопки 1?"), switch-case логику будет намного проще изменить, чем если бы вы использовали сложный набор операторов if-then. И вы будете добавлять новые условия & удаляя или исправляя неправильные, по мере того, как вы обнаружите, как устройство выходит из строя или люди делают то, чего вы не ожидали. (Спросите меня, откуда я это знаю! :-)

Было бы очень полезно иметь возможность вернуться к карте состояния, чтобы визуализировать, что должно (или не должно) происходить и что нужно изменить (на карте), чтобы добиться такого поведения. На обновленной карте обычно легко увидеть, какой код нужно добавить, удалить или исправить в блоке switch-case.

,

+1 для конечного автомата. Для получения подробной информации о том, как реализовать это в коде, я обычно отсылаю людей к Majenko [учебник по конечной машине] (https://majenko.co.uk/blog/finite-state-machine), который я нахожу довольно хорошим., @Edgar Bonet