Помогите новечку
- Войдите на сайт для отправки комментариев
Пт, 03/02/2017 - 01:06
#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);
}
}
Насмотрелся примеров в нете и решил сделать свои эффекты мигания на ленте
А прошу помощи собственно в чем не как не могу найти как мне менять интервал каждого эфекта и порядок их смены например: case1 15сек , case2 5 сек, case1 30 сек, case3 2 сек, case2 15сек создать трек из эфектов
Похоже. Вы решили не "сделать свои" эффекты, а "использовать чужие", правильно? Или это Ваш код?
Жесть, в библеотеке neopixel и то примеры поинтересней
Похоже. Вы решили не "сделать свои" эффекты, а "использовать чужие", правильно? Или это Ваш код?
Дык а то, блинки миллисы и прочую х-ню нам не по чину юзать, мы скетчи уже качать умеем. Правда как они работают, ХЗ?
Я все таки предлагаю сделать минитест при регистрации...
1 режим скопировал 2 других мои это сделано чтобы светодиоды по 5 загорались а не всей лентой как в самой библиотеке а переключение по таймеру я взял с другого примера И блинки я все проюзал уже и про таймеры начитался вот ток от этого не стал больше в них разбираться
И я написал что режимов то я еще наделаю как зажигать диоды как менять режимы по кнопки эт уже умею
Возникла идея а могуя прям в цикле написать что после нажатия накнопку запускаем первый эфект и активировать таймер а дальше если кнопка не нажата то запускаем например з и опять таймер ?
Почему спрашиваю а не пробую я могу ошибиться с написанием и не чего не будет работать мне интересно -так же может работать
да всё можно...
только сначала освой знаки препинания
#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); } }Вот таким суровым способом у меня получилось создать трек из эффектов.
Я так понимаю чтобы эт все смотрелось компактней надо создать класс?
1 режим скопировал 2 других мои это сделано чтобы светодиоды по 5 загорались а не всей лентой как в самой библиотеке