首页 > 解决方案 > 从 Arduino Uno 切换到 NodeMCU esp8266 的 LED 灯条颜色更改代码不起作用

问题描述

我编写了代码来根据我设置的值切换 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 一切正常。

标签: arduinoesp8266nodemcuarduino-esp8266neopixel

解决方案


如果错误是我没有编译,那么从控制台发布错误。

否则,您使用的是错误的引脚。引脚号和 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;

推荐阅读