【问题标题】:Code to change color on led strip not working switching from Arduino Uno to NodeMCU esp8266从 Arduino Uno 切换到 NodeMCU esp8266 的 LED 灯条颜色更改代码不起作用
【发布时间】: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 而言它是题外话:stackoverflow.com/help/on-topic
  • 我使用 voltmetro 测试了电压较低的硬件。那么3.3 V si就没有问题了。我分享了 ma 问题,因为我认为它不是硬件相关问题。 @marcel

标签: arduino esp8266 nodemcu arduino-esp8266 neopixel


【解决方案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
猜你喜欢
  • 2020-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
  • 2021-05-25
  • 2019-10-20
相关资源
最近更新 更多