RGB светодиод с режимом плавного увеличения яркости

Тема в разделе "Arduino & Shields", создана пользователем Shura_krivie_ruki, 16 июн 2018.

  1. Добрый вечер!
    Уважаемые гуру,
    Помогите разобраться.
    Суть вопроса такая взял скетч из книги Джереми Блума (ночник)
    Код (C++):
    const int BLED=9;
    const int GLED=10;
    const int RLED=11;
    const int BUTTON=2;
    boolean lastButton = LOW;
    boolean currentButton = LOW;
    int ledMode = 0;

    void setup()
    {
    pinMode(BLED, OUTPUT);
    pinMode(GLED, OUTPUT);
    pinMode(RLED, OUTPUT);
    pinMode(BUTTON, INPUT);
    }
    boolean debounce(boolean last)
    {
    boolean current = digitalRead(BUTTON);
    if (last != current)
    {
    delay(5);
    current = digitalRead(BUTTON);
    return current;
    }
    }
    void setMode(int mode)
    {
    if (mode == 1)
    {
    digitalWrite(RLED, HIGH);
    digitalWrite(GLED, LOW);
    digitalWrite(BLED, LOW);
    }
    else if (mode == 2)
    {
    digitalWrite(RLED, LOW);
    digitalWrite(GLED, HIGH);
    digitalWrite(BLED, LOW);
    }
    else if (mode == 3)
    {
    digitalWrite(RLED, LOW);
    digitalWrite(GLED, LOW);
    digitalWrite(BLED, HIGH);
    }
    else if (mode == 4)
    {
    analogWrite(RLED, 127);
    analogWrite(GLED, 0);
    analogWrite(BLED, 127);
    }
    else if (mode == 5)
    {
    analogWrite(RLED, 0);
    analogWrite(GLED, 127);
    analogWrite(BLED, 127);
    }
    else if (mode == 6)
    {
    analogWrite(RLED, 127);
    analogWrite(GLED, 127);
    analogWrite(BLED, 0);

    }
    else if (mode == 7)
    {
    analogWrite(RLED, 85);
    analogWrite(GLED, 85);
    analogWrite(BLED, 85);
    }

    else
    {
    analogWrite(RLED, LOW);
    analogWrite(GLED, LOW);
    analogWrite(BLED, LOW);
    }

    }
    void loop()
    {
    currentButton = debounce(lastButton);

    if (lastButton == LOW && currentButton == HIGH)
    {
    ledMode++;
    }
    lastButton = currentButton;

    if (ledMode == 9) ledMode = 0;
    setMode(ledMode);
    }
    и хочу добавить к режимам ещё один из той же книги ( плавное увеличение яркости)
    Код (C++):
    const int LED=13;
    void setup()
    {
    pinMode(LED, OUTPUT);
    }
    void loop()
    {
    for (int i=0; i<256; i=i+5)
    {
    analogWrite(LED, i);
    delay(10);
    }
    for (int i=255; i>=0; i=i-5)
    {
    analogWrite(LED, i);
    delay(10);
    }
    }
    Не получается объединить.
    Если не затруднит расскажите как правильно это делать. Из книги плохо понятно.
     
    Последнее редактирование: 16 июн 2018
  2. Как я понимаю нужно создать ещё один режим
    Код (C++):
    else if (mode == 8)
    и далее добавлять
    for (int i=0; i<256; i=i+5)
    {
    analogWrite(LED, i);
    delay(10);
    }
    for (int i=255; i>=0; i=i-5)
    {
    analogWrite(LED, i);
    delay(10);
    }
     
    Последнее редактирование: 16 июн 2018
  3. Но вот на этом этапе у меня все и рушиться ((
     
  4. NikitOS

    NikitOS Король шутов Администратор

  5. NikitOS

    NikitOS Король шутов Администратор

    Так?
    Код (C++):
    const int BLED=9;
    const int GLED=10;
    const int RLED=11;
    constint LED=13;
    const int BUTTON=2;
    boolean lastButton = LOW;
    boolean currentButton = LOW;
    int ledMode = 0;

    void setup()
    {
    pinMode(BLED, OUTPUT);
    pinMode(GLED, OUTPUT);
    pinMode(RLED, OUTPUT);
    pinMode(LED, OUTPUT);
    pinMode(BUTTON, INPUT);
    }
    boolean debounce(boolean last)
    {
    boolean current = digitalRead(BUTTON);
    if (last != current)
    {
    delay(5);
    current = digitalRead(BUTTON);
    return current;
    }
    }
    void setMode(int mode)
    {
    if (mode == 1)
    {
    digitalWrite(RLED, HIGH);
    digitalWrite(GLED, LOW);
    digitalWrite(BLED, LOW);
    }
    else if (mode == 2)
    {
    digitalWrite(RLED, LOW);
    digitalWrite(GLED, HIGH);
    digitalWrite(BLED, LOW);
    }
    else if (mode == 3)
    {
    digitalWrite(RLED, LOW);
    digitalWrite(GLED, LOW);
    digitalWrite(BLED, HIGH);
    }
    else if (mode == 4)
    {
    analogWrite(RLED, 127);
    analogWrite(GLED, 0);
    analogWrite(BLED, 127);
    }
    else if (mode == 5)
    {
    analogWrite(RLED, 0);
    analogWrite(GLED, 127);
    analogWrite(BLED, 127);
    }
    else if (mode == 6)
    {
    analogWrite(RLED, 127);
    analogWrite(GLED, 127);
    analogWrite(BLED, 0);

    }
    else if (mode == 7)
    {
    analogWrite(RLED, 85);
    analogWrite(GLED, 85);
    analogWrite(BLED, 85);
    }
    else if(mode == 8)
    {
    for(int i=0; i<256; i=i+5)
    {
    analogWrite(LED, i);
    delay(10);
    }
    for(int i=255; i>=0; i=i-5)
    {
    analogWrite(LED, i);
    delay(10);
    }
    }
    else
    {
    analogWrite(RLED, LOW);
    analogWrite(GLED, LOW);
    analogWrite(BLED, LOW);
    }

    }
    void loop()
    {
    currentButton = debounce(lastButton);

    if (lastButton == LOW && currentButton == HIGH)
    {
    ledMode++;
    }
    lastButton = currentButton;

    if (ledMode == 10) ledMode = 0;
    setMode(ledMode);
    }
     
  6. Спасибо что быстро ответили.
    Суть я понял итого :
    Код (C++):
    const int BLED=9;
    const int GLED=10;
    const int RLED=11;
    const int LED=12;
    const int BUTTON=2;
    boolean lastButton = LOW;
    boolean currentButton = LOW;
    int ledMode = 0;

    void setup()
    {
    pinMode(BLED, OUTPUT);
    pinMode(GLED, OUTPUT);
    pinMode(RLED, OUTPUT);
    pinMode(LED, OUTPUT);
    pinMode(BUTTON, INPUT);
    }
    boolean debounce(boolean last)
    {
    boolean current = digitalRead(BUTTON);
    if (last != current)
    {
    delay(5);
    current = digitalRead(BUTTON);
    return current;
    }
    }
    void setMode(int mode)
    {
    if (mode == 1)
    {
    digitalWrite(RLED, HIGH);
    digitalWrite(GLED, LOW);
    digitalWrite(BLED, LOW);
    }
    else if (mode == 2)
    {
    digitalWrite(RLED, LOW);
    digitalWrite(GLED, HIGH);
    digitalWrite(BLED, LOW);
    }
    else if (mode == 3)
    {
    digitalWrite(RLED, LOW);
    digitalWrite(GLED, LOW);
    digitalWrite(BLED, HIGH);
    }
    else if (mode == 4)
    {
    analogWrite(RLED, 127);
    analogWrite(GLED, 0);
    analogWrite(BLED, 127);
    }
    else if (mode == 5)
    {
    analogWrite(RLED, 0);
    analogWrite(GLED, 127);
    analogWrite(BLED, 127);
    }
    else if (mode == 6)
    {
    analogWrite(RLED, 127);
    analogWrite(GLED, 127);
    analogWrite(BLED, 0);

    }
    else if (mode == 7)
    {
    analogWrite(RLED, 85);
    analogWrite(GLED, 85);
    analogWrite(BLED, 85);
    }
    else if(mode == 8)
    {
    for(int i=0; i<256; i=i+5)
    {
    analogWrite(LED, i);
    delay(10);
    }
    for(int i=255; i>=0; i=i-5)
    {
    analogWrite(LED, i);
    delay(10);
    }
    }
    else
    {
    analogWrite(RLED, LOW);
    analogWrite(GLED, LOW);
    analogWrite(BLED, LOW);
    }

    }
    void loop()
    {
    currentButton = debounce(lastButton);

    if (lastButton == LOW && currentButton == HIGH)
    {
    ledMode++;
    }
    lastButton = currentButton;

    if (ledMode == 10) ledMode = 0;
    setMode(ledMode);
    }
    Есть ещё один вопрос.
    Теперь на режиме плавного увеличения яркости происходит мигание и режимы больше не переключаются до перезагрузки Ардуино, после реежими отрабатывают все и на 8 мигание и стопор.
    Что может быть? Куда копать ?
     
  7. Обратил внимание что при переходе режим плавного увеличения яркости (mode ==8). Предыдущий не отключается. В чем может быть причина ?
     
  8. NikitOS

    NikitOS Король шутов Администратор

    А так?
    Код (C++):
    const int BLED=9;
    const int GLED=10;
    const int RLED=11;
    const int LED=12;
    const int BUTTON=2;
    boolean lastButton = LOW;
    boolean currentButton = LOW;
    int ledMode = 0;

    void setup()
    {
    pinMode(BLED, OUTPUT);
    pinMode(GLED, OUTPUT);
    pinMode(RLED, OUTPUT);
    pinMode(LED, OUTPUT);
    pinMode(BUTTON, INPUT);
    }
    boolean debounce(boolean last)
    {
    boolean current = digitalRead(BUTTON);
    if (last != current)
    {
    delay(5);
    current = digitalRead(BUTTON);
    return current;
    }
    }
    void setMode(int mode)
    {
    if (mode == 1)
    {
    digitalWrite(RLED, HIGH);
    digitalWrite(GLED, LOW);
    digitalWrite(BLED, LOW);
    }
    else if (mode == 2)
    {
    digitalWrite(RLED, LOW);
    digitalWrite(GLED, HIGH);
    digitalWrite(BLED, LOW);
    }
    else if (mode == 3)
    {
    digitalWrite(RLED, LOW);
    digitalWrite(GLED, LOW);
    digitalWrite(BLED, HIGH);
    }
    else if (mode == 4)
    {
    analogWrite(RLED, 127);
    analogWrite(GLED, 0);
    analogWrite(BLED, 127);
    }
    else if (mode == 5)
    {
    analogWrite(RLED, 0);
    analogWrite(GLED, 127);
    analogWrite(BLED, 127);
    }
    else if (mode == 6)
    {
    analogWrite(RLED, 127);
    analogWrite(GLED, 127);
    analogWrite(BLED, 0);

    }
    else if (mode == 7)
    {
    analogWrite(RLED, 85);
    analogWrite(GLED, 85);
    analogWrite(BLED, 85);
    }
    else if(mode == 8)
    {
    for(int i=0; i<256; i=i+5)
    {
    analogWrite(LED, i);
    delay(10);
    }
    for(int i=255; i>=0; i=i-5)
    {
    analogWrite(LED, i);
    delay(10);
    }
    }
    else
    {
    analogWrite(RLED, LOW);
    analogWrite(GLED, LOW);
    analogWrite(BLED, LOW);
    }

    }
    void loop()
    {
    currentButton = debounce(lastButton);

    if (lastButton == LOW && currentButton == HIGH)
    {
    ledMode++;
    }
    lastButton = currentButton;

    if (ledMode == 9) ledMode = 0;
    setMode(ledMode);
    }
    PS: Можно на ты, таки я на год только старше;)
     
  9. Ок)
    Попробовал методом тыка, плавности добился и режиме переделана сжимая без задержки но вот работают сразу два режима 7 и 8 . Не пойму почему предвидущий режим не отключается (mode == 7)
    Код (C++):
    const int BLED=9;
    const int GLED=10;
    const int RLED=11;
    const int LED=12;
    const int BUTTON=2;
    boolean lastButton = LOW;
    boolean currentButton = LOW;
    int ledMode = 0;

    void setup()
    {
    pinMode(BLED, OUTPUT);
    pinMode(GLED, OUTPUT);
    pinMode(RLED, OUTPUT);
    pinMode(LED, OUTPUT);
    pinMode(BUTTON, INPUT);
    }
    boolean debounce(boolean last)
    {
    boolean current = digitalRead(BUTTON);
    if (last != current)
    {
    delay(5);
    current = digitalRead(BUTTON);
    return current;
    }
    }
    void setMode(int mode)
    {
    if (mode == 1)
    {
    digitalWrite(RLED, HIGH);
    digitalWrite(GLED, LOW);
    digitalWrite(BLED, LOW);
    }
    else if (mode == 2)
    {
    digitalWrite(RLED, LOW);
    digitalWrite(GLED, HIGH);
    digitalWrite(BLED, LOW);
    }
    else if (mode == 3)
    {
    digitalWrite(RLED, LOW);
    digitalWrite(GLED, LOW);
    digitalWrite(BLED, HIGH);
    }
    else if (mode == 4)
    {
    analogWrite(RLED, 127);
    analogWrite(GLED, 0);
    analogWrite(BLED, 127);
    }
    else if (mode == 5)
    {
    analogWrite(RLED, 0);
    analogWrite(GLED, 127);
    analogWrite(BLED, 127);
    }
    else if (mode == 6)
    {
    analogWrite(RLED, 127);
    analogWrite(GLED, 127);
    analogWrite(BLED, 0);

    }
    else if (mode == 7)
    {
    analogWrite(RLED, 85);
    analogWrite(GLED, 85);
    analogWrite(BLED, 85);
    }
    else if(mode == 8)
    {
    for(int i=0; i<256; i=i+2)
    {
    analogWrite(LED, i);
    delay(1);
    }
    for(int i=255; i>=0; i=i-2)
    {
    analogWrite(LED, i);
    delay(1);
    }
    }
    else
    {
    analogWrite(RLED, LOW);
    analogWrite(GLED, LOW);
    analogWrite(BLED, LOW);
    }

    }
    void loop()
    {
    currentButton = debounce(lastButton);

    if (lastButton == LOW && currentButton == HIGH)
    {
    ledMode++;
    }
    lastButton = currentButton;

    if (ledMode == 8) ledMode = 0;
    setMode(ledMode);
    }
     
  10. Не получается.
    1. Не работает шим на выходах. Перепробовал все доступные 3,5,6,9,10,11
    2. Не отключается mode =7 при переходе на 8
    Что не так делаю ?!!!??
    Код (C++):
    const int BLED=9;
    const int GLED=10;
    const int RLED=11;
    const int LED=5;
    const int BUTTON=2;
    boolean lastButton = LOW;
    boolean currentButton = LOW;
    int ledMode = 0;

    void setup()
    {
    pinMode(BLED, OUTPUT);
    pinMode(GLED, OUTPUT);
    pinMode(RLED, OUTPUT);
    pinMode(LED, OUTPUT);
    pinMode(BUTTON, INPUT);
    }
    boolean debounce(boolean last)
    {
    boolean current = digitalRead(BUTTON);
    if (last != current)
    {
    delay(5);
    current = digitalRead(BUTTON);
    return current;
    }
    }
    void setMode(int mode)
    {
    if (mode == 1)
    {
    digitalWrite(RLED, HIGH);
    digitalWrite(GLED, LOW);
    digitalWrite(BLED, LOW);
    }
    else if (mode == 2)
    {
    digitalWrite(RLED, LOW);
    digitalWrite(GLED, HIGH);
    digitalWrite(BLED, LOW);
    }
    else if (mode == 3)
    {
    digitalWrite(RLED, LOW);
    digitalWrite(GLED, LOW);
    digitalWrite(BLED, HIGH);
    }
    else if (mode == 4)
    {
    analogWrite(RLED, 127);
    analogWrite(GLED, 0);
    analogWrite(BLED, 127);
    }
    else if (mode == 5)
    {
    analogWrite(RLED, 0);
    analogWrite(GLED, 127);
    analogWrite(BLED, 127);
    }
    else if (mode == 6)
    {
    analogWrite(RLED, 127);
    analogWrite(GLED, 127);
    analogWrite(BLED, 0);

    }
    else if (mode == 7)
    {
    analogWrite(RLED, 85);
    analogWrite(GLED, 85);
    analogWrite(BLED, 85);
    }
    else if(mode == 8)
    {
    for (int i=0; i<256; i=i++)
    {
    analogWrite(LED, i);
    delay(10);
    }
    for (int i=255; i>=0; i=i--)
    {
    analogWrite(LED, i);
    delay(10);
    }
    }
    else
    {
    analogWrite(RLED, LOW);
    analogWrite(GLED, LOW);
    analogWrite(BLED, LOW);
    }

    }
    void loop()
    {
    currentButton = debounce(lastButton);

    if (lastButton == LOW && currentButton == HIGH)
    {
    ledMode++;
    }
    lastButton = currentButton;

    if (ledMode == 8) ledMode = 0;
    setMode(ledMode);
    }
     
  11. 9xA59kK

    9xA59kK Гик

    Для отладки используй монитор порта. Выводи в него значения переменных , контролируй с помощью него что происходит. Посмотри тут.
    добавь в Setup строку Serial.begin(9600);
    Код (C++):

    void setup()
    {
    Serial.begin(9600);
    //........ниже твой код
    }
    void loop()
    {
    //......в Serial.print( сюда вставляешь свою переменную для контроля);
    //..например ledMode

    Serial.print(ledMode);
    Serial.println();
    //или еще одну переменную и так далее и т.п.
    Serial.print(mode);
    Serial.println();      
    }
    далее заливаешь скетч и открываешь монитор порта , наблюдаешь, делаешь выводы.

    Удобнее выводить в порт с именем переменной например вот так
    Код (C++):

    void setup()
    {
    Serial.begin(9600);
    //........ниже твой код
    }
    void loop()
    {
    //................
    Serial.print("ledMode = ");   //в ковычках имя переменной
    Serial.print(ledMode);         // без ковычек сама переменная
    Serial.println();                    // переход на начало новой пустой строки
    //или еще одну переменную и так далее и т.п.
    Serial.print("mode = ");
    Serial.print(mode);
    Serial.println();      
    }
    далее заливаешь скетч и открываешь монитор порта , наблюдаешь, делаешь выводы.


    ps// Тaкже можно и в Setup добавить
    Serial.begin(9600); // пишем в начало setup

    Serial.print(mode);
    Serial.println();
    добавить эти инструкции надо в конец setup или сразу после выполненной операции, потому что в setup твои инструкции выполнятся один раз.
     
    Последнее редактирование: 17 июн 2018
    Shura_krivie_ruki нравится это.
  12. ZAZ-965

    ZAZ-965 Гуру

    @Shura_krivie_ruki, вы хотите добавить режим плавного изменения яркости для RGB светодиода или добавить еще один (например White светодиод)?
    Если для текущего RGB светодиода
    Код (C++):
    const int BLED=9;
    const int GLED=10;
    const int RLED=11;
    const int BUTTON=2;
    boolean lastButton = LOW;
    boolean currentButton = LOW;
    int ledMode = 0;

    void setup()
    {
    pinMode(BLED, OUTPUT);
    pinMode(GLED, OUTPUT);
    pinMode(RLED, OUTPUT);
    pinMode(BUTTON, INPUT);
    }
    boolean debounce(boolean last)
    {
    boolean current = digitalRead(BUTTON);
    if (last != current)
    {
    delay(5);
    current = digitalRead(BUTTON);
    return current;
    }
    }
    void setMode(int mode)
    {
    if (mode == 1)
    {
    digitalWrite(RLED, HIGH);
    digitalWrite(GLED, LOW);
    digitalWrite(BLED, LOW);
    }
    else if (mode == 2)
    {
    digitalWrite(RLED, LOW);
    digitalWrite(GLED, HIGH);
    digitalWrite(BLED, LOW);
    }
    else if (mode == 3)
    {
    digitalWrite(RLED, LOW);
    digitalWrite(GLED, LOW);
    digitalWrite(BLED, HIGH);
    }
    else if (mode == 4)
    {
    analogWrite(RLED, 127);
    analogWrite(GLED, 0);
    analogWrite(BLED, 127);
    }
    else if (mode == 5)
    {
    analogWrite(RLED, 0);
    analogWrite(GLED, 127);
    analogWrite(BLED, 127);
    }
    else if (mode == 6)
    {
    analogWrite(RLED, 127);
    analogWrite(GLED, 127);
    analogWrite(BLED, 0);
    }
    else if (mode == 7)
    {
    analogWrite(RLED, 85);
    analogWrite(GLED, 85);
    analogWrite(BLED, 85);
    }
    else if (mode == 8)   //режим плавного загорания
    {
    for (int i=0; i<256; i=i+5)
    {
    analogWrite(RLED, i);
    analogWrite(GLED, i);
    analogWrite(BLED, i);
    delay(20);
    }
    }

    else if (mode == 9)   //режим плавного затухания
    {
    for (int i=255; i>=0; i=i-5)
    {
    analogWrite(RLED, i);
    analogWrite(GLED, i);
    analogWrite(BLED, i);
    delay(20);
    }
    }
    else
    {
    analogWrite(RLED, LOW);
    analogWrite(GLED, LOW);
    analogWrite(BLED, LOW);
    }

    }
    void loop()
    {
    currentButton = debounce(lastButton);

    if (lastButton == LOW && currentButton == HIGH)
    {
    ledMode++;
    }
    lastButton = currentButton;

    if (ledMode == 10) ledMode = 0;
    setMode(ledMode);
    }
     
    Shura_krivie_ruki нравится это.
  13. ZAZ-965

    ZAZ-965 Гуру

    Если для дополнительного светодиода
    Код (C++):
    const int BLED=9;
    const int GLED=10;
    const int RLED=11;
    const int LED=5;
    const int BUTTON=2;
    boolean lastButton = LOW;
    boolean currentButton = LOW;
    int ledMode = 0;

    void setup()
    {
    pinMode(BLED, OUTPUT);
    pinMode(GLED, OUTPUT);
    pinMode(RLED, OUTPUT);
    pinMode(LED, OUTPUT);
    pinMode(BUTTON, INPUT);
    }
    boolean debounce(boolean last)
    {
    boolean current = digitalRead(BUTTON);
    if (last != current)
    {
    delay(5);
    current = digitalRead(BUTTON);
    return current;
    }
    }
    void setMode(int mode)
    {
    if (mode == 1)
    {
    analogWrite(LED, LOW); // В режимах 1-7 LED не учавствует - гасим его
    digitalWrite(RLED, HIGH);
    digitalWrite(GLED, LOW);
    digitalWrite(BLED, LOW);
    }
    else if (mode == 2)
    {
    digitalWrite(RLED, LOW);
    digitalWrite(GLED, HIGH);
    digitalWrite(BLED, LOW);
    }
    else if (mode == 3)
    {
    digitalWrite(RLED, LOW);
    digitalWrite(GLED, LOW);
    digitalWrite(BLED, HIGH);
    }
    else if (mode == 4)
    {
    analogWrite(RLED, 127);
    analogWrite(GLED, 0);
    analogWrite(BLED, 127);
    }
    else if (mode == 5)
    {
    analogWrite(RLED, 0);
    analogWrite(GLED, 127);
    analogWrite(BLED, 127);
    }
    else if (mode == 6)
    {
    analogWrite(RLED, 127);
    analogWrite(GLED, 127);
    analogWrite(BLED, 0);

    }
    else if (mode == 7)
    {
    analogWrite(RLED, 85);
    analogWrite(GLED, 85);
    analogWrite(BLED, 85);
    }
    else if(mode == 8) // в этом режиме RGB не используется - гасим их
    {
    analogWrite(RLED, LOW);
    analogWrite(GLED, LOW);
    analogWrite(BLED, LOW);
    for (int i=0; i<256; i=i++)
    {
    analogWrite(LED, i);
    delay(10);
    }
    for (int i=255; i>=0; i=i--)
    {
    analogWrite(LED, i);
    delay(10);
    }
    }
    else
    {
    analogWrite(RLED, LOW);
    analogWrite(GLED, LOW);
    analogWrite(BLED, LOW);
    analogWrite(LED, LOW);
    }

    }
    void loop()
    {
    currentButton = debounce(lastButton);

    if (lastButton == LOW && currentButton == HIGH)
    {
    ledMode++;
    }
    lastButton = currentButton;

    if (ledMode == 9) ledMode = 0;
    setMode(ledMode);
    }
    @Shura_krivie_ruki, вам задачка - добавить обратное переключение режимов, переделать с использованием switch case, повторяющиеся analogWrite обернуть в функцию с тремя (или четырьмя) параметрами.
     
    Shura_krivie_ruki нравится это.
  14. Ребят способом большое !!! Пойду пилить). Орезультатах отпишу.
     
  15. Планировал сначала с RGB светодиодом не получилось потом пытался с отдельным тоже не особо получилось)
     
  16. ostrov

    ostrov Гуру

    Исправьте заголовок на информативный.
     
  17. Что не выходит каменный цветочек!(
    С примером от ZAZ-965 для RGB разобрался в своих ошибках. ( Задачкай займусь чуть позже. Сейчас она уже не такой сложной кажется)
    Но вот с добавлением ещё одного светодиода и с выводам данных на монитор у меня провал.
    - почему-то когда доходит режим до включения светодиода который привязан к 5 выходу Ардуино все гаснит и больше схема не управляется.
    Код (C++):
    const int BLED=9;
    const int GLED=10;
    const int RLED=11;
    const int LED=5;
    const int BUTTON=2;
    boolean lastButton = LOW;
    boolean currentButton = LOW;
    int ledMode = 0;

    void setup()
    {
    Serial.begin(115200);
    pinMode(BLED, OUTPUT);
    pinMode(GLED, OUTPUT);
    pinMode(RLED, OUTPUT);
    pinMode(LED, OUTPUT);
    pinMode(BUTTON, INPUT);
    }
    boolean debounce(boolean last)
    {
    boolean current = digitalRead(BUTTON);
    if (last != current)
    {
    delay(5);
    current = digitalRead(BUTTON);
    return current;
    }
    }
    void setMode(int mode)
    {
    if (mode == 1)
    {
    analogWrite(LED, LOW); // В режимах 1-7 LED не учавствует - гасим его
    digitalWrite(RLED, HIGH);
    digitalWrite(GLED, LOW);
    digitalWrite(BLED, LOW);
    }
    else if (mode == 2)
    {
    digitalWrite(RLED, LOW);
    digitalWrite(GLED, HIGH);
    digitalWrite(BLED, LOW);
    }
    else if (mode == 3)
    {
    digitalWrite(RLED, LOW);
    digitalWrite(GLED, LOW);
    digitalWrite(BLED, HIGH);
    }
    else if (mode == 4)
    {
    analogWrite(RLED, 127);
    analogWrite(GLED, 0);
    analogWrite(BLED, 127);
    }
    else if (mode == 5)
    {
    analogWrite(RLED, 0);
    analogWrite(GLED, 127);
    analogWrite(BLED, 127);
    }
    else if (mode == 6)
    {
    analogWrite(RLED, 127);
    analogWrite(GLED, 127);
    analogWrite(BLED, 0);

    }
    else if (mode == 7)
    {
    analogWrite(RLED, 85);
    analogWrite(GLED, 85);
    analogWrite(BLED, 85);
    }
    else if(mode == 8) // в этом режиме RGB не используется - гасим их
    {
    analogWrite(RLED, LOW);
    analogWrite(GLED, LOW);
    analogWrite(BLED, LOW);
    for (int i=0; i<256; i=i++)
    {
    analogWrite(LED, i);
    delay(10);
    }
    for (int i=255; i>=0; i=i--)
    {
    analogWrite(LED, i);
    delay(10);
    }
    }
    else
    {
    analogWrite(RLED, LOW);
    analogWrite(GLED, LOW);
    analogWrite(BLED, LOW);
    analogWrite(LED, LOW);
    }

    }
    void loop()
    {
                                    {
    Serial.print(ledMode);
    Serial.println();
                    delay(500);    
    Serial.print("mode = rgb");
    Serial.println();
                    delay(1100);  
                                   
                    }

    currentButton = debounce(lastButton);

    if (lastButton == LOW && currentButton == HIGH)
    {
    ledMode++;
    }
    lastButton = currentButton;
    if (ledMode == 9) ledMode = 0;
    setMode(ledMode);
    }

     
    Показания монитора скопировать не могу, работаю с планшета.
    Выглядят примерно так
    Код (C++):
    0
    mode = rgb
    0
    mode = rgb
    1
    mode = rgb
    2
    И потом как переключать на 8 режим всё висит
    mode = rgb
    7
    mode = rgb

     
    Куда копать ?
     
  18. Да и ещё стало очень долгое переключение режимов примерно секунд 10 нужно держать кнопку
     
  19. ZAZ-965

    ZAZ-965 Гуру

    Во втором скетче стоит поправить циклы - не заметил мелкого шага приращения.
    Код (C++):
    for (int i=0; i<256; i=i++)
    for (int i=255; i>=0; i=i--)
    на
    for (int i=0; i<256; i=i+5)
    for (int i=255; i>=0; i=i-5)
     
    При 256 шагаг и 10 мс задержке цикл крутится 2,5 сек не опрашивая клавитуру. Чтобы кнопка реагировала мгновенно - используйте прерывание, тем более кнопка уже подключена к пину 2 на котором работает прерывание INT0.