Кнопки нажимаются в правильном порядке
Я пытаюсь найти лучший способ сделать это, в настоящее время использую кучу запутанных операторов if, которые работают. У меня есть ИК-датчик и три кнопки, которые нужно активировать в правильном порядке. Каждый датчик/кнопка активирует светодиоды и звуковые эффекты. Во-первых, когда датчик 1 становится ВЫСОКИМ, можно кратковременно нажать кнопку 1, затем кнопку 2, затем кнопку 3. Если датчик 1 НИЗКИЙ, то при нажатии кнопок ничего не должно происходить. Когда датчик 1 ВЫСОКИЙ, кнопки должны быть нажаты в правильном порядке для прохождения последовательности. Когда датчик 1 возвращается к НИЗКОМУ, он должен сбросить все и разрешить повторный запуск последовательности, когда ВЫСОКИЙ. Должен ли я искать переключатели регистра для этого?
Спасибо
Джейсон
@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
- Как объявить массив переменного размера (глобально)
- Программирование Arduino с использованием Python, а не C/C ++
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Как справиться с rollover millis()?
- Является ли использование malloc() и free() действительно плохой идеей для Arduino?
- Можно ли сделать несколько функций loop() с помощью Arduino Uno?
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- устаревшее преобразование из строковой константы в 'char*'
что должно произойти, если кнопки нажаты в неправильном порядке?, @Juraj
Если датчик 1 НИЗКИЙ, то при нажатии кнопок ничего не должно происходить. Когда датчик 1 ВЫСОКИЙ, кнопки следует нажимать в правильном порядке, чтобы выполнить последовательность., @Jason8899
что должно произойти, когда состояние датчика становится низким на полпути к последовательности кнопок? .... пожалуйста, добавьте описание к вашему вопросу ... НЕ пишите комментарий, @jsotola
Должен ли я посмотреть на переключатели case для этого?
... вы можете, если хотите... блок switch/case эквивалентенif else if else if...
.... это действительно единственный вопрос, который вы хотите задать?, @jsotolaи некоторые указатели, чтобы научиться кодировать это. Я все еще учусь. Благодарность, @Jason8899