Co je Unit Puzzle?
Nedávno společnost M5Stack představila nový produkt nazvaný Unit Puzzle. Unit Puzzle je jednotka pro ovládání vícebarevného světla, která se skládá z 8x8 RGB pole tvořeného 64 WS2812E RGB LED diodami.
Poprvé jsem to viděl na takovéto výstavě MakerFaire:

To mě těší, víš, že máme LED moc rádi, takže jsem hned pořídil 10 kusů puzzle. Pojďme se pobavit.
Zapojení hardwaru
O mikrokontroléru, víte, který je můj oblíbený. Přesně tak, M5Stack ATOM Lite.
A jednotka obsahovala jednotkovou hádanku, konektor, Grove kabel. To znamená, že můžeme všechny jednotky spojit dohromady.


Část kódu
První verze
//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)); // Nastaví pixel na určené pozici na červenou
      }
    }
  }
  pixely.zobrazit();
Adafruit_NeoPixel pixely(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
První představení
Velmi dokonalý displej, ale každý pixel je zhasnutý. Příliš divné, měl by být použit pro polohování. Nevadí, vypneme ho.

Druhá verze
// 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));
Druhá show
Krásný

Jiná verze
  // 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
  };

Shrnutí
Unit Puzzle je zábavná neopixel LED matice. Dělá mě šťastným celý den.
Máte nějaké další zábavné způsoby hraní? Podělme se o ně společně.
