Помогите новечку

Tenshi26
Offline
Зарегистрирован: 31.01.2017
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif

#define LEDS_COUNT      32   // количество светодиодов WS2812
#define LED_PIN         7    // пин для подключения WS2812
#define CHANGE_TIME     10   // интервал смены эффектов, сек
#define EFFECTS_COUNT   3    // количество эффектов

Adafruit_NeoPixel strip = Adafruit_NeoPixel(LEDS_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);

byte effectNumber;         // переменная для хранения номера эффекта
unsigned long timeStamp;   // переменная для хранения времени последней смены эффекта
void setup() {
  Serial.begin(9600);
  effectNumber = 1; // задаем эффект (при включении питания)
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}
void loop(){
   Serial.print("Effect:"); Serial.println(effectNumber);
  while(millis() - timeStamp < CHANGE_TIME * 1000L) // в течение интервала
  {
    switch(effectNumber)                         // включаем заданный эффект
    {
    case 1: delay(100);Popat1(0,0,155);delay(100);Popat2(0,0,155);delay(100);Popat3(0,0,155);delay(100);Popat4(0,0,155);delay(100);Popat5(0,0,155);delay(100);Popat6(0,0,155);//синий

delay(100);Popat1(136,0,155);delay(100);Popat2(136,0,155);delay(100);Popat3(136,0,155);delay(100);Popat4(136,0,155);delay(100);Popat5(136,0,155);delay(100);Popat6(136,0,155);//фиолетовый

delay(100);Popat1(230,220,0);delay(100);Popat2(230,220,0);delay(100);Popat3(230,220,0);delay(100);Popat4(230,220,0);delay(100);Popat5(230,220,0);delay(100);Popat6(230,220,0);//желтый

delay(100);Popat1(0,230,250);delay(100);Popat2(0,230,250);delay(100);Popat3(0,230,250);delay(100);Popat4(0,230,250);delay(100);Popat5(0,230,250);delay(100);Popat6(0,230,250);//голубой
     break;
     
    case 2: delay(500);Popat1(0,0,155);delay(500);Popat2(0,0,155);delay(500);Popat3(0,0,155);delay(500);Popat4(0,0,155);delay(500);Popat5(0,0,155);delay(500);Popat6(0,0,155);

delay(500);Popat1(136,0,155);delay(500);Popat2(136,0,155);delay(500);Popat3(136,0,155);delay(500);Popat4(136,0,155);delay(500);Popat5(136,0,155);delay(500);Popat6(136,0,155);

delay(500);Popat1(230,220,0);delay(500);Popat2(230,220,0);delay(500);Popat3(230,220,0);delay(500);Popat4(230,220,0);delay(500);Popat5(230,220,0);delay(500);Popat6(230,220,0);

delay(500);Popat1(0,230,250);delay(500);Popat2(0,230,250);delay(500);Popat3(0,230,250);delay(500);Popat4(0,230,250);delay(500);Popat5(0,230,250);delay(500);Popat6(0,230,250);
; break;
    case 3: colorWipe(strip.Color(255, 0, 0), 50);  // Red
    break;
    }
  }
  // когда интервал превышен
  effectNumber++;                              // увеличиваем счетчик
  if (effectNumber > EFFECTS_COUNT) effectNumber = 1; // защита от дурака
  timeStamp = millis();                    // запоминаем время начала эфекта
  

}

void Popat1(uint8_t r, uint8_t g, uint8_t b)
{
 for (uint8_t i=0; i<5; i++) 
 strip.setPixelColor(i, r, g, b); 
strip.show(); 
}
void Popat2(uint8_t r, uint8_t g, uint8_t b)
{
 for(uint8_t i=5; i<10; i++) 
 strip.setPixelColor(i, r, g, b); 
strip.show(); 
}
void Popat3(uint8_t r, uint8_t g, uint8_t b)
{
 for(uint8_t i=10; i<15; i++) 
 strip.setPixelColor(i, r, g, b); 
strip.show(); 
}
void Popat4(uint8_t r, uint8_t g, uint8_t b)
{
 for(uint8_t i=15; i<20; i++) 
 strip.setPixelColor(i, r, g, b); 
strip.show(); 
}
void Popat5(uint8_t r, uint8_t g, uint8_t b)
{
 for(uint8_t i=20; i<25; i++) 
 strip.setPixelColor(i, r, g, b); 
strip.show(); 
}

void Popat6(uint8_t r, uint8_t g, uint8_t b)
{
 for(uint8_t i=25; i<30; i++) 
 strip.setPixelColor(i, r, g, b); 
strip.show(); 
}
// Заполните Точками один за другим цветом
void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
    strip.show();
    delay(wait);
  }
}

 

Tenshi26
Offline
Зарегистрирован: 31.01.2017

Насмотрелся примеров в нете и решил сделать свои эффекты мигания на ленте

Tenshi26
Offline
Зарегистрирован: 31.01.2017

А прошу помощи собственно в чем не как не могу найти как мне менять интервал каждого эфекта и порядок их смены например: case1 15сек , case2 5 сек, case1 30 сек, case3  2 сек, case2 15сек создать трек из эфектов

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

Похоже. Вы решили не "сделать свои" эффекты, а "использовать чужие", правильно? Или это Ваш код?

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Жесть, в библеотеке neopixel и то примеры поинтересней

bwn
Offline
Зарегистрирован: 25.08.2014

ЕвгенийП пишет:

Похоже. Вы решили не "сделать свои" эффекты, а "использовать чужие", правильно? Или это Ваш код?

Дык а то, блинки миллисы и прочую х-ню нам не по чину юзать, мы скетчи уже качать умеем. Правда как они работают, ХЗ?

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Я все таки предлагаю сделать минитест при регистрации...

Tenshi26
Offline
Зарегистрирован: 31.01.2017

1 режим скопировал  2 других мои это сделано чтобы светодиоды по 5 загорались а не всей лентой как в самой библиотеке а переключение по таймеру я взял с другого примера И блинки я все проюзал уже и про таймеры начитался вот ток от этого не стал больше в них разбираться

И я написал что режимов то я еще наделаю как зажигать диоды как менять режимы по кнопки эт уже умею

Tenshi26
Offline
Зарегистрирован: 31.01.2017

Возникла идея а могуя прям в цикле написать что после нажатия накнопку запускаем первый эфект и активировать таймер а дальше если кнопка не нажата то запускаем например з и опять таймер ?

Почему спрашиваю а не пробую я могу ошибиться с написанием и не чего не будет работать мне интересно -так же может работать

vvadim
Offline
Зарегистрирован: 23.05.2012

да всё можно...

только сначала освой знаки препинания

Tenshi26
Offline
Зарегистрирован: 31.01.2017
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif

#define LEDS_COUNT      17   // количество светодиодов WS2812
#define LED_PIN         7    // пин для подключения WS2812

Adafruit_NeoPixel strip = Adafruit_NeoPixel(LEDS_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);

int CHANGE_TIME ;
byte effectNumber;         // переменная для хранения номера эффекта
unsigned long timeStamp;   // переменная для хранения времени последней смены эффекта

void setup()
{
  Serial.begin(9600);
  //effectNumber = 2; // задаем эффект (при включении питания)
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}
void loop()
{
  CHANGE_TIME=3;
 effectNumber = 1;
   Serial.print("Effect:"); Serial.println(effectNumber);

  
  while(millis() - timeStamp < CHANGE_TIME * 1000L) // в течение интервала
  {
      switch(effectNumber)                         // включаем заданный эффект
    {
    case 1:colorWipe(strip.Color(0, 0, 250), 50);
        break;
    case 2: colorWipe(strip.Color(0, 250, 0), 50); 
        break;
    case 3: colorWipe(strip.Color(255, 0, 0), 50);  // Red
        break;
    }
  }
                      // когда интервал превышен
CHANGE_TIME = 10;
 effectNumber =3;
  timeStamp = millis(); // запоминаем время начала эфекта
   while(millis() - timeStamp < CHANGE_TIME * 1000L)
 {
      switch(effectNumber) 
      {
case 1:colorWipe(strip.Color(0, 0, 250), 50);
        break;
    case 2: colorWipe(strip.Color(0, 250, 0), 50); 
        break;
    case 3: colorWipe(strip.Color(255, 0, 0), 50);  // Red
        break;
    }
 }
 CHANGE_TIME = 15;
 effectNumber =2;
 
 timeStamp = millis();

  while(millis() - timeStamp < CHANGE_TIME * 1000L)
  {
        switch(effectNumber) 
      {
case 1:colorWipe(strip.Color(0, 0, 250), 50);
        break;
    case 2: colorWipe(strip.Color(0, 250, 0), 50); 
        break;
    case 3: colorWipe(strip.Color(255, 0, 0), 50);  // Red
        break;
    }
 }
CHANGE_TIME = 20;
 effectNumber =1;
 timeStamp = millis();
  while(millis() - timeStamp < CHANGE_TIME * 1000L)
  {
        switch(effectNumber) 
      {
case 1:colorWipe(strip.Color(0, 0, 250), 50);
        break;
    case 2: colorWipe(strip.Color(0, 250, 0), 50); 
        break;
    case 3: colorWipe(strip.Color(255, 0, 0), 50);  // Red
        break;
    }
 }
 


  
  
}
// Заполните Точками один за другим цветом
void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
    strip.show();
    delay(wait);
  }
}

 

Tenshi26
Offline
Зарегистрирован: 31.01.2017

Вот таким суровым способом у меня получилось создать трек из эффектов.

Я так понимаю чтобы эт все смотрелось компактней надо создать класс?

Tenshi26
Offline
Зарегистрирован: 31.01.2017

1 режим скопировал  2 других мои это сделано чтобы светодиоды по 5 загорались а не всей лентой как в самой библиотеке