You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现两块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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 09:05:56