Bemerkung

Hallo und willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Gemeinschaft auf Facebook! Tauchen Sie tiefer ein in die Welt von Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten.

Warum beitreten?

  • Expertenunterstützung: Lösen Sie Nachverkaufsprobleme und technische Herausforderungen mit Hilfe unserer Gemeinschaft und unseres Teams.

  • Lernen & Teilen: Tauschen Sie Tipps und Anleitungen aus, um Ihre Fähigkeiten zu verbessern.

  • Exklusive Vorschauen: Erhalten Sie frühzeitigen Zugang zu neuen Produktankündigungen und exklusiven Einblicken.

  • Spezialrabatte: Genießen Sie exklusive Rabatte auf unsere neuesten Produkte.

  • Festliche Aktionen und Gewinnspiele: Nehmen Sie an Gewinnspielen und Feiertagsaktionen teil.

👉 Sind Sie bereit, mit uns zu erkunden und zu erschaffen? Klicken Sie auf [ hier ] und treten Sie heute bei!

CheerLights

CheerLights ist ein globales Netzwerk synchronisierter Lichter, das von jedem gesteuert werden kann. Treten Sie der @CheerLights - Twitter LED-Farbwechsel-Community bei, die es ermöglicht, dass LEDs weltweit gleichzeitig ihre Farben ändern. Platzieren Sie Ihre LEDs in einer Ecke Ihres Büros, um sich daran zu erinnern, dass Sie nicht alleine sind.

In diesem Fall nutzen wir ebenfalls MQTT, aber anstatt unsere eigenen Nachrichten zu veröffentlichen, abonnieren wir das Thema „cheerlights“. Dadurch können wir Nachrichten, die von anderen an das Thema „cheerlights“ gesendet werden, empfangen und diese Informationen verwenden, um die Farbe unseres LED-Streifens entsprechend zu ändern.

Benötigte Komponenten

Für dieses Projekt benötigen wir die folgenden Komponenten.

Es ist definitiv praktisch, ein ganzes Kit zu kaufen, hier ist der Link:

Name

ARTIKEL IN DIESEM KIT

LINK

Elite Explorer Kit

300+

Elite Explorer Kit

Sie können sie auch separat über die untenstehenden Links kaufen.

KOMPONENTENBESCHREIBUNG

KAUF-LINK

Arduino Uno R4 WiFi

-

Jumperkabel

KAUFEN

WS2812 RGB 8 LEDs Streifen

KAUFEN

Verdrahtung

../_images/05_cheerlight_bb.png

Schaltplan

../_images/05_cheerlight_schematic.png

Bibliothek installieren

Um die Bibliothek zu installieren, verwenden Sie den Arduino Library Manager und suchen Sie nach „ArduinoMqttClient“ und „FastLED“, um sie zu installieren.

ArduinoMqttClient.h: Wird für die MQTT-Kommunikation verwendet.

FastLED.h: Wird verwendet, um den RGB-LED-Streifen zu steuern.

Code ausführen

Bemerkung

  • Sie können die Datei 05_cheerlight.ino direkt unter dem Pfad elite-explorer-kit-main\iot_project\05_cheerlight öffnen.

  • Oder kopieren Sie diesen Code in die Arduino IDE.

Bemerkung

Im Code werden SSID und Passwort in arduino_secrets.h gespeichert. Bevor Sie dieses Beispiel hochladen, müssen Sie sie mit Ihren eigenen WLAN-Anmeldeinformationen ändern. Außerdem sollten Sie aus Sicherheitsgründen diese Informationen vertraulich halten, wenn Sie den Code teilen oder speichern.

arduino_secrets.h
#define SECRET_SSID "your_ssid"        // your network SSID (name)
#define SECRET_PASS "your_password"        // your network password (use for WPA, or use as key for WEP)
05_cheerlight.ino
  1/*
  2  The code is designed for an Arduino Uno R4 WiFi to connect to a Wi-Fi network, 
  3  subscribe to an MQTT topic, and control a chain of NeoPixel LEDs based on messages 
  4  received from the MQTT broker. It listens for color commands from the cheerlights 
  5  topic and updates the LED colors accordingly.
  6
  7  Board: Arduino Uno R4 WiFi
  8  Component: WS2812
  9  Library: https://github.com/arduino-libraries/ArduinoMqttClient (ArduinoMqttClient by Arduino)
 10           https://github.com/FastLED/FastLED (FastLED by Daniel Garcia)
 11           
 12*/
 13
 14#include <WiFiS3.h>
 15#include <ArduinoMqttClient.h>
 16#include <FastLED.h>
 17
 18#define NUM_LEDS 8  // Number of LEDs in the chain
 19#define DATA_PIN 6  // Data pin for LED control
 20
 21#include "arduino_secrets.h"
 22///////please enter your sensitive data in the Secret tab/arduino_secrets.h
 23char ssid[] = SECRET_SSID;    // your network SSID (name)
 24char pass[] = SECRET_PASS;    // your network password (use for WPA, or use as key for WEP)
 25int status = WL_IDLE_STATUS;  // the WiFi radio's status
 26
 27WiFiClient wifiClient;
 28MqttClient mqttClient(wifiClient);
 29
 30const char broker[] = "mqtt.cheerlights.com";
 31int port = 1883;
 32const char topic[] = "cheerlights";
 33
 34
 35
 36CRGB leds[NUM_LEDS];  // Array to hold LED color data
 37
 38// Define the supported CheerLights colors and their RGB values
 39String colorName[] = { "red", "pink", "green", "blue", "cyan", "white", "warmwhite", "oldlace", "purple", "magenta", "yellow", "orange" };
 40
 41int colorRGB[][3] = { 255, 0, 0,      // "red"
 42                      255, 192, 203,  // "pink"
 43                      0, 255, 0,      // "green"
 44                      0, 0, 255,      // "blue"
 45                      0, 255, 255,    // "cyan"
 46                      255, 255, 255,  // "white"
 47                      255, 223, 223,  // "warmwhite"
 48                      255, 223, 223,  // "oldlace"
 49                      128, 0, 128,    // "purple"
 50                      255, 0, 255,    // "magenta"
 51                      255, 255, 0,    // "yellow"
 52                      255, 165, 0 };  // "orange"
 53
 54
 55void setup() {
 56  //Initialize serial and wait for port to open:
 57  Serial.begin(9600);
 58
 59  while (!Serial) {
 60    ;  // wait for serial port to connect. Needed for native USB port only
 61  }
 62
 63  // check for the WiFi module:
 64  if (WiFi.status() == WL_NO_MODULE) {
 65    Serial.println("Communication with WiFi module failed!");
 66    // don't continue
 67    while (true)
 68      ;
 69  }
 70
 71  String fv = WiFi.firmwareVersion();
 72  if (fv < WIFI_FIRMWARE_LATEST_VERSION) {
 73    Serial.println("Please upgrade the firmware");
 74  }
 75
 76  // attempt to connect to WiFi network:
 77  while (status != WL_CONNECTED) {
 78    Serial.print("Attempting to connect to WPA SSID: ");
 79    Serial.println(ssid);
 80    // Connect to WPA/WPA2 network. Change this line if using open or WEP network:
 81    status = WiFi.begin(ssid, pass);
 82
 83    // wait 10 seconds for connection:
 84    delay(10000);
 85  }
 86
 87  // you're connected now, so print out the data:
 88  Serial.print("You're connected to the network");
 89  printCurrentNet();
 90  printWifiData();
 91
 92  // You can provide a unique client ID, if not set the library uses Arduino-millis()
 93  // Each client must have a unique client ID
 94  // mqttClient.setId("clientId");
 95
 96  // You can provide a username and password for authentication
 97  // mqttClient.setUsernamePassword("username", "password");
 98
 99  Serial.print("Attempting to connect to the MQTT broker: ");
100  Serial.println(broker);
101
102  if (!mqttClient.connect(broker, port)) {
103    Serial.print("MQTT connection failed! Error code = ");
104    Serial.println(mqttClient.connectError());
105
106    while (1)
107      ;
108  }
109
110  Serial.println("You're connected to the MQTT broker!");
111  Serial.println();
112
113  // set the message receive callback
114  mqttClient.onMessage(onMqttMessage);
115
116  Serial.print("Subscribing to topic: ");
117  Serial.println(topic);
118  Serial.println();
119
120  // subscribe to a topic
121  mqttClient.subscribe(topic);
122
123  // topics can be unsubscribed using:
124  // mqttClient.unsubscribe(topic);
125
126  Serial.print("Waiting for messages on topic: ");
127  Serial.println(topic);
128  Serial.println();
129
130  FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);  // Initialize LEDs
131}
132
133void loop() {
134
135  // call poll() regularly to allow the library to receive MQTT messages and
136  // send MQTT keep alives which avoids being disconnected by the broker
137  mqttClient.poll();
138
139  // Add a delay to avoid constant pinging
140  delay(5000);
141}
142
143void printWifiData() {
144  // print your board's IP address:
145  IPAddress ip = WiFi.localIP();
146  Serial.print("IP Address: ");
147
148  Serial.println(ip);
149
150  // print your MAC address:
151  byte mac[6];
152  WiFi.macAddress(mac);
153  Serial.print("MAC address: ");
154  printMacAddress(mac);
155}
156
157void printCurrentNet() {
158  // print the SSID of the network you're attached to:
159  Serial.print("SSID: ");
160  Serial.println(WiFi.SSID());
161
162  // print the MAC address of the router you're attached to:
163  byte bssid[6];
164  WiFi.BSSID(bssid);
165  Serial.print("BSSID: ");
166  printMacAddress(bssid);
167
168  // print the received signal strength:
169  long rssi = WiFi.RSSI();
170  Serial.print("signal strength (RSSI):");
171  Serial.println(rssi);
172
173  // print the encryption type:
174  byte encryption = WiFi.encryptionType();
175  Serial.print("Encryption Type:");
176  Serial.println(encryption, HEX);
177  Serial.println();
178}
179
180void printMacAddress(byte mac[]) {
181  for (int i = 5; i >= 0; i--) {
182    if (mac[i] < 16) {
183      Serial.print("0");
184    }
185    Serial.print(mac[i], HEX);
186    if (i > 0) {
187      Serial.print(":");
188    }
189  }
190  Serial.println();
191}
192
193
194void onMqttMessage(int messageSize) {
195  // we received a message, print out the topic and contents
196  Serial.print("Received a message with topic '");
197  Serial.print(mqttClient.messageTopic());
198  Serial.println("'");
199  Serial.print("Message length: ");
200  Serial.print(messageSize);
201  Serial.println(" bytes:");
202
203  // Read the message contents into a String
204  String message = mqttClient.readString();
205
206  // Convert the received message and comparison strings to lowercase
207  message.toLowerCase();
208
209  // If a message is received on the topic, you will check this message.
210  // Changes the output state according to the message
211  if (String(topic) == "cheerlights") {
212    Serial.print("Changing color to ");
213    Serial.println(message);
214    setColor(message);
215  }
216}
217
218void setColor(String color) {
219  // Loop through the list of colors to find the matching color
220  for (int colorIndex = 0; colorIndex < 12; colorIndex++) {
221    if (color == colorName[colorIndex]) {
222      // Set the color of each NeoPixel on the strip
223      for (int pixel = 0; pixel < NUM_LEDS; pixel++) {
224        leds[pixel] = CRGB(colorRGB[colorIndex][0], colorRGB[colorIndex][1], colorRGB[colorIndex][2]);
225      }
226      FastLED.show();
227    }
228  }
229}

Steuern Sie globale @CheerLights-Geräte

  1. Treten Sie dem Discord-Server bei und nutzen Sie den CheerLights-Bot, um die Farbe einzustellen. Geben Sie einfach /cheerlights in einem der Kanäle des CheerLights Discord Servers ein, um den Bot zu aktivieren.

    ../_images/05_iot_cheerlights_1.png
  2. Folgen Sie den Anweisungen des Bots, um die Farbe festzulegen. Dadurch können Sie CheerLights-Geräte weltweit steuern.

    ../_images/05_iot_cheerlights_2.png

Wie funktioniert des?

Hier sind die Hauptteile des Codes und Erklärungen ihrer Funktionen:

  1. Einbinden der erforderlichen Bibliotheken:

    • WiFiS3.h: Wird verwendet, um Wi-Fi-Verbindungen zu handhaben.

    • ArduinoMqttClient.h: Wird verwendet, um MQTT-Verbindungen zu handhaben.

    • FastLED.h: Wird verwendet, um NeoPixel LED-Streifen zu steuern.

  2. Definition einiger Konstanten:

    • NUM_LEDS: Die Anzahl der LEDs auf dem LED-Streifen.

    • DATA_PIN: Der Datenpin, der mit Arduino verbunden ist, um den LED-Streifen zu steuern.

    • arduino_secrets.h: Header-Datei, die den Namen und das Passwort des Wi-Fi-Netzwerks enthält, um sensible Informationen zu schützen.

    • broker: Adresse des MQTT-Servers.

    • port: Port des MQTT-Servers.

    • topic: Das zu abonnierende MQTT-Thema.

  3. Definition einiger globaler Variablen:

    • CRGB leds[NUM_LEDS]: Ein Array, um LED-Farbdaten zu speichern.

    • colorName: Ein Array von Farbnamen, die vom CheerLights-Projekt unterstützt werden.

    • colorRGB: Ein Array von RGB-Farbcodes, die den Farbnamen entsprechen.

  4. setup() Funktion:

    • Initialisieren der seriellen Kommunikation.

    • Überprüfen, ob das Wi-Fi-Modul vorhanden ist und dessen Firmware-Version ausgeben.

    • Versuchen, eine Verbindung zum Wi-Fi-Netzwerk herzustellen; falls es fehlschlägt, 10 Sekunden warten und erneut versuchen.

    • Nach erfolgreicher Verbindung, Verbindung zum MQTT-Broker (Server) herstellen und das angegebene Thema abonnieren.

    • Den NeoPixel LED-Streifen initialisieren.

  5. loop() Funktion:

    • Periodisch die Funktion mqttClient.poll() aufrufen, um MQTT-Nachrichten zu empfangen und MQTT-Keep-Alive-Signale zu senden.

    • Eine 5-Sekunden-Verzögerung hinzufügen, um eine kontinuierliche Verbindung zu vermeiden.

  6. Die Funktionen printWifiData() und printCurrentNet() werden verwendet, um Wi-Fi-Netzwerk- und Verbindungsinformationen auszugeben.

  7. Die Funktion printMacAddress() wird verwendet, um die MAC-Adresse im Hexadezimalformat auszudrucken.

  8. Die Funktion onMqttMessage() ist eine Rückruffunktion, die ausgelöst wird, wenn eine MQTT-Nachricht empfangen wird. Sie gibt das empfangene Thema und den Nachrichteninhalt aus und konvertiert den Nachrichteninhalt in Kleinbuchstaben. Wenn das Thema „cheerlights“ ist, ruft sie die Funktion setColor() auf, um die Farbe des LED-Streifens festzulegen.

  9. Die Funktion setColor() nimmt einen Farbnamen als Parameter und sucht nach einer passenden Farbe im Array colorName. Wenn eine passende Farbe gefunden wird, setzt sie die Farbe des LED-Streifens auf den entsprechenden RGB-Wert und aktualisiert die Farbe des LED-Streifens mit der Funktion FastLED.show().