Динамически переключаться между программами Arduino

Вопрос: У меня вопрос о том, как использовать механический переключатель для изменения программ в устройстве Arduino. В настоящее время я создаю беспроводное устройство фокуса, которое будет использовать xbee для подключения к другому устройству Arduino с потенциометром для бесшумного вращения сервопривода (программа 1). Тем не менее, я также хочу, чтобы опция подключала простую кнопку назад и

Вопрос:

У меня вопрос о том, как использовать механический переключатель для изменения программ в устройстве Arduino. В настоящее время я создаю беспроводное устройство фокуса, которое будет использовать xbee для подключения к другому устройству Arduino с потенциометром для бесшумного вращения сервопривода (программа 1). Тем не менее, я также хочу, чтобы опция подключала простую кнопку назад и вперед в основной блок (программа 2). Поэтому мне нужен способ переключения между двумя программами.

Я ищу самый элегантный способ сделать это. Оптимальным сценарием будет то, что после того, как кнопки будут вставлены в код, он автоматически переключится в режим кнопки (программа 2). Однако я не уверен, как это сделать.

Я бы предпочел механический переключатель, если последнее невозможно. Однако:

Я думал, что может быть возможно, что программа, которая ждет ввода, будет нажатием кнопки 1, которая затем переключится на программную логику программы 1, или кнопка 2 запускает программу 2.

Мне интересно узнать, обладают ли какие-либо из моих идей достоинством, и что является самым элегантным решением, которое вы можете придумать. Потому что я в тупике.

Лучший ответ:

Технически вы не можете иметь два эскиза на одной доске. Это не совсем другая программа.

Коммутатор автоматически:

Для такого подхода вам даже не требуется дополнительное оборудование. Просто включите нагрузочные резисторы на плате с помощью этого кода:

pinMode(pin, INPUT); // set pin to input digitalWrite(pin, HIGH); // turn on pullup resistors

Источник

Примечание: вам понадобится переключатель, который проводит электричество, когда он не будет нажат. Я не могу вспомнить аббревиатуру от верхней части головы.

С этим кодом все, что вам нужно сделать, это подключить один конец коммутатора к выходу Arduino по вашему выбору, а другой конец – к GND. Не добавляйте резистор к этой кнопке, так как Arduino делает это автоматически с помощью вышеуказанного кода. Затем, чтобы проверить, нажата ли она или нет, просто выполните стандартную digitalRead(pin); и он вернется:

  • HIGH если кнопка нажата или кнопка не подключена
  • LOW если кнопка не нажата, но она подключена

Поскольку два состояния имеют одинаковое возвращаемое значение, я бы рекомендовал переключать, когда обе кнопки возвращают HIGH. Если вы хотите быть уверены, что они отключены, вы можете захотеть убедиться, что они остаются нажатыми в течение двух секунд, а затем переключаться после этого, но это добавит латентность в ваш код.

Переход из одного состояния в другое:

Вам придется использовать вышеприведенный код, который я упомянул, и проверить, чтобы он подключился. Затем он будет выполнять код в зависимости от кнопок. Я написал код без излишеств ниже с delay(); для debouncing, чтобы добавить простоту. Если вы хотите сделать его более продвинутым, не стесняйтесь делать это, но у меня нет времени. Кроме того, существует небольшое переключение между режимами.

#define button1 2 #define button2 3 boolean isManual = false; void setup() { pinMode(button1, INPUT); digitalWrite(button1, HIGH); pinMode(button2, INPUT); digitalWrite(button2, HIGH); //Other setup code here! } void loop() { checkForChanges(); if (isManual == false) { //Do code here for manual buttons. If there a loop or a decently sized delay inside, call ‘checkForChanges’ and see if it still manual. If not, use ‘break;’ to escape loop/if statement } else { //Do code here for auto. If there a loop or a decently sized delay inside, call ‘checkForChanges’ and see if it still auto. If not, use ‘break;’ to escape loop/if statement } //Add any code you want executed regardless of if it manual or auto } void checkForChanges() { if (isManual == false) { if (digitalRead(button1) == LOW && digitalRead(button2) == LOW) { isManual = true; delay(200); //Crude debouncing; feel free to edit } } else { if (digitalRead(button1) == LOW && digitalRead(button2) == LOW) { isManual = true; delay(1000); //Crude debouncing; feel free to edit; you need some delay here even if there debouncing to make sure someone isn’t pushing both if (digitalRead(!(button1) == LOW && digitalRead(button2) == LOW)) { isManual = false; } } //Do one read of inputs. If } }

Оцените статью
Добавить комментарий