משחק תגובה: טיימר
חלק מהיחידה פרויקטים במסלול ה-Arduino של Coddy. שיעור 6 מתוך 24.
עכשיו המשחק מודד אותך. זמן התגובה הוא הזמן שעובר מהרגע שהנורית LED נדלקת ועד שאתה לוחץ, ולכן הסקץ' צריך לזכור רגע אחד: מתי הדליק את ה־LED.
digitalWrite(ledPin, HIGH);
litAt = millis();
state = LIT;כשהלחיצה מתבצעת במצב LIT, ההפרש הוא התשובה:
unsigned long reaction = millis() - litAt;
Serial.print("Reaction: ");
Serial.print(reaction);
Serial.println(" ms");זה עובד רק כי הסקץ' אף פעם לא נעצר בתוך delay(): loop() בודקת את הכפתור אלפי פעמים בכל אלפית שנייה, כך שהלחיצה מזוהה פחות מאלפית שנייה אחרי שהיא מתרחשת. רוב האנשים זקוקים ל־200 עד 300 ms.
אתגר
בינונימדדו את הזמן של השחקן:
- שמרו את
millis()ב־litAtכשה־LED נדלק - כשהלחיצה מתרחשת במצב
LIT, חשבו אתmillis() - litAt - הציגו אותו כך:
Reaction: 250 ms
לחצו על Run, שחקו, קראו את הצג הטורי ואז לחצו על Check.
נסו בעצמכם
const int ledPin = 12;
const int buttonPin = 2;
// שלושת המצבים של סבב
enum State { READY, WAITING, LIT };
State state = READY;
int lastButton = HIGH; // קריאת הכפתור בפעם הקודמת
unsigned long waitStart = 0; // מתי החלה ההמתנה
unsigned long waitTime = 0; // כמה זמן נמשכת ההמתנה הזו
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
Serial.println("Press the button to start");
}
void loop() {
int button = digitalRead(buttonPin);
bool pressed = (button == LOW && lastButton == HIGH); // נלחץ זה עתה
lastButton = button;
unsigned long now = millis();
switch (state) {
case READY:
if (pressed) {
randomSeed(micros()); // זמן הלחיצה אף פעם אינו זהה פעמיים
waitTime = random(1000, 3001);
waitStart = now;
state = WAITING;
}
break;
case WAITING:
if (now - waitStart >= waitTime) {
digitalWrite(ledPin, HIGH);
state = LIT;
}
break;
case LIT:
if (pressed) {
digitalWrite(ledPin, LOW);
state = READY;
}
break;
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה פרויקטים
2משחק תגובה
משחק תגובה: המתנה אקראיתמשחק תגובה: טיימרמשחק תגובה: התחלה מוקדמתמשחק תגובה: הזמן הטוב ביותרתרגלו בעצמכם: Arduino אונליין