Помогите с кодом

Neznayka_V_shlape
Offline
Зарегистрирован: 22.07.2018

Ниже приложенный код (ардуино UNO) должен  при загрузке на плату и при нажатии кнопки "заставлять" RGB-светодиод загараться разными цветами (всего 7) -это работает правильно.   Но далее, согласно коду, при повторном нажатии на кнопку RGB-светодиод должен загараться теми же цветами, но при этом мигать каждым -этого не происходит (я нажимаю кнопку второй  раз, но светодиод продолжает загараться разными цветами без мигания). 

 

Подскажи пож., что не так? 

Вот код:

const int GLED = 10;
const int RLED = 11;
const int BLED = 9;
const int BUTTON = 2;

int RLEDState = LOW;
int BLEDState = LOW;
int GLEDState = LOW;
long previousMillis = 0;
long interval = 1000;

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);
    delay(1000);


    // зеленый

    digitalWrite(RLED, LOW);
    digitalWrite(GLED, HIGH );
    digitalWrite(BLED, LOW);
    delay(1000);

    // синий
    digitalWrite(RLED, LOW);
    digitalWrite(GLED, LOW);
    digitalWrite(BLED, HIGH);
    delay(1000);
    //ПУРПУРНЫЙ КР+С

    analogWrite(RLED, 127);
    analogWrite(GLED, 0);
    analogWrite(BLED, 127);
    delay(1000);
    //бирюзовый с+зел
    analogWrite(RLED, 0);
    analogWrite(GLED, 200);
    analogWrite(BLED, 90);
    delay(1000);
    //ОРАНЖЕВЫЙ ЗЕЛ+КР

    analogWrite(RLED, 224);
    analogWrite(GLED, 20);
    analogWrite(BLED, 0);
    delay(1000);
    // БЕЛЫЙ  ЗЕЛ+КР+С

    analogWrite(RLED, 127);
    analogWrite(GLED, 127);
    analogWrite(BLED, 127);
    delay(1000);

    analogWrite(RLED, LOW);
    analogWrite(GLED, LOW);
    analogWrite(BLED, LOW);
    delay(1000);
  }

   else if ( mode == 2)

  {
    // КРАСНЫЙ


    unsigned long currentMillis = millis();

    if (currentMillis - previousMillis >= interval) {

      previousMillis = currentMillis;


      if (RLEDState == LOW)
        RLEDState = HIGH;
      else
        RLEDState = LOW;
      digitalWrite(RLED, RLEDState);
    }
    delay(5000);
    // зеленый


    unsigned long currentMillis = millis();

    if (currentMillis - previousMillis >= interval) {

      previousMillis = currentMillis;


      if (GLEDState == LOW)
        GLEDState = HIGH;
      else
        GLEDState = LOW;
      digitalWrite(GLED, GLEDState);
    }
    delay(5000);

    // синий

    unsigned long currentMillis = millis();

    if (currentMillis - previousMillis >= interval) {

      previousMillis = currentMillis;


      if (BLEDState == LOW)
        BLEDState = HIGH;
      else
        BLEDState = LOW;
      digitalWrite(BLED, BLEDState);
    }
    delay(5000);
    //ПУРПУРНЫЙ КР+С



    unsigned long currentMillis = millis();

    if (currentMillis4 - previousMillis >= interval) {

      previousMillis = currentMillis;


      if (BLEDState == 0)
        BLEDState = 127;
      else
        BLEDState = 0;
      analogWrite(BLED, BLEDState);
      if (RLEDState == 0)
        RLEDState = 150;
      else
        RLEDState = 0;
      analogWrite(RLED, RLEDState);
    }
    delay(5000);

    //бирюзовый с+зел



    unsigned long currentMillis = millis();

    if (currentMillis - previousMillis >= interval) {

      previousMillis = currentMillis;


      if (GLEDState == 0)
        GLEDState = 200;
      else
        GLEDState = 0;
      analogWrite(GLED, GLEDState);
      if (BLEDState == 0)
        BLEDState = 90;
      else
        BLEDState = 0;
      analogWrite(BLED, BLEDState);
    }
    delay(1000);
    //ОРАНЖЕВЫЙ ЗЕЛ+КР
    unsigned long currentMillis = millis();
    if (currentMillis - previousMillis >= interval) {

      previousMillis = currentMillis;


      if (RLEDState == 0)
        RLEDState = 224;
      else
        RLEDState = 0;
      analogWrite(RLED, RLEDState);
      if (GLEDState == 0)
        GLEDState = 18;
      else
        GLEDState = 0;
      analogWrite(GLED, GLEDState);
    }
    delay(5000);
    // БЕЛЫЙ  ЗЕЛ+КР+С

    unsigned long currentMillis = millis();

    if (currentMillis1 - previousMillis >= interval) {

      previousMillis = currentMillis;


      if (BLEDState == 0)
        BLEDState = 127;
      else
        BLEDState = 0;
      analogWrite(BLED, BLEDState);
      if (RLEDState == 0)
        RLEDState = 140;
      else
        RLEDState = 0;
      analogWrite(RLED, RLEDState);
      if (GLEDState == 0)
        GLEDState = 127;
      else
        GLEDState = 0;
      analogWrite(GLED, GLEDState);
    }
    delay(5000);
  }
}



  void loop()
  {
    currentButton = debounce(lastButton);
    if (lastButton == LOW &&  currentButton == HIGH)
    {
      ledMode++;
    }
    lastButton = currentButton;
    if (ledMode == 3)
      ledMode = 0;
    setMode(ledMode);
  }

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Neznayka_V_shlape. Разумеется. Я бы дальше сказал, что вам надо укреплять свои программисткие мускулы, потому что с этими вы никуда не прийдете https://www.youtube.com/watch?v=P-5-HZi6OW4

ПС:#7

Neznayka_V_shlape
Offline
Зарегистрирован: 22.07.2018

Спасибо, любитель мультиков)

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Пробуйте

const int GLED = 10;
const int RLED = 11;
const int BLED = 9;
const int BUTTON = 2;

int RLEDState = LOW;
int BLEDState = LOW;
int GLEDState = LOW;
//uint32_t previousMillis = 0;
long interval = 1000;
byte kolor = 0;// 0-КРАСНЫЙ; 1-зеленый;2-синий;3-ПУРПУРНЫЙ;4-бирюзовый;5-ОРАНЖЕВЫЙ;6-БЕЛЫЙ;
byte variant_kolor = 0;

unsigned long currentMillis = millis();

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)
  {
    if (millis() - currentMillis >= interval) { 
      switch (kolor)
      {
      case 0:
        digitalWrite(RLED, HIGH);
        digitalWrite(GLED, LOW );
        digitalWrite(BLED, LOW);
        currentMillis = millis();
        kolor++;
        break;
      case 1:
        digitalWrite(RLED, LOW);
        digitalWrite(GLED, HIGH );
        digitalWrite(BLED, LOW);
        currentMillis = millis();
        kolor++;
        break;
      case 2:
        digitalWrite(RLED, LOW);
        digitalWrite(GLED, LOW);
        digitalWrite(BLED, HIGH);
        currentMillis = millis();
        kolor++;
        break;
      case 3:
        analogWrite(RLED, 127);
        analogWrite(GLED, 0);
        analogWrite(BLED, 127);
        currentMillis = millis();
        kolor++;
        break;
      case 4:
        analogWrite(RLED, 0);
        analogWrite(GLED, 200);
        analogWrite(BLED, 90);
        currentMillis = millis();
        kolor++;
        break;
      case 5:
        analogWrite(RLED, 224);
        analogWrite(GLED, 20);
        analogWrite(BLED, 0);
        currentMillis = millis();
        kolor++;
        break;
      case 6:
        analogWrite(RLED, 127);
        analogWrite(GLED, 127);
        analogWrite(BLED, 127);
        currentMillis = millis();
        kolor++;

        analogWrite(RLED, LOW);
        analogWrite(GLED, LOW);
        analogWrite(BLED, LOW);
        currentMillis = millis();
        kolor++;
        break;
      case 7:
        analogWrite(RLED, LOW);
        analogWrite(GLED, LOW);
        analogWrite(BLED, LOW);
        currentMillis = millis();
        kolor = 0;
        break;
      }
    }
  }
  else if ( mode == 2){
    interval = 500;
    if (millis() - currentMillis >= interval) {
      switch (variant_kolor){
      case 0:
        if (RLEDState == LOW) RLEDState = HIGH;
        else {
          RLEDState = LOW;
          digitalWrite(RLED, RLEDState);
        }
        currentMillis = millis();
        variant_kolor++;
        break;
      case 1:
        if (GLEDState == LOW) GLEDState = HIGH;
        else{
          GLEDState = LOW;
          digitalWrite(GLED, GLEDState);
        }
        currentMillis = millis();
        variant_kolor++;
        break;
      case 2:
        if (BLEDState == LOW) BLEDState = HIGH;
        else{
          BLEDState = LOW;
          digitalWrite(BLED, BLEDState);
        }
        currentMillis = millis();
        variant_kolor++;
        break;
      case 3:
        if (BLEDState == 0) BLEDState = 127;
        else{
          BLEDState = 0;
          analogWrite(BLED, BLEDState);
        }
        if (RLEDState == 0) RLEDState = 150;
        else{
          RLEDState = 0;
          analogWrite(RLED, RLEDState);
        }
        currentMillis = millis();
        variant_kolor++;
        break;
      case 4:
        if (GLEDState == 0) GLEDState = 200;
        else{
          GLEDState = 0;
          analogWrite(GLED, GLEDState);
        }
        if (BLEDState == 0) BLEDState = 90;
        else{
          BLEDState = 0;
          analogWrite(BLED, BLEDState);
        }
        currentMillis = millis();
        variant_kolor++;
        break;
      case 5:
        if (RLEDState == 0) RLEDState = 224;
        else{
          RLEDState = 0;
          analogWrite(RLED, RLEDState);
        }
        if (GLEDState == 0) GLEDState = 18;
        else{
          GLEDState = 0;
          analogWrite(GLED, GLEDState);
        }
        currentMillis = millis();
        variant_kolor++;
        break;
      case 6:
        if (BLEDState == 0) BLEDState = 127;
        else{
          BLEDState = 0;
          analogWrite(BLED, BLEDState);
        }
        if (RLEDState == 0) RLEDState = 140;
        else{
          RLEDState = 0;
          analogWrite(RLED, RLEDState);
        }
        if (GLEDState == 0) GLEDState = 127;
        else{
          GLEDState = 0;
          analogWrite(GLED, GLEDState);
        }
        currentMillis = millis();
        variant_kolor = 0;
        break;

      }
    }
  }
}

void loop()
{
  currentButton = debounce(lastButton);
  if (lastButton == LOW &&  currentButton == HIGH)
  {
    ledMode++;
    if (ledMode == 1)
    {
      interval = 1000;
      kolor = 0;
    }
    if (ledMode == 2)
    {
      interval = 5000;
      variant_kolor = 0;
    }
  }
  lastButton = currentButton;
  if (ledMode == 3)
    ledMode = 0;
  setMode(ledMode);
}

 

Neznayka_V_shlape
Offline
Зарегистрирован: 22.07.2018

спасибо, попробую!