Проект Blynk на Arduino отключается при запуске анимации погони за радугой в кинотеатре с помощью NeoPixel - PullRequest
0 голосов
/ 20 июня 2020

Я пытаюсь создать простой проект, используя Blynk на D1 Mini, где я могу выбрать любую анимацию в любое время, и она должна воспроизводиться, если я не остановлю это с помощью своего приложения Blynk. В то время как все остальное работает отлично, я не могу понять, что не так с моей функцией Theaterchaserainbow, которая, когда выбрана, мой 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);
  }
}
...