Работа с таймером

Тема в разделе "Arduino & Shields", создана пользователем vasilp, 2 апр 2014.

  1. Unixon

    Unixon Оракул Модератор

    Это вам кажется, постарайтесь более творчески подходить к процессу и задавать правильные вопросы.
     
  2. vasilp

    vasilp Нерд

    Странно а что я не правильного описал и даже зарисовал? Я все таки начинающий всего знать не могу просто вычитал что delay останавливает весь процесс а milis позволяет контроллеру работать дальше но у меня не получается этого реализовать, так чего уж тут неправильного я задал??? Вот например делаю так светодиод просто горит и цикл н завершается .. Мне даже не заставить его погаснуть когда нужно.
    Код (Text):
     if (millis() - time <= ligth_time_red + next_red)
        {
          for (byte pulse = 0; pulse < Pulse_red; ++pulse)
          {
            digitalWrite(RED_PIN, HIGH);
            //delay(ligth_time_red);
            if ((millis()>time + pulseIntervalRed)||(millis()<time))
            digitalWrite(RED_PIN, LOW);
            //delay(pulseIntervalRed);
          }
     
    Последнее редактирование: 6 апр 2014
  3. Unixon

    Unixon Оракул Модератор

    Смотрите мой пример внимательнее. У вас не должно быть перехвата управления в виде циклов for(). Только реакция на события в главном цикле.

    Наступление момента времени, когда что-то должно произойти (когда светодиод должен загореться или погаснуть) - это событие. В событийно-ориентированном коде у вас loop() должен выглядеть только так:

    Код (Text):

    void loop()
    {
    if (событие 1)
    {
      // действие 1
    }
    // ...
    if (событие N)
    {
      // действие N
    }
    }
     
    И никаких явных задержек или циклов.
     
  4. Unixon

    Unixon Оракул Модератор

    Несколько импульсов одного светодиода - это несколько событий "настало время зажечь светодиод (в i-тый раз)" и "настало время погасить светодиод (в i-тый раз)".
     
  5. vasilp

    vasilp Нерд

    То есть если сделать так то задержек не будет?
    Но почему тогда синий светодиод не вступает в работу?
    Код (Text):
    if (millis() - time <= ligth_time_red )
        {
          for (byte pulse = 0; pulse < Pulse_red; ++pulse)
          {
            digitalWrite(RED_PIN, HIGH);
            delay(ligth_time_red);
            digitalWrite(RED_PIN, LOW);
            delay(pulseIntervalRed);
          }
          delay(next_red);
          }
        }
        if (millis() - time <= ligth_time_blue )
        {
          for (byte pulse = 0; pulse < Pulse_blue; ++pulse)
          {
            digitalWrite(BLUE_PIN, HIGH);
            delay(ligth_time_blue);
            digitalWrite(BLUE_PIN, LOW);
            delay(pulseIntervalBlue);
          }
          delay(next_blue);
          flag = true;
        }
     
  6. vasilp

    vasilp Нерд

    Тогда вот эту строку надо повторять в каждом событии? for (byte pulse = 0; pulse < Pulse_red; ++pulse)
     
  7. vasilp

    vasilp Нерд

    В таком варианте тоже не работает что еще не так делаю?
    Код (Text):
    boolean flag = false;
       
        // текущее системное время
        long time = millis();
        while(!flag)
        {
        if (millis() - time <= ligth_time_red)
        {
          for (byte pulse = 0; pulse < Pulse_red; ++pulse)
          {
            digitalWrite(RED_PIN, HIGH);
          }
          if ((millis()>time + pulseIntervalRed)||(millis()<time))
          {
            digitalWrite(RED_PIN, LOW);
          }
          flag = true;
        }

      }
     
     
  8. Unixon

    Unixon Оракул Модератор

    Нет. Читайте внимательно. У вас в коде вообще не должно быть цикла for().
     
  9. vasilp

    vasilp Нерд

    Тогда без него как определить сколько раз нужно мигнуть? byte Pulse_red = 2; // будет регулироваться от 1 до 5
     
  10. Unixon

    Unixon Оракул Модератор

    Когда вы вставляете цикл, он ломает логику кода, блокирует выполнение остального кода пока сам не закончится. А это именно то, с чем вы боретесь.
     
  11. Unixon

    Unixon Оракул Модератор

    Вам нужно составить условие, при котором светодиод должен гореть и использовать это условие в главном цикле, вместо того, чтобы явно N раз им моргать.
     
  12. acos

    acos Официальный гик Администратор

    Блин. Я вас совершенно не понял, я думал вам надо последовательно чтоб всё мигало)
     
  13. Unixon

    Unixon Оракул Модератор

    Пример:
    Код (Text):

    void loop()
    {

     long int time = millis() - time_start;
     bool led_on = false;
     for (int i = 0; i < pulse_count; i++)
     {
      if ((time>=(time_start + DELAY_FIRST_PULSE + DELAY_NEXT_PULSE*i)) &&
      (time<(time_start + DELAY_FIRST_PULSE + DELAY_NEXT_PULSE*i + PULSE_LENGTH))
      {
      led_on = true;
      break;
      }
     }

     digitalWrite(PIN_LED, led_on);
    }
     
     
  14. vasilp

    vasilp Нерд

    Еще хуже запутался :(
     
  15. vasilp

    vasilp Нерд

    Не понятно от куда взялось bool led_on = false и что это значит DELAY_FIRST_PULSE, DELAY_NEXT_PULSE ???
     
    Последнее редактирование: 6 апр 2014
  16. vasilp

    vasilp Нерд

    Вот зато теперь мучаю светодиод которые сутки :rolleyes: Ничерта понять не могу что с ним делать
     
  17. vasilp

    vasilp Нерд

    Не работает по этому примеру диод совсем не загорается(
     
  18. Unixon

    Unixon Оракул Модератор

    DELAY_FIRST_PULSE - интервал времени от нажатия кнопки до первого испульса,
    DELAY_NEXT_PULSE - интервал времени между импульсами,
    led_on - флаг включения светодиода.

    Я же пример привожу, чтобы принцип построения кода объяснить, а не чтобы его бездумно можно было склеить с другим кодом. Имена переменных сами за себя говорят, для чего они нужны. Вы с английским языком знакомы?
     
  19. vasilp

    vasilp Нерд

    Ничего не получается
    Код (Text):
    void loop()
    {
      long int time = millis() - time_start;
      bool led_on = false;
      if ((digitalRead (PIN_BTN_START))
      {
        for (int i = 0; i < Pulse_red; i++)
        {
          if ((time>=(time_start + next_red + pulseIntervalRed*i)) &&
          (time<(time_start + next_red + pulseIntervalRed*i + ligth_time_red)))
          {
            led_on = true;
            break;
          }
        }
        digitalWrite(RED_PIN, led_on);
      }
    }
     
  20. vasilp

    vasilp Нерд

    Уже разобрался