Умный светодиод, не хочет работать переключение эффектов.

splans
splans аватар
Offline
Зарегистрирован: 06.07.2015

Доброго всем!

Умный светодиод, не хочет работать переключение эффектов. delay - все тормозит, но избавлятся от него нет желания. Пршу помочь интегрировать в код break. Все старания безуспешны, помогите пожалуйста.

#include <Adafruit_NeoPixel.h> 
Adafruit_NeoPixel leds = Adafruit_NeoPixel(8, 14, NEO_GRB + NEO_KHZ800);

int wait = 1;
int regim = 1; 
int flag = 0;

void setup() {
  leds.begin();                       
  leds.setPixelColor(0, leds.Color(0, 0, 0));  
  leds.show();                       
  delay(500);
  
}
void loop() {
  if(digitalRead(7)==HIGH&&flag==0)
     { 
       regim++;   
       flag=1; 
       if(regim>3)
        { 
          regim=1;
        } 
     } 
      if(digitalRead(7)==LOW&&flag==1)
     {  
        flag=0;
     } 
             
if(regim==1)//1 режим 
    { 
  for(int x=0; x<4; x++) {
  for(int y=0; y<255; y++) {
    leds.setPixelColor(x, leds.Color(0, 0, y));
    leds.setPixelColor(x+4, leds.Color(0, y, 0));
    delay(wait);
    leds.show();  
  }
  } 
for(int x=0; x<4; x++) {
  for(int y=0; y<255; y++) {
    leds.setPixelColor(x, leds.Color(0, 0, ~y));
    leds.setPixelColor(x+4, leds.Color(0, ~y, 0));
    delay(wait);
    leds.show();   
  }
  }       
  }
if(regim==2)//2 режим 
    { 
  for(int x=0; x<8; x++) { 
  for(int y=0; y<255; y++) {
    leds.setPixelColor(x, leds.Color(y, 0, 0));
    leds.show();                      
    delay(wait);    
  }
  }
  }
if(regim==3)//3 режим 
    { 
  for(int x=0; x<8; x++) { 
  for(int y=0; y<255; y++) {
    leds.setPixelColor(x, leds.Color(0, y, 0));
    leds.show();                      
    delay(wait);    
  }
  }
  }  
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

splans пишет:

Доброго всем!

 Пршу помочь интегрировать в код break. 

Не понял, в чём Вам нужна помощь. Объясните подробнее, пожалуйста.

splans
splans аватар
Offline
Зарегистрирован: 06.07.2015

кнопка плохо срабатывает пока цыкл не закончился, делей тормозит выполнение меню, кнопка подключена по всем правилам, если сократить паузу то все ок, требуется по кнопке останавливать цикл, ну как то так

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну посадите кнопку на второй или третий пин, назначьте на неё прерывание с помощью attachInterrupt, в обработчике прерывания присваивайте какой-нибудь переменной buttonPressed = true; а во все условия циклов добавьте && ! buttonPressed (например, or(int y=0; y<255 && !buttonPressed; y++)). Тогда по нажатию, Вы будете немедленно вылетать из циклов.

splans
splans аватар
Offline
Зарегистрирован: 06.07.2015

спасибо, буду ломать голову, отпишусь

splans
splans аватар
Offline
Зарегистрирован: 06.07.2015

пробую с  millis, но что то как обычно, поправьте пожалуйста, это будет елочная гирлянда с кучей эффектов, но переключение между эффектами тормозит из за delay (в прошлом коде)

#include <Adafruit_NeoPixel.h> 
Adafruit_NeoPixel leds = Adafruit_NeoPixel(8, 14, NEO_GRB + NEO_KHZ800);

int wait = 1;
int regim = 1; 
int flag = 0;
unsigned long previousMillis = 0;

void setup() {
  leds.begin();                       
  leds.setPixelColor(0, leds.Color(0, 0, 0));  
  leds.show();                       
  
}
void led() {
  if ( millis() - previousMillis > 50000)
  {
    leds.setPixelColor(0, leds.Color(1, 1, 1));
    }
    }

void loop() {
  led();

  if(digitalRead(7)==HIGH&&flag==0)
     { 
       regim++;   
       flag=1; 
       if(regim>2)
        { 
          regim=1;
        } 
     } 
      if(digitalRead(7)==LOW&&flag==1)
     {  
        flag=0;
     } 
             
if(regim==1)//1 режим
{
  for(int x=0; x<4; x++) {
  for(int y=0; y<256; y++) {
    leds.setPixelColor(x, leds.Color(0, 0, y));
    leds.setPixelColor(x+4, leds.Color(0, y, 0));
    previousMillis = millis();
    leds.show(); 
  }
  } 
  for(int x=0; x<4; x++) {
  for(int y=0; y<256; y++) {
    leds.setPixelColor(x, leds.Color(0, 0, ~y));
    leds.setPixelColor(x+4, leds.Color(0, ~y, 0));
    previousMillis = millis();
    leds.show();   
  }
  } 
  }  
if(regim==2)//2 режим 
{ 
  for(int x=0; x<4; x++) {
  for(int y=0; y<256; y++) {
    leds.setPixelColor(x, leds.Color(y, 0, 0));
    leds.setPixelColor(x+4, leds.Color(0, y, y));
    previousMillis = millis();
    leds.show();  
  }
  } 
  for(int x=0; x<4; x++) {
  for(int y=0; y<256; y++) {
    leds.setPixelColor(x, leds.Color(~y, 0, 0));
    leds.setPixelColor(x+4, leds.Color(0, ~y, ~y));
    previousMillis = millis();
    leds.show();   
  }
  }       
  }    
}

 

Logik
Offline
Зарегистрирован: 05.08.2014

Ох, шото коварное Вы задумали)))

Проще на коде первого сообщения остановится. Там делей не так уже и страшен т.к. он всего 1мсек. А это не много.

Докинте в начала каждого вложеного цикла строки 34, 42 и 53 так if(digitalRead(7)==HIGH&&flag==0) break;. Тогда будет проверятся нажатие кнопки и если она нажата, то из внутреннего цикла вывалимся сразу. После нескольких таких проходов завершится и внешний цикл, это не совсем красиво зато просто. В результате лоп перейдет к работе с кнопкой. Можна и сразу из лопа выходить, тогда if(digitalRead(7)==HIGH&&flag==0) return;