首页 > 解决方案 > Arduino 上的 Blynk 项目在使用 NeoPixel 启动剧院彩虹追逐动画时断开连接

问题描述

我正在尝试在 D1 Mini 上使用 Blynk 创建一个简单的项目,我可以随时选择任何动画,除非我使用 Blynk 应用程序停止该动画,否则它应该播放。虽然其他所有功能都可以完美地运行,但我无法弄清楚我的剧院Chaserainbow功能上有什么问题,但是在选中时,我的D1被断开并再次连接。这是代码。

我从各个论坛了解到,我必须改用 blynk.timer 并在设置中设置超过 1000L 的计数。但这对于这个特殊的剧院追逐彩虹功能也无济于事。所有其他功能完美运行。任何帮助将不胜感激。

#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <Adafruit_NeoPixel.h>
#include <wifi_credentials.h>

#define BLYNK_PRINT Serial
#define myPixelPin D2
#define myPixels 16

char auth[] = "xxxxxxxmy_authxxxxxx";

int select;

BlynkTimer timer;

// Instatiate the NeoPixel from the ibrary
Adafruit_NeoPixel strip = Adafruit_NeoPixel(myPixels, myPixelPin, NEO_GRB + NEO_KHZ800);

// Timer to repeat animations
void myTimerEvent() {
  if (select == 1) {
    allOff();
  } else if (select == 12) {
    theaterChaseRainbow(50);
  }
}

// NeoPixel all off Switch
BLYNK_WRITE(V0) {
  int pinValue = param.asInt();
  select = 1;
}

// Menu based Animation Selection
BLYNK_WRITE(V1) {
  int pinValue = param.asInt();
  switch (pinValue) {
    case 1: // Item 1
      select = 11;
      break;
    case 2: // Item 2
      select = 12;
      break;
  }
}

void setup()
{
  Serial.begin(9600);
  Blynk.begin(auth, ssid, pass);
  strip.begin();
  strip.show();
  timer.setInterval(1000L, myTimerEvent);
}

void loop() {
  Blynk.run();
  timer.run(); // Initiates BlynkTimer;
}

// Theatre Chase Rainbow
//*****************************************************************************
void theaterChaseRainbow(uint8_t wait) {
  for (int j=0; j < 256; j++) {     // cycle all 256 colors in the wheel
    for (int q=0; q < 3; q++) {
        for (int i=0; i < strip.numPixels(); i=i+3) {
          strip.setPixelColor(i+q, Wheel( (i+j) % 255));    //turn every third pixel on
        }
        strip.show();
        delay(wait);
        for (int i=0; i < strip.numPixels(); i=i+3) {
          strip.setPixelColor(i+q, 0);        //turn every third pixel off
        }
    }
  }
}

//  Clear Program
//*****************************************************************************
void allOff() {
  for ( int i = 0; i < strip.numPixels(); i++ ) {
    strip.setPixelColor(i, 0, 0, 0 );
  }
  strip.show();
}

// Default Wheel defination
//*****************************************************************************
uint32_t Wheel(byte WheelPos) {
  if (WheelPos < 85) {
    return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  } else if (WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  } else {
    WheelPos -= 170;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
}

标签: c++arduinoneopixel

解决方案


推荐阅读