2015-04-22 5 views
0

Функция программы, которую я пишу, заключается в потоке входящих аналоговых данных с датчика на программу на моем компьютере через USB-порт. Для немного удовольствия, я решил добавить кнопку в программу, которая включает/выключает лампу. Лампа будет подключена к реле, которое подключается к ардуину. Я знаю, как это сделать, но я хочу знать, прервет ли это передачу данных сенсора?Arduino Uno - переключатель освещения

Я получаю текущее состояние света (HIGH (1) или LOW (0)) от arduino при нажатии кнопки, а затем записывается в arduino (HIGH (1) или LOW (0)) в зависимости на текущем состоянии. У меня есть 5-секундная задержка между каждым циклом программы arduino по причинам, связанным с выходом датчика; однако, я думаю, что мне придется изменить это, чтобы при нажатии кнопки он не пропустил цикл arduino, или это невозможно?

Я думал, что где-то я читал, что вы не можете передавать/получать потоковые данные на одной и той же последовательной линии ... в этом случае мне понадобится Mega.

ответ

2

Вы должны помнить и думать об Arduino как о единственном резьбовом устройстве. Пока он делает ничего он не может ничего сделать. Период! Однако в отношении последовательного порта буфер по-прежнему будет принимать входящие данные на RX, однако, если ситуация с переполнением возникает во время блокировки, управление невозможно.

Смотрите следующий взят непосредственно из Arduino ссылку

Некоторых вещей действительно идут на в то время как функция задержки() управляет чипом ATmega Однако, поскольку функция задержки не отключает прерывания. Запись последовательной связи, которая появляется на выводе RX, записывается, значения PWM (analogWrite) и состояния выводов поддерживаются, а прерывания будут работать так, как должны. Reference

Теперь, говоря, что, когда вы настраиваете задержку до 5 секунд между петлями (delay(5000)) вы, по сути блокирует его делать что-нибудь еще почти полную остановку.

Рамка Arduino предоставляет счетчик (millis()), который в основном работает с момента загрузки в течение примерно 50 дней с шагом в 1 миллисекунду. См Arduino - millis()

В приложении вы должны определить (вспомнить), что петля вы должны были бежать &, когда указанный цикл кончил так, чтобы не позволить другому циклу работать, пока millis() счетчик не определенное количества больше, чем ваш кол , (Не забудьте определить количество как long)

Тогда что вы делаете, это переместить петлю в отдельные функции, которые будут выполнять только если if оператор возвращает истину ...

, например ...

long interval = 5000; // Define interval outside of the main loop 
long previousCount = 0; // Used to store milli count when finished 
int loopPosition = 1; 

void loop() 
{ 
    if ((long)millis() - previousCount >= 5000) 
     // This if statement will only return true every 5 seconds (5000ms) 
    { 
     if (loopPosition == 1) 
      { 
      function_One(); 
      previousCount = millis(); // Redefine previousCount to now 
      loopPosition++; // Increment loop position 
      } 

     else if (loopPosition == 2) 
      { 
      function_Two(); 
      previousCount = millis(); 
      loopPosition--; // Decrement loop position 
      } 

    } 

// Do Anything Here You Want 
// - While ever the if statement above returns false 
// the loop will move to this without hesitation so 
// you can do things like monitor a pin low/high scenario.  

} 

void function_One() 
{ 
    // Do Your First Loop 
} 

void function_Two() 
{ 
    // Do Your Second Loop 
} 

Вышеуказанная информация остановит любую задержку, которую вы используете, от блокировки, и до некоторой степени, почти задержите устаревшую, если она будет реализована правильно при правильных сценариях.

Что касается вашего последовательного комментария данных, как я сказал в верхней части этой статьи, Arduino может только делать одну вещь за раз. Передача и прием при точно то же время невозможно даже с Mega.Говоря, что доска, подобная «Uno», например, способна только на один последовательный интерфейс, где «Mega» способен на четыре.

Удачи ....
NB- Для начинающего, читающего это, следующий учебник/пример охватывает то, что у меня выше, на простых условиях и является отличным строительным блоком для дальнейшей удивительности! Arduino - Blink Without Delay

+0

Большое спасибо, это объясняет многое очень четко. Мой вопрос о последующей деятельности - это то, что является целью Mega, имеющей четыре аппаратных последовательных порта? – wellington

+0

Не используя все четыре себя, я не говорю по опыту, однако наилучшим будет использование четырех отдельных последовательных интерфейсов ... Я добавил объяснение относительно последовательного буфера, который вы можете использовать. Просто будьте осторожны, поскольку он содержит только 64 байта – RussDunn