Weihnachten 2024 - LED Matrix und ein singender Weihnachtself - AZ-Delivery

Die Kleinen zu Hause zählen schon die Tage bis Weihnachten und es folgen die Geschenke und der Beginn des Schmückens des Hauses mit weihnachtlichen Motiven, vor allem des Baumes. Alles ist ein wenig unordentlich, aber mit großer Begeisterung.

Wie wäre es mit einem Projekt, das wir in unsere Dekoration aufnehmen? In diesem Projekt haben wir uns entschieden, vier WS2812B 16x16 Panels mit je 256 LEDs, ein Mini MP3 Player DFPlayer Master Modul und einen Mini-Lautsprecher DFPlayer Mini 3 Watt 8 Ohm zu verwenden. All dies wird mit dem AZ-ATmega328-Board Mikrocontroller verwaltet. Mit all diesen Komponenten werden wir das Bild eines Weihnachtselfen zeigen, der zu jeder einstellbaren Zeit einen kleinen Teil eines Weihnachtsliedes singen wird. Dieses Projekt dient als kleine Inspiration und Demonstration, die verwendet werden kann, um mehr Bilder und Lieder zu implementieren, um die Kleinen auf diese Weise zu überraschen.  

Es bleibt nicht mehr viel Zeit bis zur schönsten Nacht des Jahres. Wir müssen die Dekoration so gestalten, dass sie den wahren Protagonisten des Weihnachtsfestes eine Überraschung bereitet. Lassen Sie uns mit dem Projekt beginnen.

Hardware

Softwarekomponenten

Die Bibliotheken können auch über den Bibliotheksverwalter in der Arduino IDE installiert werden.

Schaltung und Beschreibung der verwendeten Module

Download der Schaltung

Es wurden die vier RGB-LED-Paneele in einer 2x2-Formation positioniert, so dass wir ein Raster von 32x32 LEDs erhalten. Um das Lied oder andere Lieder abzuspielen, verwenden wir das Mini DFPlayer Modul (ein 1K Ohm Widerstand muss im Modul verwendet werden, um die Spannung in der Kommunikationsleitung anzupassen). Es muss eine microSD-Karte verwendet werden, auf der die Datei 2.mp3 gespeichert wird. Alle oben genannten Module und Komponenten werden von dem AZ-ATmega328-Board Mikrocontroller gesteuert. Was die Stromversorgung betrifft, so würde laut Datenblatt jedes Panel mit allen LEDs in Weiß und 100 % Helligkeit 0,3 W verbrauchen, was multipliziert mit den 256 LEDs einen Gesamtverbrauch von 76,8 W ergeben würde. Die gute Nachricht ist jedoch, dass in dieser Skizze die Helligkeit nicht auf 100 %, sondern auf einen Wert von 7 von 254 eingestellt ist, so dass nicht alle LEDs gleichzeitig leuchten und nicht alle weiß sind.

Beschreibung des Projektablaufs und des Sketches

Der Ablauf dieses Projekts ist sehr einfach: Zuerst wird das AZ-Delivery Logo für 3 Sekunden, dann die Nachricht "Wishes You Merry Xmas" für 3 Sekunden eingeblendet, dann ein kleines Weihnachtslied gespielt, während ein Weihnachtself gezeigt wird. Um den Eindruck zu erwecken, dass während des Liedes gesungen wird, wechselt der kleine Bereich des Mundes mit 5 verschiedenen Bildern. Wenn das Lied endet, zeigt es eine Art Feuerwerksrakete und wünscht das neue Jahr mit "Happy New Year". Wenn die eingestellte Zeit verstrichen ist, setzt sich der Mikrocontroller über seinen RST-Port zurück, indem er seinen Zustand von HIGH auf LOW am digitalen Port 12 ändert, um wieder alle vorherigen Bilder anzuzeigen. Beginnen wir mit der Analyse des Sketches.

Sketch Download

Um die Module korrekt verwenden zu können, müssen die jeweils erforderlichen Bibliotheken immer im Abschnitt zur Definition der globalen Variablen (am Anfang des Sketches) implementiert werden. Die erste hinzuzufügende Bibliothek ist Adafruit_GFX.h, dies ist die Haupt-Grafikbibliothek, die die notwendigen Methoden zum Zeichnen von primitiven Grafiken (Punkte, Linien, Kreise, etc.) bereitstellt. Die zweite hinzuzufügende Bibliothek ist Adafruit_NeoPixel.h, die zur Steuerung der drei internen LEDs auf den Panels benötigt wird. Die dritte ist die Bibliothek SoftwareSerial.h, die es dem Mikrocontroller ermöglicht, jeden digitalen Pin für die serielle Kommunikation freizugeben, was erforderlich ist, um das MP3-Player-Modul zu verwenden. DFRobotDFPlayerMini.h ist die Bibliothek, die die für die Verwendung des MP3-Moduls erforderlichen Funktionen ermöglicht.

#include "Adafruit_GFX.h"
#include <Adafruit_NeoPixel.h>
#include <SoftwareSerial.h>
#include <DFRobotDFPlayerMini.h>

Als Nächstes wird eine erste Konstante mit der Gesamtzahl der LEDs (1024) der vier Panels erstellt und eine zweite, um den Pin 7 des Mikrocontrollers anzugeben, an den wir die Datenleitung des ersten Panels angeschlossen haben. Wir brauchen nur eine Datenleitung, da die Panels in Reihe geschaltet sind.

#define NUM_LEDS 1024
#define PIN 7

Es folgt das Objekt mySoftwareSerial  zur Verwendung des MP3-Player-Moduls über die serielle Schnittstelle. In diesem Projekt wird der digitale Pin 10 des Mikrocontrollers verwendet, um Daten vom MP3-Modul zu empfangen. Der digitale Pin 11 wird verwendet, um Daten an das MP3-Modul zu senden. Um die Steuermethoden und -befehle des Moduls zu nutzen, wie z. B. das Einstellen der Lautstärke, oder das Starten der Wiedergabe einer MP3-Datei, wird das Objekt myDFPlayer aus der Bibliothek DFRobotDFPlayerMini.h erstellt.

SoftwareSerial mySoftwareSerial(10, 11);
DFRobotDFPlayerMini myDFPlayer;

Dann wird das Bildobjekt der Bibliothek Adafruit_NeoPixel.h mit der Anzahl der LEDs auf dem Panel und dem Pin 7 implementiert. Das interne Layout ist grün, rot und blau (NEO_GRB).  Der letzte Wert der Argumente ist die Betriebsfrequenz (800 KHz).

Adafruit_NeoPixel picture(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);

Es wird eine Reihe von Farben definiert, wobei jedoch nicht alle Farben verwendet werden.

uint32_t p_red = picture.Color(150,0,0);
uint32_t p_green = picture.Color(0,150,0);
uint32_t p_blue = picture.Color(0,0,150);
uint32_t p_yellow = picture.Color(150,150,0);
uint32_t p_purple = picture.Color(150,0,150);
uint32_t p_light_blue = picture.Color(0,150,150);
uint32_t p_white = picture.Color(150,150,150);
uint32_t p_maroon = picture.Color(150,51,0);
uint32_t p_black = picture.Color(0,0,0);

Nachdem die Bibliotheken implementiert, die Modulobjekte erstellt und die erforderlichen Variablen angelegt wurden, muss die Anfangskonfiguration aller Module in der Methode setup() definiert werden. Als Erstes muss der digitale Pin 12 mit digitalWrite(12, HIGH) auf HIGH gesetzt werden und mit pinMode(12, OUTPUT) wird er als Ausgang konfiguriert. Auf diese Weise wird der digitale Pin, der mit dem RST-Pin des Mikrocontrollers verbunden ist, auf HIGH gesetzt und verhindert, dass er wieder zurückgesetzt wird.

digitalWrite(12, HIGH);
pinMode(12, OUTPUT);

Um die Kommunikation zwischen dem Mikrocontroller und dem MP3-Modul herzustellen, wird die SoftwareSerial initialisiert und die Datenübertragungsgeschwindigkeit mit mySoftwareSerial.begin(9600) auf 9600 Baud eingestellt. Die Kommunikation mit dem Serial Monitor wird mit Serial.begin(115200) mit der in Klammern stehenden Geschwindigkeit initialisiert. Um die Meldungen über den Initialisierungsstatus oder Fehler des MP3-Moduls zu erhalten, muss die Geschwindigkeit im unteren rechten Teil des Serial Monitors beim Öffnen ausgewählt werden.

mySoftwareSerial.begin(9600);
Serial.begin(115200);

Der nächste Schritt ist die Initialisierung des mp3-Moduls. Um die korrekte Initialisierung zu überprüfen, wird eine if-Anweisung verwendet. Es wird geprüft, ob das MP3-Modul aus irgendeinem Grund nicht initialisiert wurde. Das Symbol „!“ negiert die Bedingung. Wenn also das Modul nicht initialisiert ist, ist die Bedingung wahr und der Code innerhalb der geschweiften Klammern wird ausgeführt. Über die serielle Konsole wird informiert, dass die Verbindungen und das Einlegen der microSD-Karte überprüft werden muss. Ist das MP3-Modul hingegen korrekt initialisiert, ist die Bedingung nicht erfüllt und der von uns erläuterte Code wird nicht ausgeführt. Die setup()-Methode wird weiterhin ausgeführt und über die serielle Konsole mit der Zeile Serial.println(F("Correct DFPlayer initialization.")) wird informiert, dass das MP3-Player-Modul korrekt initialisiert wurde.

if (!myDFPlayer.begin(mySoftwareSerial)) {
  Serial.println(F("Error initializing mp3 module:"));
  Serial.println(F("1. Please check the connections!"));
  Serial.println(F("2. Please insert the microSD memory!"));
  while(true){
    delay(0);
  }
}

Serial.println(F("Correct DFPlayer initialization.")); 

Nach der Initialisierung des MP3-Moduls wird das aus der NeoPixel-Bibliothek erstellte Bildobjekt initialisiert, um die Anzeige der Bilder auf den LED-Panels zu ermöglichen. Es wird eine Pause von 2 Sekunden eingelegt, um sicherzustellen, dass die Initialisierung korrekt erfolgt.

picture.begin();
delay(2000);

Sobald die setup()-Methode beendet ist, beginnt die loop()-Methode mit der Anzeige der Begrüßungsnachrichten und unsere Elfe beginnt mit dem Singen des Weihnachtsliedes.

Zuerst werden mit picture.clear() alle LEDs ausgeschaltet. Dies geschieht für den Fall, dass eine von ihnen aus irgendeinem Grund angelassen wurde. Als Nächstes wird die Helligkeit der LEDs mit picture.setBrightness(7) eingestellt. In diesem Sketch wurde sie auf einen niedrigen Wert (7 von 254) gesetzt. Die Anzeige gut, aber hier kann jeder Benutzer die Helligkeit der LEDs mit größerer Intensität einstellen, falls gewünscht, indem er die Zahl in Klammern anpasst. Der maximale Wert ist 254.

picture.clear();
picture.setBrightness(7); 

Als Nächstes wird die Methode show_az_logo() aufgerufen, die das AZ-Delivery-Logo 3 Sekunden lang auf den LED-Arrays anzeigt. Es sind sehr viele einzelne Befehle. Lassen Sie uns die aufgerufene Methode nur kurz analysieren.

Jede verwendete LED wird zu Beginn konfiguriert. Das Logo wird in Rot mit picture.setPixelColor(LED number, color) angezeigt. In den Argumenten müssen Sie die Anzahl der LED (LED number) und die Farbe angeben, die angezeigt werden soll (color). Die Farbe wird am Anfang des Sketches konfiguriert. Es ist zu beachten, dass bei der Verwendung von vier Matrizen, die in Reihe geschaltet sind, jede LED eine eindeutige Nummer hat. Die erste LED hat immer die Nummer 0 und die Nummer der letzten LED 1023, was insgesamt 1024 LEDs ergibt.

Wenn alle LEDs, die das Logo anzeigen sollen, konfiguriert sind, verwenden wir die Anweisung show() des Bildobjekts, um die LEDs einzuschalten. Das Logo wird 3 Sekunden lang auf den Arrays angezeigt. Am Ende dieser Zeitspanne werden alle LEDs ausgeschaltet und das Programm kehrt zu der Zeile zurück, von der aus diese Methode aufgerufen wurde.

picture.show();
delay(3000);
picture.clear();

Das Bild, das auf den LED-Arrays angezeigt wird:

Die nächste Zeile des Sketches ruft die Methode merry_xmas() auf, die eine Weihnachtsbotschaft anzeigt. Wie man sieht, werden die gleichen Schritte wie in der zuvor erklärten Methode durchgeführt. Zuerst werden die LEDs mit einer Farbe konfiguriert. Anschließende leuchten sie für 3 Sekunden auf und nach dieser Zeit werden sie ausgeschaltet zu der Zeile des Sketches zurück, von der aus diese Methode aufgerufen wurde.

Das sieht dann folgendermaßen aus:

Nach dem Weihnachtsgruß werden die folgenden Zeilen ausgeführt, um die Sounddatei zu verwalten. Zuerst wird die Wiedergabelautstärke mit myDFPlayer.volume(15) auf einen Wert von 15 von 30 eingestellt. Dann wird die vom MP3-Modul abzuspielende Datei angegeben, in diesem Fall die Datei 2.mp3, die auf der microSD-Karte gespeichert sein muss. Der Befehl yield() wird bei Prozessen verwendet, deren Ausführung viel Zeit in Anspruch nimmt.

myDFPlayer.volume(15);
myDFPlayer.play(2);
yield();

Um den Kobold auf den LED-Arrays zu visualisieren, wird die Methode draw_goblin() aufgerufen. Die Schritte sind wieder ähnlich wie bei den beiden oben beschriebenen Methoden. Die gewünschte Farbe der LEDs mit picture.setPixelColor(LED number, color) einstellen und dann mit picture.show() einschalten. Das darzustellende Bild ist dann dieses:

Um die Bewegung des Mundes unserer Elfe zu realisieren, wird die Ausführung verschiedener Methoden programmiert, die die Farbe der LEDs im Bereich des Mundes ändern. Jede Position wird für eine Anzahl von Millisekunden angezeigt. So scheint es, dass die Elfe das Lied singt. Auch hier sehen die Befehle der Methoden ähnlich aus, wie die zuvor beschriebenen.

  • draw_mouth_1()

       

  • draw_mouth_2()

       

  • draw_mouth_3()

       

  • draw_mouth_4()

       

  • draw_mouth_5()

       

Wenn das Lied zu Ende ist, erlöschen alle LEDs erscheint eine Art Feuerwerksrakete, nachdem die Methode fireworks() ausgeführt wurde. Das Erzeugen der Animation ähnelt der des singenden Kobolds. Das vollständige Bild sieht wie folgt aus:

Wenn dann danach die Methode show_happy_new_year() ausgeführt wird, erscheint das Bild mit den Neujahrsgrüßen:

Dieses letzte Bild wird 15 Minuten lang mit der Ausführung von delay(900000) angezeigt. Da 900.000 Millisekunden 15 Minuten entsprechen, kann diese Wartezeit geändert werden, um dieses Projekt an die Wünsche jedes Benutzers anzupassen. Nach der festgelegten Zeit wird der digitale Pin 12 des Mikrocontrollers mit der Ausführung des Befehls digitalWrite(12, LOW) in den LOW-Zustand übergehen und den Neustart des Mikrocontrollers bewirken. Mit diesem Reset wird der RAM-Speicher des Mikrocontrollers freigegeben, um eine Sättigung zu vermeiden und um zu verhindern, dass der Sketch nicht mehr ausgeführt wird.

delay(900000);
picture.clear(); 

digitalWrite(12, LOW); 

Die Anordnung und Nummerierung der jeweiligen LEDs auf den vier Panels für die zuvor genannten Bilder finden Sie hier noch einmal als PDF-Dateien.

 

Wenn das Video nicht angezeigt wird, überprüfen Sie bitte die Cookie-Einstellungen Ihres Browsers!

Wir hoffen, dass Ihnen dieses Familien-Weihnachtsprojekt gefällt und Sie ermutigt, neue Bilder mit den Kleinen zu erstellen. Die Fantasie ist etwas Unendliches und hat keine Grenzen. Wir wünschen Ihnen viel Spaß, ein frohes Weihnachtsfest und ein gutes neues Jahr.

DisplaysFür arduinoProjekte für anfänger

Lascia un commento

Tutti i commenti vengono moderati prima della pubblicazione