Задать вопрос
Wolf_Yout
@Wolf_Yout

По совету для того чтобы работала кнопка, заменил delay, теперь после того как режим повторился два раза, всё начинает сходить сума, что делать?

Код:
byte mode;
byte repeated;
byte r1;
byte r2;
byte r3;
byte r4;
unsigned long last_time;
void setup() {
  // put your setup code here, to run once:
  pinMode(3, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(9, OUTPUT);
  mode = 1;
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  if(mode==1) {
    digitalWrite(3, 1); //Зажигаем красный светодиод
    if (millis() - last_time > 100) {
      last_time = millis();
      for(int i=0;i<=255;i++) { // Плавно добавляем зелёный
        analogWrite(6, i);
        delay(10);
      } 
    }
    if (millis() - last_time > 100) {
      last_time = millis();
      for(int i=255;i>=0;i--) { //Плавно выключаем красный
        analogWrite(3, i);
        delay(10);
      }  
    }
    
    if (millis() - last_time > 100) {
      last_time = millis();
      for(int i=0;i<=255;i++) { //Плавно добавляем синий
        analogWrite(9, i);
        delay(10);
      }
    }
    
    if (millis() - last_time > 100) {
      last_time = millis();
      for(int i=255;i>=0;i--) { //Плавно выключаем зелёный
        analogWrite(6, i);
        delay(10);
      }  
    }
    if (millis() - last_time > 100) {
      last_time = millis();
      for(int i=0;i<=255;i++) { //Плавно Включаем красный
        analogWrite(3, i);
        delay(10);
      }  
    }
    
    if (millis() - last_time > 100) {
      last_time = millis();
      for(int i=255;i>=0;i--) { //Плавно выключаем синий
        analogWrite(9, i);
        delay(10);
      }
    }
    if (millis() - last_time > 100) {
      last_time = millis();
    }
  }
  if(mode==2) {
    digitalWrite(3, 1);
    if (millis() - last_time > 100) {
      last_time = millis();
      digitalWrite(3,0);
      digitalWrite(6,1);
    }
    if (millis() - last_time > 100) {
      last_time = millis();
      digitalWrite(6,0);
      digitalWrite(9,1);
    }
    if (millis() - last_time > 100) {
      last_time = millis();
      digitalWrite(9,0);
    }
    if (millis() - last_time > 100) {
      last_time = millis();
    }
  }
  if(mode==3) {
    int led = random(1,4);
    Serial.print(led);
    if(led==1) {
      digitalWrite(3, 1);
      if (millis() - last_time > 1000) {
        last_time = millis();
        digitalWrite(3, 0);
      }
    }
    if(led==2) {
      digitalWrite(6, 1);
      if (millis() - last_time > 1000) {
        last_time = millis();
        digitalWrite(6, 0);
      }
    }
    if(led==3) {
      digitalWrite(9, 1);
      if (millis() - last_time > 1000) {
        last_time = millis();
        digitalWrite(9, 0);
      }
    }
  }
  if(mode==4) {
    for(int i=0;i<=255;i++) { //Плавно выключаем синий
      analogWrite(3, i);
      analogWrite(6, i);
      analogWrite(9, i);
      delay(5);
    }
    for(int i=255;i>=0;i--) { //Плавно выключаем синий
      analogWrite(3, i);
      analogWrite(6, i);
      analogWrite(9, i);
      delay(5);
    }
  }
}

Так как пока что нет кнопки, решил подождать выходные только с радугой, но проблема в том, то что когда этот режим повторился два раза, всё начало сходить с ума: Не включаются светодиоды, дважды загорается один и тот же, включаются сразу два светодиода, включается другой светодиод вместо нужного и т.д. Я не понимаю где моя ошибка, помогите.
  • Вопрос задан
  • 51 просмотр
Подписаться 1 Простой Комментировать
Решения вопроса 1
@kalapanga
Поскольку чёткого словесного описания того, что программа должна делать нет, то всю логику проверить нет возможности. Но первая очевидная ошибка - это то, что Вы для всех событий используете единственную переменную last_time. Так в жизни не бывает. У Вас в программе одновременно отсчитываются несколько временных интервалов и для каждого должен быть свой счётчик.
Рекомендую погуглить статьи на тему "конечные автоматы на ардуино". Это наиболее универсальный подход к решению задач, подобных вашей.
Ну и как-то немного странно - нет кнопки. Два проводка воткнутые в ардуину, которые можно замыкать между собой - вполне себе кнопка!
p.s. Если честно, есть ещё один путь. Использовать одну из библиотек с "таймерами". Там вся эта работа с миллис убрана от пользователя. Но лучше всё-таки один раз самому разобраться, а уж потом, когда будет понимание, можно использовать что угодно.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы