1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 | // benötigte Bibliotheken einbinden #include “Adafruit_NeoPixel.h” #include “SSD1306Ascii.h” #include “SSD1306AsciiWire.h” // Adresse I2C #define I2C_ADDRESS 0x3C // Name des OLED festlegen SSD1306AsciiWire oled; // digitaler Pin LED-Ring #define RING 7 // digitaler Pin des Lautsprechers #define LAUTSPRECHER 8 // Anzahl der LEDs -> muss an den verwendeten LED-Ring angepasst werden #define AnzahlLED 32 // LED-Ring -> Name des LED-Rings Adafruit_NeoPixel LEDRing = Adafruit_NeoPixel(AnzahlLED, RING, NEO_GRB + NEO_KHZ800); // Status entscheidet, ob das Glücksrad läuft oder gestoppt wird // false -> Glücksrad läuft beim Start volatile bool Status = false; // true -> Lautsprecher ein // false -> Lautsprecher aus bool Toene = true; // true -> zufällige Farbe nach jeder Runde wechseln // false -> Farbwechsel nach jedem Pixel bool FarbWechselRunde = false; // Definition der Farben int ROT, GRUEN, BLAU; // Taster am Interrupt-Port definieren #define TASTER 2 // Variablen für die mit millis() ermittelte Zeit // damit nur jeweils ein Tasterdruck erkannt wird static unsigned long GesicherteStartZeit = 0; unsigned long Startzeit; int Punkte; // Zeit zwischen den Bewegungen der LED int WarteZeit = 100; void setup() { Serial.begin(9600); // NeoPixel Bibliothek initialisieren LEDRing.begin(); // setBrightness(0..255) LEDRing.setBrightness(250); // pinMode des Tasters mit eingeschaltetem Vorwiderstand pinMode(TASTER, INPUT_PULLUP); // Interrupt dem Taster zuordnen und die Funktion LEDSchalten aufrufen attachInterrupt(digitalPinToInterrupt(TASTER), LEDSchalten, FALLING); // Zufallsgenerator starten randomSeed(analogRead(A0)); // OLED starten Wire.begin(); Wire.setClock(400000L); oled.begin(&Adafruit128x64, I2C_ADDRESS); // Schriftart festlegen oled.setFont(TimesNewRoman16); } void loop() { // LED-Ring ausschalten LEDRing.clear(); // zufällige Farbwerte Wechsel nach jeder 360° Drehung // -> FarbWechselRunde true if (FarbWechselRunde) { ROT = ZufallsFarbe(); GRUEN = ZufallsFarbe(); BLAU = ZufallsFarbe(); } // wenn Status false -> Glücksrad läuft if (!Status) { if (Toene) tone(LAUTSPRECHER, 1000, 5); // Start der Drehung mit LED 0 // Ende mit Anzahl der LEDs for (int i = 0; i < LEDRing.numPixels(); i++) { // zufällige Farbwerte: Wechsel nach jeder LED // -> FarbWechselRunde false if (!FarbWechselRunde) { ROT = ZufallsFarbe(); GRUEN = ZufallsFarbe(); BLAU = ZufallsFarbe(); } // Farbe für die aktuelle LED LEDRing.setPixelColor(i, ROT, GRUEN, BLAU); // LEDs einschalten LEDRing.show(); /* Taster gedrückt: Status = true -> Glücksrad stoppen break -> for-Schleife verlassen */ if (Status) { if (Toene) tone(LAUTSPRECHER, 1000, 500); // Punkte ermitteln 32 LEDs, jeweils 4 pro Feld // 40 Punkte if (i >= 0 && i <= 3) Punkte = Punkte + 40; // 100 Punkte if (i >= 4 && i <= 7) Punkte = Punkte + 100; // 20 Punkte if (i > 9 && i <= 12) Punkte = Punkte + 20; // 60 Punkte if (i > 12 && i <= 16) Punkte = Punkte + 60; // 120 Punkte if (i > 16 && i <= 20) Punkte = Punkte + 120; // 160 Punkte if (i > 20 && i <= 24) Punkte = Punkte + 160; // 80 Punkte if (i > 24 && i <= 28) Punkte = Punkte + 80; // 140 Punkte if (i > 28 && i <= 32) Punkte = Punkte + 140; // Punktestand OLED anzeigen oled.setCursor(2, 1); oled.print(“Punktestand:”); oled.setCursor(2, 4); oled.print(String(Punkte) + ” Punkte”); // for-Schleife verlassen break; } // Wartezeit bis zur nächsten LED delay(WarteZeit); // aktuell eingeschaltete LEDs ausschalten LEDRing.setPixelColor(i, 0); // wenn nur eine LED “laufen” soll, der Schalter EineLED false ist // if (!EineLED) LEDRing.setPixelColor(i + 1, 0); } } } void LEDSchalten() { // aktuelle Zeit sichern Startzeit = millis(); /* bei mehr als 250 Millisekunden Differenz zwischen der aktuellen und der gesicherten Zeit -> Status umdrehen aus false wird true -> Glücksrad stoppen aus true wird false -> Glücksrad starten */ if (Startzeit - GesicherteStartZeit > 250) { Status = !Status; } GesicherteStartZeit = Startzeit; } int ZufallsFarbe() { int Farbe = random(0, 255); return Farbe; } |