Интервал внутри интервала???

fastudio4
Offline
Зарегистрирован: 30.07.2015

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

Looka
Offline
Зарегистрирован: 24.04.2012

Не уверен что  полностью понял Вашу проблему.  

Я тк понимаю у Вас   loop()  должен крутиться что бы все остально работало? 

Так попробуйте сделать как то так 

[code]

unsigned long int timeStep = 0; // время когда можно запустить степпер
void loop() 
{
  if( "пора фоткать" && timeStep == 0 ) 
  {  shut();
     timeStep = millis() + 2000;
  }


  if( millis() > timeStep ) 
  {  stepзer();
     timeStep = 0;   // фиксируем что степпер отработал и можно опять фоткать
  }
 
}
[/code]

только акуратно разберитесь с условием когда  надо фотографровать

Ну и Вы там с терменологией разберитесь  что значит "через функцию отправлять в таймер"?  
Что вы понимаете под "таймtром"?    Вообще-то таймер это прерывание в МК. 

И как код вставляь есть прикрепленные темы

 

fastudio4
Offline
Зарегистрирован: 30.07.2015

Чуть чуть понял попробую. Я фотограф и это мой первый проект. Я пока мало чего понимаю в програмировании но сам пытаюсь во всем разбираться. Спасибо Вам большое.

fastudio4
Offline
Зарегистрирован: 30.07.2015

Не работает таким способом. Может я ошибся где то. Вот код!

//Затвор камеры
void shoot() {
  digitalWrite(CAM, HIGH);
  delay(200);
  digitalWrite(CAM, LOW);
}
 //Затвор камеры и шаговик

 
void Step() {
  stepper(20, 500, 1);
}

void menu() {
  lcd.cursor();
  delay(150);
  lcd.noCursor();
  delay(150);
}


unsigned long time;  
unsigned long interval = 5000; //Интервал
unsigned long perShoot = 0; // Доп. переменная для затвора
unsigned long perSlide = 0; // Доп. переменная дял слайдера
int interSlide = 2000; // Интервал между затвором и слайдером

void loop(){
  time = millis();
  if ((time - perShoot) >= interval && perSlide == 0) {
    perShoot = time;
    shoot();
    perSlide = time + interSlide;
 }
 if (time >= perSlide) {
   Step();
   perSlide = 0;
 }

 

fastudio4
Offline
Зарегистрирован: 30.07.2015

Всё, сам разобрался наконец то. направление было правильно, нужно только было дополнительное условие дописать.

unsigned long interval = 5000; //Интервал
unsigned long perShoot = 0; // Доп. переменная для затвора
unsigned long perSlide = 0; // Доп. переменная дял слайдера
unsigned long interSlide = 2000; // Интервал между затвором и слайдером
 
void loop(){
  
  
  if ((millis() - perShoot) >= interval && perSlide == 0) {
    perShoot = millis();
    shoot();
    perSlide = millis() + interSlide;
 }
 if (millis() >= perSlide && perSlide > perShoot) {
   stepper(20, 500, 1);
   perSlide = 0;
   kadr--;
}
}