Nota

Ciao, benvenuto nella community di appassionati SunFounder Raspberry Pi & Arduino & ESP32 su Facebook! Approfondisci Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.

Perché unirti?

  • Supporto Esperto: Risolvi problemi post-vendita e sfide tecniche con l’aiuto della nostra community e del team.

  • Impara e Condividi: Scambia suggerimenti e tutorial per migliorare le tue competenze.

  • Anteprime Esclusive: Ottieni accesso anticipato a nuovi annunci di prodotti e anteprime.

  • Sconti Speciali: Approfitta di sconti esclusivi sui nostri prodotti più recenti.

  • Promozioni Festive e Giveaway: Partecipa a giveaway e promozioni festive.

👉 Pronto per esplorare e creare con noi? Clicca [Qui] e unisciti oggi!

CheerLights

CheerLights è una rete globale di luci sincronizzate che può essere controllata da chiunque. Unisciti alla comunità @CheerLights - Twitter di LED che cambiano colore, permettendo ai LED di tutto il mondo di cambiare colore simultaneamente. Posiziona i tuoi LED in un angolo del tuo ufficio per ricordarti che non sei solo.

In questo progetto utilizziamo anche MQTT, ma invece di pubblicare i nostri messaggi, ci iscriviamo al topic «cheerlights». Questo ci permette di ricevere messaggi inviati da altri al topic «cheerlights» e di utilizzare tali informazioni per cambiare il colore della nostra striscia LED di conseguenza.

Componenti Necessari

In questo progetto, abbiamo bisogno dei seguenti componenti.

È sicuramente conveniente acquistare un kit completo, ecco il link:

Nome

ARTICOLI IN QUESTO KIT

LINK

Elite Explorer Kit

300+

Elite Explorer Kit

È anche possibile acquistarli separatamente dai link sottostanti.

INTRODUZIONE AI COMPONENTI

LINK PER L’ACQUISTO

Arduino Uno R4 WiFi

-

Cavi Jumper

ACQUISTA

Striscia LED RGB WS2812 8 LEDs

ACQUISTA

Cablaggio

../_images/05_cheerlight_bb.png

Schema

../_images/05_cheerlight_schematic.png

Installa la Libreria

Per installare la libreria, utilizza il Gestore delle Librerie Arduino e cerca «ArduinoMqttClient» e «FastLED» e installale.

ArduinoMqttClient.h: Utilizzato per la comunicazione MQTT.

FastLED.h: Utilizzato per pilotare la striscia LED RGB.

Importante

Con il rilascio di FastLED 3.7.0, la libreria FastLED supporta ufficialmente Arduino UNO R4. Pertanto, non è più necessario installare manualmente la versione di sviluppo. Aggiorna o installa semplicemente la libreria FastLED utilizzando il Gestore delle Librerie Arduino.

Avvertimento

[Non aggiornato] Poiché la libreria FastLED non ha ancora rilasciato una versione che supporta ufficialmente Arduino R4, dovrai scaricare l'ultima versione di sviluppo della libreria FastLED e sovrascrivere i file esistenti della libreria FastLED. Per istruzioni dettagliate su come fare ciò, consulta la sezione Installazione Manuale. (Questa nota sarà ritirata quando la libreria FastLED rilascerà ufficialmente un aggiornamento che supporta Arduino UNO R4.)

Esegui il Codice

Nota

  • Puoi aprire il file 05_cheerlight.ino nel percorso elite-explorer-kit-main\iot_project\05_cheerlight direttamente.

  • Oppure copia questo codice nell’IDE di Arduino.

Nota

Nel codice, SSID e password sono memorizzati in arduino_secrets.h. Prima di caricare questo esempio, è necessario modificarli con le proprie credenziali WiFi. Inoltre, per motivi di sicurezza, assicurati che queste informazioni siano mantenute riservate durante la condivisione o la memorizzazione del codice.

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}

Controlla i dispositivi globali @CheerLights

  1. Unisciti al Server Discord e utilizza il bot CheerLights per impostare il colore. Digita semplicemente /cheerlights in uno dei canali sul CheerLights Discord Server per attivare il bot.

    ../_images/05_iot_cheerlights_1.png
  2. Segui le istruzioni fornite dal bot per impostare il colore. Questo ti permetterà di controllare i dispositivi CheerLights globalmente.

    ../_images/05_iot_cheerlights_2.png

Come Funziona?

Ecco le principali parti del codice e le spiegazioni delle loro funzioni:

  1. Includi le librerie necessarie:

    • WiFiS3.h: Utilizzata per gestire le connessioni Wi-Fi.

    • ArduinoMqttClient.h: Utilizzata per gestire le connessioni MQTT.

    • FastLED.h: Utilizzata per controllare le strisce LED NeoPixel.

  2. Definisci alcune costanti:

    • NUM_LEDS: Il numero di LED sulla striscia LED.

    • DATA_PIN: Il pin dati collegato ad Arduino per controllare la striscia LED.

    • arduino_secrets.h: File header contenente il nome e la password della rete Wi-Fi per proteggere le informazioni sensibili.

    • broker: Indirizzo del server MQTT.

    • port: Porta del server MQTT.

    • topic: Il topic MQTT a cui iscriversi.

  3. Definisci alcune variabili globali:

    • CRGB leds[NUM_LEDS]: Un array per memorizzare i dati del colore dei LED.

    • colorName: Un array di nomi di colori supportati dal progetto CheerLights.

    • colorRGB: Un array di codici colore RGB corrispondenti ai nomi dei colori.

  4. Funzione setup():

    • Inizializza la comunicazione seriale.

    • Verifica se il modulo Wi-Fi è presente e stampa la versione del firmware.

    • Tenta di connettersi alla rete Wi-Fi; se fallisce, attende 10 secondi e riprova.

    • Una volta connesso con successo, si connette al broker MQTT (server) e si iscrive al topic specificato.

    • Inizializza la striscia LED NeoPixel.

  5. Funzione loop():

    • Chiama periodicamente la funzione mqttClient.poll() per ricevere messaggi MQTT e inviare segnali di keep-alive MQTT.

    • Aggiungi un ritardo di 5 secondi per evitare una connessione continua.

  6. Le funzioni printWifiData() e printCurrentNet() sono utilizzate per stampare le informazioni sulla rete Wi-Fi e sulla connessione.

  7. La funzione printMacAddress() è utilizzata per stampare l’indirizzo MAC in formato esadecimale.

  8. La funzione onMqttMessage() è una funzione di callback attivata quando viene ricevuto un messaggio MQTT. Stampa il topic del messaggio ricevuto e il contenuto, convertendo il contenuto del messaggio in minuscolo. Se il topic è «cheerlights», chiama la funzione setColor() per impostare il colore della striscia LED.

9. La funzione setColor() prende un nome di colore come parametro, quindi cerca un colore corrispondente nell’array colorName. Se viene trovato un colore corrispondente, imposta il colore della striscia LED sul valore RGB corrispondente e aggiorna``` la striscia LED utilizzando la funzione FastLED.show().