2016-09-15 6 views
0

Я хочу выбрать случайный штырь PWM каждый раз, когда цикл повторяется. Штыри, которые являются PWM, способными в Arduino UNO, являются штырьками: 3,5,6,11,10,9. Я попробовал rnd(), но он дает мне линейные значения из диапазона, то же самое с TrueRandom.Random (1,9).Выберите случайный вывод pwm в Arduino

ответ

3

Ну, есть по крайней мере два способа сделай это.

Первый (и, вероятно, лучший) способ - загрузить эти значения в массив размером шесть, сгенерировать число в диапазоне от нуля до пяти и получить значение из этой позиции в массиве.

Другими словами, psedo-код, такой как:

values = [3, 5, 6, 9, 10, 11] 
num = values[randomInclusive(0..5)] 

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

int getRandomPwmPin() { 
    static const int candidate[] = {3, 5, 6, 9, 10, 11}; 
    static const int count = sizeof(candidate)/sizeof(*candidate); 
    return candidate[TrueRandom.random(0, count)]; 
} 

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

Это было бы вдоль линий (psedo-код):

num = -1 // force entry into loop 
while num is not one of 3, 5, 6, 9, 10, 11: 
    num = randomInclusive(3..11) 

который становится:

int getRandomPwmPin() { 
    int value; 
    do { 
     value = TrueRandom.random(3, 12); 
    } while ((value == 4) || (value == 7) || (value == 8)); 
    return value; 
} 

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


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

2

Хитрость заключается в том, чтобы сделать список выводов, а затем выбрать элемент из списка в случайном

int pins[]={3,5,6,11,10,9} 

int choice = rnd() //in range 0-5 

pin = pins[choice] 

см Generating random integer from a range, чтобы получить число в диапазоне

Смежные вопросы