Stap 5: uploaden
//Deze sketch implementeert een "Gevaar" stijl deelnemer reactie tiebreak.
//
Elke deelnemer heeft een drukknop schakelaar.
Nadat Setup is voltooid, wordt de functie waitingForQuestion aangeroepen. Deze maakt gebruik van een
aansluitnet, in plaats van de Arduino lus, te wachten op de moderator
om te beginnen. Terwijl we wachten, is de speler lichten in jachtwijze verlicht.
Wanneer de moderator persen de schakeloptie S6 knop, de QUESTION_READING
staat begint. Er is hier geen tijdslimiet. In deze fase de speler
LEDs zullen licht in chase modus. Gedurende deze tijd, als een speler knop is
ingedrukt, wordt een boete van 0,25 seconden toegepast voor de volgende fase. Wanneer
de moderator de tuimelschakelaar S5 indrukt en weer loslaat, de
READY_FOR_ANSWER_LIGHT is ingeschakeld, speler LEDs zullen vervallen en
het spel zal overgaan tot de WAITING_FOR_RING_IN staat.
In WAITING_FOR_RING_IN is de READY_FOR_ANSWER_LIGHT
verlicht. Er is een vijf tweede timeout die op de vervaldatum,
oorzaken van het spel te resetAll variabelen, de waitingForQuestion wissen
functie wordt aangeroepen en de status wordt gewijzigd naar QUESTION_READING. Wanneer
een speler op een knop drukt, als de speler niet wordt geblokkeerd van een voorafgaande
fout antwoord en vertragingstijd opgelegd in de QUESTION_READING fase,
dat de speler is gedraaid en READY_FOR_ANSWER_LIGHT is uitgeschakeld.
Het spel gaat aan de WAITING_FOR_ANSWER staat.
In WAITING_FOR_ANSWER, na een vijf tweede time-out of
een speler een fout antwoord geven, overgaat het spel tot
WAITING_FOR_RING_IN, als er spelers gonsde nog niet. Als een
speler geeft een correct antwoord of alle spelers hebben geprobeerd om te beantwoorden,
resetAll wist variabelen, de waitingForQuestion-functie wordt aangeroepen
en de status wordt gewijzigd naar QUESTION_READING.
//
Opmerking: Dit programma is ingesteld om maximaal vier spelers. Als er minder
spelers, het zal omgaan met hen, hoewel wanneer die spelers hebben gebeld en
onjuist beantwoord, zal het programma time out, in plaats van onmiddellijk
ERKENNENDE dat er geen overgebleven spelers zijn. Voor de traditionele drie
speler puristen of degenen die niet kunnen met de extra vijf seconden, MAX_PLAYERS wachten
kan worden veranderd in drie en het programma recompilied en geüpload. Het zal dan
herkennen alleen spelers één tot en met 3.
2012.12.18 eerste versie.
/*
* Milieu definities
*/
#define MAX_PLAYERS 4
#define TIMEOUT_PERIOD 5000
#define DELAY_TIME 250
#define NO_ANSWER 0
#define CORRECT_ANSWER 1
#define WRONG_ANSWER -1
/*
* Hardware definities
*/
#define TOP_LED 13
#define TOP_SWITCH 9
De CORRECT_ANSWER_BUTTON is schakelen S6
#define CORRECT_ANSWER_BUTTON 3
De WRONG_ANSWER_BUTTON is schakelen S5
#define WRONG_ANSWER_BUTTON 4
#define READY_FOR_ANSWER_LIGHT 5
/*
* Schoonmaak definities
*/
int buzzedInPlayer = -1;
int buzzedInPlayerCount = 0;
niet-ondertekende lange wachttijd = 0;
int blockedPlayers = 0;
int moderator;
char ESC_CHAR = 27;
#define PUT_CURSOR_MIDSCREEN\
Serial.Print (ESC_CHAR); \
Serial.Print ("[2J"); \
vertraging (2); \
Serial.Print (ESC_CHAR); \
Serial.Print("[10;1h");
/*
* Knop pers definities
*/
#define NOT_PUSHED hoog
#define GEDUWD laag
#define geblokkeerd -1
/*
* LED staat definities
*/
#define LED_ON hoog
#define LED_OFF laag
/*
* Spel Staten
*/
#define QUESTION_READING 1
#define WAITING_FOR_RING_IN 2
#define WAITING_FOR_ANSWER 3
int fase = QUESTION_READING;
#define DEBOUNCE_TIME 10
struct player_t {}
int licht;
int buttonPin;
int de knop;
niet-ondertekende timePenalty;
} ;// Einde struct playerStruct_t
struct player_t speler [MAX_PLAYERS];
Reset de speler tijd.
VOID resetPlayerTime()
{
int i;
voor (ik = 0; ik < MAX_PLAYERS; i ++)
{
speler [i] .timePenalty = 0;
};
} / / Einde van resetAll
Reset naar de oorspronkelijke toestand.
VOID resetAll()
{
int i;
Moderator = NO_ANSWER;
fase = QUESTION_READING;
voor (ik = 0; ik < MAX_PLAYERS; i ++)
{
digitalWrite (speler [i] .light, LED_OFF);
speler [i] .button = NOT_PUSHED;
resetPlayerTime();
};
buzzedInPlayer = -1;
buzzedInPlayerCount = 0;
} / / Einde van resetAll
int readModerator()
{
Knop release is de trigger voor een knop hebben geduwd.
Ontdendering wordt gebruikt om de vrijlating van de knop.
Als (digitalRead(CORRECT_ANSWER_BUTTON) == PUSHED) {}
for(;;) {
delay(DEBOUNCE_TIME);
Als (digitalRead(CORRECT_ANSWER_BUTTON) == NOT_PUSHED) {}
breken;
}
}
Return CORRECT_ANSWER;
} else if (digitalRead(WRONG_ANSWER_BUTTON) == PUSHED) {}
for(;;) {
delay(DEBOUNCE_TIME);
Als (digitalRead(WRONG_ANSWER_BUTTON) == NOT_PUSHED) {}
breken;
}
}
Return WRONG_ANSWER;
} else {}
Return NO_ANSWER;
}
}
VOID readPlayers()
{
Staten van alle knoppen van de speler worden opgeslagen in de array van de speler.
int i;
voor (ik = 0; ik < MAX_PLAYERS; i ++)
{
Als (speler [i] .button! = geblokkeerd) {}
Als (digitalRead(player[i].buttonPin) == PUSHED) {}
speler [i] .button = PUSHED;
} else {}
speler [i] .button = NOT_PUSHED;
}
}
}
}
VOID waitingForQuestion()
{
int i;
digitalWrite (READY_FOR_ANSWER_LIGHT, LED_OFF);
Serial.println ("\tModerator, druk op de S6 en te beginnen lezing");
Serial.println ("\tModerator, pers S5 wanneer u klaar bent met de vraag");
terwijl (! () readModerator() == CORRECT_ANSWER)) {}
voor (ik = 0; ik < MAX_PLAYERS; i ++) {}
digitalWrite (speler [i] .light, LED_ON);
delay(250);
digitalWrite (speler [i] .light, LED_OFF);
}
}
PUT_CURSOR_MIDSCREEN
Serial.println ("\tPlayers, wachten op vraag tot finish");
}
VOID Setup
{
int i;
voor (ik = 0; ik < MAX_PLAYERS; i ++) {}
Toewijzen van de LED's, kathoden aangesloten op grond
speler [i] .light = TOP_LED - i;
pinMode (speler [i] .light, OUTPUT);
Toewijzen van de drukknop schakelaars; Sluit de ingang aan de grond wanneer gesloten.
speler [i] .buttonPin = TOP_SWITCH - i;
pinMode (speler [i] .buttonPin, INPUT);
digitalWrite (speler [i] .buttonPin, hoge); Pullup inschakelen
}
pinMode (READY_FOR_ANSWER_LIGHT, uitvoer);
pinMode (WRONG_ANSWER_BUTTON, INPUT);
digitalWrite (WRONG_ANSWER_BUTTON, hoge); Pullup inschakelen
pinMode (CORRECT_ANSWER_BUTTON, INPUT);
digitalWrite (CORRECT_ANSWER_BUTTON, hoge); Pullup inschakelen
resetAll();
Serial.begin(9600); instellen van seriële bibliotheek 9600 bps
PUT_CURSOR_MIDSCREEN
waitingForQuestion();
}
void loop
{
int i;
schakelaar (fase) {}
kast QUESTION_READING: {}
Moderator heeft de reset-knop gedrukt
of de ondervraagde geweest answeredd
of alle spelers hebben onjuist beantwoord.
Geen tijdschema voor deze fase.
Elke Buzz-ins zal 0,25 seconden vertraging lijden als volgende land ingevoerd.
readPlayers();
Straf solliciteren enthousiast knop persen
voor (ik = 0; ik < MAX_PLAYERS; i ++) {}
Als ((speler [i] .button == PUSHED) & &
(speler [i] .timePenalty == 0)) {
speler [i] .timePenalty = DELAY_TIME;
Serial.Print ("\tPlayer");
Serial.Print(i+1);
Serial.println ("krijgt een boete");
}
}
Moderator = readModerator();
Als (moderator == WRONG_ANSWER) {}
fase = WAITING_FOR_RING_IN;
timeout = millis() + TIMEOUT_PERIOD;
digitalWrite (READY_FOR_ANSWER_LIGHT, LED_ON);
voor (ik = 0; ik < MAX_PLAYERS; i ++) {}
speler [i] .timePenalty += millis();
}
PUT_CURSOR_MIDSCREEN
Serial.println ("\tWaiting voor Ring In");
Serial.println();
blockedPlayers = 0;
}
breken;
} / / Beëindigen geval QUESTION_READING
kast WAITING_FOR_RING_IN: {}
Moderator heeft aangedrongen op de enige knop terwijl in QUESTION_READING staat.
Vijf seconden voor deze fase.
Als (blockedPlayers > = MAX_PLAYERS) {}
PUT_CURSOR_MIDSCREEN
Serial.println ("\tAll spelers hebben gebeld in");
Serial.println ("\tModerator, lees de volgende vraag");
fase = QUESTION_READING;
resetAll();
waitingForQuestion();
breken;
} else {}
buzzedInPlayer = -1;
Als (time-out > = {millis())}
readPlayers();
voor (ik = 0; ik < MAX_PLAYERS; i ++) {}
Als ((speler [i] .timePenalty < = millis()) & &
speler [i] .button == PUSHED) {}
buzzedInPlayer = i;
buzzedInPlayerCount += 1;
digitalWrite (player [buzzedInPlayer] .light, LED_ON);
digitalWrite (READY_FOR_ANSWER_LIGHT, LED_OFF);
fase = WAITING_FOR_ANSWER;
timeout = millis() + TIMEOUT_PERIOD;
speler [i] .button = geblokkeerd;
blockedPlayers += 1;
PUT_CURSOR_MIDSCREEN
Serial.Print ("\tPlayer nummer");
Serial.println(i+1);
}
}
} else {}
Serial.println ("\tTimed te wachten op een RING_IN");
Serial.println ("\tModerator, lees de volgende vraag");
fase = QUESTION_READING;
resetAll();
waitingForQuestion();
breken;
}
breken;
} / / End anders
} / / Beëindigen geval WAITING_FOR_RING_IN
kast WAITING_FOR_ANSWER: {}
Een speler heeft GEDUWD de knop terwijl in WAITING_FOR_RING_IN staat.
Vijf seconden voor deze fase.
Als (time-out < millis()) {}
Als (buzzedInPlayerCount < = MAX_PLAYERS) {}
PUT_CURSOR_MIDSCREEN
Serial.println("\tWAITING_FOR_RING_IN");
timeout = millis() + TIMEOUT_PERIOD;
digitalWrite (player [buzzedInPlayer] .light, LED_OFF);
digitalWrite (READY_FOR_ANSWER_LIGHT, LED_ON);
fase = WAITING_FOR_RING_IN;
PUT_CURSOR_MIDSCREEN
Serial.Print ("\tPlayer nummer");
Serial.Print(buzzedInPlayer+1);
Serial.println ("time-out te wachten een antwoord");
}
}
Moderator = readModerator();
Als (moderator == CORRECT_ANSWER) {}
digitalWrite (player [buzzedInPlayer] .light, LED_OFF);
PUT_CURSOR_MIDSCREEN
Serial.Print ("\tPlayer nummer");
Serial.Print(buzzedInPlayer+1);
Serial.println (", dat klopt");
Serial.println ("\tModerator, lees de volgende vraag");
fase = QUESTION_READING;
resetAll();
waitingForQuestion();
} else
Als (moderator == WRONG_ANSWER) {}
fase = WAITING_FOR_RING_IN;
timeout = millis() + TIMEOUT_PERIOD;
digitalWrite (player [buzzedInPlayer] .light, LED_OFF);
digitalWrite (READY_FOR_ANSWER_LIGHT, LED_ON);
Serial.println ("\tOooo, sorry, dat is fout");
Serial.println ("\tWaiting voor Ring In");
resetPlayerTime();
}
breken;
} / / Beëindigen geval WAITING_FOR_ANSWER
standaard: {}
Serial.Print ("standaard: fase =");
Serial.println(Phase);
}
} / / Einde van de schakelaar (fase)
}