我一直试图让我的4个LED显示随机生成的数字是二进制代码的。唯一的问题是它不断生成一个新的随机数。 我希望这只能完成一次,有人可以帮助我吗?
int led5 = 5;
int led4 = 4;
int led3 = 3;
int led2 = 2;
int x;
void setup() {
Serial.begin(9600);
randomSeed(analogRead(0));
pinMode(led5, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led2, OUTPUT);
}
void loop(){
x = random(1, 16);
Serial.print("The random number is: ");
Serial.println(x);
if (x >= 8) {
digitalWrite(led5, HIGH);
x=x-8;
}if(x >= 4) {
digitalWrite(led4, HIGH);
x=x-4;
}if(x >= 2) {
digitalWrite(led3, HIGH);
x=x-2;
}if(x >= 1) {
digitalWrite(led2, HIGH);
x=x-1;
}
digitalWrite(led5, LOW);
digitalWrite(led4, LOW);
digitalWrite(led3, LOW);
digitalWrite(led2, LOW);
}
答案 0 :(得分:0)
您将随机数生成放在loop
方法中。这永远循环。
您有两种选择:
将其放入setup
方法或创建其他方法并从setup
调用该方法。
声明一个标志,如果该标志为false,则仅生成该数字,表示您尚未生成随机数
答案 1 :(得分:-1)
尝试使用某个全局标记来确定数字是否已生成。
$
然后在你的int generated = 0;
尝试这样的事情:
loop()
您还可以在 if (generated == 0)
{
x = random(1, 16);
Serial.print("The random number is: ");
Serial.println(x);
generated = 1;
}
中生成一次号码。
答案 2 :(得分:-1)
最简单的方法是使用static
变量。然后它只获得一次随机值。
void loop(){
static int x = random(1, 16);
//...
}
或者如果你想打印静止值,lambda或附加函数可以允许这个(它也可以内联)。
void loop() {
static int x = ([](){
int r = random(1,16);
Serial.print("The random number is: ");
Serial.print(r);
return r;
})();
//...
}
请注意:与 @codewarrior 的信念(评论)相反,静态本地不会在功能重新输入时重新初始化。它只被初始化一次。是的,这是初始化,而不是分配! Arduino IDE也是默认的C ++
6.7声明声明
允许实现在允许实现静态初始化具有命名空间范围内的静态存储持续时间(基本)的相同条件下,以静态存储持续时间执行其他本地对象的早期初始化。 start.init)。否则这个对象在第一次控件通过其声明时被初始化
你可以看到每次调用都没有销毁静态本地:
3.6.3终止[basic.start.term]
返回的结果
1 Destructors(12.4)用于初始化对象(即生命周期(3.8)已开始的对象)与静态存储 持续时间是从主
所以它的错误信息是相信静态局部变量在其包含函数的多个重新条目上重新初始化。