Ви не увійшли.
fastudio4, вашу задачу можна рішити таким підходом: https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
Це в принципі те саме, про що пише NoName. Тут: http://playground.arduino.cc/Code/SimpleTimer ця ідея реалізована. Вам лишається прив’язати по таймеру до shoot, shootStep і menu. stepper хай лишається, як є, оскільки там важливі точні інтервали часу.
привет, система Ардуино и его примеры "воспитывают" использование линейное выполнения кода
используйте что то типа state machine, в вашем случае это система семафором и состояний алгоритма.
и побольше спите, наверняка система работает на батарейке
пусть функции вызываются последовательно, без какого либо распараллеливания ( RTOS тут не нужен )
итого , на таймерах делайте обработку семафоров, а в цикле loop вызов нужных функций
см тут
http://www.instructables.com/id/Arduino … nterrupts/
или http://playground.arduino.cc/Code/Timer1
шаговики на таймер и PWM, используйте побольше аппаратных фич контроллера, и все будет хорошо )
Доброго времени суток! Очень нужна помощь или пинок в правильную сторону с примером.
Собрал слайдер (рельсу) для таймлапсов, но вот не могу никак понять как организовать правильный таймер для него.
Есть функция:
void shoot() {
digitalWrite(CAM, HIGH);
delay(200);
digitalWrite(CAM, LOW);
}
которая заставляет срабатывать затвор, и функция для шаговика:
void stepper(unsigned int Step, int Speed, boolean Set) {
digitalWrite(DIR, Set); // Направление вращения 0, 1
for (int i = 0; i < Step; i++){ // Шаги
digitalWrite(STEP, HIGH);
delayMicroseconds(Speed);
digitalWrite(STEP, LOW);
delayMicroseconds(Speed);
}
}
Соответственно запускающая при её вызове (stepper(20, 500, 0);).
Загвоздка заключается в том что сначала должен срабатывать затвор камеры, а уж через несколько секунд, когда камера устаканится сработает шаговик.
Пробовал через функцию отправлять в таймер:
void shootStep() {
shoot();
delay(2000);
stepper(20, 500, 0);
}
Но вот delay(2000); портит всю малину, так как ещё есть дисплей, на котором выводятся значения остатка кадров, интервал и прочая лабуда. Все параметры выставляются кнопками на приборе, которые как и кнопка старта программы работает не корректно из за этого прерывания.
пример таймера на millis() который я использовал в своих целях справляется:
unsigned long interval = 5000; //Интервал
unsigned long previousMillis = 0;
void loop(){
if ((unsigned long)(millis() - previousMillis) >= interval) {
previousMillis = millis();
shootStep();
}
menu();
}
Возможно я копаю не туда, и возможно решение лежит в работе с интервалом между камерой и шаговиком для устранения delay(2000);, но решить пока не могу. Если У Вас форумчане есть идеи или решения по этой теме, помогите пожалуйста.