- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
关于我关于 SO 的最后一个问题,我正在研究一个由 Arduino Mega 控制的交互式 14x14 LED table (有关设置和代码的更多信息,请查看 here。在解决了数据以错误的顺序到达 Arduino 的问题后,我现在面临这个问题:
为了使用 Adafruit 的 NeoPixel 库控制 LED 台上每个像素的颜色,我读取了一个 int[14][14][3] 形式的数组。这现在工作正常,但是当我尝试为超过 7 个 LED 灯带设置 RGB 值时,没有任何反应。我还有几个 Serial.println()
调用来检查读取了哪些数据,如果我运行的 LED 灯条超过 7 个,则为每个可能的值打印 0
。
控制 LED 的基本功能完美运行 - 只要我使用的灯带不超过 7 个,我也可以正确处理上述数据并将其输出到 LED 灯带。问题是,如果我在一个数组中声明多于这 7 个 strip 或拆分它们都没有关系。此外,每次我想使用不同的 strip 时,单独初始化它们也无法创建一个 strip 实例并为其重新分配引脚。
我的代码目前看起来像这样,我完全不知道这个问题可能是什么原因或我该如何解决。
#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 能够支持的 strip 数量,因此必须有一个解决方案。
为了测试我的代码,我使用了这个数据,它是随机生成的 14x14 RGB 矩阵的字符串表示形式:
[[[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]]]
预先感谢您的帮助,我非常感谢您提供的任何提示或建议。
最佳答案
你只有 8kB 的 ram 而你正在使用:
int values[14][14][3];
=> 这个数组有 1176 个字节(而不是一半,如果你使用 byte/uint8_t 而不是 int)String matrixAsString = "";
和 +=
运算符。这会严重扰乱内存(就内存碎片而言)。DynamicJsonDocument doc(4372);
分配另一个巨大的内存values
数组有点无关紧要所以根据那个,你一定是内存不足
无论如何,我会使用一些体面的 ARM 和 DMA 魔法(例如在 STM32 MCU 上同时使用 16 个 channel )而无需 CPU 的太多交互来发送它。或现有解决方案,如 OctoWS2811 LED Library
关于c++ - Adafruit NeoPixel 库在处理超过 7 个 LED 灯条时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56370401/
我无法弄清楚使用此语法初始化类实例的好处 Adafruit_8x8matrix matrix = Adafruit_8x8matrix();,而 Adafruit_8x8matrix matrix;
我正在编写读取文件并将其发送到 20x4 LCD 的代码,并且我有按钮,因此我可以在文件中上下移动 ` import math import time import linecache import
我写了一个脚本,使用 adafruit motor hat 库在接收到 433MHz ex 传输代码时控制电机!目前射程很短,但这是我项目的最佳方式! 问题是 433MHz rx/tx 库是 pyth
Adafruit_MQTT 库很棒,但我遇到了问题。我在 Arduino 中将它与 NodeMCU (ESP8266) 一起使用。示例代码一切正常。 (TLS 连接 - WiFiClientSecur
我正在使用带有 AdaFruit pn532 NFC/RFID 防护罩的 Arduino UNO。目标是有一个带假底的鞋盒。在那个假底下面是我的原型(prototype),它希望能够分辨出假底上方盒子
我正在尝试通过 3g 和 TCP 连接向服务器发送数据包。下面是我找到的 .cpp 和 .h 文件的链接: https://os.mbed.com/users/Nels885/code/Adafrui
我正在开发一个项目,需要 GPRS 连接并同时发送短信。 我正在使用 Raspberry Pi 和 adafruit fona。 我按照此 FONA Tethering to Raspberry Pi
我是 Python 新手,目前正在我的 Pi 3 mod b 上开发一个项目。我使用 Adafruit ADC1015 来转换模拟信号。但是,即使我有获取一些伏特测量值的代码,我也会收到“Attrib
我运行安装程序 from this website让我的 arduino 使用 AdaFruit LED。并运行: sudo pip3 install adafruit-circuitpython-n
我有一个 Adafruit (Gemma)/Arduino 和一个 Neopixel LED 环,我想从《魔兽世界》游戏内事件中控制它们。这部分是焊接和工作的。 问题: 有什么方法可以在魔兽世界和 P
我正在尝试将从十六进制字符串转换的字节数组写入 NTAG203 RFID 标签的内存中。我使用的是 Raspberry Pi 3、PN532 芯片和 Adafruit PN532 python lib
将 mbed 操作系统和 stm32 核板与 Adafruit Fona 3g 结合使用,我正在尝试通过 3g 连接将数据发送到服务器。我正在使用此处发布的 .cpp 文件和 .h 文件:https:
我已经成功安装了 Adafruit_Gpio 包,当我尝试运行 adafruit 提供的 bme 传感器的示例文件时,出现以下错误: Traceback (most recent call las
我正在使用 Adafruit Ft232H breakout 将 GPIO 端口添加到我的 Linux 电脑。虽然我在使用 libftdi 和 bitbang 模式闪烁 LED 灯时取得了一些成功,但
我一直在为我的 arduino ATMega2560 试验 I2C 和 mcp23017 IO 扩展器芯片,因为我宁愿使用 arduino 本身上的 IO 来做其他事情,我只是想知道如何使用 adaf
所以我试图将图像的字节数组放入外部 eeprom (c24LC16B) 并使用 Adafruit gfx 库中的 drawBitmap() 函数在 Nokia 3310 LCD(带有 Adafruit
希望你们中的任何一个能帮助我! 我正在尝试使用 Adafruit SHT31-D (一个 i2c 设备)板和我的 Pi2。我要离开 this datasheet指导我的编码工作。我正在使用 Wirin
我是 Arduino 的新手,我正在尝试使用 Adafruit Motor Shield V2.3 运行直流电机。我按照 Adafruit 网站上的说明进行操作,但是当我上传代码时我的电机没有启动。我
关于我关于 SO 的最后一个问题,我正在研究一个由 Arduino Mega 控制的交互式 14x14 LED table (有关设置和代码的更多信息,请查看 here。在解决了数据以错误的顺序到达
我正在尝试编写一个程序来在 Adafruit 60 LED 灯带上显示特定的灯光序列。目标是我将在代码中手动输入一个 DNA 序列,当程序运行时,每个碱基都会在 strip 上显示自己的颜色。这是到目
我是一名优秀的程序员,十分优秀!