Перевести на millis

Всем привет!
Я не очень силён в программировании, но кое-что уже могу
Написал вот такой код хаотичного моргания двумя светодиодами с использованием delay()
Код работает. Arduino NANO.
А перевести код на использование millis() не могу даже предположить как потому что использую random()
Кто может помочь? Буду признателен!

int BlueLED = 3; // Синий светодиод
int WhiteLED = 4; // Белый светодиод
int StartWork = true;  // Старт / стоп работы
int COUNT_CYCLE = 1;  // количество циклов запуска

void setup() {
  pinMode (WhiteLED, OUTPUT);
  pinMode (BlueLED, OUTPUT);
}

void loop() {
  // Условие для запуска процедур
  if (StartWork) 
    {
      for (int x = 1; x <= COUNT_CYCLE; x++) 
        {
          welder(); // Вызов
        }
    }
StartWork = false; // останавливаем
shut_down(); // выключаем все светодиоды
}


void welder() { // Мигание белым и сисним светодиодами
  int cycle = random(5, 20); // Случайным образом устанавливает время циклов
  for (int i = 0; i < cycle; i++)
    {
      // моргнём белым
      digitalWrite(WhiteLED, HIGH);
      delay(random(10));
      digitalWrite(WhiteLED, LOW);
      delay(random(100));
      // моргнём синим
      digitalWrite(BlueLED, HIGH);
      delay(random(30));
      digitalWrite(BlueLED, LOW);
      delay(random(200));
    }
}

void shut_down() 
  {
    // Выключить все светодиоды
    digitalWrite(WhiteLED, LOW);
    digitalWrite(BlueLED, LOW);
    delay(random(2000, 5000));  // случайная пауза
    StartWork = true; // перезапуск мигания
}

Берёте из примеров скетч BlinkWithoutDelay.ino
Там есть один раз заданный interval. А вам его надо устанавливать с помощью рандома.
Первый раз делаете это например в setup.
А далее каждый раз, когда меняете состояние диода, тоже присваивайте этому interval новое рандомное значение.

1 лайк

Спасибо!
Попробую разобраться если смогу :slight_smile:

Примерно понял.
Но у меня разные интервалы на HIGH и LOW
Мне тогда нужно использовать 2 интервала? И ещё 2 для каждого из светодиодов?

А кому сейчас легко?

2 лайка

Сделайте для одного, оберните в класс и используйте столько, на сколько пинов хватит на ардуине

1 лайк

Нууууу… для меня это пока что “тёмный лес”
Осмелюсь попросить набросать код если не затруднит :pray:

Сделал вот так для одного светодиода.
Моргает и по моему длительность HIGH и Low разная

const int ledPin = 4;
int ledState = LOW;
unsigned long previousMillis = 0;
long interval = 0;

void setup() {
  pinMode(ledPin, OUTPUT);
  interval = 0;
}

void loop() {
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    if (ledState == LOW) {
      interval = random(20);
      ledState = HIGH;
    } else {
      interval = random(100);
      ledState = LOW;
    }
    digitalWrite(ledPin, ledState);
  }
}

сбросить вам отличный справочник по языку. А программы тут каждый пишет себе сам.

1 лайк

Вот весь диалог с ИИ. https://rugpt.io/nejroset-dlya-napisaniya-koda

Спойлер
  • Генераторы — Написать код

  • Си, Ардуино. Программа выдаёт высокий - низкий уровень со случайными интервалами на вывод D13 платы arduino nano/

  • Для реализации программы на Arduino, которая будет выдавать высокий и низкий уровень на выводе D13 с случайными интервалами, можно использовать следующий код:

const int ledPin = 13; // Пин D13
unsigned long previousMillis = 0; // Переменная для хранения предыдущего времени
long interval; // Переменная для хранения случайного интервала

void setup() {
  pinMode(ledPin, OUTPUT); // Настраиваем пин D13 как выход
  randomSeed(analogRead(0)); // Инициализируем генератор случайных чисел
}

void loop() {
  unsigned long currentMillis = millis(); // Получаем текущее время

  // Проверяем, прошло ли время для изменения состояния
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis; // Сохраняем текущее время
    
    // Генерируем случайный интервал от 500ms до 2000ms
    interval = random(500, 2000);

    // Меняем состояние выхода
    digitalWrite(ledPin, !digitalRead(ledPin)); // Смена состояния на противоположное
  }
}

Описание кода:

  1. Настройка пинов: В setup() настраиваем пин D13 как выход.
  2. Генерация случайных чисел: Функция randomSeed(analogRead(0)); используется для инициализации генератора случайных чисел, чтобы результаты были различны при каждом запуске.
  3. Основной цикл: В loop() мы получаем текущее время и проверяем, прошло ли время, достаточное для смены состояния. Если да, то мы генерируем новый случайный интервал от 500 до 2000 миллисекунд.
  4. Переключение состояния: digitalWrite(ledPin, !digitalRead(ledPin)); меняет состояние на выходе на противоположное (высокий/низкий уровень).

Загрузка кода:

Скопируйте этот код и вставьте его в вашу среду разработки Arduino (например, Arduino IDE). Загрузите его на вашу плату Arduino Nano, и вы увидите мигание встроенного светодиода на выводе D13 с случайными интервалами.

1 лайк

… ну или ИИ :slight_smile:

Всем спасибо!

  1. Да.
  2. Да. И не забудте кроме интервалов для каждого светодиода ещё и свой previousMillis завести.
    Два ещё ладно, но если захочется больше, то однозначно стоит послушать, что @Estorsky советует.

может при смене состояния устанавливать нужный интервал, тогда в код выше всего три-пять строк добавить

видимо после Ковида запамятовал?

Каким местом это к песочнице? Опять межвитковое?

2 лайка

Если Вы про Ковид болезнь, то я тоже прошёл через 65% поражения :frowning: никому не желаю… страшно задыхаться…

ты же утверждал! тут - это форум, степень помощи разная, если ты никому ничем не помогаешь, это не значит что это делают все, вот буквально на днях код человеку поправил и, даже заработало )))

запомните, если этот человек появился в вашей теме, все, тему можно закрывать.
она пойдет в совершенно другом направлении и/или перерастет в срачь.

Добавил в просьбу к ИИ слово класс. И про светодиоды ничего не говорил - шаман однако :rofl:

Спойлер
  • Си++, Ардуино. Программа создаёт класс для выдачи высокого - низкого уровень со случайными интервалами на выводы платы arduino nano и с применением класса управляет выводами D13, D12, D11.

  • Для создания класса в C++ для Arduino, который будет управлять выводами D13, D12 и D11 с выдачей высокого и низкого уровня со случайными интервалами, можно использовать следующий код:

class RandomBlinker {
public:
    RandomBlinker(int pin) : pin(pin), interval(0), previousMillis(0) {
        pinMode(pin, OUTPUT); // Настраиваем пин как выход
        randomSeed(analogRead(0)); // Инициализируем генератор случайных чисел
        // Генерируем начальный интервал
        setRandomInterval();
    }

    void update() {
        unsigned long currentMillis = millis(); // Получаем текущее время

        // Проверяем, прошло ли время для изменения состояния
        if (currentMillis - previousMillis >= interval) {
            previousMillis = currentMillis; // Сохраняем текущее время
            
            // Меняем состояние выхода
            digitalWrite(pin, !digitalRead(pin)); // Смена состояния на противоположное

            // Устанавливаем новый интервал
            setRandomInterval();
        }
    }

private:
    int pin; // Номер пина
    unsigned long previousMillis; // Переменная для хранения предыдущего времени
    long interval; // Переменная для хранения случайного интервала

    void setRandomInterval() {
        interval = random(500, 2000); // Генерируем случайный интервал от 500ms до 2000ms
    }
};

RandomBlinker blinker1(13);
RandomBlinker blinker2(12);
RandomBlinker blinker3(11);

void setup() {
    // В setup() ничего не нужно инициализировать,
    // так как это происходит в конструкторе класса
}

void loop() {
    // Обновляем статус всех блестящих объектов
    blinker1.update();
    blinker2.update();
    blinker3.update();
}

Описание кода:

  1. Класс RandomBlinker:
    * Конструктор класса принимает номер пина и инициализирует его как выход.
    * Используется randomSeed(analogRead(0)); для инициализации генератора случайных чисел.
    * Метод setRandomInterval() генерирует случайный интервал для мигания LED.
    * Метод update() проверяет, прошло ли достаточно времени для смены состояния, и переключает состояние LED на соответствующем пине.
  2. Создание экземпляров класса:
    * Ваша программа создает три экземпляра класса RandomBlinker для пинов D13, D12 и D11.
  3. Обновление в основной программе:
    * В loop() вызывается метод update() для каждого экземпляра класса, чтобы обновить состояния светодиодов.

Загрузка кода:

Скопируйте этот код в вашу среду разработки Arduino (например, Arduino IDE). Загрузите его на вашу плату Arduino Nano, и вы увидите, как светодиоды на выводах D13, D12 и D11 мигают с случайными интервалами

.

2 лайка