Adafruit_NeoPixel 对象在数组中使用时的异常行为
Adafruit_NeoPixel objects abnormal behavior when used in an array
我在尝试找出如何遍历 Adafruit_NeoPixel 对象数组时遇到了问题。
但我终究无法弄清楚哪里出了问题。我在 google 上查找了这个问题,并通过 Ardrino 和 stack over flow 我尝试调整代码以适应我看到其他人所做的事情(例如,不是在数组中列出 adafruit_neopixles 对象,而是创建阵列中的 neopixles)让它工作,但我仍然没有运气。
所以这是一个简单的例子:这个脚本应该让前 6 个 LED 灯亮起绿色蓝色
#include <Adafruit_NeoPixel.h>
Adafruit_NeoPixel strips[] = {
Adafruit_NeoPixel(32, 5, NEO_GRB + NEO_KHZ800),
Adafruit_NeoPixel(32, 6, NEO_GRB + NEO_KHZ800),
Adafruit_NeoPixel(32, 7, NEO_GRB + NEO_KHZ800),
};
#define NUMSTRIPS (sizeof(strips)/sizeof(strips[0]))
void setup() {
//Edit2
Serial.begin(115200);
//end Edit2
for(int i=0; i<NUMSTRIPS; i++)
{
strips[i].begin();
strips[i].setBrightness(255); //adjust brightness here
/*This is code that ive added in AFTER i made the orgional post to see if it had any difference
*/
for (int j=0; j<10;j++){
strips[0].setPixelColor(j, 0,100,0);
}
/* End of edited code
*/
strips[i].show(); // Initialize all pixels to 'off'
}
//Edit2
Serial.println("Loop end");
//End Edit2
//strips[0].begin();
strips[0].setBrightness(255);
strips[0].setPixelColor(0, 0,100,255);
strips[0].setPixelColor(1, 0,100,255);
strips[0].setPixelColor(2, 0,100,255);
strips[0].setPixelColor(3, 0,100,255);
strips[0].setPixelColor(4, 0,100,255);
strips[0].setPixelColor(5, 0,100,255);
strips[0].show();
}
然而,这没有任何作用,根本没有 LED 灯亮起。 -为什么!?
然而,当我注释掉 For 循环并取消注释 strips[0].begin
时,它确实有效。
那么这是为什么呢?我有什么不明白的?
编辑:所以我尝试更改我的代码中的一些内容以测试它是否有任何影响
我加入了
for (int j=0; j<10;j++){
strips[0].setPixelColor(j, 0,100,0);
}
它在循环内工作,但现在循环后的任何东西都不再工作。
编辑 2:所以在使用串行后,我发现循环结束时设备正在崩溃。那为什么会这样呢?
编辑 3:
首先,我想对 ocrdu 说抱歉,他们试图编辑这个,但仍然没有完全正确的想法。
其次,我想说问题已经解决了一半,异常行为是由微控制器崩溃引起的,当条带被文盲通过时。至于为什么那还是我需要帮助理解的。
所以我在它崩溃之前完成了 1 个循环所以进展?我接受了 Botje 的建议,我使用 strips[i].numPixels();
而不是使用固定值
但是我决定再做一些测试,看看我是否已经解决了这个问题,而且它在测试 2 开始之前就崩溃了。这是新代码。
#include <Adafruit_NeoPixel.h>
Adafruit_NeoPixel strips[] = {
Adafruit_NeoPixel(32, 5, NEO_GRB + NEO_KHZ800),
Adafruit_NeoPixel(32, 6, NEO_GRB + NEO_KHZ800),
Adafruit_NeoPixel(32, 7, NEO_GRB + NEO_KHZ800),
};
#define NUMSTRIPS (sizeof(strips)/sizeof(strips[0]))
void setup() {
Serial.begin(115200);
Serial.println("1st Test Do a loop with out crashing over all the strips");
for(int i=0; i<NUMSTRIPS; i++)
{
strips[i].begin();
strips[i].setBrightness(255);
for (int j=0; j<strips[i].numPixels();j++){
strips[i].setPixelColor(j, 0,100,0);
Serial.println(j);
}
Serial.println("b4 show");
strips[i].show();
}
Serial.println("Loop end");
Serial.println("If you are reading this then the microcontroller did not crash on 1st Test");
delay(150);
Serial.println("2nd Test Do a loop with out crashing over 1 strip");
for (int k=0; k<strips[0].numPixels();k++)
{
strips[0].setPixelColor(k, 0,100,255);
strips[0].show();
Serial.println(k);
}
Serial.println("Loop end");
Serial.println("If you are reading this then the microcontroller did not crash the 2nd Test");
delay(150);
Serial.println("3rd Test Do a loop changing onley 6 pixles on 1 strip with out crashing");
for (int l=0; l<=5; l++)
{
strips[0].setPixelColor(l, 200,0,0);
strips[0].show();
Serial.println(l);
}
Serial.println("Loop end");
Serial.println("If you are reading this then the microcontroller did not crash the 3rd Test");
}
所以我已经通过更换 adafruit liabery 和 fastled 不再崩溃或异常行为来解决这个问题。
我在尝试找出如何遍历 Adafruit_NeoPixel 对象数组时遇到了问题。 但我终究无法弄清楚哪里出了问题。我在 google 上查找了这个问题,并通过 Ardrino 和 stack over flow 我尝试调整代码以适应我看到其他人所做的事情(例如,不是在数组中列出 adafruit_neopixles 对象,而是创建阵列中的 neopixles)让它工作,但我仍然没有运气。
所以这是一个简单的例子:这个脚本应该让前 6 个 LED 灯亮起绿色蓝色
#include <Adafruit_NeoPixel.h>
Adafruit_NeoPixel strips[] = {
Adafruit_NeoPixel(32, 5, NEO_GRB + NEO_KHZ800),
Adafruit_NeoPixel(32, 6, NEO_GRB + NEO_KHZ800),
Adafruit_NeoPixel(32, 7, NEO_GRB + NEO_KHZ800),
};
#define NUMSTRIPS (sizeof(strips)/sizeof(strips[0]))
void setup() {
//Edit2
Serial.begin(115200);
//end Edit2
for(int i=0; i<NUMSTRIPS; i++)
{
strips[i].begin();
strips[i].setBrightness(255); //adjust brightness here
/*This is code that ive added in AFTER i made the orgional post to see if it had any difference
*/
for (int j=0; j<10;j++){
strips[0].setPixelColor(j, 0,100,0);
}
/* End of edited code
*/
strips[i].show(); // Initialize all pixels to 'off'
}
//Edit2
Serial.println("Loop end");
//End Edit2
//strips[0].begin();
strips[0].setBrightness(255);
strips[0].setPixelColor(0, 0,100,255);
strips[0].setPixelColor(1, 0,100,255);
strips[0].setPixelColor(2, 0,100,255);
strips[0].setPixelColor(3, 0,100,255);
strips[0].setPixelColor(4, 0,100,255);
strips[0].setPixelColor(5, 0,100,255);
strips[0].show();
}
然而,这没有任何作用,根本没有 LED 灯亮起。 -为什么!?
然而,当我注释掉 For 循环并取消注释 strips[0].begin
时,它确实有效。
那么这是为什么呢?我有什么不明白的?
编辑:所以我尝试更改我的代码中的一些内容以测试它是否有任何影响 我加入了
for (int j=0; j<10;j++){
strips[0].setPixelColor(j, 0,100,0);
}
它在循环内工作,但现在循环后的任何东西都不再工作。
编辑 2:所以在使用串行后,我发现循环结束时设备正在崩溃。那为什么会这样呢?
编辑 3: 首先,我想对 ocrdu 说抱歉,他们试图编辑这个,但仍然没有完全正确的想法。
其次,我想说问题已经解决了一半,异常行为是由微控制器崩溃引起的,当条带被文盲通过时。至于为什么那还是我需要帮助理解的。
所以我在它崩溃之前完成了 1 个循环所以进展?我接受了 Botje 的建议,我使用 strips[i].numPixels();
而不是使用固定值
但是我决定再做一些测试,看看我是否已经解决了这个问题,而且它在测试 2 开始之前就崩溃了。这是新代码。
#include <Adafruit_NeoPixel.h>
Adafruit_NeoPixel strips[] = {
Adafruit_NeoPixel(32, 5, NEO_GRB + NEO_KHZ800),
Adafruit_NeoPixel(32, 6, NEO_GRB + NEO_KHZ800),
Adafruit_NeoPixel(32, 7, NEO_GRB + NEO_KHZ800),
};
#define NUMSTRIPS (sizeof(strips)/sizeof(strips[0]))
void setup() {
Serial.begin(115200);
Serial.println("1st Test Do a loop with out crashing over all the strips");
for(int i=0; i<NUMSTRIPS; i++)
{
strips[i].begin();
strips[i].setBrightness(255);
for (int j=0; j<strips[i].numPixels();j++){
strips[i].setPixelColor(j, 0,100,0);
Serial.println(j);
}
Serial.println("b4 show");
strips[i].show();
}
Serial.println("Loop end");
Serial.println("If you are reading this then the microcontroller did not crash on 1st Test");
delay(150);
Serial.println("2nd Test Do a loop with out crashing over 1 strip");
for (int k=0; k<strips[0].numPixels();k++)
{
strips[0].setPixelColor(k, 0,100,255);
strips[0].show();
Serial.println(k);
}
Serial.println("Loop end");
Serial.println("If you are reading this then the microcontroller did not crash the 2nd Test");
delay(150);
Serial.println("3rd Test Do a loop changing onley 6 pixles on 1 strip with out crashing");
for (int l=0; l<=5; l++)
{
strips[0].setPixelColor(l, 200,0,0);
strips[0].show();
Serial.println(l);
}
Serial.println("Loop end");
Serial.println("If you are reading this then the microcontroller did not crash the 3rd Test");
}
所以我已经通过更换 adafruit liabery 和 fastled 不再崩溃或异常行为来解决这个问题。