Использование Random() и больше, чем
Полный нуб Arduino, я родом из "фона" Python, хотя и этого почти не знаю.
Я пишу супер простой скрипт, который включит лампочку, когда генератор случайных чисел сгенерирует число больше 100. Очевидно, у меня проблема с синтаксисом или что-то в этом роде: что я делаю не так? Во-вторых, как быстро происходит случайный
запрос чисел? Можно ли его замедлить? Мне не нужно, чтобы моя лампочка включалась 50 раз в секунду.
Спасибо! И, пожалуйста, будьте добры; Я знаю, что это гуглится, мне просто не хватает необходимых знаний, чтобы эффективно гуглить это.
/*
*/
int relayPin = 7;
int randomNumber = random(1001);
void setup() {
pinMode(relayPin, OUTPUT);
}
void loop() {
if(randomNumber > 100)
digitalWrite(relayPin, LOW);
else{
digitalWrite(relayPin, HIGH);}
}```
@Tooluser, 👍-1
Обсуждение1 ответ
Лучший ответ:
Здесь есть несколько вещей, которые следует обсудить.
Во - первых, генерация случайных чисел: на самом деле arduino не генерирует случайные числа. У него есть список чисел в памяти, который просто "кажется" случайным. Вот почему это называется псевдослучайным числом. Итак, вам нужно объявить начальную точку на этой последовательности, из которой вы получите "случайные" числа. Это делается с помощью "randomSeed()" в void setup. Например:
void setup() {
// put your setup code here, to run once:
randomSeed(analogRead(0)); /запускает псевдослучайную последовательность в случайной точке,
//в этом случае значение analogRead несоединенного вывод
}
Далее давайте сгенерируем наш номер. Переменная может быть глобальной (как вы объявили ее вне любой функции), но вы должны объявить ее с помощью "random()" только внутри "void loop". В противном случае его значение будет присвоено только один раз (это то, что ваш код говорит ему, чтобы сделать это один раз).
Вот что я бы сделал:
int relayPin = 7;
long randomNumber; //просто объявляет переменную; она должна быть типа "long".
void setup() {
randomSeed(analogRead(0)); //запускает псевдослучайную последовательность в случайной точке
pinMode(relayPin, OUTPUT);
}
void loop() {
randomNumber = random(0, 301);
//каждый раз, когда код зацикливается, он присваивает другое значение randomNumber
//в этом случае число будет находиться в диапазоне от 0 до 300 (301-исключенный предел).
if(randomNumber > 100){
digitalWrite(relayPin, HIGH);
}
else{
digitalWrite(relayPin, LOW);
}
delay(500); //half a second delay
}
Если вы хотите получить более подробную информацию о том, как генерируются случайные числа в Arduino, посетите справочник языка Arduino: https://www.arduino.cc/reference/en/
Спасибо вам за это! Это объяснение было очень любезно и полезно с вашей стороны! Я буду реализовывать это после работы., @Tooluser
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
в чем же проблема?, @jsotola
кстати, поставьте букву `` на отдельную строку, чтобы она была невидима, @jsotola
Проблема в том, что релейный модуль не переключается. Я предполагаю, что в моем коде есть ошибка., @Tooluser
да, логическая ошибка ... спросите себя: "когда обновляется значение randomNumber?`, @jsotola
Текущий код (если вы переместите генерацию случайных чисел в *loop()*) будет переключаться не просто 50 раз, а тысячи раз в секунду. Посмотрите на пример кода, чтобы получить представление о том, как это решить., @StarCat
Начните учиться, он же "строить знания", посмотрев на некоторые из приведенных примеров... ;-), @the busybee
Начните с примера blink и подумайте, как вы можете рандомизировать его..., @Majenko