DK0975

Zielscheibe

May 11th, 2024
303
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.70 KB | None | 0 0
  1.  
  2. // Bibliotheken einbinden
  3. #include <Wire.h> // Wire Bibliothek einbinden
  4. #include <LiquidCrystal_I2C.h> // Vorher hinzugefügte LiquidCrystal_I2C Bibliothek einbinden
  5. 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)"
  6.  
  7. // Pins für Targets festlegen -> 10mm Target (A1) bis 50mm Target (A5) - A0 dient zur Rückstellung der Punkte
  8. constexpr byte TARGET_PINS[] {A1, A2, A3, A4, A5, A0};
  9. constexpr byte NUM_TARGET_PINS {sizeof(TARGET_PINS) / sizeof(TARGET_PINS[0])};
  10.  
  11. // Punkte für 10mm Target bis 50mm Target - 0 Punkte zur Rückstellung der Punkte
  12. constexpr byte T_POINTS_VALUE[NUM_TARGET_PINS] {50, 40, 30, 20, 10, 0};
  13.  
  14. // Startpunkte auf 0
  15. unsigned int score = 0;
  16.  
  17.  
  18. int Piezo = 2;
  19.  
  20. //LED-Pins
  21. const unsigned int MIN_LED_PIN = 3;
  22. const unsigned int MAX_LED_PIN = 7;
  23.  
  24. // Abfrage der Pins - N enthält die Anzahl der Pins
  25. template <size_t N> bool checkPins(const byte (&pins)[N], byte &index) {
  26. for (; index < N; ++index) {
  27. if (HIGH == digitalRead(pins[index])) { return true; }
  28. }
  29. return false;
  30. }
  31.  
  32. uint8_t numDigits(unsigned int number) {
  33. uint8_t digits = (number == 0) ? 1 : 0;
  34. while (number) {
  35. number /= 10;
  36. ++digits;
  37. }
  38. return digits;
  39. }
  40.  
  41. void reset(){ // Reset wenn Treffer = 0 Punkte, Kontakt an A0
  42. 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.
  43. lcd.print(" ");
  44. 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.
  45. lcd.print(" ");
  46. }
  47.  
  48.  
  49. void setup() {
  50. Serial.begin(38400);
  51. for (auto pin : TARGET_PINS) {
  52. pinMode(pin, INPUT);
  53. pinMode(Piezo, OUTPUT);
  54. lcd.init();
  55. lcd.backlight();
  56. lcd.setCursor(0, 0);
  57. lcd.print("Treffer :");
  58. lcd.setCursor(0, 1);
  59. lcd.print("Gesamt : ");
  60. lcd.print(score);
  61. }
  62.  
  63. pinMode(A7, INPUT); // Analogen Pin A7 als Eingang definieren
  64. randomSeed(analogRead(A7)); // Zufallszahlen-Sequenz initialisieren. Durch analogRead am nicht verbundenen Analogeingang wird gewährleistet,
  65. // dass bei jedem Programmstart eine neue Zufallszahlenfolge verwendet wird.
  66.  
  67. for(int pin=MIN_LED_PIN; pin<=MAX_LED_PIN; pin++){
  68. pinMode(pin, OUTPUT); // PINs von MIN_LED_PIN bis MAX_LED_PIN als OUTPUT festlegen.
  69. }
  70.  
  71. }
  72.  
  73. void loop() {
  74. static unsigned int oldScore {0};
  75.  
  76. byte index {0};
  77.  
  78. 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
  79. digitalWrite(zufallsWert, HIGH); // zufällige LED einschalten
  80. delay(3000); // 3 Sekunden
  81.  
  82. // Es wurde ein Treffer registriert. Je nach Index von 10mm (0) bis 50mm (4)
  83. if (true == checkPins(TARGET_PINS, index) && zufallsWert == HIGH){
  84. digitalWrite(Piezo, HIGH);
  85. delay(50);
  86. digitalWrite(Piezo, LOW);
  87. delay(250);
  88. lcd.setCursor(10, 0);
  89. lcd.print(T_POINTS_VALUE[index]);
  90. delay(500);
  91. score = (T_POINTS_VALUE[index] > 5) ? score + T_POINTS_VALUE[index] : 0;
  92. reset();
  93. oldScore = score;
  94. lcd.setCursor(9, 1);
  95. lcd.print(score);
  96. digitalWrite(zufallsWert, LOW); // zufällige LED ausschalten
  97. delay(100); // 0,1 Sekunden warten
  98. }
  99. }
Advertisement
Add Comment
Please, Sign In to add comment