Несколько одновременных функций в Arduino

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

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

Здесь я столкнулся с несколькими проблемами: - При ожидании в исходном состоянии (кнопка не нажата) кажется, что я иногда могу нажать кнопку без реакции, потому что цикл все еще продолжается. Мне нужно выяснить, как избежать ожидания в цикле, когда 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();
 }
}

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

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

2 ответа

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

Кстати, недавно я опубликовал некоторые материалы как на государственных машинах, так и на *******, как упоминал Ханс Пассант, а также на альтернативы задержке(), и с дополнительными ссылками, которые могут оказаться полезными.


Вы можете использовать дизайн временного фрагмента. Позвольте мне изложить это в общих чертах. Первый цикл кода, чтобы он всегда выдавал задержку (1) и устанавливал счетчик мод 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.
 }

licensed under cc by-sa 3.0 with attribution.