Несколько функций одновременно в Arduino - PullRequest
1 голос
/ 02 февраля 2012

Я работаю над эскизом Arduino, где создал два светофора, один для обычного движения и один для пешеходов. Я создал функцию для каждого из этих двух источников света, которая проходит по циклу (например: желтеет, подождите 20 секунд, затем загорится красным и снова подождет). Они называются aTrafficlight () и pTrafficlight, где a - это нормальное освещение, а p - для пешеходов. В моей функции loop () я установил digitalRead для кнопки. Когда эта кнопка нажата, светофор должен циклически проходить по своим петлям по одному (таким образом, нормальный свет становится красным, pTrafficlight немного ждет, затем становится зеленым, мигает несколько раз, становится красным, ждет и заканчивает цикл, поэтому переходит в исходное состояние.)

Это все работает. Но теперь я хочу добавить зуммер. Этот зуммер должен подавать звуковой сигнал один раз в секунду, когда индикатор pTraffic горит красным, один раз в десятую секунду, когда он зеленый, и два раза в две секунды, когда он мигает зеленым.

Здесь я столкнулся с несколькими проблемами: - При ожидании в исходном состоянии (кнопка не нажата) кажется, что я иногда могу нажать кнопку без реакции, потому что цикл все еще продолжается. Мне нужно выяснить, как избежать ожидания в цикле, когда buttonState == LOW. (Есть функция wait (int sec)) - Когда кнопка нажата, она циклически повторяется. Я мог бы просто написать какую-то петлю, в которой сигнал светофора бытует красным и звучит одновременно, но я бы предпочел, чтобы они были отделены друг от друга. - То же самое для двойных звуковых сигналов. Я не хочу, чтобы звуковой сигнал и мигание индикатора были одинаковыми для цикла, так как это сбивает с толку и затрудняет чтение и понимание кода.

Вот мой цикл ():

int buttonState = 0;

void loop(){
  buttonState = digitalRead(pButton);

  if(buttonState == LOW){
    vSet("red");
    pSet("green");

    // This is where I tried to create the sound.
    digitalWrite(pSound, HIGH);
    delay(10);
    digitalWrite(pSound, LOW);
    wait(1);
  } else {
    aTrafficlight();
    pTrafficlight();
  }
}

Есть ли способ решить мои проблемы с многопоточностью? Я попытался найти его на arduino.cc и в Google, но не могу найти способ, который достаточно хорошо понимаю, чтобы использовать его в моем существующем коде.

Если нет, у вас есть предложения получше?

Ответы [ 2 ]

3 голосов
/ 04 февраля 2012

Вам не нужно многопоточность.Вам нужно использовать таймеры, будь то с помощью прерываний (как писал Павел) или с помощью другого механизма, такого как библиотека Metro, который позволяет коду продолжать цикл во время работы таймера.См. Этот вопрос и ответ: Как я могу создать прерывания в C для Arduino

По совпадению, я недавно опубликовал некоторый материал как на автоматах, так и на Arduino, как ГансУпоминается Passant, и об альтернативах delay (), и с дополнительными ссылками, которые вы можете найти полезными.

0 голосов
/ 13 августа 2013

Вы можете использовать дизайн временных интервалов. Позвольте мне в общих чертах изложить это. Первый цикл кода, так что он всегда выдает задержку (1) и устанавливает счетчик mod 10 как:

 int stopWhen = -1;  // at startup
 // etc.
 x = (x+1)%10;       // every time loop execs

Тогда когда buttonState == LOW

 if (stopwWhen = -1)
 {
    stopWhen = x;
    // beep etc.
 }

Но на каждом цикле:

 // always exec this:
 if (stopWhen == x)
 {
    stopWhen = -1;
    // stop beeping.
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...