// software for http://www.kreativekiste.de/elektro/dem-heissen-draht-auf-der-spur // developed by Timo Denk (Nov 2014) // // wiring: // 0: start // 1: stop // 2: mistake // 3: buzzer // A0: penalty time // A4: display SDA // A5: display SCL // libraries #include #include LiquidCrystal_I2C lcd(0x3F,20,4); const byte startPin = 0, stopPin = 1, mistakePin = 2, buzzerPin = 3, penaltyTimePin = A0; const byte minPenaltyTime = 1, maxPenaltyTime = 15; // [t] = 1 s const String penaltyTimeString = "Fehler", finalTimeString = "Endzeit", timeString = "Zeit", commercialString = "www.kreativekiste.de", totalTime = "Gesamtzeit"; long millisStart, millisEnd; int mistakes, penaltyTime, lastPenaltyTime; void setup() { lcd.init(); lcd.backlight(); pinMode(startPin, INPUT); pinMode(stopPin, INPUT); pinMode(mistakePin, INPUT); pinMode(buzzerPin, OUTPUT); digitalWrite(buzzerPin, LOW); digitalWrite(startPin, HIGH); digitalWrite(stopPin, HIGH); digitalWrite(mistakePin, HIGH); } void loop() { clearScreen(); printStringCenter(1, "Heisser Draht"); printStringCenter(2, "Strafzeit einstellen"); lastPenaltyTime = 0, penaltyTime = 0; // waiting for game to start while (digitalRead(startPin) == HIGH) { penaltyTime = (byte)round(map(analogRead(penaltyTimePin), 0, 1023, minPenaltyTime, maxPenaltyTime)); if (penaltyTime != lastPenaltyTime) { clearRow(3); printStringCenter(3, String(penaltyTime) + " s"); lastPenaltyTime = penaltyTime; } } // game running millisStart = millis(); clearScreen(); mistakes = 0; while (digitalRead(stopPin) == HIGH) { // check for mistakes printStatusOnScreen(); if (digitalRead(mistakePin) == LOW) { mistakes++; digitalWrite(buzzerPin, HIGH); printStatusOnScreen(); delay(500); digitalWrite(buzzerPin, LOW); } delay(10); } // game finished millisEnd = millis(); clearScreen(); clearRow(0); printStringCenter(0, "Spiel beendet!"); printStatusOnScreen(); delay(16000); } void printStatusOnScreen() { int playingTime = round((millis() - millisStart)/1000), penaltyTimeSum = mistakes * penaltyTime; printStringCenter(1, "Spielzeit: " + sec2MinSecString(playingTime)); printStringCenter(2, "Fehler: " + String(mistakes) + " x " + String(penaltyTime) + "s"); printStringCenter(3, "Gesamt: " + sec2MinSecString(playingTime + penaltyTimeSum)); } void showCommercial() { clearRow(0); printStringCenter(0, commercialString); } void clearScreen() { for (byte i = 0; i < 4; i++) clearRow(i); showCommercial(); } void printStringCenter(byte row, String string) { lcd.setCursor((int)((20 - string.length()) / 2), row); lcd.print(string); } void clearRow(byte row) { lcd.setCursor(0, row); lcd.print(" "); } String sec2MinSecString(int input) { // converts seconds to a string like "minutes:seconds" String minutes = String((int)(input / 60)); String seconds = String(input % 60); if (seconds.length() == 1) seconds = "0" + seconds; //if (minutes.length() == 1) // minutes = "0" + minutes; return minutes + ":" + seconds + " "; }