从 Arduino Uno 切换到 NodeMCU esp8266 的 LED 灯条颜色更改代码不起作用
Posted
技术标签:
【中文标题】从 Arduino Uno 切换到 NodeMCU esp8266 的 LED 灯条颜色更改代码不起作用【英文标题】:Code to change color on led strip not working switching from Arduino Uno to NodeMCU esp8266 【发布时间】:2018-06-29 17:41:47 【问题描述】:我编写了代码来根据我设置的值切换 LED 灯条上的颜色(代码如下)。
当我尝试在 NodeMCU ESP8266 上加载相同的代码时,此代码不再起作用。我使用了库 Adafruit Neopixel,我认为上面提到的板子支持它。
非常欢迎任何帮助和/或建议。
#include <Adafruit_NeoPixel.h>
//#define ATTINY
#define DIMCOLORE 3
#define NUMCOLORI (sizeof(colori) / ((DIMCOLORE)*sizeof(byte)))
#define DELTRANSIZIONE (tempoTransizione) / (numOfPixels)
#define SPENTO 0
#define ROSSO 1
#define VERDE 2
#define BLU 3
#define GIALLO 4
#define CIANO 5
#define MAGENTA 6
#define BIANCO 7
#define CELESTINO 8
const byte pinLuci = 4;
const byte numOfPixels = 51;
const int tresh_1 = 10; // white
const int tresh_2 = 20; // blue
const int tresh_3 = 30; // yellow
const int tresh_4 = 40; // red
const unsigned long tempoCritico = 5000;
const unsigned long tempoLampeggio = 300;
const unsigned long tempoTransizione = 270;
byte colori[][DIMCOLORE] =
0, 0, 0, // 0 OF
255, 0, 0, // 1 ROSSO
0, 255, 0, // 2 VERDE
0, 0, 255, // 3 BLU
255, 130, 0, // 4 GIALLO
0, 255, 255, // 5 CIANO
255, 0, 255, // 6 MAGENTA
255, 130, 50, // 7 BIANCO
;
unsigned long inizioAlto = 0;
byte colore = BIANCO;
byte ultimoColore = colore;
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(numOfPixels, pinLuci, NEO_GRB + NEO_KHZ800);
void impostaColore(byte indiceColore)
for (byte i = 0; i < numOfPixels; i++) pixels.setPixelColor(i, pixels.Color(colori[indiceColore][0], colori[indiceColore][1], colori[indiceColore][2]));
pixels.show();
void impostaColore(byte valR, byte valG, byte valB)
for (byte i = 0; i < numOfPixels; i++) pixels.setPixelColor(i, pixels.Color(valR, valG, valB));
pixels.show();
void impostaSequenza(byte indiceColore)
for (byte i = 0; i < numOfPixels; i++)
pixels.setPixelColor(i, pixels.Color(colori[indiceColore][0], colori[indiceColore][1], colori[indiceColore][2]));
pixels.show();
delay(DELTRANSIZIONE);
void impostaSequenza(byte valR, byte valG, byte valB)
for (byte i = 0; i < numOfPixels ; i++)
pixels.setPixelColor(i, pixels.Color(valR, valG, valB));
pixels.show();
delay(DELTRANSIZIONE);
void lampeggia(byte indiceColore, byte volte, unsigned long tempoLamp)
for (byte i = 0 ; i < volte ; i++)
impostaColore(0);
delay(tempoLamp);
impostaColore(indiceColore);
delay(tempoLamp);
void setup()
#ifndef ATTINY
Serial.begin(115200);
#endif
pixels.begin();
for (byte i = 0; i < 54; i++)
pixels.setPixelColor(i, pixels.Color(colori[2][0], colori[2][1], colori[2][2]));
pixels.show();
for (byte j = 0 ; j <= NUMCOLORI ; j++)
impostaColore(j);
delay(50);
impostaColore(BIANCO);
void loop()
int value = 5;
#ifndef ATTINY
Serial.print(millis());
Serial.print('\t');
Serial.print(value);
#endif
if (value < tresh_1)
#ifndef ATTINY
Serial.print(" 0 ");
#endif
inizioAlto = 0;
colore = BIANCO;
else if ((value >= tresh_1) && (value < tresh_2) && (value < tresh_3) && (value < tresh_4))
#ifndef ATTINY
Serial.print(" BASSA ");
#endif
inizioAlto = 0;
colore = BLU;
else if ((value >= tresh_2) && (value < tresh_3) && (value < tresh_4))
#ifndef ATTINY
Serial.print(" MEDIA ");
#endif
inizioAlto = 0;
colore = GIALLO;
else if ((value >= tresh_3) && (value < tresh_4))
#ifndef ATTINY
Serial.print(" ALTA ");
#endif
inizioAlto = 0;
colore = ROSSO;
else if (value >= tresh_4)
#ifndef ATTINY
Serial.print(" MAX ");
#endif
if (inizioAlto == 0)
#ifndef ATTINY
Serial.print(" ----- ");
#endif
inizioAlto = millis();
colore = ROSSO;
else if ((millis() - inizioAlto) > tempoCritico)
#ifndef ATTINY
Serial.print(" +++++ ");
#endif
lampeggia(ROSSO, 1, tempoLampeggio / 2);
if (colore != ultimoColore)
impostaSequenza(colore);
ultimoColore = colore;
#ifndef ATTINY
Serial.println();
#endif
delay(tempoLampeggio / 2);
我更改它的唯一行是关于引脚名称:
const byte pinLuci = D5;
我附上了一些关于我所做的硬件连接的照片,也许问题可能就在那里。
我想明确一点,使用 Arduino Uno 一切正常。
【问题讨论】:
如果您向我们展示正常工作的接线,您希望我们如何查看您可能有故障的接线? ESP8266 是 3.3 V 设备,而 ws2812 LED 是 5 V 设备。不能 100% 保证它会起作用。有一些解决方法,但这不是一个编程解决方案,在这里是题外话。接线问题也一样。 我投票决定将此问题作为题外话结束,因为就 Stack Overflow 而言它是题外话:***.com/help/on-topic 我使用 voltmetro 测试了电压较低的硬件。那么3.3 V si就没有问题了。我分享了 ma 问题,因为我认为它不是硬件相关问题。 @marcel 【参考方案1】:如果错误是我没有编译然后从控制台发布错误。
否则,这就是您使用的错误引脚。 管脚号和GPIO号不一样。
如果你想使用 GPIO04,你应该在你的草图中使用引脚 D2。看下面的管脚映射
static const uint8_t D0 = 16;
static const uint8_t D1 = 5;
static const uint8_t D2 = 4;
static const uint8_t D3 = 0;
static const uint8_t D4 = 2;
static const uint8_t D5 = 14;
static const uint8_t D6 = 12;
static const uint8_t D7 = 13;
static const uint8_t D8 = 15;
static const uint8_t D9 = 3;
static const uint8_t D10 = 1;
【讨论】:
我之前发布的代码可以编译。我现在将 pin 声明与您展示给我的表格一起使用。所以我使用了:''static const uint8_t D5 = 14;'' 现在我得到编译错误。 amperometroNeopixel_DG:19:错误:重新定义 'const uint8_t D5' static const uint8_t D5 = 14; C:\Users\User\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.1\variants\nodemcu/pins_arduino.h:42:22: 错误:'const uint8_t D5' 之前在这里定义的 static const uint8_t D5 = 14; ^ 退出状态 1 重新定义 'const uint8_t D5' 显然,表格转换似乎已经定义。所以我处理了声明行,并在需要的地方简单地使用了“D5”这个词。现在它编译了,但 它仍然没有点亮带状 LED。以上是关于从 Arduino Uno 切换到 NodeMCU esp8266 的 LED 灯条颜色更改代码不起作用的主要内容,如果未能解决你的问题,请参考以下文章
arduino UNO r3和arduino mega2560 用esp8266 01的WiFi模块可以接入百度天工物联网平台吗?