Dopo aver pubblicato il precedente articolo, ho ricevuto alcuni commenti che mi chiedevano a cosa potesse servire un generatore di numeri random come quello incluso nel chip esp32.
I numeri random sono molto utilizzati in crittografia e la bontà di un generatore di numeri random è fondamentale per garantire elevati livelli di sicurezza, come ben spiegato in questo articolo di Cloudflare. Ecco perché Espressif ha deciso di includere tale generatore come periferica hardware all’interno del proprio chip esp32.
Oggi però voglio mostrarvi un utilizzo più frivolo dei numeri random: utilizzeremo infatti tali numeri per accendere/spegnere un led, simulando così una fiamma che arde in maniera casuale.
Vi ho già illustrato in un altro articolo le funzioni che il framework ci mette a disposizione per fare I/O base, quindi il sorgente di questo esempio (sempre disponibile su Github) dovrebbe essere facilmente comprensibile.
Il led può essere collegato ad un pin a scelta: tramite menuconfig è possibile indicare il pin utilizzato. Per limitare la corrente, ho collegato in serie una resistenza da 100ohm:
I numeri random generati vanno da 0 a 4294967296 (il registro è infatti a 32bit). Ho quindi dovuto scalare tali numeri in modo che l’intervallo di accensione/spegnimento dei led fosse compreso tra 50 e 500ms (4294967296 / 9544371 fa circa 450):
uint32_t getRandomDelay() { uint32_t random = esp_random(); return 50 + random / 9544371; } |
Ecco l’effetto finale:
Hi Luca! First of all thank you for the great tutorials!
I just built and flashed the example and work as expected. It’s just that I don’t quite understand the esp_random() function. Could you please explain it in more detail?
Thanks again!
hi, that is a built-in (in the ESP-IDF framework) function to use the hardware number generator and obtain a random value.
Hi Luca, how do you figure out the stack size?
I changed the function to:
uint32_t getRandomDelay() {
uint32_t random = esp_random();
uint32_t result2 = 50 + random / 9544371;
printf(“esp_random: %d\r\n”,result2);
return result2;
}
Why do I need to change stack_size to 2048?
xTaskCreate(&blink_task, “blink_task”, 2048, NULL, 5, NULL);