12396| 1
|
[进阶] ESP32 Arduino教程:随机数生成 |
简介 ESP32 Arduino教程旨在解释如何使用Arduino核心在ESP32开发板上生成随机数。 在硬件方面,ESP32(https://www.dfrobot.com.cn/goods-1359.html)拥有一个真随机数发生器,意味着从它获取的值是真正随机的[1]。 这些真正的随机数是基于WiFi /蓝牙RF子系统噪声,这意味着如果蓝牙和WiFi都被禁用,则只生成伪随机数[1]。 虽然对于此简单教程,数字是否为真正的随机数或伪随机数是不相关的,但是ESP32生成真正随机数的能力至关重要,因为它们可以用于加密操作[1]。您可以在这里阅读关于这两种随机性差异的解释(https://www.random.org/randomness/)。 关于ESP32随机数发生器的有趣事情是,在启用WiFi的情况下从它获得的2 GB数据样本已经通过了Dieharder Random Number Testsuite [1]的所有测试,这是一个随机数发生器的测试套件[2]。 作为ESP32随机数生成的低级分析,您可以查看这篇精彩的文章(https://www.lucadentella.it/en/2017/02/10/esp32-10-generatore-numeri-random/)。 ESP32教程测试使用集成在ESP32 FireBeetle开发板的DFRobot的ESP-WROOM-32设备进行的。 如果您愿意,可以查看以下本教程视频版本。 代码 我们将通过在Arduino设置函数上打开一个串行连接启动代码,这样我们就可以输出程序结果。 [mw_shl_code=applescript,true]void setup() { Serial.begin(115200); } [/mw_shl_code] 然后,我们将获得并定期在主循环函数上打印随机数。 为了获得随机数,我们可以使用这里定义的低级esp_random函数(https://github.com/espressif/ard ... /esp32/esp_system.h )。此函数不接收任何参数,并返回0和 但请注意,如简介部分所述,只有当WiFi或蓝牙RF系统正在运行时,该值才是真正随机的[3]。 作为这种低电平函数的替代方案,我们还可以使用Arduino随机函数,它也在ESP32 Arduino核心上实现。 随机函数被重载,可以通过传递一个或两个输入参数进行调用。 [mw_shl_code=applescript,true]Serial.println(esp_random());[/mw_shl_code] 如果我们只传递一个参数,我们指定生成的随机数的上限(不包括)[4]。因此,结果将是介于0和输入参数值-1之间的数字。 因此,在以下调用中,我们将得到0到9之间的数字。 [mw_shl_code=applescript,true]Serial.println(random(10));[/mw_shl_code] 如果我们通过传递两个输入参数调用该函数,则第一个将是生成的随机数(包括)的下限,第二个将是上限(不包括)。 因此,在以下调用中,我们将获得10到19之间的随机数。 [mw_shl_code=applescript,true] Serial.println(random(10,20));[/mw_shl_code] 请注意,随机函数的两种版本在其实现中调用esp_random函数,如此处所示(https://github.com/espressif/ard ... res/esp32/WMath.cpp)。因此,关于需要连接WiFi或蓝牙RF系统以获得真正随机生成的数字的考虑也同样适用。 最终完整代码如下所示。为了方便阅读,我们添加了额外的打印功能,并且在Arduino循环的每次迭代之间都有一个小的延迟。 [mw_shl_code=applescript,true] void setup() { Serial.begin(115200); } void loop() { Serial.println("-----------"); Serial.println(esp_random()); Serial.println(random(10)); Serial.println(random(10,20)); delay(1000); }[/mw_shl_code] 测试代码 如需测试代码,只需编译它并将其上传到您的设备即可。然后,打开Arduino IDE串行监视器并检查打印结果。它们应该类似图1显示使用前述函数调用生成的随机数。 图1 -随机数生成。 注:本文作者是Nuno Santos,他是一位和蔼可亲的电子和计算机工程师,住在葡萄牙里斯本 (Lisbon)。 他写了200多篇有关ESP32、ESP8266的有用的教程和项目。 查看更多ESP32/ESP8266教程和项目: 中文版教程 : ESP32教程 合集 英文版教程 : ESP32 tutorial 合集 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed