Двух-цветная полицейская мигалка с ШИМ(PWM) регулировкой, самое главное без {delay & for}

Тема в разделе "Глядите, что я сделал", создана пользователем grx1a, 6 май 2013.

  1. grx1a

    grx1a Гик

    Может кому пригодится! В инете есть мигалки на один светодиод без delay, но там есть минус, светодиод включается и выключается с постоянной частотой, в этом коде можно менятьчастоту цикла, и длинну вспышки, и способов модернизации кода под свои нужные параметры думаю много.
    /*
    Код для двуцветной LED мигалки с широтно импульсной модуляцией (ШИМ=PWM)
    БЕЗ ИСПОЛЬЗОВАНИЯ ФУНКЦИИ delay!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    */

    #define ledPin1 5 // PIN СИНИЙ LED
    #define ledPin2 4 // PIN КРАСНЫЙ LED
    boolean BlinkPeriod = 0; // Триггер периода вспышки за цикл
    boolean OFF_LED_Period = 0; // Триггер периода запрета вспышки за цикл
    int pos = 1; // Переменная смены цвета и количеста вспышек (счетчик)
    long t1 = 50; // Время вспышки (длинна вспышки) (можно завести на потенцеометр через map)
    long t2 = 130; // Время (можно завести на потенцеометр через map)
    long time;
    int count; // Счетчик импульсов

    void setup()
    {
    pinMode(ledPin1, OUTPUT);
    pinMode(ledPin2, OUTPUT);
    }

    void loop()
    {

    //ГЕНЕРАТОР ПРЯМОУГОЛЬНЫХ ИМПУЛЬСОВ С ПЕРЕМЕННОЙ СКВАЖНОСТЬЮ
    if((BlinkPeriod==0)&&(OFF_LED_Period==0))
    {
    time=millis();
    BlinkPeriod=1;
    count++; // Счетчик импульсов вспышки
    if (count>6) count=1; // 6 - позиций счетчика
    OFF_LED_Period=0;
    }
    if( BlinkPeriod && (millis() - time) > t1) //Время Вспышки
    {
    BlinkPeriod = 0;
    OFF_LED_Period=1;
    }
    if(OFF_LED_Period && (millis() - time) > t2) //Время Цикла
    {
    OFF_LED_Period=0;
    }

    //ОПРЕДЕЛЕНИЕ МИГАЮЩЕГО LED (КРАСНЫЙ - СИНИЙ)
    if((count==1)||(count==2)) // ДВЕ ВСПЫШКИ
    {pos = 1;} // КРАСНЫЙ LED
    if((count==3)||(count==4)) // ПАУЗА МЕЖДУ СМЕНОЙ ЦВЕТА
    {pos = 2;} // Две позиции счетчика на паузу
    if((count==5)||(count==6)) // ДВЕ ВСПЫШКИ
    {pos = 3;} // СИНИЙ LED

    //ВЫХОДНОЙ СИГНАЛ
    if ((BlinkPeriod==1)&&(pos==1)) // Мигает КРАСНЫЙ LED
    {digitalWrite(ledPin1,HIGH);}
    else
    {digitalWrite(ledPin1,LOW);}

    if((BlinkPeriod==1)&&(pos==3)) // Мигает СИНИЙ LED
    {digitalWrite (ledPin2,HIGH);}
    else
    {digitalWrite (ledPin2,LOW);}

    }
    // t1 и t2 лучше подключить на потенциометр через функцию map, и при помощи них управлять вспышками
     
  2. grx1a

    grx1a Гик

    опечатка :t1 и t2 лучше подключить на потенциометр-Ы
     
  3. grx1a

    grx1a Гик

    Доработал код под два потенцеометра, которыми можно управлять частотой мигалки
    потенциометры поставил по 10кОм каждый


    /*
    Код для двуцветной LED мигалки с широтно импульсной модуляцией (ШИМ=PWM)
    БЕЗ ИСПОЛЬЗОВАНИЯ ФУНКЦИИ delay!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    */

    #define ledPin1 5 // PIN СИНИЙ LED
    #define ledPin2 4 // PIN КРАСНЫЙ LED
    #define pot1 1
    #define pot2 2

    boolean BlinkPeriod = 0; // Триггер периода вспышки за цикл
    boolean OFF_LED_Period = 0; // Триггер периода запрета вспышки за цикл
    int pos = 1; // Переменная смены цвета и количеста вспышек (счетчик)
    long t1; // Время вспышки (длинна вспышки)
    long t2; // Время
    long time;
    int count; // Счетчик импульсов

    void setup()
    {
    pinMode(ledPin1, OUTPUT);
    pinMode(ledPin2, OUTPUT);
    }

    void loop()
    { int potpos1=analogRead(pot1);
    int potpos2=analogRead(pot2);
    t1 = map(potpos1,0,1023,0,300);
    t2 = map(potpos2,0,1023,0,300);


    //ГЕНЕРАТОР ПРЯМОУГОЛЬНЫХ ИМПУЛЬСОВ С ПЕРЕМЕННОЙ СКВАЖНОСТЬЮ
    if((BlinkPeriod==0)&&(OFF_LED_Period==0))
    {
    time=millis();
    BlinkPeriod=1;
    count++; // Счетчик импульсов вспышки
    if (count>6) count=1; // 6 - позиций счетчика
    OFF_LED_Period=0;
    }
    if( BlinkPeriod && (millis() - time) > t1) //Время Вспышки
    {
    BlinkPeriod = 0;
    OFF_LED_Period=1;
    }
    if(OFF_LED_Period && (millis() - time) > t2) //Время Цикла
    {
    OFF_LED_Period=0;
    }

    //ОПРЕДЕЛЕНИЕ МИГАЮЩЕГО LED (КРАСНЫЙ - СИНИЙ)
    if((count==1)||(count==2)) // ДВЕ ВСПЫШКИ
    {pos = 1;} // КРАСНЫЙ LED
    if((count==3)||(count==4)) // ПАУЗА МЕЖДУ СМЕНОЙ ЦВЕТА
    {pos = 2;} // Две позиции счетчика на паузу
    if((count==5)||(count==6)) // ДВЕ ВСПЫШКИ
    {pos = 3;} // СИНИЙ LED

    //ВЫХОДНОЙ СИГНАЛ
    if ((BlinkPeriod==1)&&(pos==1)) // Мигает КРАСНЫЙ LED
    {digitalWrite(ledPin1,HIGH);}
    else
    {digitalWrite(ledPin1,LOW);}

    if((BlinkPeriod==1)&&(pos==3)) // Мигает СИНИЙ LED
    {digitalWrite (ledPin2,HIGH);}
    else
    {digitalWrite (ledPin2,LOW);}

    }
     
    Citrus нравится это.
  4. grx1a

    grx1a Гик

    все таки лучше count и pos немного сократить, более резво мигаеть начинает, красивее
    рекомендую count==4 убрать, вернее сместить его на count==5 а count==6 вообще убрать из кода
    тогда задержка между сменой цвета будет не 2 позиции а одна, ну соответвственно под это изменение в других частях кода подгонку сделать, так красивее работает
     
  5. grx1a

    grx1a Гик

    Код (Text):

    *
    Код для двуцветной LED мигалки  с широтно импульсной модуляцией (ШИМ=PWM)
    БЕЗ ИСПОЛЬЗОВАНИЯ ФУНКЦИИ    delay!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    */
     
    #define ledPin1  5            // PIN СИНИЙ LED    
    #define ledPin2  4            // PIN КРАСНЫЙ LED
    #define pot1 1                // PIN ПОТЕНЦЕОМЕТРА ДЛИННЫ ВСПЫШКИ
    #define pot2 2                // PIN ПОТЕНЦЕОМЕТРА ДЛИННЫ ЦИКЛА
     
    boolean BlinkPeriod = 0;                  // Триггер периода вспышки за цикл
    boolean OFF_LED_Period = 0;   // Триггер периода запрета вспышки за цикл
    int pos = 1;                             // Переменная смены цвета и количеста вспышек (счетчик)
    long t1;                                  // Время вспышки  (длинна вспышки)
    long t2;                                 // Время  цикла
    long time;
    int count;                           // Счетчик импульсов
     
    void setup()
    {
      pinMode(ledPin1, OUTPUT);
      pinMode(ledPin2, OUTPUT);
    }
     
    void loop()
    {
      int potpos1=analogRead(pot1); //Читает показания потенцеометра №1
      int potpos2=analogRead(pot2); //Читает показания потенцеометра №2
      t1 = map(potpos1,0,1023,0,300);  //Переводит показания потенцеометра №1 во время
      t2 = map(potpos2,0,1023,0,300);  //Переводит показания потенцеометра №2 во время
     
     
      //ГЕНЕРАТОР ПРЯМОУГОЛЬНЫХ ИМПУЛЬСОВ С ПЕРЕМЕННОЙ СКВАЖНОСТЬЮ
      if((BlinkPeriod==0)&&(OFF_LED_Period==0))
        {
          time=millis();
          BlinkPeriod=1;
          count++;                                        // Счетчик импульсов вспышки
              if (count>5) count=1;               // 5 - позиций счетчика
          OFF_LED_Period=0;
        }
      if( BlinkPeriod && (millis() - time) > t1)      //Время Вспышки
        {
          BlinkPeriod = 0;
          OFF_LED_Period=1;
        }
      if(OFF_LED_Period && (millis() - time) > t2)  //Время Цикла
        {
          OFF_LED_Period=0;
        }
     
      //ОПРЕДЕЛЕНИЕ МИГАЮЩЕГО LED (КРАСНЫЙ - СИНИЙ)
       if((count==1)||(count==2))     // ДВЕ ВСПЫШКИ
          {pos = 1;}                                    // КРАСНЫЙ LED
       if(count==3)                           // ПАУЗА МЕЖДУ СМЕНОЙ ЦВЕТА
          {pos = 2;}                                  // Одна позиция счетчика на паузу
       if((count==4)||(count==5))   // ДВЕ ВСПЫШКИ
          {pos = 3;}                                  // СИНИЙ LED
     
      //ВЫХОДНОЙ СИГНАЛ
      if ((BlinkPeriod==1)&&(pos==1))    // Мигает КРАСНЫЙ LED
          {digitalWrite(ledPin1,HIGH);}
      else
           {digitalWrite(ledPin1,LOW);}
     
      if((BlinkPeriod==1)&&(pos==3))     // Мигает СИНИЙ LED
          {digitalWrite (ledPin2,HIGH);}
      else
          {digitalWrite (ledPin2,LOW);}
     
    }
     
  6. grx1a

    grx1a Гик

    ВО, ПОЛУЧИЛОСЬ КОД НОРМАЛЬНО ПЕРЕНЕСТИ КАК ОН ДОЛЖЕН БЫТЬ, С ПРОБЕЛАМИ И ИНТЕРВАЛАМИ, ТОЛЬКО ЧТО ТО КОМЕНТАРИИ ПОРАЗЛЕТАЛИСЬ
     
  7. Citrus

    Citrus Нерд

    Все отлично ... но гляньте может у Вас Caps запал =)
     
  8. grx1a

    grx1a Гик

    не Caps точно не запал
     
  9. grx1a

    grx1a Гик

    есть на сайте амперки страничка ВВ-Коды, надо пртехоньку ее осваивать
     
  10. grx1a

    grx1a Гик

    теперь буду думать как к этой мигалке еще присобачить сирену, есть код сирены но он с функцией for что равносильно delay тормозу выполнения программы, буду думать.