Arduino Rastgele Sayı Üreticisini Kullanma: Rastgele ve Rastgele Tohum İşlevleri. Arduino Kursu - Zamanlama ve Rastgele Arduino Rastgele Bit Dizisi Oluşturma

Arduino'yu programlarken, taslağı yazan programcı veya Arduino'yu böyle bir programla kullanacak kullanıcı tarafından önceden bilinmeyecek bir sayı almanız gereken zamanlar vardır. Bu durumda, rastgele (veya daha doğrusu sözde rastgele) bir sayı üreteci kurtarmaya gelir.



Bu oluşturucuyu etkinleştirmek için random() veya randomSeed() fonksiyonlarını kullanmak yeterlidir. Bu makale, bu işlevlerle nasıl çalışılacağını ve ayrıca sayı üretirken sözde rastgelelikten nasıl kurtulacağınızı gösterecektir.


Genel olarak, sözde rasgele bir sayı üreteci, sayıların görünüşünün rasgeleliğini veya rasgeleliğini taklit eder, ancak aslında, bu sayıların bir kısmını yeterince uzun bir süre boyunca analiz ederseniz, belirli bir modeli fark edebilirsiniz.


Bu nedenle, sözde rasgele sayılar üretmek için rasgele fonksiyon en fazla iki parametreye sahip olabilir ve rasgele(maks) veya rasgele(min, maks) olarak yazılabilir. Burada maksimum parametre, gerekli olan sözde rasgele sayı oluşturma aralığının üst sınırını ayarlar. Kullanarak ek parametre aralığın alt sınırını ayarlamak için min kullanılabilir. Sonuç olarak, işlev min ve max-1 arasında bir sözde rasgele sayı döndürür.


random() işlevini kullanırken, her seferinde tam olarak aynı sözde rasgele sayılar listesinin üretileceğini anlamak önemlidir. Örneğin, bir kumar makinesi yaparsanız ve kola ilk bastığınızda kazanan bir kombinasyon çıkacaktır, ardından Arduino'yu sıfırlayıp kola tekrar basarsanız, bu slot makinesinin aynı kazancı göstereceğinden emin olabilirsiniz. kombinasyon. Aslında, Arduino'da, örneğin www.igrovye-apparati-vulcan.com/ oyun makinelerinde uygulandığı gibi, tamamen rastgele sayı üretimine sahip bir oyun makinesi uygulamak kolay değildir, ancak sorunu randomSeed kullanarak kısmen çözebilirsiniz. () işlev.


Bu işlev bir değer alır (örneğin, bir tamsayı) ve random() işlevi tarafından oluşturulan rastgele listeyi değiştirmek için bir sayı kullanır. döngü. Ancak bu durumda, bir sorun olacaktır; bu, randomSeed() işlevi kullanılırken rastgele sayıların sırası farklı olsa da, çizimin her çalıştırıldığında yine aynı olacaktır.


Bu durumda tek çözüm, analog çevre birimleri (ADC) ve karşılık gelen analogRead () işlevini kullanan bir seçenek olabilir. Analog girişi hiçbir şeye bağlamazsanız, yani havada "asılı" bırakırsanız, bu hattaki gürültü sayesinde gerçekten rastgele sayılar elde edebilirsiniz. Daha sonra kurulum ayarlarında şu şekilde randomSeed(analogRead(A0)) yazabilirsiniz. A0 analog portunun herhangi bir yere bağlı olmaması şartıyla.

Rastgele sayı üreteçleri hakkında çok şey yazıldı, ancak neredeyse her zaman, uygulama söz konusu olduğunda, şu ima edilir (veya açıkça belirtilir). Konuşuyoruz x86/x64 ve diğer "yetişkin" mimariler hakkında. Aynı zamanda, mikrodenetleyiciler üzerinde cihazların geliştirilmesine ayrılmış forumlar "%denetleyiciadı% üzerinde nasıl rasgele bir sayı üretebilirim?" sorularıyla doludur. Ayrıca, yanıt aralığı "Google / Wikipedia'ya bakın"dan "standart işlevi kullan"a kadar uzanır. Bu "standart işlev" her zaman mevcut olmaktan uzaktır ve geliştiriciye her açıdan uygundur, daha sıklıkla tam tersidir: ya sayılar rastgele olmaktan uzaktır ya da çalışma hızı çok düşüktür ya da ortaya çıkan kod değildir. hiç boş belleğe sığdırmak.
Rastgele sayılar üretmek için algoritmaların neler olduğunu, doğru olanı nasıl seçeceğimizi ve en önemlisi bu algoritmaların denetleyicilere uygulanmasının özelliklerinin neler olduğunu anlamaya çalışalım.

Rastgelelik puanı

RNG uygulamaları, oyuncaklardan ciddi kriptografiye kadar çok farklı olabilir. Buna göre, jeneratör gereksinimleri de büyük ölçüde değişir. Jeneratörün kalitesini ("rastgelelik" seviyesini) değerlendirmek için özel testler vardır. İşte en temel olanları:
  • frekans testi. Bir bit dizisindeki sıfırların ve birlerin sayısını saymaktan oluşur. Birler ve sıfırlar yaklaşık olarak eşit olmalıdır.
  • Özdeş bit dizisini test edin. 000...0 veya 111...1 gibi aynı bit satırları aranır. Serilerin karşılaştığı frekansların dağılımı, uzunluklarına bağlı olarak, gerçekten rastgele bir sinyal için böyle bir dağılıma karşılık gelmelidir.
  • Spektral test. Ayrık Fourier dönüşümü, orijinal diziye uygulanır. Ortaya çıkan spektrum, dizinin periyodik özelliklerinin varlığını gösterecek önemli tepe noktalarına sahip olmamalıdır.
  • Otokorelasyon testi. Dizinin birbirine göre kaydırılan kopyaları arasındaki korelasyon değeri hesaplanır. Test, bir dizide tekrar eden bölümleri bulmanızı sağlar.
Düzinelerce benzer testi içeren özel kitler vardır:
NIST - şifreleme algoritmalarını değerlendirmek için AES yarışmasında kullanılır.
DIEHARD, var olan en titiz setlerden biridir.

PRNG algoritmaları

Sabit kodlu bir algoritmaya göre üretilen herhangi bir dizi, gerçekten rastgele kabul edilemez, bu nedenle, algoritmik üreteçlerden bahsederken terimi kullanırlar. sözde rastgele sonraki. Herhangi bir sözde rasgele sayı üreteci (PRNG) er ya da geç döngüye girer, başka bir şey de bu "geç"in birkaç milisaniye veya belki birkaç yıl içinde gelebilmesidir. Döngünün uzunluğu, üreteç N'nin dahili durumunun boyutuna bağlıdır (aslında bu, üreteç tarafından ihtiyaç duyulan bellek miktarıdır) ve 2 (N / 2) ile 2 N bit arasında değişir.
Çok sayıda PRNG algoritması icat edildi, ancak bunların tümü mikro denetleyicilerde uygulamaya uygun değil. Hız ve kullanılabilir bellek konusunda çok sınırlıyız, birçok denetleyici gerçek aritmetik ve hatta çarpma komutlarını desteklemiyor. Bu sınırlamaları göz önünde bulundurarak, iyi bilinen bazı algoritmalara bakalım.
Doğrusal uyumlu yöntem
Dizinin bir sonraki üyesi formülle hesaplanır.
X ben+1 = (aX ben + c) mod m
Sayı M dizinin maksimum periyodunu belirtir, tamsayılar A Ve C- "sihirli" katsayılar. Sayı M ikinin gücüne eşit olanı seçmek mantıklıdır, bu durumda modulo indirgeme işlemi yüksek bitleri atmaya indirgenir. Azami süreyi alabilmek için aşağıdaki koşulların karşılanması gerekir:
- C ve m aralarında asal olmalı,
- bir-1 bir çoğul olmalı P tüm asal bölenler için P sayılar M,
- Eğer M 4'ün katıdır (ve bizim durumumuzda bir kat olacaktır), o zaman bir-1 4'ün katı olmalıdır.
Bir incelik daha var: sonuç olarak X durum değişkeninin yalnızca yüksek bitleri alınmalıdır, çünkü rastgeleliğin istatistiksel parametreleri düşük bitler için çok daha kötüdür. Doğrusal uyumlu algoritma, çoğu kitaplıkta genellikle standart Rand() olarak uygulanır.

Artıları:

  • belirli bir durum değişkeni boyutu için mümkün olan maksimum süre;
  • yeterince hızlı;
  • genellikle derleyici kitaplığında zaten uygulanmaktadır.
Eksiler:
  • çarpma işlemi gereklidir;
  • tüm bitler eşit derecede rastgele değildir.
Özet:çok sorumlu olmayan uygulamalar için hızlı ve basit algoritma.
Gecikmeli Fibonacci yöntemi
Bu algoritma ilişkiyi kullanır
X ben \u003d X i-a - X i-b,
durum değişkeni nerede X işaretsiz bir tamsayıdır. gecikme değerleri A Ve B sadece herhangi biri değil, kesin olarak tanımlanmış olanlar alınır, maksimum kaliteyi elde etmek için çiftler (17.5), (55.24) veya (97.33) önerilir. Gecikme ne kadar büyük olursa, periyot o kadar uzun olur ve dizinin spektral özellikleri o kadar iyi olur. Öte yandan, jeneratörün çalışması için önceki sayıların max(a,b)'sini saklamak gerekir ki bu her zaman kabul edilebilir değildir. Ayrıca, oluşturucuyu çalıştırmak için, genellikle daha basit bir PRNG kullanılarak elde edilen max(a,b) sayılarına ihtiyacınız vardır.

Artıları:

  • çarpma işlemi gerektirmez;
  • rastgele bir sayının tüm bitleri istatistiksel olarak eşdeğerdir.
Eksiler:
  • büyük miktarda bellek gerektirir;
  • çalıştırmak için büyük bir sayı dizisi gerektirir.
Özet:çok yüksek kaliteli, ancak yoğun kaynak kullanan bir algoritma.
Doğrusal Geri Besleme Kaydırma Kaydı


Durum değişkeni, N uzunluğunda bir kayıtta saklanır. Bir sonraki durumun oluşturulması iki adımı içerir:
  1. C = X i1 xor X i2 xor… X ik bitinin değeri hesaplanır, burada i1, i2…ik- denilen bit numaralarını kaydedin virajlar.
  2. Kayıt 1 bit sağa kaydırılır, en soldaki bit değeri alır İLE.
Üreticinin çıktısı, kaydın en sağdaki (veya en soldaki veya her neyse) bitidir, yani sözde rastgele dizi, yineleme başına bir bit üretilir. Doğru seçilmiş sayıda kademe ile, jeneratörün periyodu 2 N - 1 olacaktır. "Eksi bir", çünkü kaydın yasak bir sıfır durumu vardır. Şube numaraları için N 3 ila 168 arası bu belgede görüntülenebilir.
Bu arada, Fibonacci konfigürasyonu olarak adlandırılan yukarıda açıklanan konfigürasyona ek olarak (aynı adlı PRNG yöntemiyle karıştırılmamalıdır!), Sözde var. Galois yapılandırması.


Yeni bir en soldaki biti oluşturmak için kademe dizisindeki bitlerin toplamını kullanmak yerine, kademe dizisinin her bir bitini en sağdaki bit ile XOR'layın ve ardından tüm kaydı sağa döndürün. Tüm XOR işlemleri aynı anda gerçekleştirilebildiğinden, bu şemanın anlaşılması daha zordur, ancak uygulanması daha kolaydır. Fibonacci ve Galois şemaları, sözde rasgele sayıların periyot uzunluğu ve kalitesi açısından eşdeğerdir.

Artıları:

  • çok basit uygulama, aritmetik bile gerekli değildir, sadece bit işlemleri ve kaydırmalar;
  • çok hızlı algoritma (özellikle Galois şeması);
  • iyi istatistiksel özellikler.
Eksiler:
  • sıfır eşitsizliği için başlangıç ​​değerini kontrol etmeniz gerekir.
Özet:çok hızlı ve oldukça kaliteli bir algoritma.
Kriptoya dayanıklı algoritmalar
Kriptografide uygulama için PRNG'nin bir temel gereksinimi daha vardır: tersinmezlik. Yukarıda listelenen tüm algoritmalar bu özelliğe sahip değildir: PRNG'nin birkaç çıkış değerini bilmek, basit bir denklem sistemini çözerek algoritmanın parametrelerini bulmak mümkündür (aynı “sihirli” sabitler) bir, b, c vesaire). Ve parametreleri bilerek, sözde rasgele dizinin tamamını yeniden oluşturabilirsiniz.
Yeterince güçlü herhangi bir blok şifre, kriptografik olarak güçlü bir PRNG algoritması olarak kullanılabilir. Bir gizli anahtar seçerek, algoritmayı ardışık doğal sayılara uygulayarak sözde rasgele sayı blokları elde edilebilir. N bitlik bir blok şifre için, periyot en fazla 2 N olacaktır. Böyle bir planın güvenliği tamamen anahtarın gizliliğine bağlıdır.
Tüm modern kriptografik algoritmalar, PRNG'ler olarak kullanım için test edilmiştir, yani sertifikalı bir algoritma kullanılarak, çıktı akışının istatistiksel ve spektral özelliklerine özel bir özen gösterilmesine gerek yoktur. Sadece kripto algoritmalarının hesaplama "açgözlülüğü" hakkında endişelenmeniz gerekiyor. Çok sayıda şifreleme işlemi gerçekleştirmeniz gerekiyorsa, donanım şifreleme bloklarına sahip bir denetleyici seçmek mantıklıdır. Genellikle bu tür denetleyicilerde ayrıca çok iyi bir kriptoya dayanıklı donanım PRNG vardır.

entropi kaynakları

Daha önce de belirtildiği gibi, yalnızca deterministik algoritmalar kullanılarak gerçek bir rasgele sayı üretmek imkansızdır. Bu nedenle, genellikle bir grup PRNG + harici kullanılır entropi kaynağı. Entropi kaynağı, PRNG için başlangıç ​​değerini ayarlamak için kullanılır ve ikincisinin görevi, dizinin spektral ve istatistiksel saflığını sağlamaktır. Entropi kaynağı olarak ne kullanılabilir? Evet, pratik olarak her şey.
Kullanıcı etkinliği
Cihaz, kullanıcı ile herhangi bir şekilde etkileşime giriyorsa, entropi kaynağı olarak kullanıcının kendisini kullanmak oldukça iyi bir fikirdir. Örneğin, en yakın mikrosaniye (veya daha doğrusu, en önemsiz basamakları) ile ölçülen bir düğmeye basma süresi tamamen tahmin edilemez. Bununla birlikte, çoğu zaman cihazın bağımsız olarak çalışması gerekir, bu da bu harika bilgi kanalını kaybettiğimiz anlamına gelir.
Analogtan dijitale dönüştürücü
Birçok denetleyicide yerleşik ADC'ler bulunur. Ve birçok denetleyicide çok vasat kalitededirler, sadece "olmak" için yapılmıştır. ADC sonucunun düşük bitleri, DC voltajı ölçülüyor olsa bile neredeyse her zaman önemli gürültü içerir. Bu kullanılabilir: ADC'nin girişini bir bölücü aracılığıyla besleme voltajına bağlayın, birkaç düzine ölçüm yapın, en önemsiz bitleri alın - işte sizin için harika bir rasgele sayı. ADC yerleşik bir preamp içeriyorsa, açın, ayrıca ses çıkarır.
asenkron üreteçler
Senkronize olmayan iki saatin periyot farkını kullanabilirsiniz. Çoğu denetleyici, örneğin bir bekçi köpeği zamanlayıcısı içerir. Güvenilirliği artırmak için, ana saat sinyaline hiçbir şekilde bağlı olmayan ayrı bir osilatörden saatlenir. Watchdog zamanlayıcısının bir periyodundaki ana saat sinyalinin döngü sayısını saymak yeterlidir. Ölçüm sırasında sayacın birçok kez taşması için dönemleri seçerseniz, oldukça rastgele bir sayı elde edebilirsiniz. Bu yöntemin dezavantajı, birkaç saniyeye kadar uzun zaman almasıdır.
Gerçek zamanlı saat
Şema varsa gerçek zamanlı saat, PRNG'yi başlatmak için mevcut okumalarını kullanabilirsiniz. Örneğin, geçerli tarih/saati Unix saat formatına çevirerek hemen 32 bit elde ederiz ki bu Asla saniyede bir defadan fazla okuma yapmadığınız sürece tekrar oluşmayacaktır. Gerçek zamanı kullanmak, değerlerin benzersizliğini verir, ancak herhangi bir öngörülemezlik vermez, bu nedenle birleştirmek daha iyidir Bu taraftan diğerleriyle.
uzaktan kumanda devresi
Denetleyicide yoksa çevre birimleri, G / Ç bağlantı noktaları dışında, aşağıdakileri yapabilirsiniz: ayaklardan biri bir kapasitör aracılığıyla toprağa ve bir direnç aracılığıyla - besleme voltajına bağlanır. Denetleyici girişlerinde dahili pull-up dirençleri varsa, harici dirence gerek yoktur.

Bu bağlantı noktasına bir "0" sinyali veriyoruz - kapasitör boşaldı. Bağlantı noktasını giriş moduna geçiriyoruz - kapasitör şarj olmaya başlıyor. Üzerindeki voltaj eşiğe ulaştığında, giriş "0" durumundan "1" durumuna geçecektir. Şarj süresi birçok faktöre büyük ölçüde bağlıdır: besleme voltajı, RC devresi parametre kayması, eşik kararsızlığı, sıcaklık, sızıntı, parazit. Yeterli doğrulukla ölçerek ve en önemsiz bitleri alarak, iyi bir rastgelelik elde edebilirsiniz.
Donanım gürültü üreteci
Birçok ciddi uygulama için (öncelikle kriptografi), yukarıda listelenenlerden daha güvenilir bir entropi kaynağı gereklidir. Bu gibi durumlarda sinyal, termal, atış ve hatta kuantum etkilerine dayalı bir gürültü oluşturucudan sayısallaştırılır. Gürültülü öğe genellikle özel bir diyot veya zener diyottur, buradan gelen sinyal yükseltilir ve bir ikili bit akışı oluşturan bir karşılaştırıcıya beslenir.

Karşılaştırıcı yanıt eşiğinin, alınan sinyalin istatistiksel özelliklerini etkilememesi için, bir karşılaştırıcı üzerinde çalışan iki gürültü üreteci kullanılır:

Çözüm

Son olarak, size hayatımdan bir hikaye anlatacağım. Forumda sorulan başka bir soruyla başladı "kontrolörde nasıl rasgele bir sayı üretirim?". Sorunun yazarı, zar atma taklidi yapan cihazın ne işe yaradığını ders projesi olarak anlatmıştır. Algoritmaları çözmeye yönelik birkaç başarısız denemeden sonra, topikstarter çözümünü paylaştı: Gerçek bir kalıbı 1000 kez yuvarladı ve elde edilen sayılarla denetleyicinin tüm boş belleğini puanladı. Jeneratör, gösteri sırasında "rezervinin" üçte birinden daha azını kullandığı göz önüne alındığında, tüm "rastgelelik" testlerini başarılı bir şekilde geçti.
Bu nedenle, böyle bir çözümün, özellikle sayıların rastgeleliğine çok katı gereksinimler getiriliyorsa, ancak çok sık gerekli değilse, yaşam hakkı da vardır. Bellek fiyatları hızla düşerken, bir cihazı, kullanım ömrü boyunca dayanacak "kaos payı" flash sürücüsüyle stoklamak akıllıca olabilir.
İlginiz için teşekkür ederim!

UPD1: Yorumlarda haklı olarak belirtildiği gibi, RNG'ye bir saldırı olduğu varsayılırsa ve saldırganın cihaza donanım erişimi varsa, harici entropi kaynakları büyük bir dikkatle kullanılmalıdır, çünkü bir sinyalden gelen sinyali değiştirmek çok zor değildir. dış kaynak. Kullanılmalıdır iç kaynaklar, harici ek olabilir.
Her şeyin entropisini biriktirmek de iyi bir fikirdir. boş zaman, ve başka bir rasgele sayı oluşturmanız gerektiğinde kullanın. Genellikle bu gibi durumlarda sözde. entropi havuzu- PRNG işlevlerinden birinin periyodik olarak gerçekleştirildiği ve entropi kaynaklarından gelen verilerin sürekli karıştırıldığı bir dizi.

UPD2:Çoğu durumda, cihazı kapatıp açtıktan sonra tekrar biriktirmemek için Entropy havuzunun içeriğini (üzgünüm, normal Rusça çevirisini bilmiyorum) EEPROM'a kaydetmek yararlıdır. Bu, her şeyden önce, asenkron üreteçler yöntemiyle entropi elde etmek için geçerlidir: yeterince kararlı koşullar altında, her çalıştırmadan sonra aynı dizi üretilebilir.
Bir saldırı bekleniyorsa, EEPROM içeriğinin kurcalanmasına karşı önlem alın. Denetleyici izin veriyorsa, kilit bitlerini kullanarak okuma / silme / yazma işlemini engelleyin, açıldığında, en azından en basit sağlama toplamlarını kullanarak EEPROM'un bütünlüğünü kontrol edin.

Etiketler:

  • rfc
  • gps
  • mikrodenetleyiciler
  • algoritmalar
Etiket ekle

rastgele Tohum (tohum)

Random() işlevinin başlangıç ​​noktası olarak bir değer veya tohum ayarlar.

randomSeed(değer); // 'değer'i ilk rasgele değer olarak ayarlar

Arduino gerçekten rasgele sayılar üretemediğinden, randomSeed, rasgele işleve bir değişken, sabit veya başka bir işlev koymanıza izin vererek daha fazla rasgele sayı üretmenize yardımcı olur.

"rastgele numaralar. Bu işlevde kullanılabilecek birçok farklı çekirdek veya işlev vardır; buna millis(), hatta analogRead() gibi bir analog pin yoluyla elektrik gürültüsünü okumak dahildir.

rasgele (maks)

rastgele (min, maks)

Rastgele işlevi, minimum ve maksimum değerler tarafından verilen aralık içinde sözde rasgele bir sayı döndürmenizi sağlar.

değer = rastgele(100, 200); // 'değer'i rastgele olarak ayarlar

// 100 ile 200 arasında bir sayı

Not: Bunu randomSeed() işlevini kullandıktan sonra kullanın. Aşağıdaki örnek, 0 ile 255 arasında rastgele bir sayı üretir ve PWM'yi verir.

rastgele değere eşit PWM çıkışına sinyal:

int randNumara; // rastgele bir değer depolamak için değişken

int led = 10; // Pim 10'da dirençli LED

geçersiz kurulum() () // kuruluma gerek yok

randomSeed(millis()); // millis() öğesini tohum olarak ayarlar

randNumber = rasgele(255); // 0 - 255 arası rasgele sayı analogWrite(led, randNumber); // çıkış PWM sinyali

gecikme(500); // yarım saniye duraklat

Kaynak: Gololobov V. - Robotlar nerede başlar? Okul çocukları için Arduino projesi hakkında (sadece değil) - 2011

İlgili Mesajlar

Serial.begin (rate) Seri bağlantı noktasını açar ve seri veri aktarımı için hızı ayarlar. Diğer baud hızları desteklense de, bilgisayar iletişimi için tipik baud hızı 9600'dür. geçersiz kurulum()( Serial.begin…….

Tüm değişkenler kullanılmadan önce bildirilmelidir. Bir değişken bildirmek, değerinin türünü tanımlamak anlamına gelir: int, long, float, vb., benzersiz bir değişken adı ayarlamak ve ek olarak…….

Tamam, bu programı kurduk. Modülle çalışmanın “mekanizmasında” hata ayıkladık. Ve birkaç örneğe bakın. Ama kendim için yararlı bir şey yaratmak istiyorum. Hadi deneyelim. Önce bir önceki projeyi kapatalım. Bunun için…….

Dikkat! Diğer geliştirme ortamlarında Arduino modülü ile çalışırken mikrodenetleyici konfigürasyonuna (Sigortalar) dikkat etmelisiniz. Değişikliğin tam olarak neye yol açabileceğini öğrenene kadar…….

Zaman ve rastgele. Reaksiyon

Bu sefer "Rastgele" değerlerin ne olduğunu öğreneceğiz ve ayrıca zamanla nasıl çalışacağımızı öğreneceğiz.

İhtiyacımız olacak:

  • Saat düğmesi
  • gıcırtı
  • Bağlantı kabloları "PAPA-PAPA"

Reaksiyon

Bugünkü görevimiz, tepkimizin hızını bulmamızı sağlayan bir devre kurmak.

Sol tuşa bastığınızda "rastgele" bir süre sonra bir sinyal sesi duyulur. Ve sağ tuşa bastığınızda, gıcırtıdan sağ tuşa basana kadar ne kadar zaman geçtiği not edilir.

Kim yetenekli - kendisi dener ve şemaya bakarız.

#define BUZ 8 #define START 9 #define STOP 7 int zamanı; // Senkronizasyon değişkeni void setup() ( Serial.begin(9600); pinMode(START, INPUT_PULLUP); pinMode(STOP, INPUT_PULLUP); pinMode(BUZ, OUTPUT); ) geçersiz döngü() ( if(digitalRead(START) == 0) // BAŞLAT Düğmesine Basarken.. ( int start_time = millis();// Basma zamanını hatırla time = start_time; // Global bir değişkene yaz int Rand = random(0, 4000) ; // "Rastgele" bir gecikme süresi oluştur = süre + Rand; //Gecikme süresi gecikmesi ekle(Rand); //Bekleme tonu(BUZ, 3000, 500); //Beep! ) if(digitalRead(STOP) = = 0 && digitalRead( START) == 1)// STOP butonuna basıldığında... ( int stop_time = millis(); //Duruş zamanını hatırla. time = stop_time - time; // Zaman farkını hesapla. Serial .println("Time: "); // Serial.Serial.println(time); delay(1000); ) ) // İkinci denemeden önce tekrar BAŞLAT düğmesine basın.

Açıklamalar

int zaman; Değişkenler (tümü değil), atandıklarında herhangi bir değer atanması gerekmez. Bu değişkeni iki if ifadesini bağlamak için kullandık.

C++'da, bir döngü içinde bildirilen değişkenler, yalnızca o döngü içinde geçerli olduklarından, diğer döngülerde mevcut olmayacaktır. Bu, programlama hatalarını önlemek için yapılır. Program kodu büyüdüğünde ne dediğimi anlayacaksınız.

Bir değişkeni birden fazla deyim için kullanılabilir hale getirmek için, onu global yapmalısınız. Onlar. işlevlerin dışında bir değişken bildirin.

milis(); Programın başlamasından bu yana geçen milisaniye sayısını döndürür.

Sinyal vermekten düğmeye basana kadar geçen süreyi ölçmek için buna ihtiyacımız var.

rastgele(dakika,maks); Bu bir "rastgele" sayı üreteci. İki değer alır. Min ile max arasında bir sayı üretir.

Belirli bir değer dizisi olduğu için "rastgele" sayılar. Çok uzun ama aynı. Farklı diziler elde etmek için kullanmalısınız RastgeleTohum();

İşlev, üreteci başlatır. Ve parametreyi rastgele olarak ayarlarsanız, ihtiyacımız olan dizileri elde ederiz. Parametre sabitlenirse aynı sıra olacaktır.

Çözüm

Artık kendi cihazınızın yardımıyla reaksiyonunuzu eğitebilirsiniz. Ve devam edebilirsiniz.

radyo elemanlarının listesi

atama Tip mezhep Miktar NotMağazanot defterim
arduino kurulu

arduino uno

1 not defterine
ekmek tahtasıBreadboard-yarım1 not defterine
Piezo zilPasif1 not defterine
Saat düğmesitutucu olmadan2 not defterine
Bağlantı telleri"Baba baba"1



Tepe