首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NeoPixel阵列让我的ESP32重启!为什么?

NeoPixel阵列让我的ESP32重启!为什么?
EN

Stack Overflow用户
提问于 2021-10-10 17:23:29
回答 1查看 51关注 0票数 2

我正在尝试用一个由5个对象组成的数组替换5个"Adafruit_NeoPixel“对象。换句话说,就是转换成这个:

代码语言:javascript
复制
Adafruit_NeoPixel strips_0 (LED_COUNT, LED_PIN_0, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel strips_1 (LED_COUNT, LED_PIN_1, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel strips_2 (LED_COUNT, LED_PIN_2, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel strips_3 (LED_COUNT, LED_PIN_3, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel strips_4 (LED_COUNT, LED_PIN_4, NEO_GRB + NEO_KHZ800);

如下所示:

代码语言:javascript
复制
Adafruit_NeoPixel strips[]
{
  (LED_COUNT, LED_PIN_0, NEO_GRB + NEO_KHZ800),
  (LED_COUNT, LED_PIN_1, NEO_GRB + NEO_KHZ800),
  (LED_COUNT, LED_PIN_2, NEO_GRB + NEO_KHZ800),
  (LED_COUNT, LED_PIN_3, NEO_GRB + NEO_KHZ800),
  (LED_COUNT, LED_PIN_4, NEO_GRB + NEO_KHZ800)
};

当然,我已经修改了:

代码语言:javascript
复制
strips_0.begin();
strips_0.show();
(...)

出自:

代码语言:javascript
复制
strips[0].begin();
strips[0].show();
(...)

(到目前为止还好吗?)

问题出现在主循环中:

我已经更换了这个(效果很好)

代码语言:javascript
复制
for(int i=0; i <60 ; i++)
{
  strips_0.setPixelColor (i,colors[0]);
  strips_0.show();

  strips_1.setPixelColor (i,colors[0]);
  strips_1.show();

  strips_2.setPixelColor (i,colors[0]);
  strips_2.show();

  strips_3.setPixelColor (i,colors[0]);
  strips_3.show();

  strips_4.setPixelColor (i,colors[0]);
  strips_4.show();

  delay(20);
  shiftFirstNumbers(1); // modifies the value of colors[0]
}

通过这个(它不再起作用):

代码语言:javascript
复制
for(int i=0; i <60 ; i++)
 {   for(int j = 0;j<=4;j++)
   {
   strips[j].setPixelColor (i,colors[0]);   strips[j].show();
   }
  delay(20);   shiftFirstNumbers(1);
 }

这将使ESP32重新启动(并重新启动)

以下是我在控制台中看到的内容

代码语言:javascript
复制
99
Guru Meditation Error: Core  1 panic'ed (InstrFetchProhibited). Exception was unhandled.
Core 1 register dump:
PC      : 0x800de840  PS      : 0x00060a30  A0      : 0x800de840  A1      : 0x3ffb1ee0  
A2      : 0x00000007  A3      : 0x00000000  A4      : 0x00000000  A5      : 0x00000000  
A6      : 0x3ff56000  A7      : 0x00000000  A8      : 0x3ffc4348  A9      : 0x3ffb1ec0  
A10     : 0x3ffbb208  A11     : 0x40085474  A12     : 0x00000006  A13     : 0x00000001  
A14     : 0x00060420  A15     : 0x00000000  SAR     : 0x0000001a  EXCCAUSE: 0x00000014  
EXCVADDR: 0x800de840  LBEG    : 0x400de7ed  LEND    : 0x400de7fe  LCOUNT  : 0x00000000  

Backtrace: 0x400de840:0x3ffb1ee0 0x400de83d:0x3ffb1f10 0x400de658:0x3ffb1f70 0x400d1d74:0x3ffb1f90 0x400e0c3d:0x3ffb1fb0 0x40089c61:0x3ffb1fd0

Rebooting...
ets Jun  8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x12 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0018,len:4
load:0x3fff001c,len:1044
load:0x40078000,len:8896
load:0x40080400,len:5828
entry 0x400806ac

(99是循环开始时的Serial.print(99) )

你知道我的代码出了什么问题吗?对不起,我是C++的新手,希望你能帮忙!

问候

EN

回答 1

Stack Overflow用户

发布于 2021-10-10 18:33:58

问得好。与C++对象混合在一起的C风格的数组非常棘手。这里使用的语法没有使用指定的三个参数调用类Adafruit_NeoPixel的构造函数:

代码语言:javascript
复制
Adafruit_NeoPixel strips[] {
  (LED_COUNT, LED_PIN_0, NEO_GRB + NEO_KHZ800),
  (LED_COUNT, LED_PIN_1, NEO_GRB + NEO_KHZ800),
  (LED_COUNT, LED_PIN_2, NEO_GRB + NEO_KHZ800),
  (LED_COUNT, LED_PIN_3, NEO_GRB + NEO_KHZ800),
  (LED_COUNT, LED_PIN_4, NEO_GRB + NEO_KHZ800)
};

创建C++对象的C数组的正确方法是这样(请注意大括号,它强制初始化和调用构造函数):

代码语言:javascript
复制
Adafruit_NeoPixel strips[] {
  {LED_COUNT, LED_PIN_0, NEO_GRB + NEO_KHZ800},
  {LED_COUNT, LED_PIN_1, NEO_GRB + NEO_KHZ800},
  {LED_COUNT, LED_PIN_2, NEO_GRB + NEO_KHZ800},
  {LED_COUNT, LED_PIN_3, NEO_GRB + NEO_KHZ800},
  {LED_COUNT, LED_PIN_4, NEO_GRB + NEO_KHZ800}
};

或者这样(显式调用构造函数):

代码语言:javascript
复制
Adafruit_NeoPixel strips[] {
  Adafruit_NeoPixel(LED_COUNT, LED_PIN_0, NEO_GRB + NEO_KHZ800),
  Adafruit_NeoPixel(LED_COUNT, LED_PIN_1, NEO_GRB + NEO_KHZ800),
  Adafruit_NeoPixel(LED_COUNT, LED_PIN_2, NEO_GRB + NEO_KHZ800),
  Adafruit_NeoPixel(LED_COUNT, LED_PIN_3, NEO_GRB + NEO_KHZ800),
  Adafruit_NeoPixel(LED_COUNT, LED_PIN_4, NEO_GRB + NEO_KHZ800)
};

如果你对问题的根源感兴趣,那就是表达式(LED_COUNT, LED_PIN_0, NEO_GRB + NEO_KHZ800)。这被视为一个逗号操作符,它按顺序计算所有逗号分隔的语句,并返回最后一个语句的值。因此,您的Adafruit_NeoPixel类是通过调用Adafruit_NeoPixel(NEO_GRB + NEO_KHZ800)来构造的,这可能会破坏它内部的一些重要内容。

考虑下面这段代码:

代码语言:javascript
复制
#include <iostream>

class Foo {
public:
    Foo(int m, int n = -1): _m(m), _n(n) {}
    int _m, _n;
};

int main() {
    Foo farr[] {
        (1, 2), 
        {3, 4}
    };
    for (int i = 0; i < 2; i++) {
        printf("%d %d\n", farr[i]._m, farr[i]._n);
    }
}

你会期望它打印出来

代码语言:javascript
复制
1 2
3 4

但它没有。相反,它会打印出来

代码语言:javascript
复制
2 -1
3 4

这是因为第一个对象实际上是用Foo(2)构造的

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

https://stackoverflow.com/questions/69517393

复制
相关文章

相似问题

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