从 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模块可以接入百度天工物联网平台吗?

Arduino UNO + 433无线模块实例

Arduino UNO + DS1302 + TM1638时间显示+Proteus仿真二

arduinouno开发板上有几个usb接口

从0 开始 DIY你的Arduino UNO

Arduino Uno Raspberry Pi 串行通信双读数