Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Retro-Arcade-Uhr

Komponenten und Verbrauchsmaterialien

Arduino Mega 2560
× 1

Notwendige Werkzeuge und Maschinen

3D-Drucker (generisch)

Apps und Onlinedienste

Arduino-IDE

Über dieses Projekt

Einführung:Retro-Arcade-Uhr - Arduino

Baue eine interaktive Arcade-Nachtuhr mit Touchscreen und animierten Arcade-Figuren, mit denen du einen Ton deiner Wahl für den Wecker aufnehmen kannst.

Das Projekt umfasst eine 3D-gedruckte Hülle und vier separate Programme zur Auswahl

1. Arcade Clock - DK Mario, Space Invaders und Pac-Man Animation

2. Pacman Clock - Interaktives animiertes Pac-Man-Spiel mit Uhrfunktionen

3. DK Clock - Interaktives animiertes DK-Spiel mit Uhrfunktionen

4. Tumble Ghost - Animiertes Pac-Man-Geisterspiel basierend auf Flappy Bird

Viel Spaß beim Bauen und ein tolles Geschenk für alle, die gerne die Nostalgie der Arcade-Spielfiguren der 80er Jahre erleben.

Schritt 1:Sammeln Sie die Materialien

  • Arduino Board - Arduino Mega 2560 (Artikel 1, 2 und 3 können als eine gebündelte Bestellung erworben werden)
  • Touchscreen Arduino Shield - 3.2" Mega Touch LCD Erweiterungsplatine
  • Touchscreen - 3,2" TFT-LCD-Display + Touchscreen für Arduino Mega 2560
  • Echtzeituhrmodul - DS3231 RTC
  • Sprachaufzeichnungsmodul - ISD1820 Diktiergerät
  • PLA-Filament für 3D-Drucker
  • Zweikomponenten-Epoxidharz zum Zusammenkleben des Gehäuses
  • USB-Kabel 2m lang USB-Ladegerät (wird für die Stromversorgung der Uhr verwendet)
  • Heißklebepistole
  • Kabelbinder X 3

Optionale Komponenten zum automatischen Dimmen der Hintergrundbeleuchtung nur erforderlich, wenn eine Nachttischuhr:

  • Widerstand 270 kOhm
  • Zenerdiode 3,3 V
  • 0,5-Watt-Widerstand 47 Ohm
  • Lichtabhängiger Widerstand (LDR)

Schritt 2:Drucken Sie die 3D-Hülle

Ich habe das Uhrengehäuse auf einem Creality Ender 3 gedruckt. Alle 3D-Druckdateien und Anleitungen für das Gehäuse finden Sie hier auf Thingiverse.

Schritt 3:Bauen Sie die Schaltung auf

Die Gesamtschaltung enthält eine Echtzeituhr, Arduino Mega, ein Soundmodul, einen Touchscreen und einen Bildschirmschutz.

1. Echtzeituhr

Montieren Sie die Echtzeituhr auf der Rückseite des Arduino Mega wie in der Abbildung gezeigt. Ich habe eine Heißklebepistole und Verpackungsschaum verwendet, um sicherzustellen, dass sie sich nicht berühren und es eine gewisse Dämpfung gibt, um Bewegungen zu absorbieren. In meinem Fall habe ich 2 der RTC-Beine direkt an das Arduino gelötet und ein Anschlusskabel verwendet, um 5V und GND mit dem Arduino zu verbinden.

2. Tonaufnahmemodul

Diese sind wirklich cool und einfach zu bedienen. Verwenden Sie auf ähnliche Weise wie oben Schaum und Heißkleber, um das Modul und den Lautsprecher auf der Rückseite des Arduino zu positionieren, und achten Sie darauf, dass sie gegen Berührung isoliert sind. Das Soundmodul wird von D8 auf dem Arduino getriggert, daher müssen dieses und das Netzteil gemäß dem mitgelieferten Schaltplan angeschlossen werden.

3. Automatischer Dimmer der Hintergrundbeleuchtung (optional)

Wenn Sie als Nachttischuhr verwenden möchten, möchten Sie wahrscheinlich die Hintergrundbeleuchtung nachts automatisch dimmen, damit sie Ihren Schlaf nicht beeinträchtigt. (Wenn nicht, können Sie diesen Schritt überspringen!) Leider ist die Hintergrundbeleuchtung im TFT-Bildschirm fest mit +3,3 V verdrahtet und kann nicht mit dem Arduino eingestellt werden. Dies bedeutet, dass wir es trennen und erneut mit einem PWM-Pin auf dem Arduino verbinden müssen, um die Helligkeit der Hintergrundbeleuchtung zu steuern. Ich wollte dies mit minimaler Beschädigung von Stiften oder Spuren an den Komponenten tun, also habe ich den folgenden Ansatz gewählt. Befolgen Sie die folgenden Schritte sorgfältig

(a) Um dies zu erreichen, wird ein lichtabhängiger Widerstand (LDR) an der Rückseite des Geräts positioniert, um das Licht zu erkennen. Bohren Sie zwei 3mm Löcher in das Gehäuse und schieben Sie die LDR-Beine durch die Löcher. Verwenden Sie Heißkleber auf der Innenseite des Schranks, um die Beine an Ort und Stelle zu halten. Zwei Drähte an der Innenseite des Gehäuses anlöten und gemäß Schaltplan anschließen. Fügen Sie A7 des Arduino gemäß dem Schaltplan einen 270 kOhm-Widerstand hinzu.

(b) Entfernen Sie das TFT-Display und stellen Sie es auf eine feste Unterlage. Identifizieren Sie Pin 19 (LED_A) und entfernen Sie vorsichtig einige Millimeter des Kunststoffs an der Basis des Pins. Biegen Sie den Stift flach und vom Stecker weg, wie in der Abbildung oben gezeigt. Prüfen Sie, ob sich das TFT-Schild gut einstecken lässt und der gebogene Stift den Stecker oder die Buchse nicht blockiert.

(c) Löten Sie ein 47-Ohm-Register an den gebogenen Stift und verbinden Sie einen Draht vom Widerstand mit D9 des Arduino Mega. Der Arduino D9-Pin kann bis zu 40 mA absenken, sodass der Widerstand dies auf weniger begrenzt. Schließen Sie eine 3,3-V-Zener-Diode an denselben Pin (LED_A) an und verbinden Sie diese gemäß dem Diagramm mit Erde. Dies dient dazu, die Hintergrundbeleuchtung vor Überspannung zu schützen, da die Spannung auf 3,3 V geregelt wird.

4. TFT-Bildschirm und Arduino-Shield

Schieben Sie die 3,2-Zoll-TFT-Touchscreen-Anschlüsse vorsichtig in das TFT-Arduino-Shield. Verbinden Sie dann vorsichtig die Oberseite des Arduino gemäß dem bereitgestellten Bild. Die RTC verfügt über eine Batterie, sodass die Uhrzeit auch dann korrekt angezeigt wird, wenn die Stromversorgung unterbrochen wurde. Die Alarmzeit wird im Eeprom auf dem Arduino gespeichert, was bedeutet, dass sie bei einem Stromausfall beibehalten wird.

Schritt 4:Laden Sie den Code

Das Projekt erfordert, dass die folgenden Dateien und Bibliotheken geladen werden, bevor es kompiliert und ausgeführt wird. Der Code ist einzigartig und basiert auf den Fähigkeiten der Bibliotheken, der Hardware, einiger benutzerdefinierter Grafiken und anderer Projekte, die ich mir ausgeliehen habe.

Bitte beachten Sie:Die Entwicklung des Codes für dieses Projekt hat IDE v1.06 verwendet und einige der erforderlichen Bibliotheken sind veraltet. Dies bedeutet, dass einige Leute beim Laden von Code Probleme mit der neuen IDE-Version 1.6 und höher haben. Aus Gründen der Einfachheit empfehle ich daher, IDE v1.06 zu verwenden und die korrekten Versionsbibliotheksdateien in ZIP-Dateien am Ende von Schritt 4 des Tutorials einzufügen.

1. Arduino-IDE

Ich habe eine frühere Version der Arduino IDE verwendet, daher empfehle ich der Einfachheit halber, dass Sie die Arduino IDE Version 1.06 auf Ihrem Desktop-Computer herunterladen, bevor Sie den Code installieren. Sie können seine Version von hier erhalten.

2. Bibliotheken

Diese müssen heruntergeladen und zur IDE (Integrated Development Environment) hinzugefügt werden, die auf Ihrem Computer ausgeführt wird und zum Schreiben und Hochladen von Computercode auf die physische Platine verwendet wird.

  • UTFT.h und URtouch.h befinden sich in der ZIP-Datei unten
  • Time.h befindet sich in der ZIP-Datei unten
  • DS1307RTC.h befindet sich in der ZIP-Datei unten
  • Wire.h und EEPROM.h sind bereits in IDE V1.06 enthalten

Gutschrift für UTFT.h und URtouch.h geht an Rinky-Dink Electronics Ich habe diese ZIP-Dateien eingefügt, da es den Anschein hat, als ob die Quell-Website nicht mehr verfügbar ist.

4. TFT-Bildschirmvariationen

Die Unklarheiten von TFT-Bildschirmen und Herstellern haben zu diesen Hinweisen geführt.

(a) Sainsmart - Wenn Sie einen 3,2-Zoll-TFT-Bildschirm mit der Marke Sainsmart auf der Rückseite des TFT-Geräts gekauft haben, müssen Sie feststellen, dass die Bibliotheken geändert werden müssen, um Anzeigeprobleme zu beheben. Wenn Sie bereits ein Sainsmart TFT-Display gekauft haben, gibt es unten eine Lösung

Bearbeiten Sie die Datei "initlcd.h" und ändern Sie die folgende Zeile von

LCD_Write_COM_DATA(0x01, 0x2B3F);

zu

LCD_Write_COM_DATA(0x01, 0x3B3F);

Sie müssen die IDE neu starten und dann den Code neu auf das Arduino laden.

(b.) TFT-Controller-Chipsatz - Wer einen 3,2-Zoll-TFT-Bildschirm gekauft hat, kann möglicherweise auch einen von zwei verschiedenen Chipsätzen "SSD1289" oder "ILI9341" haben. Das Ärgerliche ist, dass der Unterschied online nicht einfach zu unterscheiden ist. Die gute Nachricht ist, dass Es ist einfach zu beheben. Wenn nach dem Laden des Codes ein leerer Bildschirm angezeigt wird, liegt dies wahrscheinlich daran, dass es sich um einen ILI9341-Controller handelt.

Um das Problem zu beheben, müssen Sie die folgenden Änderungen am Code vornehmen. Bearbeiten Sie den Code und ändern Sie die folgende Codezeile

von

UTFT myGLCD(SSD1289, 38, 39, 40, 41); //Parameter sollten an Ihr Display-/Schirmmodell angepasst werden

zu

UTFT myGLCD(ILI9341_16, 38, 39, 40, 41); //Parameter sollten an Ihr Display-/Schirmmodell angepasst werden

Versuchen Sie nun, den Code neu auf das Arduino zu laden.

(c.) Invertierte Touchscreen-Steuerung

Einige Hersteller haben berichtet, dass die Touchscreen-Tasten der Y-Achse vertauscht wurden. Es wurde ein Fix dafür gefunden, bei dem zwei Codezeilen geändert werden mussten, um das Lesen des Touchscreens umzudrehen.

Suchen Sie nach:"yT =myTouch.getY();" Ändern Sie es in:"yT =240 - myTouch.getY();"

Vergessen Sie nicht, zweimal zu suchen, die erste Instanz dient der Steuerung von Pacman im Uhrmodus, die zweite ist für das Setup-Menü.

5. Grafikdateien

Es gibt eine Gruppe von Bitmap-Dateien, die ich unten eingefügt habe und die sich im selben Unterverzeichnis wie der Arduino-Code befinden müssen, wenn Sie mit dem Laden in den Arduino beginnen. Laden Sie daher die unten stehenden Dateien herunter und verwenden Sie die IDE zum Laden.

6. Uhr einrichten

Sobald der Code erfolgreich geladen wurde, drücken Sie die Mitte des Bildschirms und dies sollte den Setup-Bildschirm öffnen. Verwenden Sie das Menü, um die Uhrzeit und den Wecker im 24-Stunden-Format einzustellen. Drücken Sie die SAVE-Taste, um die Einstellung zu speichern. Die RTC verfügt über eine Batterie, sodass die Uhrzeit auch dann korrekt angezeigt wird, wenn die Stromversorgung unterbrochen wurde. Die Alarmzeit wird im EEPROM gespeichert, dh sie bleibt bei einem Stromausfall erhalten.

7. Testen des Alarms

Das Soundmodul wird verwendet, um den Alarm bereitzustellen. Der ISD1820 wird vom Arduino D8-Pin gesteuert. Ton kann einfach hinzugefügt werden, indem Ton in das Mikrofon gespielt wird, während gleichzeitig die Aufnahmetaste am ISD1820 gedrückt wird. In meinem Fall habe ich die ursprüngliche Pac-Man-Einführungsmusik aus einer Audiodatei aufgenommen, die über ein anderes Gerät abgespielt wurde. Sobald der Ton aufgenommen wurde, kann die Aufnahme durch Drücken der PLAY-E-Taste getestet werden, die den Ton über den Lautsprecher abspielen sollte. Verwenden Sie das Setup-Menü, um die Uhrzeit und die Weckzeit im Abstand von einigen Minuten einzustellen. Stellen Sie sicher, dass Sie den Alarm "SET" und drücken Sie die Menütasten "SAVE". Wenn Sie zum Hauptbildschirm zurückkehren, sollte der Alarm ertönen, wenn die Zeit eintritt. Sie können den Alarm ausschalten, indem Sie auf die Mitte des Touchscreen-Felds drücken, was zum Setup-Bildschirm führt.

8. Touchscreen-Kalibrierung

Einige Hersteller haben festgestellt, dass die Tasten auf dem Setup-Bildschirm nicht mit den TFT-Touch-Steuerelementen übereinstimmen. In diesen Fällen muss der Touchscreen kalibriert werden. Dies kann ganz einfach mit dem Touchscreen-Kalibrierungscode und den Anweisungen in der URtouch-Bibliothek erfolgen. Befolgen Sie diese Anweisungen, wenn Sie dieses Problem bemerken.

9. Vier verschiedene Programme zur Auswahl

1. Arcade Clock - DK Mario, Space Invaders &Pacman Animation2. Pacman Clock - Interaktives animiertes Pacman/Ms Pacman-Spiel mit Uhrfunktionen

3. DK Clock - Interaktives animiertes DK-Spiel mit Uhrfunktionen

4. Tumble Ghost - Animiertes Pacman Ghost-Spiel basierend auf Flappy Bird

1.%2BRetroArcadeClockTechKiwigadgetsV1.zip 2.%2BRetro_Pacman_Clock_V10.zip 3.%2BRetro_DK_Clock_V3.zip 4.%2BTumble_Ghost_V10.zip DS1307RTC.zip Time.zip URTouch.zip UTFT.zip

Schritt 5:Alles zusammenfügen

1. Externe Stromversorgung hinzufügen

Der letzte Schritt besteht darin, die externe Stromversorgung hinzuzufügen. Fügen Sie mit einem Bohrer ein Loch in die Rückseite des Schranks ein. Führen Sie das USB-Kabel durch die Rückseite und befestigen Sie dann die USB-Kabel VCC, GND, D+ und D- an der Basis des Arduino USB-Anschlusses gemäß dem Schaltplan. Dies hat zwei Vorteile, erstens verfügt der USB-Eingang an Arduino Mega Boards über einen Überstromschutz, und zweitens können Sie das USB-Kabel verwenden, um Codeänderungen hochzuladen, ohne die Box demontieren zu müssen. Heißkleben Sie die Stromkabelisolierung auf die Rückseite des Arduino, um beim Zusammenbau der Vorder- und Rückwand vor Kabelspannung zu schützen. Fügen Sie dem Kabel einen Kabelbinder hinzu, indem Sie einen Kabelbinder fest um das Kabel an der Innenseite des Gehäuses am Stromkabel 6-8 cm vom Arduino-Anschluss entfernt anbringen. Der Kabelbinder sollte beim Ziehen des USB-Kabels Spannungen an den Gelenken vermeiden, indem er gegen die Innenseite des Gehäuses stößt.

2. Montage der Elektronik im Koffer

Platzieren Sie die Schaltung oben auf der Frontplatte mit den vier Lochführungen, die den Bildschirm mittig im Ausschnitt ausrichten sollen. Schalten Sie die Schaltung ein, damit Sie den Frontplattenbildschirm sehen können, überprüfen Sie, ob sich das Bildschirmbild in der richtigen Position befindet, und kleben Sie sie dann mit Heißkleber fest. Das Ergebnis ist eine passgenaue Passform mit einem quadratischen Bildschirm, der in der Aussparung zentriert ist.

3. Endmontage

Drücken Sie die Frontplatte vorsichtig auf die Rückplatte und ziehen Sie vorsichtig am USB-Netzkabel, um das Spiel in der Rückplatte zu kompensieren. Der Kabelhalter ist hier nützlich und soll Beschädigungen an der Verkabelung schützen. Schließen Sie das USB-Ladegerät an und schon kann es losgehen.

Ich hoffe es gefällt euch!

Code

  • Retro-Arcade-Uhr
Retro-Arcade-UhrC/C++
Arduino IDE
/* Retro Arcade Clock - TechKiwigadgets V1 - Erste Produktionsversion*/ #include  #include #include #include  #include  #include  // eine grundlegende DS1307-Bibliothek, die die Zeit als time_t// zurückgibt Alarmvariablenboolean alarmstatus =false; // Flag, bei dem false aus und true ist onboolean soundalarm =false; // Flag, um anzuzeigen, dass der Alarm ausgelöst werden mussint alarmhour =0; // Stunde der Alarmeinstellungint alarmminute =0; // Minute der Alarmeinstellungsbyte ahour; //Byte-Variable für Stundenbyte amin; //Byte-Variable für minuteint actr =300; // Wenn der Alarm ertönt, ist dies ein Zähler, der zum Zurücksetzen der Soundkarte verwendet wird, bis der Bildschirm berührt wirdint act =0;int p =0; // Animationsposition E.G Pacman Graphic Flag 0 =Geschlossen, 1 =Mittel Offen, 2 =Weit Offen, 3 =Mittel Offenint m =0; // Animation Position Mario 3 Positionen// Grafik X,Y Koordinaten// myGLCD.drawBitmap (30, 14, 40, 40, rd_ghost); // Geschlossen Ghostint GhostX =15;int GhostY =14;int GhostD =0; // Richtung d ==0 =rechts, 1 =runter, 2 =links, 3 =hoch // myGLCD.drawBitmap (140, 14, 40, 40, MarioR3); // Geschlossen Ghostint MarioX =141;int MarioY =14;int MarioD =0; // Richtung d ==0 =rechts, 1 =runter, 2 =links, 3 =hoch // myGLCD.drawBitmap (240, 14, 40, 40, Monkey2); // Geschlossener Ghostint MonkeyX =261;int MonkeyY =14;int MonkeyD =0; // Richtung d ==0 =rechts, 1 =runter, 2 =links, 3 =hoch // myGLCD.drawBitmap (30, 180, 40, 40, pacman); // Geschlossen Ghostint pacmanX =15;int pacmanY =185;int pacmanD =2; // Richtung d ==0 =rechts, 1 =runter, 2 =links, 3 =hoch// myGLCD.drawBitmap (140, 180, 40, 40, Alien); // Geschlossen Ghostint AlienX =141;int AlienY =185;int AlienD =2; // Richtung d ==0 =rechts, 1 =runter, 2 =links, 3 =hoch// myGLCD.drawBitmap (240, 180, 40, 40, Cannon); // Geschlossener Geist int CannonX =270;int CannonY =185;int CannonD =2; // Richtung d ==0 =rechts, 1 =runter, 2 =links, 3 =hoch // Initialisiert RTC-Zeitwerte:const int DS1307 =0x68; // Adresse von DS1307 siehe Datenblätter // Display Dimmer Variablesint dimscreen =255; // Diese Variable wird verwendet, um die Bildschirmhelligkeit zu steuern, wobei 255 die maximale Helligkeit istint LDR =100; // LDR-Variable direkt von Analog 7 gemessen//====Objekte erstellenUTFT myGLCD(SSD1289,38,39,40,41); //Parameter sollten an Ihr Display-/Schirmmodell angepasst werdenURTouch myTouch( 6, 5, 4, 3, 2);//====Fontsextern uint8_t SmallFont[];extern uint8_t BigFont[];extern uint8_t SevenSegNumFont[]; extern uint8_t SevenSeg_XXXL_Num[];// Define bitmapsextern unsigned int Alien1[0x640]; // Alien 1 graphicextern unsigned int Alien2[0x640]; // Alien 2 graphicextern unsigned int Cannon[0x640]; // Space Invaders cannonextern unsigned int MarioL1[0x310]; // M Left 1extern unsigned int MarioL2[0x310]; // Ghost Bitmap Geradeausextern unsigned int MarioL3[0x310]; // Ghost Bitmap Geradeausextern unsigned int MarioR1[0x310]; // Ghost Bitmap Geradeausextern unsigned int MarioR2[0x310]; // Ghost Bitmap Geradeausextern unsigned int MarioR3[0x310]; // Ghost Bitmap Geradeausextern unsigned int MarioStop[0x310]; // Ghost Bitmap Geradeausextern unsigned int MarioU1[0x310]; // Ghost Bitmap Geradeausextern unsigned int MarioU2[0x310]; // Ghost Bitmap Geradeausextern unsigned int MarioU3[0x310]; // Ghost Bitmap Geradeausextern unsigned int MarioU4[0x310]; // Ghost Bitmap Geradeausextern unsigned int rd_ghost[784]; // Ghost Bitmap Geradeausextern unsigned int ru_ghost[784]; // Ghost Bitmap Geradeausextern unsigned int rl_ghost[784]; // Ghost Bitmap Geradeausextern unsigned int rr_ghost[784]; // Ghost Bitmap Geradeausextern unsigned int r_o_pacman[784]; // Ghost Bitmap Geradeausextern unsigned int r_m_pacman[784]; // Ghost Bitmap Geradeausextern unsigned int l_o_pacman[784]; // Ghost Bitmap Geradeausextern unsigned int l_m_pacman[784]; // Ghost Bitmap Geradeausextern unsigned int u_m_pacman[784]; // Ghost Bitmap Geradeausextern unsigned int u_o_pacman[784]; // Ghost Bitmap Geradeausextern unsigned int d_m_pacman[784]; // Ghost Bitmap Geradeausextern unsigned int d_o_pacman[784]; // Ghost Bitmap Geradeausextern unsigned int c_pacman[784]; // Ghost Bitmap Geradeausextern unsigned int Monkey2[0x640]; // Ghost Bitmap Geradeausextern unsigned int Monkey3[0x640]; // Ghost Bitmap Geradeaus // Touchscreen-Koordinatenboolean screenPressed =false;int xT,yT;int userT =4; // Flag zur Anzeige der Richtungsberührung auf dem Bildschirmboolean setupscreen =false; // verwendet, um auf den Setup-Bildschirm zuzugreifen // Alarm-Setup-Variablenboolean xsetup =false; // Flag, um festzustellen, ob der Setup-Modus vorhanden ist // Animationsverzögerung zum Verlangsamen der Bewegung downint dly =0; // Ursprünglich 30 // Zeitaktualisierungszähler int rfcvalue =300; // Warten Sie diese lange Zeit bis zur Überprüfung auf Änderungenint rfc =1; // Deklarieren Sie globale Variablen für die vorherige Zeit, um nur die geänderten Ziffern aktualisieren zu können // Es gibt vier Ziffern, die unabhängig voneinander gezeichnet werden müssen, um eine konsistente Positionierung der Zeit zu gewährleisten int c1 =20; // Zehnerstundenziffer int c2 =20; // Einerstundenziffer int c3 =20; // Zehner-Minuten-Ziffer int c4 =20; // Ones Minute digitvoid setup () {// RTC Serial.begin (9600) initialisieren; // while (!Seriell); // warten, bis Arduino Serial Monitor öffnet delay (200); setSyncProvider(RTC.get); // die Funktion zum Abrufen der Uhrzeit von der RTC setSyncInterval(60); // Synchronisiere die Zeit alle 60 Sekunden (1 Minuten) if (timeStatus ()! =timeSet) { Serial.println ( "Kann nicht mit der RTC synchronisiert werden"); RTC.set(1408278800); // setze die RTC auf den 25. August 2014, 9:00 Uhr setTime(1408278800); } else {Serial.println ( "RTC hat die Systemzeit eingestellt"); } // Setup Alarm Enable Pin, um Ton auf der ISD1820-Platine wiederzugeben pinMode (8, OUTPUT); // D8 wird zum Umschalten des Tons verwendet DigitalWrite (8, LOW); // Auf niedrig stellen, um den Ton auszuschalten // Anzeige einleiten myGLCD.InitLCD(); myGLCD.clrScr(); myTouch.InitTouch(); myTouch.setPrecision(PREC_LOW); drawscreen(); // Initiiere das Spiel UpdateDisp(); // Aktualisieren Sie den Wert auf die Uhr. wenn (p ==4) { p =0; // Zähler auf geschlossen zurücksetzen} // Pacman-Grafikflag inkrementieren 0 =Geschlossen, 1 =Mittel Offen, 2 =Weit Offenm=m+1; wenn (m==3) {m=0; // Zähler auf geschlossen zurücksetzen}// Bildschirmhelligkeit einstellen// Umgebungslicht prüfen und LED-Helligkeit entsprechend anpassen Umgebung ca. 500 Dunkel ist unter 100LDR =analogRead(A7);/* Testwertebereich von LDR myGLCD.setColor(237, 28, 36); myGLCD.setBackColor(0, 0, 0); myGLCD.printNumI(LDR,250,60);*/if (LDR>=121){ dimscreen =255; aufrechtzuerhalten. Wenn (LDR <=120) { dimscreen =45; } analogWrite(9, dimscreen); // Kontrolliert die Helligkeit 0 ist dunkel, Umgebungsraum ist ungefähr 25 und 70 ist direktes Sonnenlicht // Lesen Sie das aktuelle Datum und die aktuelle Uhrzeit von der RTC und setzen Sie boardrfc++ zurück; if (rfc>=rfcvalue) {// Zyklen zählen und Zeit drucken UpdateDisp(); // Wert auf Takt aktualisieren, dann ... dly =18; // Verzögerung zurücksetzen rfc =0; } //===Überprüfen Sie, ob der Alarm ertönen muss if (alarmstatus ==true){ if ( (alarmhour ==hour()) &&(alarmminute ==minute())) {// Lassen Sie den Alarm soundalarm =true; } } //===Alarmton starten - Der Ton zahlt für 10 Sekunden und wird dann bei 20 Sekunden neu gestartet Ton, wenn der Bildschirm nicht berührt wird if (act ==0) {// Alarm durch Umschalten von D8 auslösen, aufgezeichneter Ton ausgelöst durch Übergang von LOW zu HIGH digitalWrite (8, HIGH); // Setze hoch digitalWrite (8, LOW); // Setze niedrig UpdateDisp(); // aktualisiere den Wert auf die Uhr} act =act +1; if (act ==actr) {// Alarm durch Umschalten von D8, aufgenommener Ton ausgelöst durch Übergang von LOW zu HIGH digitalWrite (8, HIGH); // Setze hoch digitalWrite (8, LOW); // Niedrige Akte setzen =0; // Zähler hoffnungsvoll alle 20 Sekunden zurücksetzen } }// Prüfen ob Benutzereingabe auf Touchscreen // UserT setzt Richtung 0 =rechts, 1 =runter, 2 =links, 3 =hoch, 4 =keine Berührungseingabe myTouch.read(); if (myTouch.dataAvailable() &&!screenPressed) { xT =myTouch.getX(); yT =myTouch.getY(); // ********************************* // ****** Rufen Sie den Setup-Modus auf ** ****** // ********************************** if (((xT>=120) &&(xT<=200) &&(yT>=105) &&(yT<=140)) &&(soundalarm !=true)) { // Setup-Routine aufrufen, wenn kein Alarm ertönt xsetup =true; // Flag Clocksetup () umschalten; // Uhr-Setup-Routine aufrufen UpdateDisp(); // Wert auf Uhr aktualisieren} else // Wenn die Mitte des Bildschirms berührt wird, während der Alarm ertönt, dann schalten Sie den Ton aus und setzen Sie den Alarm zurück, um nicht eingestellt zu werden if (((xT>=120) &&(xT<=200) &&(yT> .) =105) &&(yT<=140)) &&((alarmstatus ==true) &&(soundalarm ==true))) { alarmstatus =false; Tonalarm =falsch; digitalWrite(8,LOW); // Niedrig setzen } screenPressed =true; } // Erlaubt nicht, den Bildschirm zu halten / Sie müssen ihn sonst antippen if ( !myTouch.dataAvailable() &&screenPressed){ ​​screenPressed =false; }drawghost(ghostX, GhostY, GhostD, p); // Position erhöhen und Bild zeichnen // Geisterrichtung //// Richtung d ==0 =rechts, 1 =unten, 2 =links, 3 =upif(ghostD ==0){ // Rechts // Zähler erhöhen und testen Ergebnisse GhostX =GhostX + 3; if (ghostX ==270) { myGLCD.fillRect (ghostX-3, GhostY, GhostX, GhostY+28); // Trail-off-Grafik löschen, bevor die Position geändert wird GhostD =1; // Richtung nach unten ändern}} else if(ghostD ==1) {//nach unten // Zähler und Testergebnisse inkrementieren GhostY =GhostY + 3; if (ghostY ==185) { myGLCD.fillRect(ghostX+3, GhostY-3, GhostX+36, GhostY); // Trail-off-Grafik löschen, bevor die Position geändert wird GhostD =2; // Richtung nach unten ändern } } else if(ghostD ==2) { // Links // Zähler und Testergebnisse inkrementieren GhostX =GhostX - 3; if (ghostX ==12) { myGLCD.fillRect(ghostX+28, GhostY, GhostX+31, GhostY+28); // Löschen der Trail-Off-Grafik vor dem Drucken neuer Positi GhostD =3; // Richtung nach unten ändern}} else if(ghostD ==3) { // Up // Zähler und Testergebnisse inkrementieren GhostY =GhostY - 3; if (ghostY ==14) { myGLCD.fillRect(ghostX, GhostY+29, GhostX+28, GhostY+28); // Trail-off-Grafik löschen, bevor neue Position gedruckt wird GhostD =0; // Richtung nach unten ändern }}drawMonkey(MonkeyX, MonkeyY, MonkeyD, p); // Position inkrementieren und Bild zeichnen // Monkey Direction //// Direction d ==0 =rechts, 1 =runter, 2 =links, 3 =upif(MonkeyD ==0){ // Rechts // Zähler inkrementieren und testen Ergebnisse MonkeyX =MonkeyX + 3; if (MonkeyX ==270) { myGLCD.fillRect (MonkeyX-3, MonkeyY, MonkeyX, MonkeyY+40); // Trail-off-Grafik löschen, bevor die Richtung geändert wird MonkeyD =1; // Richtung nach unten ändern}} else if(MonkeyD ==1) {//nach unten // Zähler und Testergebnisse erhöhen MonkeyY =MonkeyY + 3; if (MonkeyY ==185) { myGLCD.fillRect(MonkeyX+3, MonkeyY-3, MonkeyX+38, MonkeyY); // Trail-off-Grafik löschen, bevor neue Position gedruckt wird MonkeyD =2; // Richtung nach unten ändern } } else if(MonkeyD ==2) { // Links // Zähler und Testergebnisse inkrementieren MonkeyX =MonkeyX - 3; if (MonkeyX ==12) { myGLCD.fillRect(MonkeyX+41, MonkeyY+1, MonkeyX+40, MonkeyY+38); // Löschen der Trail-Off-Grafik vor dem Drucken neuer Positi MonkeyD =3; // Richtung nach unten ändern } } else if(MonkeyD ==3) { // Up // Zähler und Testergebnisse inkrementieren MonkeyY =MonkeyY - 3; if (MonkeyY ==14) { myGLCD.fillRect(MonkeyX, MonkeyY+38, MonkeyX+40, MonkeyY+43); // Trail-off-Grafik löschen, bevor neue Position gedruckt wird MonkeyD =0; // Richtung nach unten ändern }}drawCannon(CannonX, CannonY, CannonD, p); // Position erhöhen und Bild zeichnen // Kanonenrichtung //// Richtung d ==0 =rechts, 1 =unten, 2 =links, 3 =upif(CannonD ==0){ // Rechts // Zähler erhöhen und testen Ergebnisse KanoneX =KanoneX + 3; if (CannonX ==270) { myGLCD.fillRect(CannonX-3, CannonY+3, CannonX, CannonY+36); // Trail-off-Grafik löschen, bevor die Richtung geändert wird CannonD =1; // Richtung nach unten ändern } } else if(CannonD ==1) { // Down // Zähler und Testergebnisse erhöhen CannonY =CannonY + 3; wenn (KanoneY ==185) {KanoneD =2; // Richtung nach unten ändern } } else if(CannonD ==2) { // Links // Zähler und Testergebnisse erhöhen CannonX =CannonX - 3; if (CannonX ==12){ myGLCD.fillRect(CannonX+41, CannonY+3, CannonX+40, CannonY+36); // Löschen der Trail-Off-Grafik vor dem Drucken neuer Positi CannonD =3; // Richtung nach unten ändern } } else if(CannonD ==3) { // Up // Zähler und Testergebnisse inkrementieren CannonY =CannonY - 3; wenn (KanoneY ==14) {KanoneD =0; // Richtung nach unten ändern }}drawpacman(pacmanX, pacmanY, pacmanD, p); // Position erhöhen und Bild zeichnen // Pacman Richtung //// Richtung d ==0 =rechts, 1 =unten, 2 =links, 3 =upif(pacmanD ==0){ // Rechts // Zähler erhöhen und testen Ergebnisse pacmanX =pacmanX + 3; if (pacmanX ==270) { myGLCD.fillRect(pacmanX-3, pacmanY+3, pacmanX, pacmanY+36); // Trail-off-Grafik löschen, bevor die Richtung geändert wird pacmanD =1; // Richtung nach unten ändern}} else if(pacmanD ==1) {//nach unten // Zähler und Testergebnisse inkrementieren pacmanY =pacmanY + 3; if (pacmanY ==185) {myGLCD.fillRect(pacmanX+3, pacmanY-3, pacmanX+36, pacmanY); // Trail-off-Grafik löschen, bevor die Position geändert wird pacmanD =2; // Richtung nach unten ändern}} else if(pacmanD ==2) { // Links // Zähler und Testergebnisse inkrementieren pacmanX =pacmanX - 3; if (pacmanX ==12) { myGLCD.fillRect(pacmanX+28, pacmanY, pacmanX+31, pacmanY+28); // Löschen der Trail-Off-Grafik vor dem Drucken neuer Positi pacmanD =3; // Richtung nach unten ändern}} else if(pacmanD ==3) {//nach oben // Zähler und Testergebnisse inkrementieren pacmanY =pacmanY - 3; if (pacmanY ==14) { myGLCD.fillRect(pacmanX, pacmanY+29, pacmanX+28, pacmanY+28); // Trail-off-Grafik löschen, bevor neue Position gedruckt wird pacmanD =0; // Richtung nach unten ändern }}drawAlien(AlienX, AlienY, AlienD, p); // Position inkrementieren und Bild zeichnen // Alien Direction //// Direction d ==0 =rechts, 1 =runter, 2 =links, 3 =upif(AlienD ==0){ // Right // Zähler inkrementieren und testen Ergebnisse AlienX =AlienX + 3; if (AlienX ==270) { myGLCD.fillRect (AlienX-3, AlienY+3, AlienX, AlienY+36); // Trail-off-Grafik löschen, bevor die Richtung geändert wird AlienD =1; // Richtung nach unten ändern } } else if(AlienD ==1) { // Down // Zähler und Testergebnisse inkrementieren AlienY =AlienY + 3; wenn (AlienY ==185) {AlienD =2; // Richtung nach unten ändern } } else if(AlienD ==2) { // Links // Zähler und Testergebnisse inkrementieren AlienX =AlienX - 3; if (AlienX ==12) { myGLCD.fillRect (AlienX+41, AlienY+3, AlienX+40, AlienY+36); // Löschen der Trail-Off-Grafik vor dem Drucken neuer Positi AlienD =3; // Richtung nach unten ändern } } else if(AlienD ==3) { // Up // Zähler und Testergebnisse inkrementieren AlienY =AlienY - 3; wenn (AlienY ==14) { AlienD =0; // Richtung nach unten ändern }}drawMario(MarioX, MarioY, MarioD, p); // Position erhöhen und Bild zeichnen // Mario Richtung //// Richtung d ==0 =rechts, 1 =unten, 2 =links, 3 =upif(MarioD ==0){ // Rechts // Zähler erhöhen und testen Ergebnisse MarioX =MarioX + 3; if (MarioX ==270) { myGLCD.fillRect(MarioX-3, MarioY+3, MarioX, MarioY+36); // Trail-off-Grafik löschen, bevor die Richtung geändert wird MarioD =1; // Richtung nach unten ändern } } else if(MarioD ==1) { // Down // Zähler und Testergebnisse erhöhen MarioY =MarioY + 3; if (MarioY ==185) { myGLCD.fillRect(MarioX+3, MarioY-3, MarioX+36, MarioY); // Trail-off-Grafik löschen, bevor neue Position gedruckt wird MarioD =2; // Richtung nach unten ändern } } else if(MarioD ==2) { // Links // Zähler und Testergebnisse erhöhen MarioX =MarioX - 3; wenn (MarioX ==12){MarioD =3; // Richtung nach unten ändern } } else if(MarioD ==3) { // Up // Zähler und Testergebnisse inkrementieren MarioY =MarioY - 3; if (MarioY ==14) { myGLCD.fillRect(MarioX, MarioY+30, MarioX+28, MarioY+28); // Trail-off-Grafik löschen, bevor neue Position gedruckt wird MarioD =0; // Richtung nach unten ändern }}delay(dly); }// ********************************************** ************************************************* **********// =====Digitaluhr aktualisieren// **************************** ************************************************* ****************************** void UpdateDisp(){ // Löschen Sie den Zeitbereich myGLCD.setColor (0, 0, 0); myGLCD.setBackColor (0, 0, 0); // myGLCD.fillRect (60, 80, 262, 166); int-h; // Stundenwert im 24-Stunden-Format int e; // Minutenwert im Minutenformat int pm =0; // Flag, um zu bestimmen, ob PM oder AM // Es gibt vier Ziffern, die unabhängig voneinander gezeichnet werden müssen, um eine konsistente Positionierung der Zeit sicherzustellen int d1; // Zehner-Stundenziffer int d2; // Ones hour digit int d3; // Tens minute digit int d4; // Ones minute digit h =hour(); // 24 hour RT clock value e =minute();/* TESTh =12;e =8;*/// Calculate hour digit values for timeif ((h>=10) &&(h <=12)) { // AM hours 10,11,12 d1 =1; // calculate Tens hour digit d2 =h - 10; // calculate Ones hour digit 0,1,2 } else if ( (h>=22) &&(h <=24)) { // PM hours 10,11,12 d1 =1; // calculate Tens hour digit d2 =h - 22; // calculate Ones hour digit 0,1,2 } else if ((h <=9)&&(h>=1)) { // AM hours below ten d1 =0; // calculate Tens hour digit d2 =h; // calculate Ones hour digit 0,1,2 } else if ( (h>=13) &&(h <=21)) { // PM hours below 10 d1 =0; // calculate Tens hour digit d2 =h - 12; // calculate Ones hour digit 0,1,2 } else { // If hour is 0 d1 =1; // calculate Tens hour digit d2 =2; // calculate Ones hour digit 0,1,2 } // Calculate minute digit values for timeif ((e>=10)) { d3 =e/10; // calculate Tens minute digit 1,2,3,4,5 d4 =e - (d3*10); // calculate Ones minute digit 0,1,2 } else { // e is less than 10 d3 =0; d4 =e; } if (h>=12){ // Set // h =h-12; // Work out value pm =1; // Set PM flag} // *************************************************************************// Print each digit if it has changed to reduce screen impact/flicker// Set digit font colour to white myGLCD.setColor(255, 255, 255); myGLCD.setBackColor(0, 0, 0); myGLCD.setFont(SevenSeg_XXXL_Num); // First Digitif(((d1 !=c1)||(xsetup ==true))&&(d1 !=0)){ // Do not print zero in first digit position myGLCD.printNumI(d1,10,70); // Printing thisnumber impacts LFH walls so redraw impacted area // ---------------- Clear lines on Outside wall myGLCD.setColor(0,0,0); myGLCD.drawRoundRect(1, 238, 318, 1); }//If prevous time 12:59 or 00:59 and change in time then blank First Digitif((c1 ==1) &&(c2 ==2) &&(c3 ==5) &&(c4 ==9) &&(d2 !=c2) ){ // Clear the previouis First Digit and redraw wall myGLCD.setColor(0,0,0); myGLCD.fillRect(50, 70, 70, 165);}if((c1 ==0) &&(c2 ==0) &&(c3 ==5) &&(c4 ==9) &&(d2 !=c2) ){ // Clear the previouis First Digit and redraw wall myGLCD.setColor(0,0,0); myGLCD.fillRect(50, 70, 70, 165);} myGLCD.setColor(255, 255, 255); myGLCD.setBackColor(0, 0, 0); myGLCD.setFont(SevenSeg_XXXL_Num); // Second Digitif((d2 !=c2)||(xsetup ==true)){ myGLCD.printNumI(d2,70,70); // Print 0}// Third Digitif((d3 !=c3)||(xsetup ==true)){ myGLCD.printNumI(d3,143,70); // Was 145 }// Fourth Digitif((d4 !=c4)||(xsetup ==true)){ myGLCD.printNumI(d4,204,70); // Was 205 }if (xsetup ==true){ xsetup =false; // Reset Flag now leaving setup mode } // Print PM or AM // myGLCD.setColor(1, 73, 240); myGLCD.setBackColor(0, 0, 0); myGLCD.setFont(BigFont); if (pm ==0) { myGLCD.print("AM", 270, 147); } else { myGLCD.print("PM", 270, 147); }// ----------- Alarm Set on LHS lower pillarif (alarmstatus ==true) { // Print AS on fron screenleft hand side myGLCD.print("AS", 7, 147); } // Round dots myGLCD.setColor(255, 255, 255); myGLCD.setBackColor(0, 0, 0); myGLCD.fillCircle(137, 105, 5); myGLCD.fillCircle(137, 135, 5);//--------------------- copy exising time digits to global variables so that these can be used to test which digits change in futurec1 =d1;c2 =d2;c3 =d3;c4 =d4;}// =====initiateGame - Custom Functionvoid drawscreen() { // Setup Clock Background //Draw Background lines myGLCD.setColor(1, 73, 240);// myGLCD.setColor(229, 14, 122);// myGLCD.setColor(255, 0, 131); // ---------------- Outside wall myGLCD.drawRoundRect(0, 239, 319, 0); myGLCD.drawRoundRect(2, 237, 317, 2); myGLCD.drawBitmap (ghostX, ghostY, 28, 28, rd_ghost); // Closed Ghost myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioR3); // Closed Ghost myGLCD.drawBitmap (MonkeyX, MonkeyY, 40, 40, Monkey2); // Closed Ghost myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, r_o_pacman); // Closed Ghost myGLCD.drawBitmap (AlienX, AlienY, 40, 40, Alien1); // Closed Ghost myGLCD.drawBitmap (CannonX, CannonY, 40, 40, Cannon); // Closed Ghost } // ********************************** // ******* Enter Setup Mode ********* // ********************************** // Use up down arrows to change time and alrm settings void clocksetup(){ int timehour =hour();int timeminute =minute();// Read Alarm Set Time from Eeprom // read a byte from the current address of the EEPROM ahour =EEPROM.read(100); alarmhour =(int)ahour; if (alarmhour>24 ) { alarmhour =0; } amin =EEPROM.read(101); alarmminute =(int)amin; if (alarmminute>60 ) { alarmminute =0; }boolean savetimealarm =false; // If save button pushed save the time and alarm // Setup Screen myGLCD.clrScr();// ---------------- Outside wall myGLCD.setColor(255, 255, 0); myGLCD.setBackColor(0, 0, 0); myGLCD.drawRoundRect(0, 239, 319, 0); myGLCD.drawRoundRect(2, 237, 317, 2); //Reset screenpressed flagscreenPressed =false;// Read in current clock time and Alarm time // Setup buttons myGLCD.setFont(BigFont); // Time Set buttons myGLCD.print("+ +", 135, 38); myGLCD.print("- -", 135, 82); myGLCD.drawRoundRect(132, 35, 152, 55); // time hour + myGLCD.drawRoundRect(180, 35, 200, 55); // time minute + myGLCD.drawRoundRect(132, 80, 152, 100); // time hour - myGLCD.drawRoundRect(180, 80, 200, 100); // time minute - // Alarm Set buttons myGLCD.print("+ +", 135, 138); myGLCD.print("- -", 135, 182); myGLCD.drawRoundRect(132, 135, 152, 155); // alarm hour + myGLCD.drawRoundRect(180, 135, 200, 155); // alarm minute + myGLCD.drawRoundRect(132, 180, 152, 200); // alarm hour - myGLCD.drawRoundRect(180, 180, 200, 200); // alarm minute - myGLCD.print("SAVE", 13, 213); myGLCD.print("EXIT", 245, 213); myGLCD.drawRoundRect(10, 210, 80, 230); myGLCD.drawRoundRect(243, 210, 310, 230); // Get your Ghost on myGLCD.drawBitmap (50, 20, 28, 28, rd_ghost); // Closed Ghost myGLCD.drawBitmap (240, 100, 28, 28, r_o_pacman); // Closed Ghost myGLCD.drawBitmap (240, 20, 40, 40, Alien1); // Closed Ghost // Begin Loop herewhile (xsetup ==true){ if (alarmstatus ==true){ // flag where false is off and true is on myGLCD.print("SET", 220, 160); } else { myGLCD.print("OFF", 220, 160); } myGLCD.drawRoundRect(218, 157, 268, 177);// Draw Sound Button myGLCD.print("TEST", 50, 110); // Triggers alarm sound myGLCD.drawRoundRect(48, 108, 116, 128); // Display Current Time myGLCD.print("Time", 40, 60); // myGLCD.printNumI(timehour, 130, 60); if(timehour>=10){ // Annoyingly if number less than 10 doesnt print on RHS and misses zero so need to compensate myGLCD.printNumI(timehour, 130, 60); // If>=10 just print minute } else { myGLCD.print("0", 130, 60); myGLCD.printNumI(timehour, 146, 60); } myGLCD.print(":", 160, 60); if(timeminute>=10){ // Annoyingly if number less than 10 doesnt print on RHS and misses zero so need to compensate myGLCD.printNumI(timeminute, 175, 60); // If>=10 just print minute } else { myGLCD.print("0", 175, 60); myGLCD.printNumI(timeminute, 193, 60); } //Display Current Alarm Setting myGLCD.print("Alarm", 40, 160); // myGLCD.printNumI(alarmhour, 130, 160); if(alarmhour>=10){ // Annoyingly if number less than 10 doesnt print on RHS and misses zero so need to compensate myGLCD.printNumI(alarmhour, 130, 160); // If>=10 just print minute } else { myGLCD.print("0", 130, 160); myGLCD.printNumI(alarmhour, 146, 160); } myGLCD.print(":", 160, 160); if(alarmminute>=10){ // Annoyingly if number less than 10 doesnt print on RHS and misses zero so need to compensate myGLCD.printNumI(alarmminute, 175, 160); // If>=10 just print minute } else { myGLCD.print("0", 175, 160); myGLCD.printNumI(alarmminute, 193, 160); } // Read input to determine if buttons pressed myTouch.read(); if (myTouch.dataAvailable()) { xT =myTouch.getX(); yT =myTouch.getY(); // Capture input command from user if ((xT>=230) &&(xT<=319) &&(yT>=200) &&(yT<=239)) { // (243, 210, 310, 230) Exit Button xsetup =false; // Exit setupmode } else if ((xT>=0) &&(xT<=90) &&(yT>=200) &&(yT<=239)) { // (243, 210, 310, 230) Save Alarm and Time Button savetimealarm =true; // Exit and save time and alarm xsetup =false; // Exit setupmode } else if ((xT>=130) &&(xT<=154) &&(yT>=32) &&(yT<=57)) { // Time Hour + (132, 35, 152, 55) timehour =timehour + 1; // Increment Hour if (timehour ==24) { // reset hour to 0 hours if 24 timehour =0; } } else if ((xT>=130) &&(xT<=154) &&(yT>=78) &&(yT<=102)) { // (132, 80, 152, 100); // time hour - timehour =timehour - 1; // Increment Hour if (timehour ==-1) { // reset hour to 23 hours if <0 timehour =23; } } else if ((xT>=178) &&(xT<=202) &&(yT>=32) &&(yT<=57)) { // Time Minute + (180, 35, 200, 55) timeminute =timeminute + 1; // Increment Hour if (timeminute ==60) { // reset minute to 0 minutes if 60 timeminute =0; } } else if ((xT>=178) &&(xT<=202) &&(yT>=78) &&(yT<=102)) { // (180, 80, 200, 100); // time minute - timeminute =timeminute - 1; // Increment Hour if (timeminute ==-1) { // reset minute to 0 minutes if 60 timeminute =59; } } else if ((xT>=130) &&(xT<=154) &&(yT>=133) &&(yT<=157)) { // (132, 135, 152, 155); // alarm hour + alarmhour =alarmhour + 1; // Increment Hour if (alarmhour ==24) { // reset hour to 0 hours if 24 alarmhour =0; } } else if ((xT>=130) &&(xT<=154) &&(yT>=178) &&(yT<=202)) { // (132, 180, 152, 200); // alarm hour - alarmhour =alarmhour - 1; // Increment Hour if (alarmhour ==-1) { // reset hour to 23 hours if <0 alarmhour =23; } } else if ((xT>=178) &&(xT<=202) &&(yT>=133) &&(yT<=157)) { // (180, 135, 200, 155); // alarm minute + alarmminute =alarmminute + 1; // Increment Hour if (alarmminute ==60) { // reset minute to 0 minutes if 60 alarmminute =0; } } else if ((xT>=178) &&(xT<=202) &&(yT>=178) &&(yT<=202)) { // (180, 180, 200, 200); // alarm minute - alarmminute =alarmminute - 1; // Increment Hour if (alarmminute ==-1) { // reset minute to 0 minutes if 60 alarmminute =59; } } else if ((xT>=216) &&(xT<=270) &&(yT>=155) &&(yT<=179)) { // (218, 157, 268, 177); // alarm set button pushed if (alarmstatus ==true) { alarmstatus =false; // Turn off Alarm } else { alarmstatus =true; // Turn on Alarm } } else if ((xT>=46) &&(xT<=118) &&(yT>=106) &&(yT<=130)) { // ((48, 108, 116, 128); // alarm test button pushed // Set off alarm by toggling D8, recorded sound triggered by LOW to HIGH transition digitalWrite(8,HIGH); // Set high digitalWrite(8,LOW); // Set low } // Should mean changes should scroll if held down delay(250); } } if ( savetimealarm ==true) { // The following codes transmits the data to the RTC Wire.beginTransmission(DS1307); Wire.write(byte(0)); Wire.write(decToBcd(0)); Wire.write(decToBcd(timeminute)); Wire.write(decToBcd(timehour)); Wire.write(decToBcd(0)); Wire.write(decToBcd(0)); Wire.write(decToBcd(0)); Wire.write(decToBcd(0)); Wire.write(byte(0)); Wire.endTransmission(); // Ends transmission of data // Write the Alarm Time to EEPROM so it can be stored when powered off //alarmhour =(int)ahour; ahour =(byte)alarmhour; amin =(byte)alarmminute; EEPROM.write(100, ahour); EEPROM.write(101, amin); // Now time and alarm data saved reset flag savetimealarm =false;} //* Clear Screen myGLCD.setColor(0, 0, 0); myGLCD.setBackColor(0, 0, 0); myGLCD.fillRect(0,239,319,0); xsetup =true; // Set Flag now leaving setup mode in order to draw Clock Digits setSyncProvider(RTC.get); // the function to get the time from the RTC setSyncInterval(60); // sync the time every 60 seconds (1 minutes) drawscreen(); // Initiate the screen UpdateDisp(); // update value to clock } // =================Decimal to BCD converterbyte decToBcd(byte val) { return ((val/10*16) + (val%10));} /* myGLCD.drawBitmap (ghostX, ghostY, 28, 28, ghost); // Closed Ghost myGLCD.drawBitmap (MarioX, MarioY, 40, 40, Mario); // Closed Ghost myGLCD.drawBitmap (MonkeyX, MonkeyY, 40, 40, Monkey); // Closed Ghost myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, r_o_pacman); // Closed Ghost myGLCD.drawBitmap (AlienX, AlienY, 40, 40, Alien); // Closed Ghost myGLCD.drawBitmap (CannonX, CannonY, 40, 40, Cannon); // Closed Ghost *///**********************************************************************************************************//======Draws the rd_ghost - bitmapvoid drawghost(int x, int y, int d, int p) { // Draws the ghost - bitmap // knotting direction d ==0 =right, 1 =down, 2 =left, 3 =up myGLCD.setColor(0, 0, 0); myGLCD.setBackColor(0, 0, 0); if ( d ==0){ // Right myGLCD.fillRect(x-3, y, x, y+28); // Clear trail off graphic before printing new position // draw image myGLCD.drawBitmap (ghostX, ghostY, 28, 28, rr_ghost); } else if ( d ==1){ // Down myGLCD.fillRect(x+3, y-3, x+36, y); // Clear trail off graphic before printing new position // draw image myGLCD.drawBitmap (ghostX, ghostY, 28, 28, rd_ghost); } else if ( d ==2){ // Left myGLCD.fillRect(x+28, y, x+31, y+28); // Clear trail off graphic before printing new positi // draw image myGLCD.drawBitmap (ghostX, ghostY, 28, 28, rl_ghost); // draw image } else if ( d ==3){ // Up myGLCD.fillRect(x, y+29, x+28, y+28); // Clear trail off graphic before printing new position // draw image myGLCD.drawBitmap (ghostX, ghostY, 28, 28, ru_ghost); }}//**********************************************************************************************************//======Draws the Mario - bitmapvoid drawMario(int x, int y, int d, int p) { // Draws the Mario - bitmap // Mario direction d ==0 =right, 1 =down, 2 =left, 3 =up myGLCD.setColor(0, 0, 0); myGLCD.setBackColor(0, 0, 0); if ( d ==0){ // Right myGLCD.fillRect(x-3, y+3, x, y+36); // Clear trail off graphic before printing new position // draw image if (p==0) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioR1); } else if (p==1) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioR3); } else if (p==2) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioR2); } else if (p==3) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioR3); } } else if ( d ==1){ // Down myGLCD.fillRect(x+3, y-3, x+36, y); // Clear trail off graphic before printing new position // draw image if (p==0) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioU1); } else if (p==1) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioU2); } else if (p==2) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioU1); } else if (p==3) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioU2); } } else if ( d ==2){ // Left myGLCD.fillRect(x+28, y, x+31, y+28); // Clear trail off graphic before printing new positi // draw image if (p==0) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioL1); } else if (p==1) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioL3); } else if (p==2) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioL2); } else if (p==3) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioL3); } } else if ( d ==3){ // Up myGLCD.fillRect(x, y+30, x+28, y+28); // Clear trail off graphic before printing new position // draw image if (p==0) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioU1); } else if (p==1) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioU2); } else if (p==2) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioU1); } else if (p==3) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioU2); } }// myGLCD.drawBitmap (MarioX, MarioY, 40, 40, MarioR3); }//**********************************************************************************************************//======Draws the Cannon - bitmapvoid drawCannon(int x, int y, int d, int p) { // Draws the Cannon - bitmap // Cannon direction d ==0 =right, 1 =down, 2 =left, 3 =up myGLCD.setColor(0, 0, 0); myGLCD.setBackColor(0, 0, 0); if ( d ==0){ // Right myGLCD.fillRect(x-3, y+3, x, y+36); // Clear trail off graphic before printing new position // draw image } else if ( d ==1){ // Down myGLCD.fillRect(x+3, y-3, x+36, y); // Clear trail off graphic before printing new position // draw image } else if ( d ==2){ // Left myGLCD.fillRect(x+41, y+3, x+40, y+36); // Clear trail off graphic before printing new positi // draw image } else if ( d ==3){ // Up myGLCD.fillRect(x, y+41, x+40, y+40); // Clear trail off graphic before printing new position // draw image } myGLCD.drawBitmap (CannonX, CannonY, 40, 40, Cannon); }//**********************************************************************************************************//======Draws the Monkey - bitmapvoid drawMonkey(int x, int y, int d, int p) { // Draws the Monkey - bitmap // Monkey direction d ==0 =right, 1 =down, 2 =left, 3 =up myGLCD.setColor(0, 0, 0); myGLCD.setBackColor(0, 0, 0); if ( d ==0){ // Right myGLCD.fillRect(x-3, y, x, y+40); // Clear trail off graphic before printing new position // draw image if (p==0) { myGLCD.drawBitmap (MonkeyX, MonkeyY, 40, 40, Monkey2); } else if (p==1) { myGLCD.drawBitmap (MonkeyX, MonkeyY, 40, 40, Monkey2); } else if (p==2) { myGLCD.drawBitmap (MonkeyX, MonkeyY, 40, 40, Monkey3); }else { myGLCD.drawBitmap (MonkeyX, MonkeyY, 40, 40, Monkey3); } } else if ( d ==1){ // Down myGLCD.fillRect(x, y-3, x+40, y); // Clear trail off graphic before printing new position // draw image myGLCD.drawBitmap (MonkeyX, MonkeyY, 40, 40, Monkey3); } else if ( d ==2){ // Left myGLCD.fillRect(x+41, y, x+40, y+40); // Clear trail off graphic before printing new positi // draw image if (p==0) { myGLCD.drawBitmap (MonkeyX, MonkeyY, 40, 40, Monkey2); } else if (p==1) { myGLCD.drawBitmap (MonkeyX, MonkeyY, 40, 40, Monkey2); } else if (p==2) { myGLCD.drawBitmap (MonkeyX, MonkeyY, 40, 40, Monkey3); }else { myGLCD.drawBitmap (MonkeyX, MonkeyY, 40, 40, Monkey3); } } else if ( d ==3){ // Up myGLCD.fillRect(x, y+43, x+40, y+40); // Clear trail off graphic before printing new position // draw image myGLCD.drawBitmap (MonkeyX, MonkeyY, 40, 40, Monkey3); } }//**********************************************************************************************************//======Draws the pacman - bitmapvoid drawpacman(int x, int y, int d, int p) { // Draws the pacman - bitmap // pacman direction d ==0 =right, 1 =down, 2 =left, 3 =up myGLCD.setColor(0, 0, 0); myGLCD.setBackColor(0, 0, 0); if ( d ==0){ // Right myGLCD.fillRect(x-3, y+3, x, y+36); // Clear trail off graphic before printing new position // draw image if (p==0) { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, c_pacman); } else if (p==1) { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, r_m_pacman); } else if (p==2) { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, r_o_pacman); }else { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, r_m_pacman); } } else if ( d ==1){ // Down myGLCD.fillRect(x+3, y-3, x+36, y); // Clear trail off graphic before printing new position // draw image if (p==0) { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, c_pacman); } else if (p==1) { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, d_m_pacman); } else if (p==2) { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, d_o_pacman); }else { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, d_m_pacman); } } else if ( d ==2){ // Left myGLCD.fillRect(x+28, y, x+31, y+28); // Clear trail off graphic before printing new positi // draw image if (p==0) { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, c_pacman); } else if (p==1) { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, l_m_pacman); } else if (p==2) { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, l_o_pacman); }else { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, l_m_pacman); } } else if ( d ==3){ // Up myGLCD.fillRect(x, y+29, x+28, y+28); // Clear trail off graphic before printing new position // draw image if (p==0) { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, c_pacman); } else if (p==1) { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, u_m_pacman); } else if (p==2) { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, u_o_pacman); }else { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, u_m_pacman); } }// myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, r_o_pacman); }//**********************************************************************************************************//======Draws the Alien - bitmapvoid drawAlien(int x, int y, int d, int p) { // Draws the Alien - bitmap // Alien direction d ==0 =right, 1 =down, 2 =left, 3 =up myGLCD.setColor(0, 0, 0); myGLCD.setBackColor(0, 0, 0); if ( d ==0){ // Right myGLCD.fillRect(x-3, y+3, x, y+36); // Clear trail off graphic before printing new position // draw image if((p ==1)||(p ==3)){ myGLCD.drawBitmap (AlienX, AlienY, 40, 40, Alien1); } else { myGLCD.drawBitmap (AlienX, AlienY, 40, 40, Alien2); } } else if ( d ==1){ // Down myGLCD.fillRect(x+3, y-3, x+36, y); // Clear trail off graphic before printing new position // draw image if((p ==1)||(p ==3)){ myGLCD.drawBitmap (AlienX, AlienY, 40, 40, Alien1); } else { myGLCD.drawBitmap (AlienX, AlienY, 40, 40, Alien2); } } else if ( d ==2){ // Left myGLCD.fillRect(x+41, y+3, x+40, y+36); // Clear trail off graphic before printing new positi // draw image if((p ==1)||(p ==3)){ myGLCD.drawBitmap (AlienX, AlienY, 40, 40, Alien1); } else { myGLCD.drawBitmap (AlienX, AlienY, 40, 40, Alien2); } } else if ( d ==3){ // Up myGLCD.fillRect(x, y+41, x+40, y+40); // Clear trail off graphic before printing new position // draw image if((p ==1)||(p ==3)){ myGLCD.drawBitmap (AlienX, AlienY, 40, 40, Alien1); } else { myGLCD.drawBitmap (AlienX, AlienY, 40, 40, Alien2); } } }

Kundenspezifische Teile und Gehäuse

Thingiverse
https://www.thingiverse.com/thing:3017701CAD file on thingiverse.com

Schaltpläne


Herstellungsprozess

  1. LED-Sequenzer
  2. Kuckucksuhr
  3. Arduino-Pov-Vision-Uhr
  4. Verilog-Taktgenerator
  5. Einfache Wordclock (Arduino)
  6. TeleBall Retro-Handheld-Spielkonsole
  7. Hauptuhr
  8. Ingegno Retro-Spielekonsole
  9. italienische Wordclock
  10. Infinity-Spiegeluhr