Arduino nejaušo skaitļu ģeneratora izmantošana: nejaušās un nejaušās sēklu funkcijas. Arduino kurss — laiks un nejauša Arduino nejaušo bitu secību ģenerēšana

Programmējot Arduino, ir reizes, kad nepieciešams iegūt skaitli, kuru iepriekš nezinās ne programmētājs, kurš raksta skici, ne lietotājs, kurš izmantos Arduino ar šādu programmu. Šajā gadījumā palīgā nāk nejaušs (vai drīzāk pseidogadījuma) skaitļu ģenerators.



Lai aktivizētu šo ģeneratoru, pietiek ar random() vai randomSeed() funkciju izmantošanu. Šajā rakstā tiks parādīts, kā strādāt ar šīm funkcijām, kā arī kā atbrīvoties no pseidogadījuma skaitļu ģenerēšanas laikā.


Kopumā pseidogadījuma skaitļu ģenerators atdarina skaitļu parādīšanās nejaušību vai nejaušību, bet patiesībā, ja analizējat vairākus no šiem skaitļiem pietiekami ilgu laiku, varat pamanīt noteiktu modeli.


Tātad nejaušības funkcijai pseidogadījuma skaitļu ģenerēšanai var būt līdz diviem parametriem, un to var rakstīt kā nejaušu (max) vai nejaušu (min, max). Šeit maksimālais parametrs, kas ir obligāts, nosaka pseidogadījuma skaitļu ģenerēšanas diapazona augšējo robežu. Izmantojot papildu parametrs min var izmantot, lai iestatītu diapazona apakšējo robežu. Rezultātā funkcija atgriezīs kādu pseidogadījuma skaitli starp min un max-1.


Ir svarīgi saprast, ka, izmantojot random() funkciju, katru reizi tiks ģenerēts tieši tāds pats pseidogadījuma skaitļu saraksts. Piemēram, ja izgatavojat spēļu automātu un pirmo reizi nospiežot rokturi, parādīsies laimesta kombinācija, tad varat būt drošs, ka, atiestatot Arduino un vēlreiz nospiežot rokturi, šis spēļu automāts parādīs to pašu laimestu kombināciju. Patiešām, Arduino nav viegli ieviest spēļu automātu ar pilnīgi nejaušu skaitļu ģenerēšanu, kā, piemēram, tas ir ieviests spēļu automātos www.igrovye-apparati-vulcan.com/ , taču jūs varat daļēji atrisināt problēmu, izmantojot funkciju randomSeed().


Šī funkcija ņem vērtību (piemēram, veselu skaitli) un izmanto skaitli, lai modificētu izlases sarakstu, ko ģenerē funkcija random(). Varat ievietot randomSeed() iestatīšanas funkcijā un izmantot random() funkciju bezgalīgā ciklā. Bet šajā gadījumā būs āķis, kas ir tāds, ka, lai gan nejaušo skaitļu secība būs atšķirīga, izmantojot funkciju randomSeed(), tā joprojām būs vienāda katru reizi, kad tiks palaists skice.


Vienīgais risinājums šajā gadījumā var būt opcija, izmantojot analogās perifērijas ierīces (ADC) un atbilstošo analogRead () funkciju. Ja nekam nepievienojat analogo ieeju, tas ir, atstājat to "karājoties" gaisā, tad, pateicoties troksnim šajā līnijā, jūs varat iegūt patiešām nejaušus skaitļus. Pēc tam iestatīšanas iestatījumos varat rakstīt šādi randomSeed(analogRead(A0)). Ar nosacījumu, ka analogais ports A0 nav pievienots nekur.

Daudz ir rakstīts par nejaušo skaitļu ģeneratoriem, bet gandrīz vienmēr, kad runa ir par ieviešanu, tiek netieši norādīts (vai skaidri pateikts), ka mēs runājam par x86/x64 un citām "pieaugušo" arhitektūrām. Tajā pašā laikā forumos, kas veltīti mikrokontrolleru ierīču izstrādei, ir daudz jautājumu “kā ģenerēt nejaušu skaitu vietnē %controllername%?”. Turklāt atbilžu klāsts sniedzas no “skatīt Google / Wikipedia” līdz “izmantot standarta funkciju”. Šī “standarta funkcija” ne vienmēr ir klāt un ir piemērota izstrādātājam visos aspektos, biežāk ir otrādi: vai nu skaitļi ir tālu no nejaušības, vai arī darba ātrums ir pārāk mazs, vai arī iegūtais kods vispār neietilpst brīvajā atmiņā.
Mēģināsim izdomāt, kādi ir nejaušu skaitļu ģenerēšanas algoritmi, kā izvēlēties pareizo un, pats galvenais, kādas ir šo algoritmu ieviešanas iezīmes kontrolleros.

Nejaušības rādītājs

RNG lietojumprogrammas var būt ļoti dažādas, sākot no rotaļlietām līdz nopietnai kriptogrāfijai. Attiecīgi arī prasības ģeneratoram ļoti atšķiras. Lai novērtētu ģeneratora kvalitāti ("nejaušības" līmeni), tiek veikti īpaši testi. Šeit ir visvienkāršākie:
  • frekvences pārbaude. Sastāv no nulles un vieninieku skaitīšanas bitu secībā. Vieniniekiem un nullēm jābūt aptuveni vienādiem.
  • Pārbaudiet identisku bitu secību. Tiek meklētas identisku bitu rindas, piemēram, 000...0 vai 111...1. Frekvenču sadalījumam, ar ko saskaras sērija, atkarībā no to garuma jāatbilst šādam sadalījumam patiesi nejaušam signālam.
  • Spektrālais tests. Sākotnējai secībai tiek piemērota diskrētā Furjē transformācija. Iegūtajā spektrā nedrīkst būt nozīmīgi maksimumi, kas norādītu uz secības periodisko īpašību klātbūtni.
  • Autokorelācijas tests. Tiek aprēķināta korelācijas vērtība starp secības kopijām, kas nobīdītas viena pret otru. Pārbaude ļauj secīgi atrast atkārtotas sadaļas.
Ir īpaši komplekti, kas ietver desmitiem līdzīgu testu:
NIST - izmanto AES konkursā, lai novērtētu šifrēšanas algoritmus.
DIEHARD ir viens no visstingrākajiem komplektiem.

PRNG algoritmi

Jebkuru secību, kas ģenerēta pēc stingri kodēta algoritma, nevar uzskatīt par patiesi nejaušu, tāpēc, runājot par algoritmiskajiem ģeneratoriem, viņi lieto terminu pseido nejaušība secība. Jebkurš pseidogadījuma skaitļu ģenerators (PRNG) agrāk vai vēlāk izveido cilpas, cita lieta ir tāda, ka šis “vēlais” var rasties dažu milisekundēs vai varbūt dažu gadu laikā. Cikla ilgums ir atkarīgs no ģeneratora N iekšējā stāvokļa lieluma (faktiski tas ir ģeneratoram nepieciešamais atmiņas apjoms) un svārstās no 2 (N / 2) līdz 2 N bitiem.
Ir izgudrots milzīgs skaits PRNG algoritmu, taču ne visi no tiem ir ērti ieviešanai mikrokontrolleros. Mums ir ļoti ierobežots ātrums un pieejamā atmiņa, daudzi kontrolleri neatbalsta reālas aritmētikas un pat reizināšanas komandas. Paturot prātā šos ierobežojumus, apskatīsim dažus labi zināmus algoritmus.
Lineārā kongruenta metode
Nākamais secības dalībnieks tiek aprēķināts pēc formulas
X i+1 = (aX i + c) mod m
Numurs m norāda maksimālo secības periodu, veselus skaitļus a Un c- "burvju" koeficienti. Numurs m ir saprātīgi izvēlēties vienādu ar divu jaudu, un tādā gadījumā modulo samazināšanas darbība tiek samazināta līdz lielo bitu izmešanai. Lai iegūtu maksimālo periodu, ir jāievēro šādi nosacījumi:
- c un m ir jābūt pirmajam skaitlim,
- a-1 jābūt daudzkārtējam lpp visiem galvenajiem dalītājiem lpp cipariem m,
- Ja m ir 4 reizinājums (un mūsu gadījumā tas būs daudzkārtējs), tad a-1 jābūt skaitļa 4 reizinājumam.
Ir vēl viens smalkums: kā rezultātā jāņem tikai stāvokļa mainīgā X augstie biti, jo zemajiem bitiem nejaušības statistiskie parametri ir daudz sliktāki. Lineārais kongruenciālais algoritms parasti tiek ieviests kā standarta rand () daudzās bibliotēkās.

Plusi:

  • maksimālais iespējamais periods konkrētam stāvokļa mainīgā izmēram;
  • pietiekami ātri;
  • bieži jau ir ieviests kompilatora bibliotēkā.
Mīnusi:
  • nepieciešama reizināšanas operācija;
  • ne visi biti ir vienādi nejauši.
Kopsavilkums:ātrs un vienkāršs algoritms ne pārāk atbildīgām lietojumprogrammām.
Fibonači metode ar kavēšanos
Šis algoritms izmanto attiecību
X i \u003d X i-a - X i-b,
kur ir stāvokļa mainīgais X ir neparakstīts vesels skaitlis. Aizkaves vērtības a Un b tiek ņemti nevis kādi, bet stingri noteikti, pāri (17,5), (55,24) vai (97,33), lai sasniegtu maksimālu kvalitāti. Jo lielāka aizkave, jo ilgāks periods un labākas secības spektrālās īpašības. No otras puses, lai ģenerators darbotos, ir jāsaglabā iepriekšējie skaitļi max(a,b), kas ne vienmēr ir pieņemami. Tāpat, lai palaistu ģeneratoru, nepieciešami max(a,b) skaitļi, kurus parasti iegūst, izmantojot vienkāršāku PRNG.

Plusi:

  • nav nepieciešamas reizināšanas darbības;
  • visi nejaušā skaitļa biti ir statistiski līdzvērtīgi.
Mīnusi:
  • nepieciešams liels atmiņas apjoms;
  • lai palaistu, ir nepieciešams liels skaitļu masīvs.
Kopsavilkums:ļoti kvalitatīvs, bet resursietilpīgs algoritms.
Lineārās atsauksmes maiņas reģistrs


Stāvokļa mainīgais tiek saglabāts reģistrā ar garumu N. Nākamā stāvokļa ģenerēšana ietver divus posmus:
  1. Tiek aprēķināta bita C = X i1 xor X i2 xor… X ik vērtība, kur i1, i2…ik- reģistrēt bitu numurus, zvanīt līkumi.
  2. Reģistrs tiek nobīdīts par 1 bitu pa labi, bet kreisais galējais bits iegūst vērtību AR.
Ģeneratora izvade ir reģistra galējais (vai galējais kreisais, vai kāds cits) bits, t.i., pseidogadījuma secība tiek ģenerēta viens bits katrā iterācijā. Ar pareizi izvēlētu krānu skaitu ģeneratora periods būs 2 N - 1. "Mīnus viens", jo ir aizliegts reģistra nulles stāvoklis. Filiāles numuri priekš N no 3 līdz 168 var apskatīt šajā dokumentā.
Papildus iepriekš aprakstītajai konfigurācijai, kuru, starp citu, sauc par Fibonači konfigurāciju (nejaukt ar tāda paša nosaukuma PRNG metodi!), Ir arī t.s. Galois konfigurācija.


Tā vietā, lai izmantotu pieskārienu secības bitu summu, lai ģenerētu jaunu, vistālāk pa kreisi esošo bitu, XOR katru pieskārienu secības bitu ar galējo labo bitu, pēc tam pagrieziet visu reģistru pa labi. Šo shēmu ir grūtāk saprast, bet vieglāk īstenot, jo visas XOR darbības var veikt vienlaikus. Fibonači un Galuā shēmas ir līdzvērtīgas perioda ilguma un pseidogadījuma skaitļu kvalitātes ziņā.

Plusi:

  • ļoti vienkārša realizācija, pat aritmētika nav nepieciešama, tikai bitu darbības un nobīdes;
  • ļoti ātrs algoritms (īpaši Galois shēma);
  • labas statistiskās īpašības.
Mīnusi:
  • jums jāpārbauda nulles nevienlīdzības sākotnējā vērtība.
Kopsavilkums:ļoti ātrs un diezgan kvalitatīvs algoritms.
Kriptoizturīgi algoritmi
Lai izmantotu kriptogrāfiju, PRNG ir vēl viena būtiska prasība: neatgriezeniskums. Visiem iepriekš uzskaitītajiem algoritmiem nav šīs īpašības: zinot vairākas PRNG izejas vērtības, ir iespējams, risinot vienkāršu vienādojumu sistēmu, atrast algoritma parametrus (tās pašas "maģiskās" konstantes a, b, c utt). Un, zinot parametrus, jūs varat reproducēt visu pseidogadījuma secību.
Jebkuru pietiekami spēcīgu bloka šifru var izmantot kā kriptogrāfiski spēcīgu PRNG algoritmu. Izvēloties slepeno atslēgu, var iegūt pseidogadījuma skaitļu blokus, piemērojot algoritmu secīgiem naturāliem skaitļiem. N bitu bloka šifram periods būs ne vairāk kā 2 N . Šādas shēmas drošība ir pilnībā atkarīga no atslēgas noslēpuma.
Visi mūsdienu kriptogrāfijas algoritmi tiek pārbaudīti lietošanai kā PRNG, tas ir, izmantojot sertificētu algoritmu, nav īpaši jārūpējas par izvades plūsmas statistiskajām un spektrālajām īpašībām. Jums tikai jāuztraucas par kriptovalūtu algoritmu skaitļošanas "nepārspējamību". Ja nepieciešams veikt lielu skaitu šifrēšanas darbību, ir lietderīgi izvēlēties kontrolieri ar aparatūras kriptogrāfijas blokiem. Bieži šādos kontrolieros ir arī ļoti laba kriptoizturīga aparatūra PRNG.

Entropijas avoti

Kā jau minēts, izmantojot tikai deterministiskus algoritmus, nav iespējams ģenerēt patiesi nejaušu skaitli. Tāpēc parasti tiek izmantots PRNG + ārējais ķekars entropijas avots. Entropijas avots tiek izmantots, lai iestatītu PRNG sākotnējo vērtību, un pēdējā uzdevums ir nodrošināt secības spektrālo un statistisko tīrību. Ko var izmantot kā entropijas avotu? Jā, praktiski jebko.
Lietotāja darbība
Ja ierīce kaut kādā veidā mijiedarbojas ar lietotāju, ir diezgan laba ideja izmantot pašu lietotāju kā entropijas avotu. Piemēram, pogas nospiešanas laiks, mērot ar precizitāti līdz tuvākajai mikrosekundei (vai drīzāk, tās vismazāk nozīmīgajiem cipariem), ir pilnīgi neparedzams. Tomēr bieži vien ierīcei jādarbojas autonomi, kas nozīmē, ka mēs pazaudējam šo brīnišķīgo informācijas kanālu.
Analogais-digitālais pārveidotājs
Daudziem kontrolieriem ir iebūvēti ADC. Un daudzos kontrolieros tie ir ļoti viduvējas kvalitātes, radīti vienkārši "lai būtu". ADC rezultāta zemie biti gandrīz vienmēr satur ievērojamu troksni, pat ja tiek mērīts līdzstrāvas spriegums. To var izmantot: pievienojiet ADC ieeju barošanas spriegumam caur dalītāju, veiciet dažus desmitus mērījumu, veiciet vismazāk nozīmīgus bitus - šeit ir lielisks nejaušs skaitlis. Ja ADC ir iebūvēts priekšpastiprinātājs, ieslēdziet to, tas arī rada troksni.
Asinhronie ģeneratori
Varat izmantot divu nesinhronizētu pulksteņu periodu starpību. Lielākajā daļā kontrolieru ir, piemēram, sargsuņa taimeris. Lai uzlabotu uzticamību, tas tiek iestatīts no atsevišķa oscilatora, kas nekādā veidā nav savienots ar galveno pulksteņa signālu. Pietiek saskaitīt galvenā pulksteņa signāla ciklu skaitu vienā sargsuņa taimera periodā. Ja izvēlaties periodus tā, lai mērīšanas laikā skaitītājs daudzkārt pārplūstu, jūs varat iegūt diezgan nejaušu skaitli. Šīs metodes trūkums ir tas, ka tas aizņem ilgu laiku, līdz pat vairākām sekundēm.
Reālā laika pulkstenis
Ja shēmā ir reālā laika pulkstenis, varat izmantot to pašreizējos rādījumus, lai inicializētu PRNG. Piemēram, konvertējot pašreizējo datumu/laiku uz Unix laika formātu, mēs uzreiz iegūstam 32 bitus, kas nekad neatkārtosies, ja vien nenolasīsit rādījumus vairāk nekā vienu reizi sekundē. Reāllaika izmantošana dod vērtību unikalitāti, bet nedod neparedzamību, tāpēc labāk kombinēt šī metode ar citiem.
RC ķēde
Ja kontrolierim tādu nav perifērijas ierīces, izņemot I / O portus, varat rīkoties šādi: viena no kājām ir savienota caur kondensatoru ar zemi un caur rezistoru - ar barošanas spriegumu. Ja kontrollera ieejām ir iekšējie uzvilkšanas rezistori, ārējais rezistors nav vajadzīgs.

Mēs izvadām “0” signālu uz šo portu - kondensators ir izlādējies. Mēs pārslēdzam portu uz ievades režīmu - kondensators sāk uzlādēt. Kad spriegums uz tā sasniegs slieksni, ieeja pārslēgsies no stāvokļa "0" uz "1". Uzlādes laiks ir ļoti atkarīgs no daudziem faktoriem: barošanas sprieguma, RC ķēdes parametru novirzes, sliekšņa nestabilitātes, temperatūras, noplūdes, traucējumiem. Mērot to ar pietiekamu precizitāti un ņemot vismazākos bitus, jūs varat iegūt labu nejaušību.
Aparatūras trokšņu ģenerators
Daudzām nopietnām lietojumprogrammām (galvenokārt kriptogrāfijai) ir nepieciešams uzticamāks entropijas avots nekā iepriekš minētie. Šādos gadījumos signāls tiek digitalizēts no trokšņu ģeneratora, pamatojoties uz termisko, šāvienu vai pat kvantu efektu. Trokšņains elements parasti ir īpaša diode vai zenera diode, no kuras signāls tiek pastiprināts un tiek padots uz komparatoru, kas veido bināru bitu plūsmu.

Lai salīdzinājuma reakcijas slieksnis neietekmētu saņemtā signāla statistiskās īpašības, tiek izmantoti divi trokšņu ģeneratori, kas darbojas uz viena salīdzinājuma:

Secinājums

Visbeidzot es jums pastāstīšu vienu stāstu no savas dzīves. Tas sākās ar citu forumā uzdoto jautājumu "kā es varu ģenerēt nejaušu skaitli kontrolierī?". Jautājuma autors paskaidroja, ko dara iekārta, kas atdarina kauliņu mešanu, kā kursa projektu. Pēc vairākiem neveiksmīgiem mēģinājumiem izdomāt algoritmus, topikstarter dalījās ar savu risinājumu: viņš vienkārši izmeta īstu kauli 1000 reizes un ar iegūtajiem skaitļiem atzīmēja visu kontroliera brīvo atmiņu. Ģenerators pārliecinoši izturēja visus “nejaušības” testus, ņemot vērā, ka demonstrācijas laikā tas iztērēja mazāk nekā trešdaļu no savas “rezerves”.
Tāpēc arī šādam risinājumam ir tiesības uz dzīvību, it īpaši, ja skaitļu nejaušībai tiek izvirzītas ļoti stingras prasības, taču tās netiek prasītas īpaši bieži. Tā kā atmiņas cenas strauji krītas, var būt prātīgi iegādāties ierīci ar "haosa augstuma" zibatmiņas disku, kas kalpos ierīces kalpošanas laikā.
Paldies par uzmanību!

UPD1: Kā pareizi tika atzīmēts komentāros, ja ir paredzēts uzbrukums RNG un uzbrucējam būs aparatūras piekļuve ierīcei, ārējie entropijas avoti ir jāizmanto ļoti uzmanīgi, jo nav ļoti grūti nomainīt signālu no ārējais avots. Ir jāizmanto iekšējie avoti, iespējams, papildus ārējiem.
Ir arī laba ideja uzkrāt visa entropiju Brīvais laiks, un izmantojiet to, ja jums ir jāģenerē cits nejaušs skaitlis. Parasti šādos gadījumos t.s. Entropijas baseins- masīvs, kurā periodiski tiek veikta viena no PRNG funkcijām un kurā pastāvīgi tiek sajaukti dati no entropijas avotiem.

UPD2: Daudzos gadījumos ir lietderīgi saglabāt Entropy baseina saturu (atvainojiet, es nezinu parasto tulkojumu krievu valodā) EEPROM, lai pēc ierīces izslēgšanas un ieslēgšanas tas vairs neuzkrātos. Tas, pirmkārt, attiecas uz entropijas iegūšanu ar asinhrono ģeneratoru metodi: pietiekami stabilos apstākļos pēc katras ieslēgšanas var ģenerēt vienu un to pašu secību.
Ja ir gaidāms uzbrukums, veiciet piesardzības pasākumus pret EEPROM satura iejaukšanos. Ja kontrolieris atļauj, bloķējiet lasīšanu / dzēšanu / rakstīšanu, izmantojot bloķēšanas bitus, kad tas ir ieslēgts, kontrolējiet EEPROM integritāti, vismaz izmantojot vienkāršākās kontrolsummas.

Tagi:

  • rfc
  • gpsch
  • mikrokontrolleri
  • algoritmi
Pievienojiet atzīmes

randomSeed (seed)

Iestata vērtību jeb sēklu kā izlases () funkcijas sākumpunktu.

nejaušsSēkla(vērtība); // iestata "vērtību" kā sākotnējo nejaušo vērtību

Tā kā Arduino nevar ģenerēt patiesi nejaušus skaitļus, randomSeed ļauj nejaušības funkcijā ievietot mainīgo, konstantu vai citu funkciju, kas palīdz ģenerēt vairāk nejaušu skaitļu.

"nejaušie" skaitļi. Šajā funkcijā var izmantot daudzas dažādas sēklas vai funkcijas, tostarp millis() vai pat analogRead(), lai nolasītu elektrisko troksni caur analogo tapu.

nejauši (maks.)

nejauši (min, max)

Nejaušības funkcija ļauj atgriezt pseidogadījuma skaitli minimālo un maksimālo vērtību diapazonā.

vērtība = nejaušs(100, 200); // iestata 'vērtību' uz nejaušību

// skaitlis no 100 līdz 200

Piezīme: Izmantojiet to pēc funkcijas randomSeed() izmantošanas. Šis piemērs ģenerē nejaušu skaitli no 0 līdz 255 un izvada PWM

signāls uz PWM izeju, kas vienāds ar nejaušu vērtību:

int randNumber; // mainīgais, lai saglabātu nejaušu vērtību

int led = 10; // LED ar rezistoru uz kontakta 10

void setup() () // iestatīšana nav nepieciešama

randomSeed(millis()); // iestata millis() kā sēklu

randNumber = nejaušs(255); // nejaušs skaitlis no 0 līdz 255 analogWrite(led, randNumber); // izvada PWM signālu

kavēšanās (500); // pauze pussekundi

Avots: Gololobovs V. - Kur sākas roboti. Par Arduino projektu skolēniem (un ne tikai) - 2011

saistītās ziņas

Serial.begin (rate) Atver seriālo portu un iestata sērijas datu pārsūtīšanas ātrumu. Tipiskais datu pārraides ātrums datora saziņai ir 9600, lai gan tiek atbalstīti citi bodu ātrumi. Void setup()( Serial.begin…….

Visi mainīgie ir jādeklarē, pirms tos var izmantot. Mainīgā deklarēšana nozīmē tā vērtības veida definēšanu: int, long, float utt., Unikāla mainīgā nosaukuma iestatīšanu un papildus…….

Labi, mēs esam instalējuši šo programmu. Mēs esam atkļūdojuši “mehānismu” darbam ar moduli. Un apskatiet dažus piemērus. Bet es gribētu pats izveidot kaut ko noderīgu. Pamēģināsim. Vispirms noslēgsim iepriekšējo projektu. Priekš šī…….

Uzmanību! Strādājot ar Arduino moduli citās izstrādes vidēs, jums jābūt uzmanīgiem attiecībā uz mikrokontrollera konfigurāciju (Drošinātājiem). Kamēr jūs precīzi zināt, pie kā izmaiņas varētu novest pie …….

Laiks un nejaušība. Reakcija

Šoreiz uzzināsim, kas ir "Random" vērtības, kā arī iemācīsimies strādāt ar laiku.

Mums būs nepieciešams:

  • Pulksteņa poga
  • čīkstētājs
  • Savienojošie vadi "PAPA-PAPA"

Reakcija

Mūsu šodienas uzdevums ir salikt ķēdi, kas ļauj noskaidrot mūsu reakcijas ātrumu.

Nospiežot kreiso pogu, pēc "izlases" laika atskan signāls. Un, nospiežot labo pogu, tiek atzīmēts, cik daudz laika ir pagājis no čīkstēšanas līdz labās pogas nospiešanai.

Kas ir izveicīgs - izmēģina pats, un mēs skatāmies shēmu.

#define BUZ 8 #define START 9 #define STOP 7 int time; // Sinhronizācijas mainīgais void setup() ( Serial. begin(9600); pinMode(START, INPUT_PULLUP); pinMode(STOP, INPUT_PULLUP); pinMode(BUZ, OUTPUT); ) void loop() ( if(digitalRead(START) == 0) (poga = start_time; //Lai to ierakstītu globālā mainīgā int Rand = random(0, 4000); //Generate a "nejaušs" aizkaves laiks = laiks + Rand; //Pievienojiet aizkaves laika aizkavi (Rand); //Gaidīt signālu (BUZ, 3000, 500); //Pīkstiens! int apstāties_laiks = apstāšanās laiks S // apstāšanās laiks S /time stop time; .println("Laiks: "); //Izdrukājiet laiku Serial.Serial.println(time); delay(1000); ) ) //Pirms otrā mēģinājuma vēlreiz nospiediet pogu START.

Paskaidrojumi

starpt laiks; Mainīgajiem (ne visiem), kad tie ir norādīti, nav jāpiešķir nekādas vērtības. Mēs izmantojām šo mainīgo, lai saistītu divus if paziņojumus.

Programmā C++ cilpas ietvaros deklarētie mainīgie nebūs pieejami citās cilpās, jo tie ir derīgi tikai šajā cilpā. Tas tiek darīts, lai novērstu programmēšanas kļūdas. Kad programmas kods pieaugs, jūs sapratīsit, par ko es runāju.

Lai mainīgais būtu pieejams vairākiem priekšrakstiem, tas ir jāpadara globāls. Tie. deklarēt mainīgo ārpus funkcijām.

millis(); Atgriež milisekundes, kas pagājušas kopš programmas palaišanas.

Mums tas ir nepieciešams, lai izmērītu laiku, kas pagājis no signalizācijas līdz pogas nospiešanai.

nejauši (min,max); Tas ir "izlases" skaitļu ģenerators. Ņem divas vērtības. Tas ģenerē skaitli starp min un max.

"Nejauši" skaitļi, jo tā ir noteikta vērtību secība. Ļoti garš, bet tas pats. Lai iegūtu dažādas secības, jums vajadzētu izmantot NejaušiSēkla();

Viņa, funkcija, inicializē ģeneratoru. Un, ja jūs iestatāt parametru uz nejaušu, tad mēs iegūsim mums nepieciešamās secības. Tāda pati secība būs, ja parametrs ir fiksēts.

Secinājums

Tagad jūs varat trenēt savu reakciju, izmantojot savu ierīci. Un jūs varat turpināt.

Radio elementu saraksts

Apzīmējums Tips Denominācija Daudzums PiezīmeVeikalsMans piezīmju bloks
Arduino dēlis

Arduino Uno

1 Uz piezīmju grāmatiņu
Maizes dēlisMaizes dēlis-puse1 Uz piezīmju grāmatiņu
Pjezo zummersPasīvs1 Uz piezīmju grāmatiņu
Pulksteņa pogaBez fiksatora2 Uz piezīmju grāmatiņu
Savienojošie vadi"Papa Papa"1



Tops