Интервалы светодиодов на ардуино

Тема в разделе "Arduino & Shields", создана пользователем Дмитрий5678, 14 май 2020.

  1. Значит, заказал, я, написать скетч одному парню, но он какой-то странный оказался и не захотел доделывать программу мне до конца, хотя я и платить не отказывался, а наоброт говорил: "Скидывайте номер карты, я оплачу", но он молчит. Но не суть. Там нужно чтобы 2 стробы отдельные друг от друга и соответственно с разными интервалами мигали так, чтобы 2-я строба включалась строго после некоторого времени как прогорела 1-я. Т.е. из-за того, что у них разные интервалы, один светодиод начинает, как бы перекрывать другой, мигая в одно время с ним. Может, кто-нибудь подскажет мне с этим вопросом, мне нужно как бы установить время через которое будет загораться второй светодиод. Сам скетч полностью готов и меня в нём все устраивает, за исключением этого момента. На моём видео, сначала видно,что мигает так, как нужно, но потом постепенно начинает первый светодиод налезать на второй.

     
  2. b707

    b707 Гуру

    если вы хотите, чтобы вам дали бесплатный совет - выкладывайте код, посмотрим. А если хотите, чтобы сделали "под ключ" - размещайте в разделе "Закажу проект"
     
  3. //хххххххххххххххххххххххххххххххххххххххххххххххххххххххххххх
    int flag = 0;
    int mode = 0;
    int kn = 2;
    int CD1 = A0;
    int CD2 = 11;

    unsigned long lastturn;
    unsigned long lastturn_2;
    int flag_strob_2 = 0;
    //============================================================

    void setup() {
    pinMode(kn, INPUT);
    pinMode(CD1, OUTPUT);
    pinMode(CD2, OUTPUT);
    pinMode(8, OUTPUT);
    pinMode(5, OUTPUT);
    pinMode(7, OUTPUT);
    pinMode(A1, OUTPUT);
    pinMode(4, OUTPUT);


    }
    //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    void loop() {
    kn_mode();
    switch (mode)
    {
    case 0:{
    digitalWrite(8, LOW);
    digitalWrite(5, LOW);
    digitalWrite(A1,LOW);
    digitalWrite(A0,LOW);
    digitalWrite(11,LOW);
    digitalWrite(7, LOW);
    digitalWrite(4, LOW);

    }
    break;
    case 1:{
    digitalWrite(8, HIGH);
    digitalWrite(5, HIGH);
    }
    break;

    case 2:{
    digitalWrite(8, HIGH);
    digitalWrite(5, HIGH);
    digitalWrite(A1, HIGH);
    strob_1();
    }
    break;

    case 3:{
    digitalWrite(8, HIGH);
    digitalWrite(5, HIGH);
    digitalWrite(A1, HIGH);
    digitalWrite(7, HIGH);
    strob_1();
    }
    break;

    case 4:{
    digitalWrite(8, HIGH);
    digitalWrite(5, HIGH);
    digitalWrite(A1, HIGH);
    digitalWrite(7, LOW);
    digitalWrite(4, HIGH);
    strob_1();
    strob_2();
    }
    break;

    case 5:{
    digitalWrite(8, HIGH);
    digitalWrite(5, HIGH);
    digitalWrite(A1, HIGH);
    digitalWrite(7, LOW);
    digitalWrite(4, LOW);
    strob_1();
    strob_2();
    }
    break;

    }
    }

    //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    //==========================================================================
    int kn_mode()
    {
    if (digitalRead(kn) == HIGH && flag == 0)
    {
    delay(100);
    mode++;
    flag = 1;
    if (mode > 5)
    {
    mode = 0;
    }

    }


    if (digitalRead(kn) == LOW && flag == 1)
    {
    delay(100);
    flag = 0;
    }
    }


    //===========================================================================
    void strob_1()
    {
    if (millis()-lastturn > 1300 && millis()-lastturn < 1400 )
    {
    digitalWrite(CD1, HIGH);
    }

    else
    {
    digitalWrite(CD1, LOW);
    }


    if (millis()-lastturn > 1400)
    {
    lastturn=millis();
    }
    }
    //==========================================================================
    void strob_2()
    {
    if(flag_strob_2 == 0)
    {
    if (millis()-lastturn_2 > 140 && millis()-lastturn_2 < 180 )
    {
    digitalWrite(CD2, HIGH);
    }

    else
    {
    digitalWrite(CD2, LOW);
    }
    if (millis()-lastturn_2 > 180)
    {
    lastturn_2=millis();
    flag_strob_2 = 1;
    }
    }

    //========
    if(flag_strob_2 == 1)
    {
    if (millis()-lastturn_2 > 1200 && millis()-lastturn_2 < 1240 )
    {
    digitalWrite(CD2, HIGH);
    }

    else
    {
    digitalWrite(CD2, LOW);
    }

    if (millis()-lastturn_2 > 1240)
    {
    lastturn_2=millis();
    flag_strob_2 = 0;
    }
    }
    }
     
  4. Вот код)
     
  5. b707

    b707 Гуру

    это не код. Посмотрите в правилах. как нужно вставлять код в сообщение и исправьте
     
  6. Код (C++):
    //хххххххххххххххххххххххххххххххххххххххххххххххххххххххххххх
    int flag = 0;
    int mode = 0;
    int kn = 2;
    int CD1 = A0;
    int CD2 = 11;

    unsigned long lastturn;
    unsigned long lastturn_2;
    int flag_strob_2 = 0;
    //============================================================

    void setup() {
      pinMode(kn, INPUT);
      pinMode(CD1, OUTPUT);
      pinMode(CD2, OUTPUT);
      pinMode(8, OUTPUT);
      pinMode(5, OUTPUT);
      pinMode(7, OUTPUT);
      pinMode(A1, OUTPUT);
      pinMode(4, OUTPUT);
     
     
     
    }
    //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    void loop() {
     
      kn_mode();
     
      switch (mode)
      {
        case 0:{
          digitalWrite(8, LOW);
          digitalWrite(5, LOW);
          digitalWrite(A1,LOW);
          digitalWrite(A0,LOW);
          digitalWrite(11,LOW);
          digitalWrite(7, LOW);
          digitalWrite(4, LOW);
         
               }
         break;
     
        case 1:{
          digitalWrite(8, HIGH);
          digitalWrite(5, HIGH);
               }
           break;
         
        case 2:{
          digitalWrite(8, HIGH);
          digitalWrite(5, HIGH);
          digitalWrite(A1, HIGH);
          strob_1();
               }
           break;
         
        case 3:{
          digitalWrite(8, HIGH);
          digitalWrite(5, HIGH);
          digitalWrite(A1, HIGH);
          digitalWrite(7, HIGH);
          strob_1();
               }
           break;
         
        case 4:{
          digitalWrite(8, HIGH);
          digitalWrite(5, HIGH);
          digitalWrite(A1, HIGH);
          digitalWrite(7, LOW);
          digitalWrite(4, HIGH);
          strob_1();
          strob_2();
               }
           break;
         
        case 5:{
          digitalWrite(8, HIGH);
          digitalWrite(5, HIGH);
          digitalWrite(A1, HIGH);
          digitalWrite(7, LOW);
          digitalWrite(4, LOW);
          strob_1();
          strob_2();
               }
           break;  
     
      }
    }

    //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    //==========================================================================
    int kn_mode()
    {
       if (digitalRead(kn) == HIGH && flag == 0)
      {
         delay(100);
         mode++;
         flag = 1;
       if (mode > 5)
        {
         mode = 0;
        }
     
      }


      if (digitalRead(kn) == LOW && flag == 1)
      {
       delay(100);
       flag = 0;
      }
     
    }


    //===========================================================================
    void strob_1()
    {
      if (millis()-lastturn > 1300  && millis()-lastturn < 1400 )
    {
        digitalWrite(CD1, HIGH);
    }
    else
    {
        digitalWrite(CD1, LOW);
    }
      if (millis()-lastturn > 1400)
      {
         lastturn=millis();
      }
    }
    //==========================================================================
    void strob_2()
    {
      if(flag_strob_2 == 0)
    {
         if (millis()-lastturn_2 > 140  && millis()-lastturn_2 < 180 )
       {
        digitalWrite(CD2, HIGH);
       }
        else
       {
        digitalWrite(CD2, LOW);
       }
     
      if (millis()-lastturn_2 > 180)
      {
         lastturn_2=millis();
         flag_strob_2 = 1;
      }
     
    }
    //========
       if(flag_strob_2 == 1)
       {
        if (millis()-lastturn_2 > 1200  && millis()-lastturn_2 < 1240 )
        {
          digitalWrite(CD2, HIGH);
        }
        else
        {
         digitalWrite(CD2, LOW);
        }
       
       if (millis()-lastturn_2 > 1240)
        {
         lastturn_2=millis();
         flag_strob_2 = 0;
        }
       }
    }
     
  7. Извиняюсь, не знал
     
  8. b707

    b707 Гуру

    по коду сразу стало понятно. почему автор не стал доделывать и даже денег не взял :) Сколько ему было. лет двенадцать? :)
    Для начала попробуйте убрать две строчки delay(100); в процедуре kn_mode(). Если не поможет - тогда надо будет вникать в код глубже :)
     
  9. Да не, не в этом дело, kn_mode - это кнопка, если убрать delay, начинает как-то криво эта кнопка работать. А можно сделать один интервал из нескольких, зная время между ними, но чтобы этот один интервал отвечал за два разных светодиода? Знаю запутано, но как могу) Т.е. он сделал 2 разных интервала, но мне, по сути, не нужен, strob_2 без strob_1, да, если честно, он без strob_1 не используется совсем.
     
  10. b707

    b707 Гуру

    Можно сделать как угодно. Просто насколько я вижу в коде, у вас кнопка переключает пять режимов, в каждом из которых строб работает по своему. Поэтому возникают вопросы
    - о каком из режимов идет речь?
    - опишите, как должны загораться светодиоды?

    И еще - в программе вывод сигналов на CD1 и CD2 происходит как в процедурах strob_1 и strob_2, так и непосредственно в цикле. Это специально так задумано? - потому как выглядит просто как будто автор сначала делал строб прямо в loop(). а потом написал специальные процедуры-а из основного цикла удалить забыл...
    В общем, говоря прямо - это помойка, а не код :) По хорошему его не править надо, а переписывать.
     
  11. Поняятно:( Да в общем и целом работает как надо, но из-за того, что два светодиода с разными интервалами, они со временем начинают, как бы "залазить друг на друга" Я снял видео и залил на ютуб, там в начале видоса светодиоды работают как надо, но потом потихоньку начинают работать одновременно, а нужно так: допустим, белый дабл блинк, а красный просто блинк:D, так вот, когда красный мигает - белый молчит, когда белый мигает - красный молчит. Ну вообщем на видео всё видно(в начале - правильно, под конец видео - не правильно), но через некоторое время они опять начинают работать отдельно друг от друга.
    Режим/пин
    1 D8 D5
    2 D8 D5 A1 A0
    3 D8 D5 A1 A0 D7
    4 D8 D5 A1 A0 D7 D11 D4
    5 D8 D5 A1 A0 D7
    Я на самом деле не знаю, как там у него всё задумывалось, но чувак странный:)
     
  12. b707

    b707 Гуру

    Поясните, зачем столько пинов. На видео у вас всего 2 светодиода.
    И еще вы не ответили - на видео это который режим работает?
     
  13. Да светодиодов и правда многовато, но они мне пока не нужны, остальные просто светятся. Я поэтому и подключил всего 2, которые мне нужно показать Вам. Мигают только D11 и A0
     
  14. b707

    b707 Гуру

    Дмитрий, вы хронически не отвечаете на вопросы...
     
  15. На видео 4 режим.
     
  16. Извиняюсь)
     
  17. Поправка: 5 режим - D8 D5 A1 A0 D11
     
    b707 нравится это.
  18. b707

    b707 Гуру

    Дмитрий, в вашем случае нужно обьединить два стробоскопа общим интервалом. У меня сейчас рабочий день заканчивается. если никто до того не подскажет - я позже отпишусь подробнее.
     
  19. Да, именно это и нужно сделать:) Буду ждать)
     
  20. b707

    b707 Гуру

    Вместо последовательного вызова функйий strob_1 strob_2 вызывайте вот эту одну функцию:
    Код (C++):
    void strob_12(){
    if (millis()-lastturn > 1300  && millis()-lastturn < 1400 )
       {
        digitalWrite(CD1, HIGH);
       }
    else
       {
        digitalWrite(CD1, LOW);
       }

    if ((millis()-lastturn > 590  && millis()-lastturn < 630 ) ||
        (millis()-lastturn > 770  && millis()-lastturn < 810 ))
       {
        digitalWrite(CD2, HIGH);
       }
    else
       {
        digitalWrite(CD2, LOW);
       }


    if (millis()-lastturn > 1400)
      {
         lastturn=millis();
      }
    }
    в коде не проверял, могут быть опечатки