Код Arduino работает медленно при выполнении двух задач
Я хочу, чтобы вывод 11 выдавал прямоугольную волну один раз в 3 секунды
и хочу, чтобы вывод 12 действовал как переключатель для свечения встроенного светодиода вывода 13..
подключенный вывод 12 к GND с резистором 10 ком
Если я ввел только код переключателя, он работает быстро (светодиод включается мгновенно), но когда я ввел этот код (on на картинке), он запаздывает на 1 секунду, чтобы включить светодиод. почему?
А также, если я подключу контакты с 11 по 12, я предполагаю, что встроенный светодиод должен включаться и выключаться в соответствии с формой волны, исходящей от, но светодиод всегда низкий.
@yuvan m, 👍-2
Обсуждение1 ответ
По сути, код состоит из двух частей
- Прямоугольная волна с 3-секундной задержкой включена и 3-секундной задержкой выключена
- если вывод 12 высокий, то вывод 13 будет высоким, а если 12 низкий, то 13 тоже низкий (простой переключатель включения/выключения).
Второй блок кода выполняется только после завершения выполнения первого блока кода.
Вот почему, когда я подключил вывод 11 к 12, светодиод не светился, потому что, когда работал ВОЛНОВОЙ код (тот первый блок кода, который выдает прямоугольную волну), второй блок кода был тихим, следовательно, 12-й вывод все еще не стал переключателем.
И задержка, о которой я говорил, была вызвана этим, на самом деле задержка составляет 6 секунд. Потому что после того, как код переключения завершит свой запуск, Arduino потребуется целых шесть секунд, чтобы вернуться к коду переключения в цикле, потому что должен работать волновой сигнал с 3 секундами включения и 3 секундами выключения.
если вы хотите выполнять две задачи одновременно, вам необходимо изучить разделы millis() и protothreading.
Вы можете спросить меня, почему я был настолько глуп, чтобы задать подобный вопрос, потому что единственный язык программирования, который я когда-либо нюхал, - это python, и там я узнал, что python - это интерпретатор, и он выполняется построчно, поскольку код Arduino ide построен на c ++, который является компилятором.
Я думал, что код не будет выполняться построчно, вместо этого код будет скомпилирован, но теперь только я понял, что, несмотря на то, что файл скомпилирован, нет никаких шансов, что каждый код может быть запущен одновременно с фактическим значением компилятора.
Я бы посоветовал вам провести некоторое исследование функции задержки, чтобы вы поняли, почему она называется блокирующей функцией. Скомпилированный код также идет построчно. Если вы хотите сделать две вещи одновременно, вам нужны два потока. С помощью многозадачности можно создать впечатление, что вы делаете две вещи одновременно. У меня такое чувство, что ваш код работает так, как написано, он проверяет переключатель только каждые 6 секунд., @Gil
Да, брат, я понял, @yuvan m
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
используйте эту библиотеку https://www.arduino.cc/reference/en/libraries/arduino-timer/, @Antonio51
Или это https://playground.arduino.cc/Main/FlexiTimer2 / https://learn.adafruit.com/multi-tasking-the-arduino-part-2/timers, @Antonio51
Просто чтобы попытаться подтвердить, о чем именно вы спрашиваете: вы явно сказали ему что-то сделать, * отложить на 3 секунды *, сделать что-то еще, * отложить еще на 3 секунды * ... а теперь вы спрашиваете , почему произошла задержка ... ?, @brhans
Пожалуйста, никакого кода в качестве изображения. Скопируйте и вставьте код в виде текста в вопрос. Затем вы можете отформатировать is как код, чтобы он отображался правильно, @chrisl
Посмотрите на пример
BlinkWithoutDelay
, который поставляется с Arduino IDE, и на функциюmillis ()
. Вы можете найти много учебных пособий по этому вопросу в Интернете. В принципе, вы не должны откладывать на длительное время, так как arduino ничего не может сделать за это время. Используйте неблокирующий стиль кода, @chrisl@brhans братан, я имею в виду только часть переключателя, а не форму волны .. если я включу переключатель, задержка составит 1 секунду, @yuvan m
@chrisl на каком языке используется ard?? C или c++, @yuvan m
Код Arduino - это C ++, @chrisl
Ваш Arduino даже не будет считывать переключатель, пока задержка (задержки) не будут завершены. Таким образом, вы видите задержку до 6 секунд в каждом цикле, где он не считывает переключатель., @brhans
@brhans значит, сначала выполняется код мигания, а затем приходит только код переключения???, @yuvan m
Пожалуйста, убедитесь, что вы понимаете написанный вами код. Судя по вашим комментариям, это не так. Как говорит Крисл, посмотрите на пример blink без промедления и поймите его. Мы можем только давать вам подсказки, обучение - это ваша задача., @the busybee
@yuvanm: Повторите “_первое выполнение кода мигания, затем приходит только код переключения?_”: Действительно: Arduino выполняет по одному оператору за раз в том порядке, в котором они записаны. Все, что приходит после
delay (3000);
, выполняется только после того, как Arduino будет выполнен с задержкой., @Edgar Bonet@EdgarBonet спасибо, что понял, @yuvan m
Хорошо, все. Вы видите поле "ответ" под вопросом? Вот куда уходят ответы. Немного грустно, что это поле пусто (на момент написания этой статьи), и в качестве комментариев к этому вопросу дается множество полезных ответов. Это ** не форум **. Пожалуйста, не отвечайте в комментариях., @Nick Gammon
@yuvanm Если вы думаете, что понимаете, в чем проблема, вы даже можете ответить на свой собственный вопрос, тем самым помогая будущим людям, которые задаются тем же вопросом. Затем люди могут проголосовать за ваш ответ, показав, насколько он хорош., @Nick Gammon