Схемы мигания светодиодов с несколькими светодиодами с помощью millis() без использования Delay()

Я хочу создать схемы мигания нескольких светодиодов с помощью функции millis(). Я исследовал эту проблему, но не нашел идеального решения.

Я нашел один блог, но в нем используется массив светодиодных контактов; Мне нужно решение без массива. Будем признательны за любую помощь.

Это мой код, который я написал:

const int Button_code_1 = 2;
const int Button_code_2 = 3;
const int Button_code_stop = 4;

const int LED_one = 6;
const int LED_two = 8;
const int LED_three = 10;
const int LED_four = 12;

int buttonState_code_1 = 0;
int buttonState_code_2 = 0;
int buttonState_code_stop = 0;

void setup() {
  // put your setup code here, to run once:

  Serial.begin(9600);

  pinMode(Button_code_1,INPUT);
  pinMode(Button_code_2,INPUT);
  pinMode(Button_code_stop,INPUT);

  pinMode(LED_Button_one,INPUT);
  pinMode(LED_Button_two,INPUT);
  pinMode(LED_Button_three,INPUT);
  pinMode(LED_Button_four,INPUT);
  
  pinMode(LED_one, OUTPUT);
  pinMode(LED_two, OUTPUT);
  pinMode(LED_three, OUTPUT);
  pinMode(LED_four, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:

  buttonState_code_1 = digitalRead(Button_code_1);
  Serial.println(buttonState_code_1);
  buttonState_code_2 = digitalRead(Button_code_2);
  Serial.println(buttonState_code_2);
  delay(1000);
  buttonState_code_stop = digitalRead(Button_code_stop);
  
  if(buttonState_code_1==1)
  {
    pattern_one();
  }
  if(buttonState_code_2==1)
  {
    pattern_two();
  }

}

void pattern_one()
{
  digitalWrite(LED_one, LOW);
  digitalWrite(LED_two, HIGH);
  digitalWrite(LED_three, LOW);
  digitalWrite(LED_four, LOW);
  delay(3000);
  digitalWrite(LED_one, LOW);
  digitalWrite(LED_two, LOW);
  digitalWrite(LED_three, LOW);
  digitalWrite(LED_four, HIGH);
  delay(3000);
  digitalWrite(LED_one, HIGH);
  digitalWrite(LED_two, LOW);
  digitalWrite(LED_three, LOW);
  digitalWrite(LED_four, LOW);
  delay(3000);
  digitalWrite(LED_one, LOW);
  digitalWrite(LED_two, LOW);
  digitalWrite(LED_three, HIGH);
  digitalWrite(LED_four, LOW);
  delay(3000);
}

void pattern_two()
{
  digitalWrite(LED_one, HIGH);
  digitalWrite(LED_two, LOW);
  digitalWrite(LED_three, LOW);
  digitalWrite(LED_four, LOW);
  delay(3000);
  digitalWrite(LED_one, LOW);
  digitalWrite(LED_two, LOW);
  digitalWrite(LED_three, HIGH);
  digitalWrite(LED_four, LOW);
  delay(3000);
  digitalWrite(LED_one, LOW);
  digitalWrite(LED_two, HIGH);
  digitalWrite(LED_three, LOW);
  digitalWrite(LED_four, LOW);
  delay(3000);
  digitalWrite(LED_one, LOW);
  digitalWrite(LED_two, LOW);
  digitalWrite(LED_three, LOW);
  digitalWrite(LED_four, HIGH);
  delay(3000);
}

Это мой пример кода с четырьмя светодиодами. Я написал этот код с помощью delay(), поэтому, когда я хочу изменить шаблон, я не могу, потому что delay() блокирует код.

Я изучил этот вопрос и нашел в качестве решения функцию millis(). Как реализовать этот код с помощью функции millis()?

, 👍-2

Обсуждение

1. Почему без массива? Это странное требование. Это для школьных упражнений? 2. Вы не предоставили нам достаточно информации, чтобы помочь вам. Какова именно ваша цель и какая у вас проблема в ее реализации, @chrisl

У меня 9 светодиодов, и мне нужно мигать один за другим с задержкой в 3 секунды, и у меня есть 2 разных шаблона мигания и две кнопки для выбора шаблона и одна кнопка для остановки программы. поэтому для использования разных шаблонов я хочу, чтобы он не был массивом, иначе, если я получу больше шаблонов, я должен взять больше массива по одному для каждого шаблона. Надеюсь, это очистит запрос, @coder

Таким образом, ваш шаблон заключается в том, какой светодиод загорается следующим, а продолжительность всегда одинакова? Тогда чем плох один массив для каждого паттерна, а лучше один массив массивов (двухмерный массив)? Все еще кажется, что это простой подход. С двумерным массивом вы можете записать его таким образом, что добавление шаблона — это просто добавление другого шаблона в массив., @chrisl

Пожалуйста, поместите всю информацию в вопрос, отредактировав его. Также, пожалуйста, подробно опишите, где именно вы застряли. В чем проблема? Что именно вы не понимаете. Тогда мы сможем написать хороший ответ, соответствующий вашему вопросу., @chrisl

Я отредактировал свой вопрос., @coder


1 ответ


1

Это один из эффектов для 3 (наборов) светодиодов из наброска светового будильника. :

void cycleEffect() {

  static unsigned long previousMillis;
  static uint8_t cycleCounter;

  if (millis() - previousMillis > 100) {
    previousMillis = millis();
    digitalWrite(LEDS_CENTRAL_PIN, cycleCounter == 0);
    digitalWrite(LEDS_LEFT_PIN, cycleCounter == 1);
    digitalWrite(LEDS_RIGHT_PIN, cycleCounter == 2);
    cycleCounter++;
    if (cycleCounter == 3) {
      cycleCounter = 0;
    }
  }
}
,

@Juray: вы можете заменить последние три строки более распространенным способом сделать это: cycleCounter = (cycleCounter + 1) % 3 (хотя я просто понимаю, что это может быть, когда производительность важнее), @Michel Keijzers