रिएक्शन टाइमर
Arduino C++अभी बनाए बोर्ड पर एक रिएक्शन-टाइमर गेम बनाएँ। पिन 13 वाली LED 1 से 3 s के किसी बेतरतीब समय के बाद जलती है; खिलाड़ी D2 वाला बटन (GND से जुड़ा) जितनी जल्दी हो सके दबाता है, और LED जलने से दबाने तक का समय इस तरह छपता है, उदाहरण के लिए Reaction: 312 ms। LED जलने से पहले दबाने पर Too soon! छपता है। हर दबाव के बाद LED बुझ जाती है और नया दौर शुरू होता है। दबाव को D2 पर इंटरप्ट से पकड़ें, उसे डिबाउंस करें, और सारा समय millis() से नापें, कभी delay() से नहीं।
जाँच
- अभी चलाया नहीं गयाattachInterrupt, INPUT_PULLUP और millis() इस्तेमाल करता है, और कभी delay() नहीं
- अभी चलाया नहीं गयाशुरुआत में LED बुझी रहती है
- अभी चलाया नहीं गयाLED 3 s के अंदर जलती है
- अभी चलाया नहीं गयादबाने पर LED तुरंत बुझती है और नया दौर शुरू होता है
- अभी चलाया नहीं गयारिएक्शन टाइम छापता है, उदाहरण के लिए Reaction: 312 ms
- अभी चलाया नहीं गयाLED से पहले दबाने पर Too soon! छापता है
संकेत
- attachInterrupt(digitalPinToInterrupt(2), onFall, FALLING), D2 के गिरते ही onFall चलाता है। इंटरप्ट रूटीन को छोटा रखें: एक volatile वेरिएबल में millis() लिखें और एक फ़्लैग सेट करें।
- दबाते समय और छोड़ते समय कॉन्टैक्ट कुछ मिलीसेकंड तक उछलते हैं। किसी एज को तभी गिनें जब 20 ms बाद भी पिन LOW पढ़े।
- delay() नहीं: यह सहेजें कि LED कब जलनी चाहिए, millis() + random(1000, 3001), और loop() में (long)(millis() - goAt) >= 0 से तुलना करें, जो millis() के रोल-ओवर में भी सही रहता है।
- इंटरप्ट जो लिखता है उसे इंटरप्ट बंद करके कॉपी करें (noInterrupts() … interrupts()): unsigned long 4 बाइट का है, और AVR उसे एक-एक बाइट पढ़ता है।