Member 13390625 Ответов: 3

8 случайных реле. Максимум 3 требуется в любой момент времени только как я могу достичь этого?


У меня есть код, написанный ниже, чтобы управлять 8 реле в случайном порядке. Программа предназначена для моего реквизита на Хэллоуин. Я новичок в программировании. Я хочу только иметь максимум 3 реле, работающих одновременно в случайной последовательности. Любые идеи о том, как я могу решить эту проблему.

Заранее большое спасибо
#define time1 100
#define time2 3000

void setup()
{
pinMode(2, OUTPUT); //relay 1
pinMode(3, OUTPUT); //relay 2
pinMode(4, OUTPUT); //relay 3
pinMode(5, OUTPUT); //relay 4
pinMode(6, OUTPUT); //relay 5
pinMode(7, OUTPUT); //relay 6
pinMode(8, OUTPUT); //relay 7
pinMode(9, OUTPUT); //relay 8
delay(50); //Check that all relays are inactive at Reset
digitalWrite(2,HIGH);
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
}
//--(end setup )---

void loop()
{

digitalWrite(random(2,10), LOW); // sets a random relay on
delay(random(time1,time2)); // wait for some time (between 1 and 30 seconds)
digitalWrite(random(2,10), HIGH); // sets a random relay off
delay(random(time1,time2)); // wait for some time (between 1 and 30 seconds)
}


Что я уже пробовал:

Попробовал переписать код, но безуспешно, и программа замерла.

PIEBALDconsult

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

CPallini

Девяносто три, потому что оператору нужно включить максимум три реле.

PIEBALDconsult

От имени зрителей я настаиваю на том, чтобы все время включались ровно три ретрансляции. :Д
Одно и два реле просто не годятся.

CPallini

Извините: один, два или ноль. :-Д

PIEBALDconsult

Хорошо, но не такое хорошее шоу.

3 Ответов

Рейтинг:
2

Dave Kreskowiak

Это код C#, но он должен быть легко преобразован в C Arduino:

// Generate 20 values...
for (int x = 0; x < 20; x++)
{
    // Holds the byte value were turning bits on in.
    byte value = 0;

    // count holds the maximum number of bits were going to
    // enable this time around, up to maxBitsOnPerByte.
    // In your case, maxBitsOnPerByte should be 3.

    // RNG is the random number class. 'Next' will return
    // an integer between 0 and the specified limit, EXCLUSIVE.
    // In your example, this means 0, 1, 2, and 3.
    int count = RNG.Next(maxBitsOnPerByte + 1);

    // Loop 'count' times, turning on a random bit in the byte.
    // Note, this CAN turn the same bit on multiple times!
    for (int y = 0; y < count; y++)
    {
        // Take a single bit (1) and shift it left a random
        // number (from 0 to 7) bits. Then OR this value
        // with the existing value we're tracking.

        // In C#, the value of an OR operation is an integer
        // that must be cast back to a byte.
        value = (byte)(value | (0x1 << RNG.Next(8)));
    }

    // Convert the value to a string or 1's and 0's,
    // padded with 0's of course.
    string binary = Convert.ToString(value, 2).PadLeft(8, '0');
    Console.WriteLine($"Value: {binary}");
}


Рейтинг:
16

CPallini

В качестве простого подхода вы можете (случайным образом) выбрать, сколько реле мог быть ON в данный момент (скажем MAX_ON, это просто rand()%4).
Затем повторите MAX_ON раз, выбирая на каждой итерации случайное реле (rand()%7). Возможное повторение ретрансляции не приведет к аннулированию (мог) предположение.


[Обновление]
Что-то вроде (предупреждение: не проверено)

for (;;)
{
  int max_on = random(4);
  int n;
  for (n=0; n<max_on; ++n)
  {
    digitalWrite(random(2,10), LOW); 
  }
  delay(random(1,31)); // wait for some time (between 1 and 30 seconds)
}
[/Обновление]


Member 13390625

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

digitalWrite(random ()%4)), LOW); / / устанавливает максимальное реле random on
digitalWrite(random ()%7)), LOW ; / / устанавливает максимальное время включения
задержка (random (time1, time2)); / / подождите некоторое время (от 1 до 30 секунд) digitalWrite(random(2,10), HIGH); / / выключает случайное реле
задержка(случайная (time1, time2)); / / подождите некоторое время (от 1 до 30 секунд)

Если этот код будет работать, будет ли он работать в постоянном цикле?
Овации
Марк.

CPallini

Смотрите мое обновленное решение.

Member 13390625

Спасибо за вашу помощь, я понятия не имею, куда вставить эту инструкцию в свой код, который я перечислил ранее....Я скопировал ваш обновленный код в программу Arduino IDE....Штука ... и нажал кнопку проверки, продолжая получать сообщения, похожие на это:

состояние выхода 1
ожидается ')' перед ';' маркер
Что я сделал не так?

CPallini

Извините, в моем коде была ошибка. Теперь это должно быть исправлено.

Member 13390625

Привет, спасибо за время и усилия, чтобы помочь мне,
Это то, что я сделал, объединив мой исходный код с вашим пересмотренным кодом. Надеюсь, я правильно сложил их вместе. К сожалению, если это правильное кодирование,

#определение времени 1 100
#определение time2 3000


недействительными установки()
{
pinMode (2, выход); / / реле 1
pinMode(3, выход); / / реле 2
pinMode(4, выход); / / реле 3
pinMode(5, выход); / / реле 4
pinMode(6, выход); / / реле 5
pinMode(7, выход); / / реле 6
pinMode(8, выход); / / реле 7
pinMode(9, выход); / / реле 8
задержка (50); / / проверьте, что все реле неактивны при сбросе
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
}
//--(окончательная настройка )---

пустая петля()


{
для (;;)
{
int max_on = random(4);
int n;
для (n=0; n< max_on; ++n)
{
digitalWrite (random(2,10), LOW);
}
задержка(случайная(1,31)); / / подождите некоторое время (от 1 до 30 секунд)
}

Я получаю этот код ошибки при проверке с помощью Arduino IDE:

состояние выхода 1
ожидаемый '}' в конце ввода

Я что-то сломал?
Я думаю, что должен оставаться механиком VW, это кодирование для меня совершенно чужой язык.(Гайки и болты я действительно понимаю) ха-ха.

CPallini

На самом деле в вашей программе отсутствует'}'. Просто добавьте закрывающую фигурную скобку в самом конце.
Между прочим. В следующий раз, когда мне понадобится механик, что ж, готовься :-)

Member 13390625

Вот чего я добился до сих пор; я изменил некоторые цифры, в основном временную задержку, снизил случайное число с 4 до 2, 3, но даже делая это из предоставленного вами кода, я все равно могу получить до 5 реле, работающих одновременно. Однако среднее значение равно 4, что находится в пределах моей компетенции. В нем все еще есть элемент неожиданности. Новый код, приведенный ниже (слегка измененный)
[код]

#определение времени 1 1000
#определение time2 4000


недействительными установки()
{
pinMode (2, выход); / / реле 1
pinMode(3, выход); / / реле 2
pinMode(4, выход); / / реле 3
pinMode(5, выход); / / реле 4
pinMode(6, выход); / / реле 5
pinMode(7, выход); / / реле 6
pinMode(8, выход); / / реле 7
pinMode(9, выход); / / реле 8
задержка (50); / / проверьте, что все реле неактивны при сбросе
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
}
//--(окончательная настройка )---

пустая петля ()

// для (;;)

{
int max_on = random(2, 3);
int n;
// for (n = 0; n < max_on; ++n)
digitalWrite (random(2, 10), LOW); / / устанавливает случайное реле на
задержка (случайная(time1, time2)); / / подождите некоторое время (от 10 до 40 секунд
digitalWrite (random(2, 10), HIGH); / / выключает случайное реле
задержка (случайная(time1, time2)); / / подождите некоторое время (от 10 до 40 секунд)
}

CPallini

Код неправильный: он должен записывать включенные реле, чтобы отключить их. Предположим,вы хотите включить максимум 3 реле. Затем
пустая петля
{
инт max_on = случайное(2,3);
int n;
int rel[3];

для (n=0; n< 3; ++n)
{
rel[n] = random(2,10); / / случайным образом выбираем реле
digitalWrite( rel[n], LOW); / / включите его
}
задержка (случайная (time1, time2)); // некоторая задержка
для (n=0; n< 3; ++n)
{
digitalWrite( rel[n], HIGH); / / выключите записанное реле
}
}

Member 13390625

Большое спасибо, ваш код не прошел проверку, но я настаивал и по какой-то странной причине дополнительный } в конце кода исправил это. Я запустил его в течение нескольких часов в тестовом режиме, и он работает очень хорошо. Я подключу свой анимационный реквизит к ретрансляторам в выходные и посмотрю, как они все функционируют, скрестив пальцы, они будут вести себя так, как ожидалось.
Еще раз....большое спасибо.
Arduino Mp3-плеер следующий, для моего окружающего звука для моего дисплея.
Какие-нибудь советы? кроме того ... не делай этого!!!! ха-ха...

Рейтинг:
0

Patrice T

Цитата:
У меня есть код, написанный ниже, чтобы управлять 8 реле в случайном порядке.

Случайный означает что-либо между 0 и 8 реле.
Чтобы получить 3 реле из 8, вы должны использовать метод под названием шарканье.
шарканье
Вы должны построить программу, которая будет имитировать перетасовку карт.
Скажем, у вас есть колода из 8 карт, 5 карт черного цвета и 3 карты красного.
Вы выбираете 1 наугад из 8 карт и убираете его из колоды.
Вы выбираете 1 наугад из оставшихся 7 карт и убираете его из колоды.
И так далее...
Как это работает в программе ?
Установите массив размером 8, Установите 5 элементов в 0 и 3 элемента в 1.
Выберите случайное число от 1 до 8, замените этот элемент элементом 1.
Выберите случайное число от 2 до 8, замените этот элемент на элемент 2.
Выберите случайное число от 3 до 8, замените этот элемент на элемент 3.
...
Результат в массиве-это положение ваших реле.