Che cosa è Unit Puzzle?
Recentemente, M5Stack ha lanciato un nuovo prodotto chiamato Unit Puzzle. Unit Puzzle è un'unità di controllo della luce multicolore composta da un array RGB 8x8 composto da 64 LED RGB WS2812E.
L'ho visto per la prima volta a uno spettacolo MakerFaire come questo:

Questo mi rende felice, sai che ci piacciono molto i LED, quindi ho ricevuto immediatamente un puzzle da 10 unità. Divertiamoci un po'.
Collegamento hardware
Per quanto riguarda il microcontrollore, sapete qual è il mio preferito. Esatto, M5Stack ATOM Lite.
E l'unità includeva un puzzle unitario, un connettore, un cavo Grove. Ciò significa che possiamo mettere insieme tutte le unità.


Parte del codice
Prima versione
//The unit puzzle used WS2812E, which means Adafruit_NeoPixel library is our best choice
#include
//And define part:
#define PIN 26
#define NUMPIXELS 512
//The official recommendation for long-term lighting is 10% brightness, so we use 25
#define BRIGHTNESS 25 // Brightness range(0-255)
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
//I need display letters 'OPENELAB'
int letters[8][64] = {
{30, 38, 21, 45, 20, 44, 19, 43, 18, 42, 17, 41, 24, 32}, // O
{22, 30, 38, 46, 21, 45, 20, 44, 19, 27, 35, 43, 18, 17, 16}, // P
{22, 30, 38, 46, 21, 20, 19, 27, 35, 43, 18, 17, 16, 24, 32, 40}, // E
{22, 46, 21, 45, 20, 28, 44, 19, 27, 35, 43, 18, 34, 42, 17, 41, 16, 40}, // N
{22, 30, 38, 46, 21, 20, 19, 27, 35, 43, 18, 17, 16, 24, 32, 40}, // E
{22, 21, 20, 19, 18, 17, 16, 24, 32, 40}, // L
{30, 38, 21, 45, 20, 44, 19, 27, 35, 43, 18, 42, 17, 41, 16, 40}, // A
{22, 30, 38, 21, 45, 20, 36, 19, 27, 18, 34, 17, 41, 16, 24, 32} // B
};
//Initialize the NeoPixel library, set the brightness, turn off all pixels, call the function that displays text, and then loop empty
void setup() {
pixels.begin();
pixels.setBrightness(BRIGHTNESS);
pixels.show();
displayText();
}
void loop() {
}
// Clear all lamp beads
void displayText() {
pixels.clear();
// Set the position of the lamp beads to display each character
for (int charIndex = 0; charIndex < 8; charIndex++) {
for (int i = 0; i < 64; i++) {
if (letters[charIndex][i] != -1) {
int pixelIndex = charIndex * 64 + letters[charIndex][i];
pixels.setPixelColor(pixelIndex, pixels.Color(255, 0, 0)); // Imposta il pixel nella posizione specificata su rosso
}
}
}
pixel.mostra();
Adafruit_NeoPixel pixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
Primo spettacolo
Display molto perfetto, ma ogni pixel 0 si illuminava. Troppo strano, dovrebbe essere usato per il posizionamento. Non importa, spegniamolo.

Seconda versione
// In the define section, increase the color cycle time by 0.5 seconds
#define COLOR_CHANGE_INTERVAL 500
// Define the character part to add characters to display red, green and blue in three colors
int letters[8][64] = {
{30, 38, 21, 45, 20, 44, 19, 43, 18, 42, 17, 41, 24, 32}, // O
{22, 30, 38, 46, 21, 45, 20, 44, 19, 27, 35, 43, 18, 17, 16}, // P
{22, 30, 38, 46, 21, 20, 19, 27, 35, 43, 18, 17, 16, 24, 32, 40}, // E
{22, 46, 21, 45, 20, 28, 44, 19, 27, 35, 43, 18, 34, 42, 17, 41, 16, 40}, // N
{22, 30, 38, 46, 21, 20, 19, 27, 35, 43, 18, 17, 16, 24, 32, 40}, // E
{22, 21, 20, 19, 18, 17, 16, 24, 32, 40}, // L
{30, 38, 21, 45, 20, 44, 19, 27, 35, 43, 18, 42, 17, 41, 16, 40}, // A
{22, 30, 38, 21, 45, 20, 36, 19, 27, 18, 34, 17, 41, 16, 24, 32} // B
};
unsigned long lastColorChangeTime = 0;
int currentColorIndex = 0;
uint32_t colors[3] = {pixels.Color(255, 0, 0), pixels.Color(0, 255, 0), pixels.Color(0, 0, 255)};
// Add switching colors in the loop
void loop() {
unsigned long currentTime = millis();
if (currentTime - lastColorChangeTime >= COLOR_CHANGE_INTERVAL) {
lastColorChangeTime = currentTime;
displayText();
currentColorIndex = (currentColorIndex + 1) % 3;
}
}
// Make sure the first lamp bead (pixel 0) of all matrices is off
for (int charIndex = 0; charIndex < 8; charIndex++) {
int firstPixelIndex = charIndex * 64;
if (firstPixelIndex < NUMPIXELS) {
pixels.setPixelColor(firstPixelIndex, pixels.Color(0, 0, 0));
Secondo spettacolo
Bellissimo

Altra versione
// Define the color corresponding to each character
uint32_t characterColors[8] = {
pixels.Color(255, 0, 0), // O - Red
pixels.Color(0, 255, 0), // P - Green
pixels.Color(0, 0, 255), // E - Blue
pixels.Color(255, 255, 0), // N - Yellow
pixels.Color(0, 255, 255), // E - Light blue
pixels.Color(255, 0, 255), // L - Magenta
pixels.Color(255, 128, 0), // A - Orange
pixels.Color(128, 0, 128) // B - Purple
};

Riepilogo
Unit Puzzle è una divertente matrice LED neopixel. Mi rende felice tutto il giorno.
Hai altri modi divertenti per giocare? Condividiamolo insieme.
