Память для ввода данных?

Когда кнопка нажата, Arduino может быть чем-то занят (например, рисованием экрана). Когда у Arduino наконец появится время проверить ввод кнопки, пользователь, возможно, уже отпустит ее.

Есть ли способ сохранить входные данные до тех пор, пока Arduino не успеет их проверить? Было бы здорово, если бы существовал ic, который мог бы позаботиться об этом.

Спасибо за помощь!

, 👍1

Обсуждение

Это называется *прерывание*., @Majenko

Я в большинстве случаев, это не проблема. Люди немного медлительны по сравнению с Arduino, работающим на частоте 16 МГц. Нажатие кнопки занимает от десятков до сотен миллисекунд. Вечность для процессора. В качестве альтернативы вы можете добавить RC-схему к кнопке. Это имеет дополнительное преимущество, заключающееся в том, что сигнал кнопки также отключается., @Gerben

Просто УЛОВКА, но похоже, что вы используете функцию delay ();, которая блокирует arduino, не позволяя ему делать что-либо еще до завершения. Работайте с функцией millis(); ваш код будет неблокирующим., @Gil


3 ответа


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

0

Ответ на ваш прямой вопрос, есть ли IC для хранения входных данных, - да. Это называется триггером Set-Reset (или SR). Я не знаю, упакованы ли они отдельно в микросхему, но их действительно просто сделать с помощью пары перекрестно соединенных элементов NAND.

Но на самом деле это не совсем правильное решение вашей проблемы. Ваш код не должен быть настолько "занят", чтобы пропускать медленный ввод, такой как нажатие кнопки. Я процитировал "занят", потому что обычно вызовы функции delay (), а не вычисления, занимают процессор в течение любого большого промежутка времени, и следует избегать задержек (), если в вашем коде требуется выполнить более 1 действия.

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

,

0

Основное руководство при написании приложений для Arduino состоит в том, чтобы выполнять небольшой объем работы при каждом прохождении функции цикла, а затем выполнять немного больше при следующем проходе. Проверьте все ваши входные данные, выполните логику в ответ на эти входные данные, настройте unsigned long переменные без знака с будущими значениями millis (), проверьте эти значения, чтобы узнать, наступило ли будущее время, и повторите.

Не используйте функцию задержки(). Это смерть кооперативной системы, такой как Arduino. Когда ваш Arduino выполняет вызов delay(), все останавливается, пока не пройдет время задержки.

,

0

Есть ли способ сохранить входные данные до тех пор, пока Arduino не успеет их проверить?

Нет, нет никакого способа запомнить/буферизировать входные изменения в Arduino (вы могли бы использовать микросхему flipfop, как писал JRobert. Это может дать вам такую функциональность). Но есть прерывания, которые можно использовать с помощью контактов. Срабатывающее прерывание действительно прерывает выполнение основного кода и выполняет соответствующую ему процедуру ISR (Interrupt Service Routine), чтобы обработать причину прерывания, а затем возвращается для выполнения основного кода. Микроконтоллер имеет множество различных прерываний, каждое из которых связано со своим специальным оборудованием. Существуют прерывания для последовательного интерфейса, для SPI, I2C, а также некоторые из них, подключенные к внешним выводам прерывания или прерыванию PinChange (эти последние два могут быть использованы с вашей кнопкой). Таким образом, это не будет "хранить" входное изменение, но оно будет прерывать основной код, чтобы немедленно действовать в соответствии с входным изменением. Так что это другой принцип.

Если вы хотите привязать свою кнопку к прерыванию, вы можете просто остаться в фреймворке Arduino и использовать функцию attachInterrupt (). Для этого есть много учебных пособий в Интернете. Имейте в виду, что вы никогда не должны делать длинные вещи внутри ISR, и функции, такие как delay (), там не будут работать.


Тем не менее, скорее всего, на самом деле не нужно использовать прерывания с кнопками. Люди довольно медлительны, поэтому каждое нажатие кнопки будет длиться примерно 100 мс или дольше.

Теперь вы можете сказать, что ваш код делает вещи дольше, чем 100 мс. Но здесь кролик похоронен (дословный перевод немецкой поговорки, означающей "есть проблема"). Когда вы начинаете с Arduino, вы делаете много блокирующих вещей, таких как delay() или blocking while loops. Они часто очень просты в реализации, но ничего больше не будет работать во время этих вещей.

Вместо этого вы должны разделить свои действия на мелкие части. Когда пришло время что-то делать, вы делаете эту маленькую часть и быстро выходите. Это позволяет другому коду работать между ними. Хорошим примером является пример BlinkWithoutDelay. Обычный пример blink использует delay(), который блокирует все остальное. Вместо этого вы можете использовать функцию millis() в качестве часов и принимать меры только тогда, когда пришло время сделать это, в противном случае для дальнейшего ускорения. Так же, как ты готовишь пиццу в духовке. Вы не будете сидеть перед духовкой, ожидая, пока пицца будет готова. Вы бы занялись чем-нибудь другим и регулярно смотрели на часы, если пришло время выносить пиццу.

Вы не показали свой код, поэтому мы не можем дать вам больше советов в этом направлении. Но вы можете найти много учебников об этом, если вы ищете такие термины, как Arduino blink без задержки или Arduino millis tutorial.

,