首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当寻址超过7个LED条时,Adafruit NeoPixel库无法工作

当寻址超过7个LED条时,Adafruit NeoPixel库无法工作
EN

Stack Overflow用户
提问于 2019-05-30 01:10:24
回答 1查看 500关注 0票数 0

在最后一个问题上,我正在开发一个由Arduino Mega控制的交互式14x14LED表(有关设置和代码的更多信息,请看这里。修正了数据以错误的顺序到达Arduino的问题后,我现在面临着这个问题:

为了控制LED表上每个像素的颜色,使用Adafruit的NeoPixel库,我在表单int143的数组中读取。这现在工作很好,但当我试图设置RGB值超过7个LED条与相应的数据,什么都没有发生。我也有几个Serial.println()调用来检查读取什么数据,如果我运行超过7个LED条,0就会被打印出来,以确定每一个可能的值。

控制LED的基本功能是完美的-我也可以处理和输出上述数据正确的LED条,只要我不使用超过7条。问题是,如果我在一个数组中声明多于这7条条带,或者将它们分开,这并不重要。另外,单独初始化它们不像创建条带的一个实例那样有效,每次我想使用不同的条带时都会重新分配引脚。

我的代码现在看起来是这样的,我完全不知道造成这个问题的原因是什么,或者我如何解决这个问题。

代码语言:javascript
复制
#include <ArduinoJson.h>
#include <Adafruit_NeoPixel.h>

#ifdef __AVR__
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif

#define PINROW0 0
#define PINROW1 1
#define PINROW2 2
#define PINROW3 3
#define PINROW4 4
#define PINROW5 5
#define PINROW6 6
#define PINROW7 7
#define PINROW8 8
#define PINROW9 26
#define PINROW10 28
#define PINROW11 30
#define PINROW12 32
#define PINROW13 34

#define NUMPIXELS 14 //Anzahl der Pixel pro Reihe

/*Adafruit_NeoPixel row0 = Adafruit_NeoPixel(NUMPIXELS, PINROW0, NEO_GRB + NEO_KHZ800);
  Adafruit_NeoPixel row1 = Adafruit_NeoPixel(NUMPIXELS, PINROW1, NEO_GRB + NEO_KHZ800);
  Adafruit_NeoPixel row2 = Adafruit_NeoPixel(NUMPIXELS, PINROW2, NEO_GRB + NEO_KHZ800);
  Adafruit_NeoPixel row3 = Adafruit_NeoPixel(NUMPIXELS, PINROW3, NEO_GRB + NEO_KHZ800);
  Adafruit_NeoPixel row4 = Adafruit_NeoPixel(NUMPIXELS, PINROW4, NEO_GRB + NEO_KHZ800);
  Adafruit_NeoPixel row5 = Adafruit_NeoPixel(NUMPIXELS, PINROW5, NEO_GRB + NEO_KHZ800);
  Adafruit_NeoPixel row6 = Adafruit_NeoPixel(NUMPIXELS, PINROW6, NEO_GRB + NEO_KHZ800);
  Adafruit_NeoPixel row7 = Adafruit_NeoPixel(NUMPIXELS, PINROW7, NEO_GRB + NEO_KHZ800);
  Adafruit_NeoPixel row8 = Adafruit_NeoPixel(NUMPIXELS, PINROW8, NEO_GRB + NEO_KHZ800);
  Adafruit_NeoPixel row9 = Adafruit_NeoPixel(NUMPIXELS, PINROW9, NEO_GRB + NEO_KHZ800);
  Adafruit_NeoPixel row10 = Adafruit_NeoPixel(NUMPIXELS, PINROW10, NEO_GRB + NEO_KHZ800);
  Adafruit_NeoPixel row11 = Adafruit_NeoPixel(NUMPIXELS, PINROW11, NEO_GRB + NEO_KHZ800);
  Adafruit_NeoPixel row12 = Adafruit_NeoPixel(NUMPIXELS, PINROW12, NEO_GRB + NEO_KHZ800);
  Adafruit_NeoPixel row13 = Adafruit_NeoPixel(NUMPIXELS, PINROW13, NEO_GRB + NEO_KHZ800);
*/

//Adafruit_NeoPixel currentStrip = Adafruit_NeoPixel(NUMPIXELS, pins[0], NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel row[] = { //Initialisieren des Arrays, das die addressierbaren LED Streifen im Adafruit Format enthält
  Adafruit_NeoPixel(NUMPIXELS, PINROW0, NEO_GRB + NEO_KHZ800),
  Adafruit_NeoPixel(NUMPIXELS, PINROW1, NEO_GRB + NEO_KHZ800),
  Adafruit_NeoPixel(NUMPIXELS, PINROW2, NEO_GRB + NEO_KHZ800),
  Adafruit_NeoPixel(NUMPIXELS, PINROW3, NEO_GRB + NEO_KHZ800),
  Adafruit_NeoPixel(NUMPIXELS, PINROW4, NEO_GRB + NEO_KHZ800),
  Adafruit_NeoPixel(NUMPIXELS, PINROW5, NEO_GRB + NEO_KHZ800),
  Adafruit_NeoPixel(NUMPIXELS, PINROW6, NEO_GRB + NEO_KHZ800),
  Adafruit_NeoPixel(NUMPIXELS, PINROW7, NEO_GRB + NEO_KHZ800),
  Adafruit_NeoPixel(NUMPIXELS, PINROW8, NEO_GRB + NEO_KHZ800)/*,
  Adafruit_NeoPixel(NUMPIXELS, PINROW9, NEO_GRB + NEO_KHZ800),
  Adafruit_NeoPixel(NUMPIXELS, PINROW10, NEO_GRB + NEO_KHZ800),
  Adafruit_NeoPixel(NUMPIXELS, PINROW11, NEO_GRB + NEO_KHZ800),
  Adafruit_NeoPixel(NUMPIXELS, PINROW12, NEO_GRB + NEO_KHZ800),
  Adafruit_NeoPixel(NUMPIXELS, PINROW13, NEO_GRB + NEO_KHZ800)*/
};


#define DELAY 1000 //Refresh Zyklus auf 10 Millisekunden setzen
#define NUMSTRIPS 9/*(sizeof(row)/sizeof(row[0]))*/ //Anzahl der verbundenen LED Streifen definieren


int values[14][14][3];
String matrixAsString = "";

void setup() {

#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
  clock_prescale_set(clock_div_1);
#endif

  /*Seriellen Port über den der Pi sich mit dem Arduino verbindet einrichten*/
  Serial.begin(115200); //setzen der Bitrate auf 115200 Bit pro Sekunde
  Serial.setTimeout(100000);

  /*NeoPixel Library initialisieren*/
  for (int i = 0; i < NUMSTRIPS; i++) {
    row[i].begin();
    row[i].show();
  }
}

void process(String matrixAsString) {
  DynamicJsonDocument doc(4372);
  Serial.println(matrixAsString);
  deserializeJson(doc, matrixAsString);

  Serial.println((int)(doc[2][10][0]));
  Serial.println((int)(doc[2][10][0]));
  Serial.println((int)(doc[5][10][0]));
  Serial.println((int)(doc[0][1][2]));
  Serial.println((int)(doc[0][0][1]));

  for (int i = 0; i < NUMSTRIPS; i++) {
    for (int j = 0; j < NUMPIXELS; j++) {
      for (int k = 0; k < 3; k++) {
        values[i][j][k] = (int)(doc[i][j][k]);
      }
    }
  }
}

void paint() {
  int r = 0;
  int g = 0;
  int b = 0;
  for (int i = 0; i < NUMSTRIPS; i++) {
    for (int j = 0; j < NUMPIXELS; j++) {
      r = values[i][j][0];
      g = values[i][j][1];
      b = values[i][j][2];
      row[i].setPixelColor(j, row[i].Color(r, g, b));
      row[i].show();
    }
  }
}

//infinite loop refreshing the matrix
void loop() {

  while (Serial.available()) {
    char c = Serial.read();
    matrixAsString += c;
    if (c == '\n') {
      process(matrixAsString);
      paint();
      matrixAsString = "";
    }

  }

}

作为正式的Adafruit文档,这个库被设计成有与Arduino所能支持的一样多的条连接,所以必须有一个解决方案。

为了测试我的代码,我使用了这个数据,它是随机生成的14x14RGB矩阵的字符串表示:

[[0,0,0,1,0,0,1,1,0,2,1,0,2,2,0,3,2,0,3,3,0,3,3,1,3,3,2,3,3,3,4,3,3,4,4,3,5,4,3,5,4,4],[6,4,4,7,4,4,7,5,4,7,6,4,7,7,4,7,7,5,7,7,6,7,7,7,7,7,8,8,7,8,8,8,8,8,9,8,8,10,8,8,11,8],[8,11,9,8,11,10,9,11,10,9,11,11,9,12,11,9,12,12,9,13,12,10,13,12,10,13,13,10,13,14,10,13,15,11,13,15,11,14,15,11,15,15],[12,15,15,12,15,16,12,15,17,13,15,17,13,16,17,13,16,18,14,16,18,14,17,18,15,17,18,15,17,19,15,18,19,15,18,20,15,19,20,15,19,21],[15,20,21,15,21,21,16,21,21,17,21,21,17,22,21,18,22,21,19,22,21,19,23,21,20,23,21,20,23,22,20,23,23,20,24,23,20,25,23,20,26,23],[21,26,23,22,26,23,22,27,23,23,27,23,23,27,24,24,27,24,24,27,25,24,28,25,24,28,26,24,29,26,24,29,27,24,29,28,24,30,28,25,30,28],[25,30,29,25,31,29,25,31,30,26,31,30,27,31,30,27,32,30,27,32,31,27,33,31,27,34,31,27,35,31,27,35,32,28,35,32,28,36,32,29,36,32],[29,37,32,29,37,33,29,38,33,29,38,34,30,38,34,31,38,34,32,38,34,33,38,34,33,39,34,33,39,35,33,39,36,33,40,36,33,40,37,33,41,37],[33,42,37,33,42,38,33,42,39,33,42,40,33,43,40,33,43,41,33,43,42,33,44,42,33,45,42,33,45,43,33,46,43,34,46,43,34,47,43,35,47,43],[36,47,43,37,47,43,38,47,43,38,47,44,39,47,44,39,47,45,39,48,45,40,48,45,40,48,46,40,49,46,41,49,46,41,50,46,41,51,46,41,51,47],[42,51,47,42,51,48,43,51,48,43,51,49,43,52,49,43,53,49,43,54,49,43,54,50,44,54,50,44,55,50,45,55,50,45,55,51,46,55,51,47,55,51],[48,55,51,48,56,51,48,57,51,48,58,51,48,58,52,48,58,53,48,59,53,48,59,54,48,60,54,48,60,55,48,60,56,48,60,57,49,60,57,49,61,57],[49,62,57,49,62,58,49,63,58,49,63,59,50,63,59,50,64,59,50,65,59,51,65,59,52,65,59,53,65,59,54,65,59,54,66,59,54,66,60,54,67,60],[55,67,60,56,67,60,57,67,60,58,67,60,59,67,60,59,67,61,59,68,61,59,69,61,60,69,61,61,69,61,61,69,62,61,69,63,61,70,63,61,71,63]]

谢谢您的帮助,我非常感谢您提供的任何建议或建议。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-31 19:06:37

您只有8kB的ram,您正在使用:

  • 这个数组上的int values[14][14][3]; => 1176字节(如果要使用字节/uint8 8_t而不是int,而不是一半)
  • 该死的String matrixAsString = "";+=操作符。这会严重扰乱内存(就内存碎片而言)。
  • DynamicJsonDocument doc(4372);分配另一个巨大的内存
  • 更别提了,每个条子都有自己的像素内存,所以values阵列有点多余
  • 也许可以使用相同的缓冲区来读取和json解析器?可能会省下很多钱

因此,根据这一点,你必须失去记忆

无论如何,我会使用一些像样的ARM和DMA魔法(例如,在STM32 MCU上同时使用16个通道),而不用太多的CPU交互来发送它。或者像OctoWS2811发光二极管库这样的现有解决方案

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56370401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档