Vergangenen Samstag fand im FabLab Neuenstadt der erste Workshop unseres aktuellen Jahresprogramms statt. Dozent Andreas Stahl begleitete die 6 Besucher bei ihren ersten Konstruktionsschritten in TinkerCAD. Mit TinkerCAD können kinderleicht eigene 3D-Modelle erstellt werden. Diese benötigt man zum Beispiel, wenn man mit unseren 3D-Druckern oder unserer CNC-Fräse arbeiten möchte.
TinkerCAD Workhop am 11. März 2023Konstruktionsübung: Kirche
Um die Grundfunktionen und Bedienung des browserbasierten 3D-CAD Tools zu lernen, konstruierten die Teilnehmer zuerst eine kleine Kirche aus geometrischen Grundobjekten (Quader, Zylinder, Pyramide, etc.). Anschließend wurden fortgeschrittenere Methoden besprochen und wertvolle Tipps gegeben. Andreas zeigte unseren Besuchern beispielsweise, wie man das Dach des Neuenstädter Stadtturms konstruieren kann.
Stadtturm 3D gedruckt
Wir bedanken uns an dieser Stelle nochmals ganz herzlich bei Andreas für den gelungenen und sehr kurzweiligen Workshop!
Hast du Interesse an Technik und Co.? Dann stöbere doch mal durch unser Freizeitprogramm 2023 und melde dich an!
Wir bieten in diesem Jahr ein umfangreiches Freizeitprogramm, bestehend aus unterschiedlichen Workshops und Veranstaltungen an. Das vollständige Programm kann auf unserer Homepage (Öffnungszeiten & Veranstaltungen → Freizeitprogramm 2023) angesehen oder heruntergeladen werden.
Am Freitag den 25.11.2022 fand die jährliche Mitgliederversammlung des Jugendförderverein Brückedächle e.V. im Jugendhaus Neuenstadt statt.
Nach der Entgegennahme des Vorstandberichts wurde von den Mitgliedern ein neuer Vorstand gewählt. Dieser setzt sich wie folgt zusammen:
1. Vorsitzender: Sören Oberndörfer
2. Vorsitzender: Ramon Haack
Kassenwart: Martin Trunk
Schriftführer: Mathias Häberle
Beisitzer: Alexander Ljubizki und Jan Bopp
Ausgeschieden aus dem Vorstand sind: Antonio Kadoic, Lina Richter, Marco Thiele, Timo Thiele. An dieser Stelle nochmals ein großes und herzliches Dankeschön für die Zusammenarbeit in den letzten Jahren!
Im Anschluss an die Wahl wurde über größere Vorhaben im kommenden Jahr diskutiert:
Jahresplaner: Unser Verein möchte zukünftig zusammen mit dem Jugendreferat einen Jahresplaner mit allen Terminen im Jugendhaus, FabLab Neuenstadt, FabLab Reparaturcafé, Kinderferienprogramm, etc. veröffentlichen. Dieser soll dann an öffentlichen Stellen wie z.B. den Schulen oder dem Rathaus ausliegen, aber auch online aufrufbar sein.
Für die Fräse und weitere Maschinen soll eine Absauganlage inklusive Verrohrung angeschafft werden.
Das FabLab möchte seine Ausstattung im Holzbereich erweitern. Gekauft werden sollen einige Handwerkzeuge (Sägen, Hobel, Stemmeisen, …) aber auch größere Maschinen wie eine Tisch- oder Bandsäge, sofern sich hierfür Sponsoren finden.
Nach der Versammlung ließen wir den Abend mit einer gemütlichen Weihnachtsfeier ausklingen.
Mitte 2021 ist das FabLab Neuenstadt in größere Räumlichkeiten umgezogen. Die bestehende Elektroinstallation war jedoch leider nicht mehr auf dem neusten Stand, so fehlte es beispielsweise an Fehlerstromschutzeinrichtungen. Gerade diese erachteten wir aufgrund unserer offenen und techniklastigen Arbeit als notwendig, um die Gefahren für unsere Besucherinnen und Besucher und die Reparateure im FabLab ReparaturCafé zu reduzieren. Aber auch unsere neu eingebaute Küche musste noch an’s Netz angeschlossen werden. Auch einige weitere Sonderwünsche flossen bald in das Projekt mit ein. Unser Mitglied Jan – gelernter Elektroniker für Betriebstechnik, der zu diesem Zeitpunkt gerade die Meisterschule besucht hatte – nahm sich dem Projekt an und begann mit der Planung des Umbaus. Nachdem ein grober Plan erstellt war, wurde dieser Ende 2021 der Mitgliederversammlung vorgestellt und zur Abstimmung gegeben. Diese sprach sich einstimmig für den Umbau aus.
Danach begann die organisatorische Planung des Projekts. Eine genaue Materialaufstellung und Preiskalkulation musste erstellt werden und ein Spendenantrag wurden geschrieben. Glücklicherweise erhielten wir von der in Neuenstadt ansässigen Firma ABN GmbH (Schneider Electric) bald die Zusage, dass sie uns bei der Beschaffung der Materialien für die neue Unterverteilung finanziell untersützen werden. Die ersten Materialien wurden bestellt und es konnte endlich mit den Vorbereitungen begonnen werden. Circa 200 Meter Kabel wurden neu eingezogen, mehrere Meter Kabelkanäle und Installationsrohr, sowie neue Steckdosen, Taster und Verteilerdosen wurden gesetzt. Die Unterverteilung wurde bereits komplett aufgebaut, sodass diese am späteren Bestimmungsort „nur“ noch ausgetauscht werden musste.
Neue Steckdose für KompressorAufbau neue UnterverteilungNeue UnterverteilungUnterputzinstallation KücheKüche aufgebautVorbereitungen
Nach den langen Vorbereitungen ging es dann am Donnerstag den 25.08.2022 mit dem finalen Umbau los. Da am Samstag noch ein ReparaturCafé in unseren Räumlichkeiten stattfinden sollte, wurde zuerst der untere Teil des FabLabs vom Netz getrennt und umgebaut. Es mussten noch Teile der alten Installtion entfernt und einige Kabel umgeklemmt werden. Als das ReparaturCafé erfolgreich zuende ging, konnte der nächste Bauabschnitt gestartet werden. Auch der obere Raum wurde komplett vom Netz getrennt, die alte Unterverteilung entfernt und durch den neuen Verteilerschrank ersetzt. Auch hier mussten im restlichen Raum noch mehrere Kabel umgeklemmt und umgezogen werden. Sonntags konnten dann die Kabel im neuen Verteiler aufgelegt werden. Am Montag den 29.08 war es dann endlich geschafft. Die Neuinstallation hat alle erforderlichen Messungen bestanden und konnte in Betrieb genommen werden.
KabelchaosAustauschUmbau abgeschlossenAustausch der Unterverteilung
Nochmals ein herzliches Dankeschön an alle Helfer, sowie an die ABN GmbH für ihre Unterstützung!
Alle nutzen Computer und nur wenige können Sie programmieren, aber wer programmieren kann, kann die Welt verändern.
Wir bieten einen Einsteigerkurs an.
Was muss mitgebracht werden? Hirn und Verstand und ein tragbares Notebook. Wenn kein Notebook zur Verfügung steht, dann können wir nach Absprache eines zur Verfügung stellen.
Der Kurs ist für diejenigen, die es cool fänden, wenn sich nach dem Anklicken eines Icons auf dem Desktop ein Programm öffnet, welches genau das macht, was man sich vorgestellt hat. Vielleicht hat Ihr Kind Interesse daran? Alter: 10 – 50 Jahre
Was kostet das Ganze? Nichts! Die Programmiersprache, die wir verwenden heißt Python. Python kann jeder kostenlos downloaden.
Wir treffen uns immer mittwochs um 19.00 bis 21.00 Uhr im Fablab.
Erster Termin: 22.6.2022, max. Teilnehmerzahl: 10
Dauer: Entsprechend dem Interesse, der Lernbereitschaft und dem Spaß dabei.
Hiermit laden wir herzlich zu unserer virtuellen Mitgliederversammlung am Freitag, den 10. Dezember 2020 um 19 Uhr ein. Wie im letzten Jahr werden wir die Mitgliederversammlung wieder virtuell durchführen. Für die Teilnahme ist eine vorherige Anmeldung unter: https://anmeldung.fablab-neuenstadt.de/vmv2021/ notwendig um die personalisierten Zugangsdaten und weitere Informationen für die Teilnahme mitzuteilen. Wir freuen uns über eine rege Teilnahme!
Tagesordnung:
Entgegennahme des Jahresberichtes des Vorstandes
Feststellung der Beschlussfähigkeit
Feststellung der Jahresrechnung
Entgegennahme des Prüfungsberichtes der Kassenprüfer*innen
Wahl der Kassenprüfer*innen (2 Posten)
Entlastung des Vorstandes einschl. Kassenverwaltung
Anträge / Anschaffungen
Küche
Anmietung Räumlichkeiten
Elektroverkabelung
Staubsauger
Playstation 5
3D Scanner
Ausblick
Sonstiges
Bleiben Sie gesund!
Vorstand des Jugendfördervereins Brückedächle e. V.
Besuchen kann man das FabLab vorerst wieder ab dem 12. Oktober 2021 jeden Dienstag von 18.30 bis 21.00 Uhr.
In der Zwischenzeit ist das FabLab in das EG der Öhringer Str. 24 (ehem. Schlosserei Binnig) umgezogen.
Während der regulären Öffnungszeit sind immer Menschen anwesend, die sich mit der Bedienung der Geräte auskennen und gegebenenfalls entsprechende Einweisungen und Hilfestellungen geben können.
Der Zutritt ist nur unter Einhaltung des Hygienekonzepts möglich. Dieses sollte vor dem Besuch unbedingt gelesen werden. Es ist aber auch vor den Räumlichkeiten ausgehängt. Bei Fragen stehen wir gerne per Mail unter vorstand@fablab-neuenstadt.de, über facebook @FabLabNeuenstadt oder Instagram @fablab_neuenstadt zur Verfügung.
Der Vorstand des Jugendfördervereins Brückedächle e.V. sowie alle Vereinsangehörigen freuen sich auf Ihren Besuch!
Wir blicken auf ein schwieriges Jahr 2020 zurück und möchten uns für die Unterstützung jeglicher Art bedanken. Ein besonderer Dank gilt der Mörike-Apotheke und der Avia Tankstelle für den Verkauf der im FabLab Neuenstadt selbst erstellten Holzarbeiten zur Weihnachtszeit.
Nun blicken wir nach vorne und laden Sie ein, unsere Projekte und Veranstaltungen zu besuchen, sobald wir wieder öffnen dürfen.
Unser Projekt FabLab ist für kreative Menschen der ideale Platz, egal ob man ein T-Shirt bedrucken oder besticken möchte, aus Holz lasercutten oder Materialien mit unserer neuen CNC-Fräse bearbeiten möchte. Zudem können defekte Geräte in unserem monatlichen Reparaturcafé unter Anleitung repariert werden.
Wir wünschen Ihnen einen guten Start in das Jahr 2021.
Zum Senso: Gehäuse im 3D-Druck erzeugt und aus lasergeschnittenen Arcylteilen gefertigt. Hardware: Arduino Standard, Mp3-Player (DFPlayer mini), LCD-Display 16×2, 4 Tastenfelder jeweils mit individuell ansteuerbarer LED und 4 zusätzliche Bedientasten. Funktionen: Verschiedene Spiele mit Licht- und Soundeffekten und MP3-Player zum Musikabspielen mit verschiedenen Lichteffekten. Besonderheiten: Objektorientierte Software, die speziell mit den beschränkten Fähigkeiten eines normalen Arduino umgehen muss in Bezug auf Speicherkapazität und Rechenleistung. Ergebnis: Absolut direkte Bedienung ohne jegliche Hänger. Reagiert jederzeit auf alle Tastendrücke. Ebenfalls Aufbau einer Menüstruktur, die mit den geringen Ressourcen umgehen kann und eine gute Basis ist für weitere Projekte. Mit dieser Software wurde speziell gezeigt, wie eine Echtzeitfähigkeit mit einem Mikrocontroller erreicht werden kann.
Arduino Code
include LiquidCrystal_I2C lcd(0x27, 16, 2); // Den Tasten wird eine programminterne Nummer zugeordnet: define oben 0 define rechts 1 define unten 2 define links 3 define ESC 4 define Pfeil_links 5 define Pfeil_rechts 6 define Enter 7 // Nur zur Info für LCD-Darstellung: ä:“\xE1″, ö :“\xEF“, ü :“\xF5″, ß:“\xE2″, °:“\xDF“, μ:“\xE4″, Ω:“\xF4″, komplett helles Feld:“\xFF“ // Prototyping: class Tastenklasse; class KeySoundSet; class LEDklasse; class Menuepunkt; class Liedwahl; void leiser(); void lauter(); void soundStop(); void Spiele_Lied(uint8_t Songnumber); void schreibe(const String& a, const String& b); void schreibe_loops(uint8_t Zahl); class Tastenklasse { private: int Pinnummer; // die hardwaremäßige Pinnummer der Taste am Arduino bool Key_pressed; // hier wird der letzte Tastenzustand gespeichert 1=war gedrückt public: bool Tastenevent; // Das Ereignis des Drückens der Taste, nicht der zustand des Gedrücktseins ! void Setup(int Pinnummer_) { Pinnummer = Pinnummer_; // Die private Variable Pinnummer wird mit dem Wert der übergebenen Variablen belegt pinMode(Pinnummer, INPUT); // Weil eine Taste angeschlossen ist muss der Eingang natürlich auf INPUT gesetzt werden Key_pressed = false; } void Eventabfrage() { // setzt Key_pressed auf true, wenn die Taste gedrückt ist und Tastenevent auf true, wenn sie bei der letzten Abfrage nicht gedrückt war Tastenevent = false; if (digitalRead(Pinnummer) == 1) { if (! Key_pressed) Tastenevent = true; // wenn die Taste seither nicht gedrückt war: Key_pressed = true; } else Key_pressed = false; } bool pressed() { return (Key_pressed); } }; class LEDklasse { private: int Pinnummer; bool ist_ein; int Helligkeit; public: void Setup (int Pinnummer_, int Helligkeit_) { Pinnummer = Pinnummer_; Helligkeit = Helligkeit_; // Helligkeit ist die aktuell eingestellte Helligkeit ist_ein = false; } void ein() { ist_ein = true; } void aus() { ist_ein = false; } void set_Helligkeit(int Helligkeit_) { Helligkeit = Helligkeit_; } void heller(int Schritt) { Helligkeit += Schritt; if (Helligkeit > 255) Helligkeit = 255; } void dunkler(int Schritt) { Helligkeit -= Schritt; if (Helligkeit < 0) Helligkeit = 0; } void strahle() { Helligkeit = (Helligkeit << 1) + 1; if (Helligkeit > 255) Helligkeit = 255; } void verblasse() { Helligkeit = Helligkeit >> 1; } void set(bool soft_) { if (ist_ein or soft_) analogWrite(Pinnummer, Helligkeit); else analogWrite(Pinnummer, 0); } }; LEDklasse LED[4]; class KeySoundSet { private: uint8_t _ESC, _Arraynummer; uint8_t Soundset = 190; //Tastensounds: 190 = Liednummer 190..194, 195 = Liednummer 195..199, 200 = Liednummer 200..204 4 Töne und ein „Zong“ uint8_t _Number_of_Sets; public: void set(uint8_t ESC_, uint8_t Arraynummer_, uint8_t Number_of_Sets_) { ESC = ESC; Arraynummer = Arraynummer; Number_of_Sets = Number_of_Sets; } uint8_t Soundnumber() { return (Soundset); } uint8_t loop(Tastenklasse Tastatur[]) { if (Tastatur[Pfeil_links].Tastenevent) { if (Soundset > 190) Soundset -= 5; } if (Tastatur[Pfeil_rechts].Tastenevent) { if (Soundset < 5 * (_Number_of_Sets - 1) + 190) Soundset += 5; } schreibe("", "Set: " + String((Soundset - 190) / 5 + 1) + " try it!"); for (uint8_t i = 0; i < 4; i++) { if (Tastatur[i].pressed()) LED[i].ein(); else LED[i].aus(); if (Tastatur[i].Tastenevent) Spiele_Lied(Soundset + i); } if (Tastatur[Enter].Tastenevent) Spiele_Lied(Soundset + 4); // Zong auf Enter if (Tastatur[ESC].Tastenevent) return (_ESC); else return (_Arraynummer); } }; KeySoundSet Tastensound; class Menuepunkt { private: uint8_t _links, _rechts, _ESC, _Enter, Eigene_Menuenummer; public: void set(uint8_t links_, uint8_t rechts_, uint8_t ESC_, uint8_t Enter_, uint8_t Eigene_Menuenummer_) { _links = links_; _rechts = rechts_; _ESC = ESC_; _Enter = Enter_; Eigene_Menuenummer = Eigene_Menuenummer_; } uint8_t loop(Tastenklasse Tastatur[]) { if (Tastatur[Pfeil_links].Tastenevent) return (_links); if (Tastatur[Pfeil_rechts].Tastenevent)return (_rechts); if (Tastatur[ESC].Tastenevent) return (_ESC); if (Tastatur[Enter].Tastenevent) return (_Enter); else return (Eigene_Menuenummer); } }; class Senso_Classic { private: uint8_t Key_event[4], Key_pressed[4], _ESC, Eigene_Menuenummer, Spielzustand, Zaehler, Vorgabetaste[50], akt_elem; // Spielzustand 0=Zufallsfolge erzeugen, 1 = spielt vor, 2 = nachspielen; unsigned long timestamp; public: void set(uint8_t ESC_, uint8_t Eigene_Menuenummer_) { ESC = ESC; Eigene_Menuenummer = Eigene_Menuenummer_; Spielzustand = 0; Zaehler = 0; akt_elem = 0; } uint8_t loop(Tastenklasse Tastatur[]) { Key_event[0] = Tastatur[oben].Tastenevent; Key_event[1] = Tastatur[rechts].Tastenevent; Key_event[2] = Tastatur[unten].Tastenevent; Key_event[3] = Tastatur[links].Tastenevent; Key_pressed[0] = Tastatur[oben].pressed(); Key_pressed[1] = Tastatur[rechts].pressed(); Key_pressed[2] = Tastatur[unten].pressed(); Key_pressed[3] = Tastatur[links].pressed(); if (Spielzustand == 0 and Zaehler == 0) { // Spiel hat noch nicht begonnen for (auto &i : LED) i.set_Helligkeit(255); randomSeed(millis()); // den Randombefehl mit der aktuellen zufälligen Systemzeit setzen (macht diesen wirklich zufällig) for (auto &i : Vorgabetaste) i = random(4); // vorbelegen einer Zufallsfolge Zaehler = 1; // Zaehler gibt vor, wieviele Tasten man sich merken muss Spielzustand = 1; // 1=Abspielen der Zufallsfolge / 2=Nachspielen timestamp = millis(); schreibe_loops(Zaehler); } else { if (Spielzustand == 1 and millis() - 300 > timestamp) for (auto &i : LED) i.aus(); if (Spielzustand == 1 and millis() - 500 > timestamp) { // Abspielen timestamp = millis(); if (akt_elem < Zaehler) { LED[Vorgabetaste[akt_elem]].ein(); Spiele_Lied(Tastensound.Soundnumber() + Vorgabetaste[akt_elem]); akt_elem++; } else { Spielzustand = 2; // Umschalten auf Nachspielen akt_elem = 0; } } else if (Spielzustand == 2) { // Nachspielen for (uint8_t i = 0; i < 4; i++) { // alle LEDs ausschalten if (not Key_pressed[i]) LED[i].aus(); // nur, wenn die Taste losgelassen wurde. } if (Key_event[Vorgabetaste[akt_elem]]) { // es wurde die richtige Taste gedrückt LED[Vorgabetaste[akt_elem]].ein(); Spiele_Lied(Tastensound.Soundnumber() + Vorgabetaste[akt_elem]); akt_elem++; } else { for (uint8_t i = 0; i < 4; i++) { if (Key_event[i] and i != Vorgabetaste[akt_elem]) // Falsch getippt { Spiele_Lied(Tastensound.Soundnumber() +4); delay (2500); Zaehler = 0; akt_elem = 0; Spielzustand = 0; } } } if (akt_elem == Zaehler) { // alle wurden richtig getippt, zurück zum Abspielen Spielzustand = 1; akt_elem = 0; Zaehler++; schreibe_loops(Zaehler); timestamp = millis() + 1000; } } } if (Tastatur[ESC].Tastenevent) { Spielzustand = 0; Zaehler = 0; akt_elem = 0; return (_ESC); } else return (Eigene_Menuenummer); } }; class Reaktionsspiel { private: uint8_t _ESC, Eigene_Menuenummer, Spielzustand, Countdown, Taste; // Spielzustand 0 = Neu gestartet, 1 = Startmodus, 2 = Taste wird vorgegeben, 3 = warte auf Tastendruck; unsigned long Restzeit, Punkte, Top_Punkte, timestamp; public: void set(uint8_t ESC_, uint8_t Eigene_Menuenummer_) { ESC = ESC; Eigene_Menuenummer = Eigene_Menuenummer_; Spielzustand = 0; Top_Punkte = 0; } uint8_t loop(Tastenklasse Tastatur[]) { switch (Spielzustand) { case 0 : for (auto &i : LED) { i.set_Helligkeit(255); i.aus(); } Countdown = 5; Restzeit = 20000; Punkte = 0; timestamp = millis(); Spielzustand = 1; break; case 1: schreibe("Start in " + String(Countdown) + " sek. ", "Punkte:" + String(Punkte) + " Top:" + String(Top_Punkte) + " "); if (millis() >= timestamp + 1000) { Countdown--; timestamp = millis(); } if (Countdown == 0) Spielzustand = 2; break; case 2: randomSeed(millis()); // den Randombefehl mit der aktuellen zufälligen Systemzeit setzen (macht diesen wirklich zufällig) Taste = random(4); schreibe("Rest: " + String(Restzeit) + "ms ", "Punkte:" + String(Punkte) + " Top:" + String(Top_Punkte) + " "); Spiele_Lied(Tastensound.Soundnumber() + Taste); LED[Taste].ein(); timestamp = millis(); Spielzustand = 3; break; case 3: Restzeit -= (millis() - timestamp); // Restzeit wird reduziert um die Zeit, die seit dem letzten Aufruf dieser Methode vergangen ist. timestamp = millis(); schreibe("Rest: " + String(Restzeit) + "ms ", "Punkte:" + String(Punkte) + " Top:" + String(Top_Punkte) + " "); for (int i = 0; i < 4; i++) { if (Tastatur[i].Tastenevent) { if (i == Taste) { // Die richtige Taste wurde gedrückt soundStop(); Punkte++; LED[Taste].aus(); if (Punkte > Top_Punkte) Top_Punkte = Punkte; Spielzustand = 2; } else { // die falsche Taste wurde gedrückt Spiele_Lied(Tastensound.Soundnumber() +4); for (auto &i : LED) i.ein(); delay (2500); for (auto &i : LED) i.aus(); if (Punkte > Top_Punkte) Top_Punkte = Punkte; Spielzustand = 0; } } } if (Restzeit > 1000000) { // Spielzeit ist vorbei (wegen unsigned wird Restzeit nicht negativ, sondern riesengroß) for (auto &i : LED) i.aus(); Spielzustand = 0; } break; } if (Tastatur[ESC].Tastenevent) { for (auto &i : LED) i.aus(); Spielzustand = 0; return (_ESC); } else return (Eigene_Menuenummer); } }; class Liedwahl { private: uint8_t _links, _rechts, _ESC, _Enter; bool _Lied_spielt = false; public: void set(uint8_t links_, uint8_t rechts_, uint8_t ESC_, uint8_t Enter_) { links = links; rechts = rechts; ESC = ESC; Enter = Enter; } uint8_t loop(Tastenklasse Tastatur[]) { if (Tastatur[links].pressed()) leiser(); if (Tastatur[rechts].pressed()) lauter(); if (Tastatur[oben].pressed()) for (auto &i : LED) i.heller(5); if (Tastatur[unten].pressed()) for (auto &i : LED) i.dunkler(5); if (Tastatur[Pfeil_links].Tastenevent) { _Lied_spielt = false; return (_links); } if (Tastatur[Pfeil_rechts].Tastenevent) { _Lied_spielt = false; return (_rechts); } if (Tastatur[ESC].Tastenevent) { soundStop(); if (_Lied_spielt) { _Lied_spielt = false; return (_Enter); } else return (_ESC); } if (Tastatur[Enter].pressed()) { if (not _Lied_spielt) { Spiele_Lied(_Enter); _Lied_spielt = true; } } return (_Enter); } }; class DiscoSpeedSet { private: uint8_t _ESC, _Arraynummer; public: unsigned long Discotimer = 200; void set(uint8_t ESC, uint8_t Arraynummer_) { ESC = ESC; Arraynummer = Arraynummer; } uint8_t loop(Tastenklasse Tastatur[]) { if (Tastatur[Pfeil_links].pressed() and _Discotimer > 0) _Discotimer--; if (Tastatur[Pfeil_rechts].pressed() and _Discotimer < 2000) _Discotimer++; schreibe("set Pause: " + String(_Discotimer) + "ms ", "Nur f\xF5r Typ hard"); if (Tastatur[oben].pressed()) { // obere Taste = heller LED[oben].ein(); for (auto &i : LED) i.heller(5); } else LED[oben].aus(); if (Tastatur[unten].pressed()) { // untere Taste = dunkler LED[unten].ein(); for (auto &i : LED) i.dunkler(5); } if (Tastatur[ESC].Tastenevent) { for (auto &i : LED) i.aus(); return (_ESC); } else return (_Arraynummer); } }; class DiscoTypeSet { private: uint8_t _ESC, _Arraynummer, DiscoTyp, Discolight; uint16_t Lichtspiele[10] = {0x0F0F, 0xEDB7, 0x6C93, 0x1248, 0xA5A5, 0xF5A0, 0xAA55, 0x2585, 0xA4A1, 0x0000}; // jede Stelle entspricht einem der vier hintereinander abzuspielenden Bilder (rückwärts) /* 0 0000 4 0100 8 1000 C 1100 1 0001 5 0101 9 1001 D 1101 2 0010 6 0110 A 1010 E 1110 3 0011 7 0111 B 1011 F 1111 */ uint8_t Anzahl_Lichtspiele = 10; unsigned long _timestamp; uint8_t Stufe; public: bool soft; void set(uint8_t ESC_, uint8_t Arraynummer_) { _ESC = ESC_; _Arraynummer = Arraynummer_; _timestamp = millis(); Discolight = 0; DiscoTyp = 3; soft = false; Stufe = 0; } uint8_t loop(Tastenklasse Tastatur[]) { if (Tastatur[Pfeil_links].Tastenevent && (DiscoTyp > 0)) { if (DiscoTyp == Anzahl_Lichtspiele) for (auto &i : LED) i.set_Helligkeit(200); // wenn von Soft auf Hard gewechselt wurde, dann Helligkeit einstellen DiscoTyp--; for (auto &i : LED) i.set_Helligkeit(200); } if (Tastatur[Pfeil_rechts].Tastenevent && (DiscoTyp < 2 * Anzahl_Lichtspiele - 1)) { DiscoTyp++; if (DiscoTyp == Anzahl_Lichtspiele) for (auto &i : LED) { i.set_Helligkeit(0); // wenn von Hart auf Soft gewechselt wurde, dann Helligkeit einstellen i.ein(); } } if (DiscoTyp >= Anzahl_Lichtspiele) schreibe("", " Typ: " + String(DiscoTyp - Anzahl_Lichtspiele) + " soft "); else { if (Tastatur[oben].pressed()) { // obere Taste = heller LED[oben].ein(); for (auto &i : LED) i.heller(5); } else LED[oben].aus(); if (Tastatur[unten].pressed()) { // untere Taste = dunkler LED[unten].ein(); for (auto &i : LED) i.dunkler(5); } schreibe("", " Typ: " + String(DiscoTyp) + " hard "); } if (Tastatur[ESC].Tastenevent) { for (auto &i : LED) i.aus(); return (_ESC); } else return (_Arraynummer); } void next_Discolight(unsigned long timestep) { if (DiscoTyp < Anzahl_Lichtspiele) { // hard if (millis() >= timestep + _timestamp) { _timestamp = millis(); if (++Discolight > 3) Discolight = 0; } if ((Lichtspiele[DiscoTyp] >> (4 * Discolight + 3)) & 1) LED[oben].ein(); else LED[oben].aus(); if ((Lichtspiele[DiscoTyp] >> (4 * Discolight + 2)) & 1) LED[rechts].ein(); else LED[rechts].aus(); if ((Lichtspiele[DiscoTyp] >> (4 * Discolight + 1)) & 1) LED[unten].ein(); else LED[unten].aus(); if ((Lichtspiele[DiscoTyp] >> (4 * Discolight + 0)) & 1) LED[links].ein(); else LED[links].aus(); } else // soft { for (auto &i : LED) i.ein(); Stufe ++; if (Stufe < 8) { if ((Lichtspiele[DiscoTyp - Anzahl_Lichtspiele] >> (4 * Discolight + 3)) & 1) LED[oben].strahle(); else LED[oben].verblasse(); if ((Lichtspiele[DiscoTyp - Anzahl_Lichtspiele] >> (4 * Discolight + 2)) & 1) LED[rechts].strahle(); else LED[rechts].verblasse(); if ((Lichtspiele[DiscoTyp - Anzahl_Lichtspiele] >> (4 * Discolight + 1)) & 1) LED[unten].strahle(); else LED[unten].verblasse(); if ((Lichtspiele[DiscoTyp - Anzahl_Lichtspiele] >> (4 * Discolight + 0)) & 1) LED[links].strahle(); else LED[links].verblasse(); } else { Stufe = 0; if (++Discolight > 3) Discolight = 0; } } } }; void lauter() { Serial.write(0x7e); Serial.write(0xff); Serial.write(0x04); Serial.write(0x04); Serial.write(0x00); Serial.write(0xef); delay(30); } void leiser() { Serial.write(0x7e); Serial.write(0xff); Serial.write(0x04); Serial.write(0x05); Serial.write(0x00); Serial.write(0xef); delay(30); } void soundPlay() { Serial.write(0x7e); Serial.write(0xff); Serial.write(0x06); Serial.write(0x0d); Serial.write(0x00); Serial.write(0x00); Serial.write(0x00); Serial.write(0xef); } void soundStop() { Serial.write(0x7e); Serial.write(0xff); Serial.write(0x06); Serial.write(0x0e); Serial.write(0x00); Serial.write(0x00); Serial.write(0x00); Serial.write(0xef); } // Auf der SD-Karte im Verzeichnis „01“ stehen abspielbare Dateien – Beispiel: „000.mp3“ (nr=0) oder „017.mp3“ (nr=17) void soundSelect(uint8_t nr) { Serial.write(0x7e); Serial.write(0xff); Serial.write(0x06); Serial.write(0x0f); Serial.write(0x00); Serial.write(0x01); Serial.write(nr); Serial.write(0xef); } void Spiele_Lied(uint8_t Songnumber) { soundStop(); delay(20); soundSelect(Songnumber); delay(20); soundPlay(); } String Textzeile1 = “ „, Textzeile2 = “ „; void schreibe(const String& a, const String& b) { // lcd.clear(); if (a != Textzeile1) { lcd.setCursor(0, 0); lcd.print(a); } if (b != Textzeile2) { lcd.setCursor(0, 1); lcd.print(b); } } void schreibe_loops(uint8_t Zahl) { char Text[16] {„Nachspielen „}; Text[13] = (Zahl – Zahl % 10) / 10 + 48; Text[14] = Zahl % 10 + 48; schreibe(„“, Text); } // Definition unserer globalen Variablen: Tastenklasse Key[8]; uint8_t Spielzustand = 0, Zaehler = 0, Vorgabetaste[50], akt_elem = 0; // Spiel-1: Spielzustand 0 = spielt vor, 1 = nachspielen unsigned long timestamp; Menuepunkt Menue[8]; Liedwahl Lied[17]; Senso_Classic Spiel_Senso_Classic; Reaktionsspiel Spiel_Reaktion; DiscoTypeSet DiscoElement; DiscoSpeedSet Einstellungsmenue_discospeed; uint8_t akt_Menue = 0; void setup() { // Hier im setup() wird alles Mögliche konfiguriert: lcd.init(); // initialisierung das LCD mit I²C-Schnittstelle lcd.backlight(); // LCD-Hintergrundbeleuchtung einschalten Serial.begin(9600, SERIAL_8N1); // Serielle Kommunikation mit dem MP3-Player einstellen // Hardwaremäßige Pinbelegung am Arduino UNO: // Belegung von Anto und Jan Key[oben].Setup(7); // 7 identisch Key[rechts].Setup(2); // 2 identisch Key[unten].Setup(4); // 4 identisch Key[links].Setup(8); // 9 Key[ESC].Setup(17); // A3 identisch Key[Pfeil_links].Setup(16); // A2 identisch Key[Pfeil_rechts].Setup(15); // A1 identisch Key[Enter].Setup(14); // A0 identisch // LEDs alle auf PWM-Ausgängen: LED[oben].Setup(6, 100); // 6 identisch LED[rechts].Setup(3, 100); // 3 identisch LED[unten].Setup(5, 100); // 5 identisch LED[links].Setup(9, 100); // 10 // Initilisierug aller Menüpunkte: Menue[0].set(0, 1, 0, 3, 0); // Hauptmenü-Spiele spielen set(links, rechts, ESC, Enter, eigene Arraynummer) Menue[1].set(0, 2, 1, 100, 1); // Hauptmenü-Lieder abspielen Menue[2].set(1, 2, 2, 5, 2); // Hauptmenü-Einstellungen Menue[3].set(3, 4, 0, 50, 3); // Spiele spielen-Senso Classic Menue[4].set(3, 4, 0, 51, 4); // Spiele spielen-Reaktionsspiel Menue[5].set(5, 6, 2, 98, 5); // Einstellungen-disco Typ Menue[6].set(5, 7, 2, 99, 6); // Einstellungen-disco speed Menue[7].set(6, 7, 2, 97, 7); // Einstellung des Tastensoundtyps Spiel_Senso_Classic.set(3, 50); // Classic Senso spielen set(ESC, eigene Arraynummer) Spiel_Reaktion.set(4, 51); // reaktionsspiel set(ESC, eigene Arraynummer) Tastensound.set(7, 97, 2); // Tastensound festlegen set(ESC, eigene Arraynummer, Anzahl verschiedener Soundstiele) DiscoElement.set(5, 98); // disco Typ festlegen set(ESC, eigene Arraynummer) Einstellungsmenue_discospeed.set(6, 99); // disco speed-Set speed set(ESC, eigene Arraynummer) Lied[0].set(100, 101, 1, 100); // Bei den Menüpunkten Lied steht immer die Arraynummer + 100 ! Lied[1].set(100, 102, 1, 101); // Das ist gleichzeitig die Songnummer Lied[2].set(101, 103, 1, 102); Lied[3].set(102, 104, 1, 103); Lied[4].set(103, 105, 1, 104); Lied[5].set(104, 106, 1, 105); Lied[6].set(105, 107, 1, 106); Lied[7].set(106, 108, 1, 107); Lied[8].set(107, 109, 1, 108); Lied[9].set(108, 110, 1, 109); Lied[10].set(109, 111, 1, 110); Lied[11].set(110, 112, 1, 111); Lied[12].set(111, 113, 1, 112); Lied[13].set(112, 114, 1, 113); Lied[14].set(113, 115, 1, 114); Lied[15].set(114, 116, 1, 115); Lied[16].set(115, 116, 1, 116); timestamp = millis(); } void loop() { for (auto &i : Key) i.Eventabfrage(); // Über alle Tasten (setzt die Tastenevents): for (auto &i : LED) i.set(DiscoElement.soft); // LEDs ansteuern auf den im letzten Durchlauf gewählten Zustand if (akt_Menue < 50) akt_Menue = Menue[akt_Menue].loop(Key); // allgemeine Menüs else if (akt_Menue == 50) akt_Menue = Spiel_Senso_Classic.loop(Key); // Senso_Classic else if (akt_Menue == 51) akt_Menue = Spiel_Reaktion.loop(Key); // Reaktionsspiel else if (akt_Menue == 97) akt_Menue = Tastensound.loop(Key); // Tastensounds auswählen else if (akt_Menue == 98) akt_Menue = DiscoElement.loop(Key); // Disco Typ // Ab hier alles, bei dem das Discolicht läuft else if (akt_Menue == 99) akt_Menue = Einstellungsmenue_discospeed.loop(Key); // Disco speed else akt_Menue = Lied[akt_Menue – 100].loop(Key); // MP3-Player // Alle akt_Menue über 100 gehören den absielbaren Liedern. if (akt_Menue >= 98) DiscoElement.next_Discolight(Einstellungsmenue_discospeed._Discotimer); // Discolicht anzeigen String ENTER_TO_PLAY=“ Enter to play „; switch (akt_Menue) { // Die Displayansteuerung findet hier statt, damit die Texte im Programm und nicht im Datenspeicher sind, der sonst überläuft: case 0: schreibe (“ Hauptmenue „, “ Spiele spielen „); break; case 1: schreibe (“ Hauptmenue „, „Lieder abspielen“); break; case 2: schreibe (“ Hauptmenue „, “ Einstellungen „); break; case 3: schreibe („Spiel ausw\xE1hlen „, “ Senso Classic „); break; case 4: schreibe („Spiel ausw\xE1hlen „, “ Reaktionsspiel „); break; case 5: schreibe (“ Einstellungen „, „W\xE1hle disco Typ „); break; case 6: schreibe (“ Einstellungen „, „set disco speed „); break; case 7: schreibe (“ Einstellungen „, “ Tastensounds „); break; case 50: schreibe (“ Senso Classic „, „“); break; case 51: schreibe(„“, „“); break; case 97: schreibe („W\xE1hle Tastent\xEFne“, „“); break; case 98: schreibe („W\xE1hle disco Typ“, „“); break; case 99: schreibe („“, „“); break; case 100: schreibe (ENTER_TO_PLAY, “ Mashup Germany „); break; case 101: schreibe (ENTER_TO_PLAY, „Bohemian Rapsodi“); break; case 102: schreibe (ENTER_TO_PLAY, “ J\xE1germeister „); break; case 103: schreibe (ENTER_TO_PLAY, “ Monster „); break; case 104: schreibe (ENTER_TO_PLAY, “ Bommerlunder „); break; case 105: schreibe (ENTER_TO_PLAY, “ Coconutsong „); break; case 106: schreibe (ENTER_TO_PLAY, “ Unity „); break; case 107: schreibe (ENTER_TO_PLAY, „We will rock 01 „); break; case 108: schreibe (ENTER_TO_PLAY, “ Teenagers „); break; case 109: schreibe (ENTER_TO_PLAY, „We are the champ“); break; case 110: schreibe (ENTER_TO_PLAY, „We will rock you“); break; case 111: schreibe (ENTER_TO_PLAY, “ Killer Queen „); break; case 112: schreibe (ENTER_TO_PLAY, “ Bites the dust „); break; case 113: schreibe (ENTER_TO_PLAY, “ Bicycle race „); break; case 114: schreibe (ENTER_TO_PLAY, „Crazy … thing „); break; case 115: schreibe (ENTER_TO_PLAY, „Dont stop me now“); break; case 116: schreibe (ENTER_TO_PLAY, “ Bottomed girls „); break; } }