Hvad er Unit Puzzle?
For nylig lancerede M5Stack et nyt produkt kaldet Unit Puzzle. Unit Puzzle er en multifarvet lysstyringsenhed bestående af et 8x8 RGB-array lavet af 64 WS2812E RGB LED'er.
Jeg så det første gang på et MakerFaire-show som dette:

Det gør mig glad, I ved, at vi kan rigtig godt lide LED, så jeg skaffede straks 10 enheder af puslespillet. Lad os have det sjovt.
Hardwareopsætning
Om mikrocontrolleren, I ved, hvad min favorit er. Det er rigtigt, M5Stack ATOM Lite.
Og enheden inkluderede en unit puzzle, en connector, et Grove-kabel. Det betyder, at vi kan samle alle enhederne.


Kode del
Første version
//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)); // Sets the pixel at the specified position to red
}
}
}
pixels.show();
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
Første visning
Meget perfekt display, men hver pixel 0 er tændt. For mærkeligt, den burde bruges til positionering. Ligegyldigt, lad os slukke den.

Anden version
// 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));
Anden visning
Smuk

Anden version
// 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
};

Resumé
Unit Puzzle er en sjov neopixel LED-matrix. Den gør mig glad hele dagen.
Har du andre sjove måder at lege på? Lad os dele det sammen.
