Код для изменения цвета на светодиодной полосе не работает переключение с Arduino Uno на NodeMCU esp8266 - PullRequest
0 голосов
/ 29 июня 2018

Я написал код для переключения цвета на светодиодной полосе в зависимости от установленного значения (код ниже).

Когда я пытался загрузить тот же код на 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 все работает нормально.

1 Ответ

0 голосов
/ 29 июня 2018

Если ошибка заключается в том, что я не компилирую, отправьте сообщение об ошибке из консоли.

В противном случае это неправильный пин-код, который вы используете. Номера выводов и номера 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;
...