Случайная длительность импульса в генераторе

Добрый вечер .Затрудняюсь сделать длительность импульса в генераторе случайной. Чтобы каждый новый цикл рандомно выбирал длительность в интервале 10000-30000 млсек. В коде стоит 10000 .(36 строка) замена на random(10000 , 30000) не помагает. (всегда выбирает 10000).код прилагаю

bool _gen1I = 0;
bool _gen1O = 0;
unsigned long _gen1P = 0UL;
bool _gen2I = 0;
bool _gen2O = 0;
unsigned long _gen2P = 0UL;
bool _gen3I = 0;
bool _gen3O = 0;
unsigned long _gen3P = 0UL;
void setup()
{
    pinMode(8, OUTPUT);
    digitalWrite(8, 0);
}
void loop()
{
    //Плата:1
    if (1) 
    {
        if (! _gen3I) 
        {
            _gen3I = 1;
            _gen3O = 1;
            _gen3P =  millis();
        }
    }
     else 
    {
        _gen3I = 0 ;
        _gen3O= 0;
    }
     if (_gen3I) 
    {
         if (_gen3O) 
        {
             if (_isTimer(_gen3P , 10000L)) 
            {
                 _gen3P = millis();
                _gen3O = 0;
            }
        }
         else  
        {
             if (_isTimer(_gen3P , 30000L)) 
            {
                  _gen3P = millis();
                _gen3O = 1;
            }
        }
    }
    if (_gen3O) 
    {
        if (! _gen2I) 
        {
            _gen2I = 1;
            _gen2O = 1;
            _gen2P =  millis();
        }
    }
     else 
    {
        _gen2I = 0 ;
        _gen2O= 0;
    }
     if (_gen2I) 
    {
         if (_gen2O) 
        {
             if (_isTimer(_gen2P , 400)) 
            {
                 _gen2P = millis();
                _gen2O = 0;
            }
        }
         else  
        {
             if (_isTimer(_gen2P , 2000)) 
            {
                  _gen2P = millis();
                _gen2O = 1;
            }
        }
    }
    if (_gen2O) 
    {
         if (! _gen1I) 
        {
            _gen1I = 1;
            _gen1O = 1;
            _gen1P = millis();
        }
    }
     else 
    {
        _gen1I = 0 ;
        _gen1O= 0;
    }
    if (_gen1I) 
    {
          if (_isTimer (_gen1P , 4)) 
        {
             _gen1P = millis();
            _gen1O = ! _gen1O;
        }
    }
    digitalWrite(8, _gen1O);
}
bool _isTimer(unsigned long startTime, unsigned long period)
{
    unsigned long currentTime;
    currentTime = millis();
    if (currentTime>= startTime) 
    {
        return (currentTime>=(startTime + period));
    }
     else 
    {
        return (currentTime >=(4294967295-startTime+period));
    }
}

А вывести Ваше рандомное значение на терминал и посмотреть - высшая математика?

люблю шизов
кто весь код в одну строчку пишет, кто подчеркивания во все имена переменных зачем-то

Как раз с вышкой все норм .по крайней мере было . здесь трудность для меня .

Неожиданный ответ. Обычно покультурнее програмистов встречаю .

Отлично, тогда прокомментируйте программу. Что Вы делаете в каждой строчке (блоке) программы. Сами начнёте понимать. Да и переменные опишите.
Если не знаете как - то это делается после // прямо в комментируемой строке.

Добрый человек. Если бы я смог точно прокомментировать каждую сторку то у меня бы и близко не возник такой простой вопрос. Я всего то просил помочь вместо 10000млсек использовать функцию вызова значения от10000 до 30000. Код написал в flprog и он работает для моих нужд .Но надо улучшить.

Так улучшать нужно там же, в flprog.
Мы в этой мешанине тоже ничего не смыслим.

Понятный ответ. Мне тоже код показался странным . К сожалению там я не нашел возможностей генерации случ значений. и думал что возможно кто то подскажет куда вставить и в какой форме random() или нечто подобное.

Понимаете, уважаемый, что программа, выполняющая ваши пожелалки - это 5-10 строк,
но возникает вопрос - а какой должен быть интервал между импульсами?
И для того, чтобы понять про импульсы - помигайте светодиодиками. Очень способствует.

Очень хорошо понимаю. Но для того чтобнаписать эту программу в 15 строк мне нужен месяц.ну хотябы 2 недели. длительность интервала тоже рандомная .но это я бы уже по аналогии на основе вашего ответа написал бы (рандом между 10000-30000). уже помигал пищалкой в wokwi.Прикольно . но рандом получить неполучилось . потому и обратился к вам .

Берете самую дишманскую программу мигания светодиодиком, там есть такая функция delay(), которая отмеряет время в миллисекундах, так вот туда и пихаете случайные значения.

пихать random ом? Типа random (10000, 30000) и все делать через кучу delay()?

Зачем Вам куча delay()? Нужно всего 2 для длины импульса и для длины промежутка. И сосредоточьтесь!!! delay() - в миллисекундах!!! А то что-то я начинаю сомневаться в Ваших успехах в покорении рядов Фурье.
Короче - читайте. Там почти Ваш пример:

С Фурье все просто после комплексных .но . Мне нужны три генератора . первый настроен на частоту 500Гц (2млсек период импульса) второй задает цикл генерации для первого ( к примеру импульс генерация длится 10000млсек пауза 30000) а третий разрешает второму генерить с периодом 5минут через 15 минут. От того и куча делеев .И два последних работают непредсказуемо. Вроде как генератор моргает преривисто и отключившись на неопределенное время включается снова на неопред время .Прога от flproga работает но вот впихнуть туда рандом неполучилось еще. Про ваш совет помню

Ну наконец то Вы рассказали, что Вам нужно. И сразу скажу - Вы пошли не с того конца.
Начинать надо с 3-го условия - когда его нет - всё остальное не работает.
Потом второе - когда его нет - генерации нет.
А первое можно осуществить с помощью analogWrite().
Вроде всё разжевал.
Так что напишите алгоритм на русском и дальше останется только перевести на си.

Спасибо. Я не особо что то скрывал но до последнего надеялся вставить в мой кривой код нечто подобное рандому . Завтра поищу вариант .

я так и не увидел в этом коде попыток добавить функцию random()

Да . Действительно все не так . Очень прошу напишите как должно быть .