Проект светильника с разными режимами

Создал код совместно с ЧатGPT. кнопкой переключаются режимы. Кнопка к пину 10 и питанию с резистором от пина до земли.
Есть ргб светодиод и оранжевый.
Все режимы нормально переключает, но режим радуги проскакивает.

const int redPin = 9;
const int greenPin = 6;
const int bluePin = 5;
const int orangePin = 3;
const int buttonPin = 10;
const int FADE_DELAY = 10; // Задержка между шагами плавного изменения цвета

int currentMode = 0;

// Массив с цветами радуги в RGB формате
int rainbow[][3] = {
  {255, 0, 0},    // Красный
  {255, 255, 0},  // Желтый
  {0, 255, 0},    // Зеленый
  {0, 255, 255},  // Голубой
  {0, 0, 255},    // Синий
  {255, 0, 255}   // Фиолетовый
};

void updateLEDs() {
  analogWrite(redPin, 0);
  analogWrite(greenPin, 0);
  analogWrite(bluePin, 0);
  analogWrite(orangePin, 0);
}

void setup() {
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
  pinMode(orangePin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
  updateLEDs();
}

unsigned long lastDebounceTime = 0;  // Переменная для хранения времени последнего нажатия
unsigned long debounceDelay = 500;    // Задержка для дебаунсинга

void loop() {
  unsigned long currentMillis = millis();  // Получение текущего времени
  
  // Проверка, прошла ли достаточная задержка для дебаунсинга
  if (currentMillis - lastDebounceTime > debounceDelay) {
    if (digitalRead(buttonPin) == LOW) {
      currentMode = (currentMode + 1) % 11;
      updateLEDs();
      lastDebounceTime = currentMillis;  // Обновление времени последнего нажатия
    }
  }

  switch (currentMode) {
    case 0:
      break;
    case 1:
      analogWrite(orangePin, 255);
      break;
    case 2:
      analogWrite(orangePin, 155);
      break;
    case 3:
      rainbowEffect();
      break;
    case 4:
      analogWrite(redPin, 255);
      break;
    case 5:
      analogWrite(redPin, 255);
      analogWrite(greenPin, 255);
      break;
    case 6:
      analogWrite(greenPin, 255);
      break;
    case 7:
      analogWrite(greenPin, 255);
      analogWrite(bluePin, 255);
      break;
    case 8:
      analogWrite(bluePin, 255);
      break;
    case 9:
      analogWrite(redPin, 255);
      analogWrite(bluePin, 255);
      break;
    case 10:
      analogWrite(redPin, 255);
      analogWrite(greenPin, 255);
      analogWrite(bluePin, 255);
      break;
  }
}

void rainbowEffect() {
  for (int colorIndex = 0; colorIndex < 5; colorIndex++) {
    if (digitalRead(buttonPin) == LOW) {
      delay(50);
      currentMode = (currentMode + 1) % 11;
      updateLEDs();
      return; // Выход из функции и цикла, чтобы перейти к следующему режиму
    }
    
    int startColor[3] = {rainbow[colorIndex][0], rainbow[colorIndex][1], rainbow[colorIndex][2]};
    int endColor[3] = {rainbow[colorIndex + 1][0], rainbow[colorIndex + 1][1], rainbow[colorIndex + 1][2]};

    for (int step = 0; step <= 255; step++) {
      int currentColor[3];
      for (int j = 0; j < 3; j++) {
        currentColor[j] = startColor[j] + (endColor[j] - startColor[j]) * step / 255;
      }
      analogWrite(redPin, currentColor[0]);
      analogWrite(greenPin, currentColor[1]);
      analogWrite(bluePin, currentColor[2]);
      delay(FADE_DELAY);
      if (colorIndex == 4) {
        delay(1000); // Дополнительная пауза перед возвращением к началу
      } else {
        delay(1000); // Пауза между цветами
      }
    }
  }
}

Ну так Вы знаете, кому нужно задавать вопросы.

4 лайка

Что означает “режим радуги”? По-русски можно алгоритм описать?
Как должно быть и как работает сейчас.
Чёрти что. Массивы в массивах погоняют массивами в массивах внутри вложенных циклов…аааа,где мой демидрол?
Сами-то понимаете что там происходит? Обычно принято код обильно снабжать комментариями: что,зачем,откуда и куда.

Тема с первых строк балансирует на грани ЧЧ…

1 лайк

помягче есть, аллервэй к примеру )))

1 лайк

Ну, Вы доработайте, а потом уж нам покажете, чего сейчас-то показываете?

Ну, почему? Возможно, это тема для обсуждения гпт. Думаю, что так и есть.

Заметьте, это чисто информационное сообщение - никаких вопросов и просьб к сообществу в теме нет.

Так что желающие могут потереть за “до чего дошёл прогресс”.

1 лайк

И неудивительно. Смотрите внимательнее в код:

Что Вы видите?
Я вот например вижу, что минимальная продолжительность Радуги - 255 секунд. И раньше вы ее не остановите никак, сколько на кнопку не жать. Да и потом тоже сомнительно - если только вы не угадаете нажать кнопку именно в те миллисекунды, когда программа проскакивает строчку 94.

Запомните правило - если вы хотите, чтобы программа реагировала на кнопки - в коде не должно быть операторов delay()

И передайте “ЧатГПТ” :slight_smile:

Вы решили это всерьёз пообсуждать? :slight_smile:

Почему нет? Глумится я уже опоздал…

Хм…а он пить умеет? Мне кажется,лет через 20 с ним можно будет опохмеляться.
Правильней rainbow[2]. От 0 до 2 будет 3 элемента.
Разве не 7 цветов у радуги? И мне кажется, комбинировать цвета надо так,чтоб в сумме было 255 для одинаковой яркости.

Эта мозгодробительная конструкция переключает режимы? Почему просто не приращивать значение?

неправильней…

Не путайте индекс и число элементов. Массив у ТС объявлен верно.

Точно. Лоханулся.

нет. В скобках указывается число элементов, индекс получается от 0 до (число элементов - 1).

1 лайк

Топикстартеру,походу, GPT запретил общаться с кожаными.

Кожаными? “Хотел ударить сильно и точно, но неудачно лёг на ногу кожаный дружок.”

ну почему же, миллис ведь работает, что затрудняет паразитировать кнопкам на оном (к примеру)?

В америке уже какого-то мужика до суицида довел, наверное и выпивали вместе…

Куски мяса. :rofl: