如何实现两块8x8 Adafruit NeoPixel同步镜像显示相同图案?
两块8x8 Adafruit NeoPixel同步镜像显示问题解决
问题描述
我们正在尝试为两块8x8 Adafruit NeoPixel编写控制代码,但目前仅有一块能显示指定图案。我们希望另一块能镜像同步显示相同图案,但现有代码无法实现该功能。我们曾尝试让Arduino将其识别为一块128像素的网格板,但未能成功。
硬件连接

当前代码
#include <Adafruit_NeoPixel.h> #define PIN 6 // NeoPixel连接引脚 #define NUMPIXELS 128 // 两块8x8网格的总像素数 #define GRID_WIDTH 8 // 单块网格宽度 Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); // 定义颜色 uint32_t WHITE = pixels.Color(255, 255, 255); // 白色 uint32_t YELLOW = pixels.Color(255, 236, 39); // 黄色 uint32_t MUSTARD = pixels.Color(255, 163, 0); // 芥末黄 uint32_t ORANGE = pixels.Color(171, 82, 59); // 橙色 uint32_t PURPLE = pixels.Color(126, 37, 83); // 紫色 uint32_t OFF = pixels.Color(0, 0, 0); // 熄灭 // 定义8x8颜色图案 uint32_t color_pattern[8][8] = { {OFF, OFF, OFF, ORANGE, OFF, OFF, OFF, OFF}, {OFF, OFF, PURPLE, MUSTARD, PURPLE, OFF, OFF, OFF}, {OFF, PURPLE, MUSTARD, YELLOW, MUSTARD, PURPLE, OFF, OFF}, {ORANGE, MUSTARD, YELLOW, WHITE, YELLOW, MUSTARD, ORANGE, OFF}, {OFF, PURPLE, MUSTARD, YELLOW, MUSTARD, PURPLE, OFF, OFF}, {OFF, OFF, PURPLE, MUSTARD, PURPLE, OFF, OFF, OFF}, {OFF, OFF, OFF, ORANGE, OFF, OFF, OFF, OFF}, {OFF, OFF, OFF, OFF, OFF, OFF, OFF, OFF} }; int posX = 0; // 初始X偏移位置 int posY = 0; // 初始Y偏移位置 void setup() { pixels.begin(); // 初始化NeoPixel库 } void drawPattern(int offsetX, int offsetY) { pixels.clear(); for (int y = 0; y < 8; y++) { for (int x = 0; x < 8; x++) { int pos1 = (y + offsetY) * GRID_WIDTH + (x + offsetX); int pos2 = pos1 + 64; // 第二块网格从第64个像素开始 if (pos1 >= 0 && pos1 < 64) { // 确保在第一块网格范围内 pixels.setPixelColor(pos1, color_pattern[y][x]); // 设置第一块网格对应像素颜色 } if (pos2 >= 64 && pos2 < 128) { // 确保在第二块网格范围内 pixels.setPixelColor(pos2, color_pattern[y][x]); // 设置第二块网格对应像素颜色 } } } pixels.show(); } void loop() { pixels.setBrightness(40); drawPattern(posX, posY); delay(500); // 延迟以观察移动效果 // 更新偏移位置 posX += 1; // 向右移动 if (posX > GRID_WIDTH - 8) { // 到达右边缘后,向下移动并重置X posX = 0; posY += 1; } if (posY > GRID_WIDTH - 8) { // 到达底部边缘后,重置Y posY = 0; } }
问题分析与解决建议
1. 硬件连接排查
从连接图看,两块NeoPixel为串联接法(第一块OUT接第二块IN),理论上可识别为128像素单条灯带,但需确认:
- 第二块的VCC、GND是否正确接电源/Arduino,避免供电不足(单颗NeoPixel最大约60mA,128颗满亮度需7.68A,建议外接5V/2A以上电源)
- 第一块OUT到第二块IN的信号线是否接触良好
- 若仅用Arduino USB供电,大概率因电流不足导致第二块不亮
2. 代码逻辑修正
当前drawPattern函数存在两个问题:
- 位置计算逻辑错误:当
offsetX/offsetY不为0时,pos1会超出第一块网格范围,导致第二块对应像素无法正确设置 - 未实现镜像效果:当前是直接复制第一块像素,未对第二块的X坐标进行反转
修正后的drawPattern函数:
void drawPattern(int offsetX, int offsetY) { pixels.clear(); for (int y = 0; y < 8; y++) { for (int x = 0; x < 8; x++) { // 第一块网格:正常位置映射 int grid1_y = y + offsetY; int grid1_x = x + offsetX; if (grid1_y >= 0 && grid1_y < 8 && grid1_x >= 0 && grid1_x < 8) { int pos1 = grid1_y * GRID_WIDTH + grid1_x; pixels.setPixelColor(pos1, color_pattern[y][x]); } // 第二块网格:X轴反转实现镜像 int grid2_y = y + offsetY; int grid2_x = 7 - (x + offsetX); // 反转X坐标 if (grid2_y >= 0 && grid2_y < 8 && grid2_x >= 0 && grid2_x < 8) { int pos2 = 64 + grid2_y * GRID_WIDTH + grid2_x; pixels.setPixelColor(pos2, color_pattern[y][x]); } } } pixels.show(); }
3. 位置更新逻辑优化
当前loop中的位置更新条件GRID_WIDTH - 8等于0,导致图案无法正常移动,修正如下:
// 更新位置 posX += 1; if (posX > GRID_WIDTH - 1) { // X超出网格宽度时重置 posX = 0; posY += 1; } if (posY > GRID_WIDTH - 1) { // Y超出网格高度时重置 posY = 0; }
4. 备选方案
若串联接法始终有问题,可将两块NeoPixel分别连接到Arduino不同引脚,创建两个Adafruit_NeoPixel对象,分别控制实现同步镜像。
内容的提问来源于stack exchange,提问作者Sara
相关产品推荐
相关产品推荐

