Fara Ring-in knappar med inbyggda regler (5 / 7 steg)
Steg 5: uppladdning
//Denna skiss genomför en "Jeopardy" stil tävlande svar Utslagsfrågan.
//
Varje tävlande har en tryckknapp switch.
Efter installationen anropas funktionen waitingForQuestion. Här används en
accessnätet, snarare än Arduino slingan, vänta på moderator
till att börja. Medan du väntar, är spelare lamporna tända i chase läge.
När moderator pressar växeln S6 knapp, QUESTION_READING
staten börjar. Det finns ingen tidsgräns här. I detta arrangera gradvis spelaren
Lamporna lyser i chase läge. Under denna tid, om en spelare knappen är
pressad, tillämpas ett straff av 0,25 sekunder för nästa fas. När
moderatorn trycker på knappen Växla S5 och släpper det, den
READY_FOR_ANSWER_LIGHT är påslagen och spelaren lysdioder kommer att upphöra och
spelet går vidare till den WAITING_FOR_RING_IN staten.
I WAITING_FOR_RING_IN är READY_FOR_ANSWER_LIGHT
upplyst. Det finns fem andra timeout som vid dess förfallodag,
orsakar spelet till resetAll att rensa variabler, waitingForQuestion
funktionen anropas och staten ändras till QUESTION_READING. När
en spelare trycker på en knapp, om spelaren inte BLOCKERAS från en tidigare
fel svar och helst dröjsmål införts i de QUESTION_READING fas,
spelarens tänds och READY_FOR_ANSWER_LIGHT är avstängd.
Spelet fortsätter till WAITING_FOR_ANSWER staten.
I WAITING_FOR_ANSWER, efter en fem andra timeout eller
en spelare ger ett felaktigt svar, fortsätter spelet till
WAITING_FOR_RING_IN, om det finns spelare surrade ännu inte i. Om en
spelaren ger rätt svar eller alla spelare har försökt besvara,
resetAll rensar variabler, funktionen waitingForQuestion anropas
och staten ändras till QUESTION_READING.
//
Obs: Detta program är inställd att hantera upp till fyra spelare. Om det finns färre
spelare, det kommer att hantera dem, även om när dessa spelare har ringt in och
felaktigt besvarade, programmet kommer tiden ut, i stället för att omedelbart
som erkänner att det finns ingen kvarvarande spelarna. För de traditionella tre
Player purister eller de som inte kan vänta de extra fem sekunderna, MAX_PLAYERS
kan ändras till tre och program recompilied och laddas upp. Det kommer sedan
känner bara igen en spelare genom tre.
2012.12.18 första utgåvan.
/*
* Miljö definitioner
*/
#define MAX_PLAYERS 4
#define TIMEOUT_PERIOD 5000
#define DELAY_TIME 250
#define NO_ANSWER 0
#define CORRECT_ANSWER 1
#define WRONG_ANSWER -1
/*
* Hårdvara definitioner
*/
#define TOP_LED 13
#define TOP_SWITCH 9
CORRECT_ANSWER_BUTTON är växla S6
#define CORRECT_ANSWER_BUTTON 3
WRONG_ANSWER_BUTTON är växla S5
#define WRONG_ANSWER_BUTTON 4
#define READY_FOR_ANSWER_LIGHT 5
/*
* Städning definitioner
*/
int buzzedInPlayer = -1;
int buzzedInPlayerCount = 0;
osignerade långa timeout = 0;
int blockedPlayers = 0;
int moderator;
char ESC_CHAR = 27.
#define PUT_CURSOR_MIDSCREEN\
Serial.Print (ESC_CHAR); \
Serial.Print ("[2J") \
fördröjning (2). \
Serial.Print (ESC_CHAR); \
Serial.Print("[10;1H");
/*
* Knapp tryck definitioner
*/
#define NOT_PUSHED hög
#define sköt låg
#define blockerade -1
/*
* LED stat definitioner
*/
#define LED_ON hög
#define LED_OFF låg
/*
* Spelet stater
*/
#define QUESTION_READING 1
#define WAITING_FOR_RING_IN 2
#define WAITING_FOR_ANSWER 3
int fas = QUESTION_READING;
#define DEBOUNCE_TIME 10
struct player_t {
int ljus;
int buttonPin;
int knappen;
osignerade timePenalty;
} ;// Avsluta struct playerStruct_t
struct player_t spelare [MAX_PLAYERS];
Återställ spelaren tid.
void resetPlayerTime()
{
int i;
för (jag = 0; jag < MAX_PLAYERS; i ++)
{
spelare [i] .timePenalty = 0;
};
} / / End resetAll
Återställas till det ursprungliga tillståndet.
void resetAll()
{
int i;
moderator = NO_ANSWER;
fas = QUESTION_READING;
för (jag = 0; jag < MAX_PLAYERS; i ++)
{
digitalWrite (spelare [i] .light, LED_OFF);
spelare [i] .button = NOT_PUSHED;
resetPlayerTime();
};
buzzedInPlayer = -1;
buzzedInPlayerCount = 0;
} / / End resetAll
int readModerator()
{
Knappen utgåvan är den utlösande faktorn för en knapp har tryckts.
Debounce används för att känna den knapp utgåvan.
om (digitalRead(CORRECT_ANSWER_BUTTON) == PUSHED) {
for(;;) {
Delay(DEBOUNCE_TIME);
om (digitalRead(CORRECT_ANSWER_BUTTON) == NOT_PUSHED) {
bryta;
}
}
återvända CORRECT_ANSWER;
} else om (digitalRead(WRONG_ANSWER_BUTTON) == PUSHED) {
for(;;) {
Delay(DEBOUNCE_TIME);
om (digitalRead(WRONG_ANSWER_BUTTON) == NOT_PUSHED) {
bryta;
}
}
återvända WRONG_ANSWER;
} annat {
återvända NO_ANSWER;
}
}
void readPlayers()
{
Av alla spelare knappar sparas i arrayen spelare.
int i;
för (jag = 0; jag < MAX_PLAYERS; i ++)
{
om (spelare [i] .button! = blockerat) {
om (digitalRead(player[i].buttonPin) == PUSHED) {
spelare [i] .button = PUSHED;
} annat {
spelare [i] .button = NOT_PUSHED;
}
}
}
}
void waitingForQuestion()
{
int i;
digitalWrite (READY_FOR_ANSWER_LIGHT, LED_OFF);
Serial.println (\tModerator, tryck på S6 och börja läsa");
Serial.println ("\tModerator, tryck på S5 när du har frågan");
medan (! () readModerator() == CORRECT_ANSWER)) {
för (jag = 0; jag < MAX_PLAYERS; i ++) {
digitalWrite (spelare [i] .light, LED_ON);
Delay(250);
digitalWrite (spelare [i] .light, LED_OFF);
}
}
PUT_CURSOR_MIDSCREEN
Serial.println ("\tPlayers, vänta på frågan att avsluta");
}
void setup()
{
int i;
för (jag = 0; jag < MAX_PLAYERS; i ++) {
Tilldela lysdioderna, katoder ansluten till marken
spelare [i] .light = TOP_LED - i.
pinMode (spelare [i] .light, produktionen);
Tilldela de tryckknapp växlarna; Anslut ingången till marken när stängt.
spelare [i] .buttonPin = TOP_SWITCH - i.
pinMode (spelare [i] .buttonPin, ingång);
digitalWrite (spelare [i] .buttonPin, hög); Aktivera pullup
}
pinMode (READY_FOR_ANSWER_LIGHT, OUTPUT);
pinMode (WRONG_ANSWER_BUTTON, indata);
digitalWrite (WRONG_ANSWER_BUTTON, hög); Aktivera pullup
pinMode (CORRECT_ANSWER_BUTTON, indata);
digitalWrite (CORRECT_ANSWER_BUTTON, hög); Aktivera pullup
resetAll();
Serial.BEGIN(9600); Ställ in följetong bibliotek på 9600 bps
PUT_CURSOR_MIDSCREEN
waitingForQuestion();
}
void loop()
{
int i;
Växla (fas) {
fall QUESTION_READING: {
Moderatorn har tryckte på reset-knappen
eller den ifrågasatt har varit answeredd
eller alla spelare har svarade felaktigt.
Någon tidpunkt för denna fas.
Någon Buzz-ins kommer att drabbas av 0,25 sekunders fördröjning när nästa läge in.
readPlayers();
Tillämpa straffet för ivriga knappen pressningsanläggningar
för (jag = 0; jag < MAX_PLAYERS; i ++) {
om ((spelare [i] .button == PUSHED) & &
(spelare [i] .timePenalty == 0)) {
spelare [i] .timePenalty = DELAY_TIME;
Serial.Print ("\tPlayer");
Serial.Print(i+1);
Serial.println ("får en straff");
}
}
moderator = readModerator();
om (moderator == WRONG_ANSWER) {
fas = WAITING_FOR_RING_IN;
timeout = millis() + TIMEOUT_PERIOD;
digitalWrite (READY_FOR_ANSWER_LIGHT, LED_ON);
för (jag = 0; jag < MAX_PLAYERS; i ++) {
spelare [i] .timePenalty += millis();
}
PUT_CURSOR_MIDSCREEN
Serial.println ("\tWaiting för ringen i");
Serial.println();
blockedPlayers = 0;
}
bryta;
} / / End fall QUESTION_READING
fall WAITING_FOR_RING_IN: {
Moderator har tryckte på någon knapp i QUESTION_READING tillstånd.
Fem sekunder för denna fas.
om (blockedPlayers > = MAX_PLAYERS) {
PUT_CURSOR_MIDSCREEN
Serial.println ("\tAll spelare har ringt i");
Serial.println ("\tModerator, vänligen Läs nästa fråga");
fas = QUESTION_READING;
resetAll();
waitingForQuestion();
bryta;
} annat {
buzzedInPlayer = -1;
om (timeout > = millis()) {
readPlayers();
för (jag = 0; jag < MAX_PLAYERS; i ++) {
om ((spelare [i] .timePenalty < = millis()) & &
spelare [i] .button == PUSHED) {
buzzedInPlayer = i.
buzzedInPlayerCount + = 1;
digitalWrite (spelare [buzzedInPlayer] .light, LED_ON);
digitalWrite (READY_FOR_ANSWER_LIGHT, LED_OFF);
fas = WAITING_FOR_ANSWER;
timeout = millis() + TIMEOUT_PERIOD;
spelare [i] .button = blockerat;
blockedPlayers + = 1;
PUT_CURSOR_MIDSCREEN
Serial.Print ("\tPlayer nummer");
Serial.println(i+1);
}
}
} annat {
Serial.println ("\tTimed ut väntar en RING_IN");
Serial.println ("\tModerator, vänligen Läs nästa fråga");
fas = QUESTION_READING;
resetAll();
waitingForQuestion();
bryta;
}
bryta;
} / / End annars
} / / End fall WAITING_FOR_RING_IN
fall WAITING_FOR_ANSWER: {
En spelare har DRIVIT knappen i WAITING_FOR_RING_IN tillstånd.
Fem sekunder för denna fas.
om (timeout < millis()) {
om (buzzedInPlayerCount < = MAX_PLAYERS) {
PUT_CURSOR_MIDSCREEN
Serial.println("\tWAITING_FOR_RING_IN");
timeout = millis() + TIMEOUT_PERIOD;
digitalWrite (spelare [buzzedInPlayer] .light, LED_OFF);
digitalWrite (READY_FOR_ANSWER_LIGHT, LED_ON);
fas = WAITING_FOR_RING_IN;
PUT_CURSOR_MIDSCREEN
Serial.Print ("\tPlayer nummer");
Serial.Print(buzzedInPlayer+1);
Serial.println ("timeout väntar på ett svar");
}
}
moderator = readModerator();
om (moderator == CORRECT_ANSWER) {
digitalWrite (spelare [buzzedInPlayer] .light, LED_OFF);
PUT_CURSOR_MIDSCREEN
Serial.Print ("\tPlayer nummer");
Serial.Print(buzzedInPlayer+1);
Serial.println (", som är korrekt");
Serial.println ("\tModerator, vänligen Läs nästa fråga");
fas = QUESTION_READING;
resetAll();
waitingForQuestion();
} annat
om (moderator == WRONG_ANSWER) {
fas = WAITING_FOR_RING_IN;
timeout = millis() + TIMEOUT_PERIOD;
digitalWrite (spelare [buzzedInPlayer] .light, LED_OFF);
digitalWrite (READY_FOR_ANSWER_LIGHT, LED_ON);
Serial.println ("\tOooo, tyvärr, det är fel");
Serial.println ("\tWaiting för ringen i");
resetPlayerTime();
}
bryta;
} / / End fall WAITING_FOR_ANSWER
standard: {
Serial.Print ("standard: fas =");
Serial.println(Phase);
}
} / / End växeln (fas)
}