#1 2015-07-30 19:27:02

fastudio4
Учасник
Зареєстрований: 2015-07-30
Повідомлень: 1

Таймер для двух функций или интервал внутри интервала???

Доброго времени суток! Очень нужна помощь или пинок в правильную сторону с примером.
Собрал слайдер (рельсу) для таймлапсов, но вот не могу никак понять как организовать правильный таймер для него.
Есть функция:
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);, но решить пока не могу. Если У Вас форумчане есть идеи или решения по этой теме, помогите пожалуйста.

Неактивний

#2 2015-07-31 10:19:12

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Таймер для двух функций или интервал внутри интервала???

привет, система Ардуино и его примеры "воспитывают" использование линейное выполнения кода

используйте что то типа state machine,  в вашем случае   это система семафором и состояний алгоритма.
и побольше спите, наверняка система работает на батарейке

пусть функции вызываются последовательно, без какого либо распараллеливания ( RTOS  тут не нужен )

итого , на таймерах делайте обработку семафоров,  а в цикле loop вызов нужных функций
см тут
http://www.instructables.com/id/Arduino … nterrupts/
или http://playground.arduino.cc/Code/Timer1

шаговики на таймер  и PWM, используйте побольше аппаратных фич контроллера, и все будет  хорошо )

Неактивний

#3 2015-08-11 23:37:16

brigadir
Учасник
Зареєстрований: 2015-03-04
Повідомлень: 17

Re: Таймер для двух функций или интервал внутри интервала???

fastudio4, вашу задачу можна рішити таким підходом: https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
Це в принципі те саме, про що пише NoName. Тут: http://playground.arduino.cc/Code/SimpleTimer ця ідея реалізована. Вам лишається прив’язати по таймеру до shoot, shootStep і menu. stepper хай лишається, як є, оскільки там важливі точні інтервали часу.

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму