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

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

  1. Unixon

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

    Зачем вы опять этот неправильный код на свет вытащили? :)
     
  2. vasilp

    vasilp Нерд

    Да потому что я не знаю как по другому воздействовать на светодиод. У меня получается зажечь его по таймеру или погасить но как ему указать сколько раз это повторить не понимаю.
     
  3. Megakoteyka

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

    Заведите переменную-счетчик. После окончания каждой вспышки светодиода увеличивайте значение этого счетчика. Если счетчик дотикал до нужного значения - переставайте теребить светодиод.
     
  4. Unixon

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

    Megakoteyka, у человека другая проблема. Несколько светодиодов нужно гасить и зажигать асинхронно. Прочитайте ветку сначала, включая примеры кода.
     
  5. Unixon

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

    Похоже вы совершенно не разобрались в примерах, которые я вам написал... очень жаль.
     
  6. rav_75

    rav_75 Гик

    С точки зрения дилетанта.. Флаги, счетчик
    Код (Text):
    #define RED_PIN 6
    #define PIN_BTN_START 5

    #define LED_SLEEP 0
    #define LED_READY 1
    #define LED_ON 2
    #define LED_OFF 3
    #define LED_DELAY 4

    // пауза перед работой после старта
    unsigned long next_red = 200;

    // длительность свечения
    unsigned long ligth_time_red = 500;

    // количество сколько раз мигнуть
    byte Pulse_red = 2; // будет регулироваться от 1 до 5
    byte red_i = 1; // счетчик

    //интервал между миганием
    unsigned long pulseIntervalRed = 100; // задержка между импульсами
    boolean prevBtnState = false;
    byte redLedState = LED_SLEEP;
    unsigned long redLedTimer = 0;

    void setup()
    {
      pinMode(RED_PIN, OUTPUT);
      digitalWrite(RED_PIN, LOW);
      pinMode(PIN_BTN_START, INPUT);
    }

    void loop(){
      boolean btnState = digitalRead(PIN_BTN_START);
      if(btnState && !prevBtnState && redLedState == LED_SLEEP){
        redLedState = LED_DELAY;
        redLedTimer = millis();
      }
     
      if(redLedState == LED_DELAY && millis() - redLedTimer > next_red){
        redLedState = LED_READY;
      }
     
      if(redLedState == LED_READY ){
        digitalWrite(RED_PIN, HIGH);
        redLedState = LED_ON;
        redLedTimer = millis();
      }
     
      if(redLedState == LED_ON && millis() - redLedTimer > ligth_time_red){
        digitalWrite(RED_PIN, LOW);
        redLedState = LED_OFF;
        redLedTimer = millis();
      }
     
      if(redLedState == LED_OFF && millis() - redLedTimer > pulseIntervalRed){
        red_i++;
        if(red_i > Pulse_red){
          redLedState = LED_SLEEP;
          red_i = 1;
        }else{
          redLedState = LED_READY;
        }
      }
     
      prevBtnState = btnState;
    }
     
  7. Megakoteyka

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

    Читал. В самом начале шла речь о том, что их нужно не только асинхронно теребить, но и для каждого светодиода должно быть задано количество вспышек, после которого все должно закончиться. Если я все правильно понял.
     
  8. Unixon

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

    Да, я тоже так понял. Предложил в цикле вычислять флаги включения светодиодов как функции времени и по ним уже теребить светодиоды.
     
  9. rav_75

    rav_75 Гик

    в продолжение моргаем асинхронно 3 светодиодами
    Код (Text):
    #define RED_PIN 6
    #define GREEN_PIN 7
    #define BLUE_PIN 8
    #define PIN_BTN_START 5

    enum {
      LED_SLEEP, LED_READY, LED_ON, LED_OFF, LED_DELAY};

    struct MyLed
    {
      // пауза перед работой после старта
      unsigned long next;

      // длительность свечения
      unsigned long ligth_time;

      // количество сколько раз мигнуть
      byte Pulse; // будет регулироваться от 1 до 5
      byte i;  //счетчик

      //интервал между миганием
      unsigned long pulseInterval; // задержка между импульсами

      byte state;  //состояние светодиода
      unsigned long timer;  //таймер
      byte pin;  //пин светодиода

    };

    MyLed redLed, greenLed, blueLed;

    boolean prevBtnState = false;

    void setup(){
      redLed.next = 200;
      redLed.ligth_time = 500;
      redLed.Pulse = 5;
      redLed.i = 1;
      redLed.pulseInterval = 100;
      redLed.state = LED_SLEEP;
      redLed.timer = 0;
      redLed.pin = RED_PIN;

      greenLed.next = 2000;
      greenLed.ligth_time = 500;
      greenLed.Pulse = 10;
      greenLed.i = 1;
      greenLed.pulseInterval = 700;
      greenLed.state = LED_SLEEP;
      greenLed.timer = 0;
      greenLed.pin = GREEN_PIN;

      blueLed.next = 3000;
      blueLed.ligth_time = 100;
      blueLed.Pulse = 5;
      blueLed.i = 1;
      blueLed.pulseInterval = 1000;
      blueLed.state = LED_SLEEP;
      blueLed.timer = 0;
      blueLed.pin = BLUE_PIN;

      pinMode(RED_PIN, OUTPUT);
      digitalWrite(RED_PIN, LOW);
      pinMode(GREEN_PIN, OUTPUT);
      digitalWrite(GREEN_PIN, LOW);
      pinMode(BLUE_PIN, OUTPUT);
      digitalWrite(BLUE_PIN, LOW);
      pinMode(PIN_BTN_START, INPUT);

    }

    void LedLed(struct MyLed &someLed){
      if(someLed.state == LED_DELAY && millis() - someLed.timer > someLed.next){
        someLed.state = LED_READY;
      }

      if(someLed.state == LED_READY ){
        digitalWrite(someLed.pin, HIGH);
        someLed.state = LED_ON;
        someLed.timer = millis();
      }

      if(someLed.state == LED_ON && millis() - someLed.timer > someLed.ligth_time){
        digitalWrite(someLed.pin, LOW);
        someLed.state = LED_OFF;
        someLed.timer = millis();
      }

      if(someLed.state == LED_OFF && millis() - someLed.timer > someLed.pulseInterval){
        someLed.i++;
        if(someLed.i > someLed.Pulse){
          someLed.state = LED_SLEEP;
          someLed.i = 1;
        }
        else{
          someLed.state = LED_READY;
        }
      }
    }

    void loop(){
      boolean btnState = digitalRead(PIN_BTN_START);
      if(btnState && !prevBtnState && redLed.state == LED_SLEEP){
        redLed.state = LED_DELAY;
        redLed.timer = millis();
      }

      if(greenLed.state == LED_SLEEP){
        greenLed.state = LED_DELAY;
        greenLed.timer = millis();
      }

      if(blueLed.state == LED_SLEEP){
        blueLed.state = LED_DELAY;
        blueLed.timer = millis();
      }

      LedLed(redLed);
      LedLed(greenLed);
      LedLed(blueLed);

      prevBtnState = btnState;
    }
     
  10. rav_75

    rav_75 Гик

    тут пара ошибок, может поэтому у ТС не заводилось...
    Код (Text):

    void loop()
    {

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

    digitalWrite(PIN_LED, led_on);
    }
     
    как-то так надо
     
  11. Unixon

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

    PULSE_LENGTH*i умножать не надо, у ТС импульсы не удлиняются.
     
  12. rav_75

    rav_75 Гик

    А причем здесь удлинение импульсов?
    [​IMG]
     
    Megakoteyka и Unixon нравится это.
  13. Unixon

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

    А, да, верно, забыл дописать смещение.