Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Bibliotheken einbinden
- #include <Wire.h> // Wire Bibliothek einbinden
- #include <LiquidCrystal_I2C.h> // Vorher hinzugefügte LiquidCrystal_I2C Bibliothek einbinden
- LiquidCrystal_I2C lcd(0x27, 16, 2); //Hier wird festgelegt um was für einen Display es sich handelt. In diesem Fall eines mit 16 Zeichen in 2 Zeilen und der HEX-Adresse 0x27. Für ein vierzeiliges I2C-LCD verwendet man den Code "LiquidCrystal_I2C lcd(0x27, 20, 4)"
- // Pins für Targets festlegen -> 10mm Target (A1) bis 50mm Target (A5) - A0 dient zur Rückstellung der Punkte
- constexpr byte TARGET_PINS[] {A1, A2, A3, A4, A5, A0};
- constexpr byte NUM_TARGET_PINS {sizeof(TARGET_PINS) / sizeof(TARGET_PINS[0])};
- // Punkte für 10mm Target bis 50mm Target - 0 Punkte zur Rückstellung der Punkte
- constexpr byte T_POINTS_VALUE[NUM_TARGET_PINS] {50, 40, 30, 20, 10, 0};
- // Startpunkte auf 0
- unsigned int score = 0;
- int Piezo = 2;
- //LED-Pins
- const unsigned int MIN_LED_PIN = 3;
- const unsigned int MAX_LED_PIN = 7;
- // Abfrage der Pins - N enthält die Anzahl der Pins
- template <size_t N> bool checkPins(const byte (&pins)[N], byte &index) {
- for (; index < N; ++index) {
- if (HIGH == digitalRead(pins[index])) { return true; }
- }
- return false;
- }
- uint8_t numDigits(unsigned int number) {
- uint8_t digits = (number == 0) ? 1 : 0;
- while (number) {
- number /= 10;
- ++digits;
- }
- return digits;
- }
- void reset(){ // Reset wenn Treffer = 0 Punkte, Kontakt an A0
- lcd.setCursor(10, 0);//Hier wird die Position des ersten Zeichens festgelegt. In diesem Fall bedeutet (0,0) das erste Zeichen in der ersten Zeile.
- lcd.print(" ");
- lcd.setCursor(8, 1);//Hier wird die Position des ersten Zeichens festgelegt. In diesem Fall bedeutet (0,0) das erste Zeichen in der ersten Zeile.
- lcd.print(" ");
- }
- void setup() {
- Serial.begin(38400);
- for (auto pin : TARGET_PINS) {
- pinMode(pin, INPUT);
- pinMode(Piezo, OUTPUT);
- lcd.init();
- lcd.backlight();
- lcd.setCursor(0, 0);
- lcd.print("Treffer :");
- lcd.setCursor(0, 1);
- lcd.print("Gesamt : ");
- lcd.print(score);
- }
- pinMode(A7, INPUT); // Analogen Pin A7 als Eingang definieren
- randomSeed(analogRead(A7)); // Zufallszahlen-Sequenz initialisieren. Durch analogRead am nicht verbundenen Analogeingang wird gewährleistet,
- // dass bei jedem Programmstart eine neue Zufallszahlenfolge verwendet wird.
- for(int pin=MIN_LED_PIN; pin<=MAX_LED_PIN; pin++){
- pinMode(pin, OUTPUT); // PINs von MIN_LED_PIN bis MAX_LED_PIN als OUTPUT festlegen.
- }
- }
- void loop() {
- static unsigned int oldScore {0};
- byte index {0};
- int zufallsWert = random(MIN_LED_PIN, MAX_LED_PIN+1); // Da der obere Wert exklusiv angegeben wird, addieren wir hier 1 dazu um auch die letzte LED zu integrieren
- digitalWrite(zufallsWert, HIGH); // zufällige LED einschalten
- delay(3000); // 3 Sekunden
- // Es wurde ein Treffer registriert. Je nach Index von 10mm (0) bis 50mm (4)
- if (true == checkPins(TARGET_PINS, index) && zufallsWert == HIGH){
- digitalWrite(Piezo, HIGH);
- delay(50);
- digitalWrite(Piezo, LOW);
- delay(250);
- lcd.setCursor(10, 0);
- lcd.print(T_POINTS_VALUE[index]);
- delay(500);
- score = (T_POINTS_VALUE[index] > 5) ? score + T_POINTS_VALUE[index] : 0;
- reset();
- oldScore = score;
- lcd.setCursor(9, 1);
- lcd.print(score);
- digitalWrite(zufallsWert, LOW); // zufällige LED ausschalten
- delay(100); // 0,1 Sekunden warten
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment