Выбор действий одной кнопкой

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016
Здраствуйте. Помогите отладить скетч.

Управление свеодиодной лентой.

1 - Почемуто нестабильно работает кнопка.

2 - Пока не закончится подпрограмма (Leds_x), нет реакци на кнопку.

Нужно так чтобы в момент нажатия кнопки прогама переходила к соответствующей подпрограмме, переывая роботу прежней.

//LEDS_0(); // Вся лінійка вимкнена
//LEDS_1(); // Ліва/Права сторона (лінійка 0 і 3) світяться білим
//LEDS_2(); // Ліва/Права сторона (лінійка 0 і 3) по-очереді моргають білим
//LEDS_3(); // Ліва/Права сторона (лінійка 0 і 3) разом моргають білим
//LEDS_4(); // Ліва/Права сторона (лінійка 0 і 3) по-очереді моргають синім і червоним
//LEDS_5(); // Ліва/Права сторона (лінійка 0 і 3) разом моргають ЖОВТИМ
//LEDS_6(); // Вся лінійка моргає білим, стробоскоп
//LEDS_7(); // Вся одночасно лінійка переливається різними кольрами
//LEDS_8(); // Червоний кусочок бігає туди-сюди

#include <Adafruit_NeoPixel.h>

#define LED_PIN 11 // Вихід на свєтодіоди
#define KEY_PIN 2 // Кнопка
#define NUM_LEDS 144 // Кількість діодів на всі лінійці
#define STICK_NUM 4 // Кількість сборок
#define PIXEL_IN_STICK 36 // Кількість свєтодіодів в зборці
#define PIXEL_NUM (STICK_NUM * PIXEL_IN_STICK) // 4 х 36 = 144

boolean lastButton=LOW;
boolean currentButton=LOW;

int ledMode=0;
int d = 500; // Час затримки
int StickNum_0 = 0; // Порядковий номер сборки 1
int StickNum_1 = 1; // Порядковий номер сборки 2
int StickNum_2 = 2; // Порядковий номер сборки 3
int StickNum_3 = 3; // Порядковий номер сборки 4

int val=9;
//int val;
int state;
int c;

// Змінні для LEDS_6(); // Вся лінійка моргає білим, стробоскоп
byte red_6=255;
byte green_6=255;
byte blue_6=255;
int StrobeCount_6=10;
int FlashDelay_6=50;
int EndPause_6=1000;
/*
// Змінні для LEDS_6(); // Вся лінійка моргає жовтим, стробоскоп
byte red_6=255; //0xff
byte green_6=199; //0x77
byte blue_6=0; //0x00
int StrobeCount_6=10; //10
int FlashDelay_6=100; //100
int EndPause_6=1000; //1000
*/
// Змінні для LEDS_8(); // Червоний кусочок бігає туди-сюди
byte red_8=0; //255
byte green_8=0; // 0
byte blue_8=255; //0
int EyeSize_8=20;
int SpeedDelay_8=1;
int ReturnDelay_8=50;

byte red_81=255; //255
byte green_81=0; // 0
byte blue_81=255; //0

Adafruit_NeoPixel LEDS = Adafruit_NeoPixel(PIXEL_NUM, LED_PIN, NEO_GRB + NEO_KHZ800);

//----------------------------------------
void setup()
{
pinMode(KEY_PIN, INPUT_PULLUP);
digitalWrite(KEY_PIN, HIGH);
attachInterrupt(0, pinChange, CHANGE);
Serial.begin(9600);
LEDS.begin();
LEDS.show();
Serial.println("Open");
}
//----------------------------------------
/*
boolean debounce(boolean last)
{
boolean current = digitalRead(KEY_PIN);
if (last != current)
{
delay(5);
//Serial.println(delay);
current = digitalRead(KEY_PIN);
return current;
}
}

//----------------------------------------
void setMode(int mode)
{
switch (mode)
{
case 0:
//LEDS_0();
break;

case 1:
LEDS_1();
break;

case 2:
LEDS_2();
break;

case 3:
LEDS_3();
break;

case 4:
LEDS_4();
break;

case 5:
LEDS_5();
break;

case 6:
LEDS_6();
break;

case 7:
LEDS_7();
break;

case 8:
LEDS_8();
break;

case 9:
//LEDS_9();
break;

case 10:
//LEDS_10();
break;

case 11:
//LEDS_11();
break;

case 12:
//LEDS_12();
break;
}
}

//----------------------------------------
void loop()
{
currentButton=debounce(lastButton);
if (lastButton==LOW && currentButton==HIGH)
{
ledMode++;
}

lastButton=currentButton;
if (ledMode == 13)
{
ledMode=0;
//Serial.println(0);
}

//pinChange();
setMode(ledMode);
Serial.println(ledMode);
Serial.println();

}
*/
//----------------------------------------
void loop()
{
//pinChange();
Serial.println("loop");

/*
state = digitalRead(KEY_PIN);

if (state == HIGH && c == 0) // нажали кнопку
{
c = 1;
}
if (state == LOW && c == 1) // отпустили кнопку
{
val = ++val;
if (val == 12)
{
val = 0;
}
c = 0;
}

// ======= Вполняем задачу при выборе режима =======
Serial.print("-");
Serial.println(val);
*/
//-----------
if (val == 0)
{
LEDS_0();
Serial.println("led_0");
}

//-----------
if (val == 1)
{
LEDS_1();
Serial.println("led_1");
}

//-----------
if (val == 2)
{
LEDS_2();
Serial.println("led_2");
}

//-----------
if (val == 3)
{
LEDS_3();
Serial.println("led_3");
}

//-----------
if (val == 4)
{
LEDS_4();
Serial.println("led_4");
}

//-----------
if (val == 5)
{
LEDS_5();
Serial.println("led_5");
}

//-----------
if (val == 6)
{
LEDS_6();
Serial.println("led_6");
}

//-----------
if (val == 7)
{
LEDS_7();
Serial.println("led_7");
}

//-----------
if (val == 8)
{
LEDS_8();
Serial.println("led_8");
}

//-----------
if (val == 9)
{
LEDS_9();
Serial.println("led_9");
}

//-----------
if (val == 10)
{
//LEDS_10();
//Serial.println("led_10");
}

//-----------
if (val == 11)
{
//LEDS_11();
//Serial.println("led_11");
}

//-----------
if (val == 12)
{
//LEDS_2();
//Serial.println("led_12");
}

//-----------

delay(10);

}

//----------------------------------------

void pinChange()
{
state = digitalRead(KEY_PIN);

if (state == HIGH && c == 0) // нажали кнопку
{
c = 1;
}
if (state == LOW && c == 1) // отпустили кнопку
{
val = ++val;
if (val == 12)
{
val = 0;
}
c = 0;
}
Serial.println("+*- ");
//delay(3000);
Serial.print("+ ");
Serial.println(val);

// **********************************
// ======= Вполняем задачу при выборе режима =======
/*
//-----------
if (val == 0)
{
LEDS_0();
Serial.println("led_0");
}

//-----------
if (val == 1)
{
LEDS_1();
Serial.println("led_1");
}

//-----------
if (val == 2)
{
LEDS_2();
Serial.println("led_2");
}

//-----------
if (val == 3)
{
LEDS_3();
Serial.println("led_3");
}

//-----------
if (val == 4)
{
LEDS_4();
Serial.println("led_4");
}

//-----------
if (val == 5)
{
LEDS_5();
Serial.println("led_5");
}

//-----------
if (val == 6)
{
//LEDS_6();
Serial.println("led_6");
}

//-----------
if (val == 7)
{
//LEDS_7();
Serial.println("led_7");
}

//-----------
if (val == 8)
{
//LEDS_8();
Serial.println("led_8");
}

//-----------
if (val == 9)
{
//LEDS_9();
//Serial.println("led_9");
}

//-----------
if (val == 10)
{
//LEDS_10();
//Serial.println("led_10");
}

//-----------
if (val == 11)
{
//LEDS_11();
//Serial.println("led_11");
}

//-----------
if (val == 12)
{
//LEDS_2();
//Serial.println("led_12");
}

//-----------

delay(10);
// **********************************
*/
}

//----------------------------------------
void LEDS_0() // Вся лінійка вимкнена
{
//Serial.println("LEDS_0");
LEDS.show();
byte StartPixel = StickNum_0 * PIXEL_IN_STICK;

for (byte i = StartPixel; i < (StartPixel + PIXEL_IN_STICK); i++)
LEDS.setPixelColor(i, 0, 0, 0); //(red,green,blue)
LEDS.show();
delay (d);

for (byte i = StartPixel; i < (StartPixel + PIXEL_IN_STICK); i++)
LEDS.setPixelColor(i, 0, 0, 0);
LEDS.show();

byte StartPixel_3 = StickNum_3 * PIXEL_IN_STICK;

for (byte j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
LEDS.setPixelColor(j, 0, 0, 0); //(red,green,blue)
LEDS.show();
delay (d);

for (byte j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
LEDS.setPixelColor(j, 0, 0, 0);
LEDS.show();
}

//----------------------------------------
void LEDS_1() // Ліва/Права сторона (лінійка 0 і 3) світяться білим
{
//Serial.println("LEDS_1");
LEDS.show();
byte StartPixel = StickNum_0 * PIXEL_IN_STICK;

for (byte i = StartPixel; i < (StartPixel + PIXEL_IN_STICK); i++)
LEDS.setPixelColor(i, 255, 255, 255); //(red,green,blue)
LEDS.show();
delay (d);

for (byte i = StartPixel; i < (StartPixel + PIXEL_IN_STICK); i++)
LEDS.setPixelColor(i, 255, 255, 255);
LEDS.show();

byte StartPixel_3 = StickNum_3 * PIXEL_IN_STICK;

for (byte j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
LEDS.setPixelColor(j, 255, 255, 255); //(red,green,blue)
LEDS.show();
delay (d);

for (byte j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
LEDS.setPixelColor(j, 255, 255, 255);
LEDS.show();
}

//----------------------------------------
void LEDS_2() // Ліва/Права сторона (лінійка 0 і 3) по-очереді моргають білим
{
//Serial.println("LEDS_2");
LEDS.show();
byte StartPixel = StickNum_0 * PIXEL_IN_STICK;

for (byte i = StartPixel; i < (StartPixel + PIXEL_IN_STICK); i++)
LEDS.setPixelColor(i, 255, 255, 255); //(red,green,blue)
LEDS.show();
delay (d);

for (byte i = StartPixel; i < (StartPixel + PIXEL_IN_STICK); i++)
LEDS.setPixelColor(i, 0, 0, 0);
LEDS.show();

byte StartPixel_3 = StickNum_3 * PIXEL_IN_STICK;

for (byte j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
LEDS.setPixelColor(j, 255, 255, 255); //(red,green,blue)
LEDS.show();
delay (d);

for (byte j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
LEDS.setPixelColor(j, 0, 0, 0);
LEDS.show();
}

//----------------------------------------
void LEDS_3() // Ліва/Права сторона (лінійка 0 і 3) разом моргають білим
{
//Serial.println("LEDS_3");
LEDS.show();
byte StartPixel = StickNum_0 * PIXEL_IN_STICK;

for (byte i = StartPixel; i < (StartPixel + PIXEL_IN_STICK); i++)
LEDS.setPixelColor(i, 255, 255, 255); //(red,green,blue)
LEDS.show();
delay (d);

for (byte i = StartPixel; i < (StartPixel + PIXEL_IN_STICK); i++)
LEDS.setPixelColor(i, 0, 0, 0);
LEDS.show();

byte StartPixel_3 = StickNum_3 * PIXEL_IN_STICK;

for (byte j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
LEDS.setPixelColor(j, 0, 0, 0); //(red,green,blue)
LEDS.show();
delay (d);

for (byte j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
LEDS.setPixelColor(j, 255, 255, 255);
LEDS.show();
}

//----------------------------------------
void LEDS_4() // Ліва/Права сторона (лінійка 0 і 3) по-очереді моргають синім і червоним
{
//Serial.println("LEDS_4");
LEDS.show();
byte StartPixel = StickNum_0 * PIXEL_IN_STICK;

for (byte i = StartPixel; i < (StartPixel + PIXEL_IN_STICK); i++)
LEDS.setPixelColor(i, 255, 0, 0); //(red,green,blue)
LEDS.show();
delay (d);

for (byte i = StartPixel; i < (StartPixel + PIXEL_IN_STICK); i++)
LEDS.setPixelColor(i, 0, 0, 0);
LEDS.show();

byte StartPixel_3 = StickNum_3 * PIXEL_IN_STICK;

for (byte j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
LEDS.setPixelColor(j, 0, 0, 255);//(red,green,blue)
//LEDS.setPixelColor(j, 255, 255, 255);
LEDS.show();
delay (d);

for (byte j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
LEDS.setPixelColor(j, 0, 0, 0);
LEDS.show();
}
//----------------------------------------

void LEDS_5() // Ліва/Права сторона (лінійка 0 і 3) разом моргають ЖОВТИМ
{
//Serial.println("LEDS_5");
LEDS.show();
byte StartPixel = StickNum_0 * PIXEL_IN_STICK;

for (byte i = StartPixel; i < (StartPixel + PIXEL_IN_STICK); i++)
LEDS.setPixelColor(i, 0, 0, 0); //(red,green,blue)
LEDS.show();
delay (d);

for (byte i = StartPixel; i < (StartPixel + PIXEL_IN_STICK); i++)
LEDS.setPixelColor(i, 255, 255, 0);
LEDS.show();

byte StartPixel_1 = StickNum_1 * PIXEL_IN_STICK;

for (byte j = StartPixel_1; j < (StartPixel_1 + PIXEL_IN_STICK); j++)
LEDS.setPixelColor(j, 255, 255, 0); //(red,green,blue)
LEDS.show();
delay (d);

for (byte j = StartPixel_1; j < (StartPixel_1 + PIXEL_IN_STICK); j++)
LEDS.setPixelColor(j, 0, 0, 0);
LEDS.show();
}

//----------------------------------------
void LEDS_6() // Вся лінійка моргає білим, стробоскоп
{
//Serial.println("LEDS_6");
for(int j = 0; j < StrobeCount_6; j++) {
setAll_6(red_6,green_6,blue_6);
showStrip_6();
delay(FlashDelay_6);
setAll_6(0,0,0);
showStrip_6();
delay(FlashDelay_6);
}

delay(EndPause_6);
}

//----------------------------------------
void LEDS_7() // Вся одночасно лінійка переливається різними кольрами
{
//Serial.println("LEDS_7");
for(int j = 0; j < 3; j++ ) {
// Fade IN
for(int k = 0; k < 256; k++) {
switch(j) {
case 0: setAll_6(k,0,0); break;
case 1: setAll_6(0,k,0); break;
case 2: setAll_6(0,0,k); break;
}
showStrip_6();
delay(3);
}
// Fade OUT
for(int k = 255; k >= 0; k--) {
switch(j) {
case 0: setAll_6(k,0,0); break;
case 1: setAll_6(0,k,0); break;
case 2: setAll_6(0,0,k); break;
}
showStrip_6();
delay(3);
}
}
}

//----------------------------------------
void LEDS_8() // Червоний кусочок бігає туди-сюди
{
//Serial.println("LEDS_8");
for(int i = 0; i < NUM_LEDS-EyeSize_8-2; i++) {
setAll_6(0,0,0);
setPixel_6(i, red_8/10, green_8/10, blue_8/10);
for(int j = 1; j <= EyeSize_8; j++) {
//setPixel(i+j, red, green, blue);
setPixel_6(i+j, red_8, green_8, blue_8);
}
setPixel_6(i+EyeSize_8+1, red_8/10, green_8/10, blue_8/10);
showStrip_6();
delay(SpeedDelay_8);
}

delay(ReturnDelay_8);

for(int i = NUM_LEDS-EyeSize_8-2; i > 0; i--) {
setAll_6(0,0,0);
setPixel_6(i, red_81/10, green_81/10, blue_81/10);
for(int j = 1; j <= EyeSize_8; j++) {
setPixel_6(i+j, red_81, green_81, blue_81);
}
setPixel_6(i+EyeSize_8+1, red_81/10, green_81/10, blue_81/10);
showStrip_6();
delay(SpeedDelay_8);
}

delay(ReturnDelay_8);
}

//----------------------------------------
/*
void LEDS_9() // Ліва/Права сторона (лінійка 0 і 3) світяться білим
{
//Serial.println("LEDS_99");
LEDS.show();
byte StartPixel_0 = StickNum_0 * PIXEL_IN_STICK;
byte StartPixel_1 = StickNum_1 * PIXEL_IN_STICK;
byte StartPixel_2 = StickNum_2 * PIXEL_IN_STICK;
byte StartPixel_3 = StickNum_3 * PIXEL_IN_STICK;

for (byte i = StartPixel_0; i < (StartPixel_0 + PIXEL_IN_STICK); i++)
LEDS.setPixelColor(i, 255, 255, 255); //(red,green,blue)
for (byte j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
LEDS.setPixelColor(j, 255, 255, 255); //(red,green,blue)

LEDS.show();
delay (d);

for (byte i = StartPixel_0; i < (StartPixel_0 + PIXEL_IN_STICK); i++)
LEDS.setPixelColor(i, 0, 0, 0); //(red,green,blue)
for (byte j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
LEDS.setPixelColor(j, 0, 0, 0); //(red,green,blue)
LEDS.show();

for (byte i = StartPixel_1; i < (StartPixel_1 + PIXEL_IN_STICK); i++)
LEDS.setPixelColor(i, 255, 255, 255); //(red,green,blue)
for (byte j = StartPixel_2; j < (StartPixel_2 + PIXEL_IN_STICK); j++)
LEDS.setPixelColor(j, 255, 255, 255); //(red,green,blue)

LEDS.show();
delay (d);

for (byte i = StartPixel_1; i < (StartPixel_1 + PIXEL_IN_STICK); i++)
LEDS.setPixelColor(i, 0, 0, 0); //(red,green,blue)
for (byte j = StartPixel_2; j < (StartPixel_2 + PIXEL_IN_STICK); j++)
LEDS.setPixelColor(j, 0, 0, 0); //(red,green,blue)

LEDS.show();

}
*/
//----------------------------------------
void LEDS_9() // Ліва/Права сторона (лінійка 0 і 3) світяться білим
{
//Serial.println("LEDS_99");
LEDS.show();
byte StartPixel_0 = StickNum_0 * PIXEL_IN_STICK;
byte StartPixel_1 = StickNum_1 * PIXEL_IN_STICK;
byte StartPixel_2 = StickNum_2 * PIXEL_IN_STICK;
byte StartPixel_3 = StickNum_3 * PIXEL_IN_STICK;

byte j;
byte i;

//LEDS.show();

for (i = StartPixel_0; i < (StartPixel_0 + PIXEL_IN_STICK); i++)
LEDS.setPixelColor(i, 255, 255, 255); //(red,green,blue)
for (j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
LEDS.setPixelColor(j, 255, 255, 255); //(red,green,blue)

LEDS.show();
delay (d);

for (i = StartPixel_0; i < (StartPixel_0 + PIXEL_IN_STICK); i++)
LEDS.setPixelColor(i, 255, 255, 255); //(red,green,blue)
for (j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
LEDS.setPixelColor(j, 255, 255, 255); //(red,green,blue)

LEDS.show();
delay (d);

for (i = StartPixel_0; i < (StartPixel_0 + PIXEL_IN_STICK); i++)
LEDS.setPixelColor(i, 0, 0, 0); //(red,green,blue)
for (j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
LEDS.setPixelColor(j, 0, 0, 0); //(red,green,blue)
LEDS.show();

for (i = StartPixel_1; i < (StartPixel_1 + PIXEL_IN_STICK); i++)
LEDS.setPixelColor(i, 255, 255, 255); //(red,green,blue)
for (j = StartPixel_2; j < (StartPixel_2 + PIXEL_IN_STICK); j++)
LEDS.setPixelColor(j, 255, 255, 255); //(red,green,blue)

LEDS.show();
delay (d);

for (i = StartPixel_1; i < (StartPixel_1 + PIXEL_IN_STICK); i++)
LEDS.setPixelColor(i, 0, 0, 0); //(red,green,blue)
for (j = StartPixel_2; j < (StartPixel_2 + PIXEL_IN_STICK); j++)
LEDS.setPixelColor(j, 0, 0, 0); //(red,green,blue)

LEDS.show();

}
//----------------------------------------
//////////// ----------------------------////////////
void showStrip_6()
{
#ifdef ADAFRUIT_NEOPIXEL_H
// NeoPixel
LEDS.show();
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
// FastLED
FastLED.show();
#endif
}

void setPixel_6(int Pixel, byte red, byte green, byte blue)
{
#ifdef ADAFRUIT_NEOPIXEL_H
// NeoPixel
LEDS.setPixelColor(Pixel, LEDS.Color(red, green, blue));
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
// FastLED
leds[Pixel].r = red;
leds[Pixel].g = green;
leds[Pixel].b = blue;
#endif
}

void setAll_6(byte red, byte green, byte blue)
{
for(int i = 0; i < NUM_LEDS; i++ ) {
setPixel_6(i, red, green, blue);
}
showStrip_6();
}

//////////// ----------------------------////////////

Понятия не имею как можнео испольвать millis() в этом коде.

Переключение одной кнопкой millis() работает. 

Извините, новачок.

 

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016
Прошу прощения за копию скетча, не научился еще выкладывать
  //LEDS_0();   // Вся лінійка вимкнена
  //LEDS_1();   // Ліва/Права сторона (лінійка 0 і 3) світяться білим
  //LEDS_2();   // Ліва/Права сторона (лінійка 0 і 3) по-очереді моргають білим
  //LEDS_3();   // Ліва/Права сторона (лінійка 0 і 3) разом моргають білим
  //LEDS_4();   // Ліва/Права сторона (лінійка 0 і 3) по-очереді моргають синім і червоним
  //LEDS_5();   // Ліва/Права сторона (лінійка 0 і 3) разом моргають ЖОВТИМ
  //LEDS_6();   // Вся лінійка моргає білим, стробоскоп
  //LEDS_7();   // Вся одночасно лінійка переливається різними кольрами
  //LEDS_8();   // Червоний кусочок бігає туди-сюди

#include <Adafruit_NeoPixel.h>

#define   LED_PIN               11     // Вихід на свєтодіоди
#define   KEY_PIN               2     // Кнопка
#define   NUM_LEDS              144    // Кількість діодів на всі лінійці
#define   STICK_NUM             4      // Кількість сборок
#define   PIXEL_IN_STICK        36     // Кількість свєтодіодів в зборці
#define   PIXEL_NUM            (STICK_NUM * PIXEL_IN_STICK) // 4 х 36 = 144

boolean lastButton=LOW;
boolean currentButton=LOW;

int ledMode=0;
int d = 500;                    // Час затримки
int StickNum_0 = 0;             // Порядковий номер сборки 1
int StickNum_1 = 1;             // Порядковий номер сборки 2
int StickNum_2 = 2;             // Порядковий номер сборки 3
int StickNum_3 = 3;             // Порядковий номер сборки 4

int val=9;
//int val;
int state;
int c;



// Змінні для LEDS_6(); // Вся лінійка моргає білим, стробоскоп
    byte red_6=255; 
    byte green_6=255; 
    byte blue_6=255; 
    int StrobeCount_6=10; 
    int FlashDelay_6=50; 
    int EndPause_6=1000; 
/*
// Змінні для LEDS_6(); // Вся лінійка моргає жовтим, стробоскоп
    byte red_6=255; //0xff
    byte green_6=199; //0x77
    byte blue_6=0; //0x00
    int StrobeCount_6=10; //10
    int FlashDelay_6=100; //100
    int EndPause_6=1000; //1000
*/
// Змінні для LEDS_8();  // Червоний кусочок бігає туди-сюди
    byte red_8=0; //255
    byte green_8=0; // 0
    byte blue_8=255; //0
    int EyeSize_8=20;
    int SpeedDelay_8=1;
    int ReturnDelay_8=50;

    byte red_81=255; //255
    byte green_81=0; // 0
    byte blue_81=255; //0


Adafruit_NeoPixel LEDS = Adafruit_NeoPixel(PIXEL_NUM, LED_PIN, NEO_GRB + NEO_KHZ800);

//----------------------------------------
void setup()
{  
  pinMode(KEY_PIN, INPUT_PULLUP);
  digitalWrite(KEY_PIN, HIGH);
  attachInterrupt(0, pinChange, CHANGE);
  Serial.begin(9600);
  LEDS.begin();
  LEDS.show();
  Serial.println("Open");
}
//----------------------------------------
/*
boolean debounce(boolean last)
{
  boolean current = digitalRead(KEY_PIN);
  if (last != current)
    {
      delay(5);
      //Serial.println(delay);
      current = digitalRead(KEY_PIN);
      return current;
    }  
}

//----------------------------------------
void setMode(int mode)
{
  switch (mode)
  { 
    case 0:
    //LEDS_0();
    break;
    
    case 1:
    LEDS_1();
    break;

    case 2:
    LEDS_2();
    break;

    case 3:
    LEDS_3();
    break;

    case 4:
    LEDS_4();
    break;

    case 5:
    LEDS_5();
    break;

    case 6:
    LEDS_6();
    break;

    case 7:
    LEDS_7();
    break;

    case 8:
    LEDS_8();
    break;

    case 9:
    //LEDS_9();
    break;

    case 10:
    //LEDS_10();
    break;

    case 11:
    //LEDS_11();
    break;

    case 12:
    //LEDS_12();
    break;
  }
}

//----------------------------------------
void loop()
{ 
  currentButton=debounce(lastButton);
  if (lastButton==LOW && currentButton==HIGH)
    {
      ledMode++;
    }

  lastButton=currentButton;
    if (ledMode == 13)
      {
        ledMode=0;
        //Serial.println(0);
      }

  //pinChange();
  setMode(ledMode);
  Serial.println(ledMode);
  Serial.println();

}
*/
//----------------------------------------
void loop()
{ 
  //pinChange();
  Serial.println("loop");
  

  /*
  state = digitalRead(KEY_PIN);

  if (state == HIGH && c == 0) // нажали кнопку
  {
    c = 1;
  }
  if (state == LOW && c == 1) // отпустили кнопку
  {
    val = ++val;
    if (val == 12)
    {
      val = 0;
    }
    c = 0;
  }

// ======= Вполняем задачу при выборе режима =======
Serial.print("-");
Serial.println(val);
*/
//-----------
  if (val == 0) 
  {
    LEDS_0();
    Serial.println("led_0");
  }
  
//-----------
  if (val == 1) 
  {
    LEDS_1();
    Serial.println("led_1");
  }
  
//-----------
  if (val == 2) 
  {
    LEDS_2();
    Serial.println("led_2");
   }

//-----------
  if (val == 3) 
  {
    LEDS_3();
    Serial.println("led_3");
   }

//-----------
  if (val == 4) 
  {
    LEDS_4();
    Serial.println("led_4");
  }

//-----------
  if (val == 5) 
  {
    LEDS_5();
    Serial.println("led_5");
  }

//-----------
  if (val == 6) 
  {
    LEDS_6();
    Serial.println("led_6");
  }

//-----------
  if (val == 7)
  {
    LEDS_7();
    Serial.println("led_7");
  }

//-----------
  if (val == 8) 
  {
    LEDS_8();
    Serial.println("led_8");
  }

//-----------
  if (val == 9) 
  {
    LEDS_9();
    Serial.println("led_9");
  }

//-----------
  if (val == 10) 
  {
    //LEDS_10();
    //Serial.println("led_10");
  }

//-----------
  if (val == 11) 
  {
    //LEDS_11();
    //Serial.println("led_11");
  }

//-----------
  if (val == 12) 
  {
    //LEDS_2();
    //Serial.println("led_12");
  }

//-----------

delay(10);  

}

//----------------------------------------

void pinChange()
{ 
  state = digitalRead(KEY_PIN);

  if (state == HIGH && c == 0) // нажали кнопку
  {
    c = 1;
  }
  if (state == LOW && c == 1) // отпустили кнопку
  {
    val = ++val;
    if (val == 12)
    {
      val = 0;
    }
    c = 0;
  }
  Serial.println("+*- ");
//delay(3000); 
Serial.print("+ ");
Serial.println(val);

 // **********************************
// ======= Вполняем задачу при выборе режима =======
/*
//-----------
  if (val == 0) 
  {
    LEDS_0();
    Serial.println("led_0");
  }
  
//-----------
  if (val == 1) 
  {
    LEDS_1();
    Serial.println("led_1");
  }
  
//-----------
  if (val == 2) 
  {
    LEDS_2();
    Serial.println("led_2");
   }

//-----------
  if (val == 3) 
  {
    LEDS_3();
    Serial.println("led_3");
   }

//-----------
  if (val == 4) 
  {
    LEDS_4();
    Serial.println("led_4");
  }

//-----------
  if (val == 5) 
  {
    LEDS_5();
    Serial.println("led_5");
  }

//-----------
  if (val == 6) 
  {
    //LEDS_6();
    Serial.println("led_6");
  }

//-----------
  if (val == 7)
  {
    //LEDS_7();
    Serial.println("led_7");
  }

//-----------
  if (val == 8) 
  {
    //LEDS_8();
    Serial.println("led_8");
  }

//-----------
  if (val == 9) 
  {
    //LEDS_9();
    //Serial.println("led_9");
  }

//-----------
  if (val == 10) 
  {
    //LEDS_10();
    //Serial.println("led_10");
  }

//-----------
  if (val == 11) 
  {
    //LEDS_11();
    //Serial.println("led_11");
  }

//-----------
  if (val == 12) 
  {
    //LEDS_2();
    //Serial.println("led_12");
  }

//-----------

delay(10);  
 // **********************************
 */
}

//----------------------------------------
void LEDS_0() // Вся лінійка вимкнена
{
  //Serial.println("LEDS_0");
  LEDS.show();
  byte StartPixel = StickNum_0 * PIXEL_IN_STICK;
  
    for (byte i = StartPixel; i < (StartPixel + PIXEL_IN_STICK); i++)
      LEDS.setPixelColor(i, 0, 0, 0);  //(red,green,blue)
      LEDS.show();
      delay (d);

    for (byte i = StartPixel; i < (StartPixel + PIXEL_IN_STICK); i++)
      LEDS.setPixelColor(i, 0, 0, 0);
      LEDS.show();

  byte StartPixel_3 = StickNum_3 * PIXEL_IN_STICK;
  
    for (byte j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
      LEDS.setPixelColor(j, 0, 0, 0); //(red,green,blue)
      LEDS.show();
      delay (d);
      
    for (byte j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
      LEDS.setPixelColor(j, 0, 0, 0);
      LEDS.show();
}

//----------------------------------------
void LEDS_1() // Ліва/Права сторона (лінійка 0 і 3) світяться білим
{
  //Serial.println("LEDS_1");
  LEDS.show();
  byte StartPixel = StickNum_0 * PIXEL_IN_STICK;
  
    for (byte i = StartPixel; i < (StartPixel + PIXEL_IN_STICK); i++)
      LEDS.setPixelColor(i, 255, 255, 255); //(red,green,blue)
      LEDS.show();
      delay (d);

    for (byte i = StartPixel; i < (StartPixel + PIXEL_IN_STICK); i++)
      LEDS.setPixelColor(i, 255, 255, 255);
      LEDS.show();

  byte StartPixel_3 = StickNum_3 * PIXEL_IN_STICK;
  
    for (byte j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
      LEDS.setPixelColor(j, 255, 255, 255); //(red,green,blue)
      LEDS.show();
      delay (d);
      
    for (byte j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
      LEDS.setPixelColor(j, 255, 255, 255);
      LEDS.show();
}

//----------------------------------------
void LEDS_2() // Ліва/Права сторона (лінійка 0 і 3) по-очереді моргають білим 
{
  //Serial.println("LEDS_2");
  LEDS.show();
  byte StartPixel = StickNum_0 * PIXEL_IN_STICK;
  
    for (byte i = StartPixel; i < (StartPixel + PIXEL_IN_STICK); i++)
      LEDS.setPixelColor(i, 255, 255, 255);  //(red,green,blue)
      LEDS.show();
      delay (d);

    for (byte i = StartPixel; i < (StartPixel + PIXEL_IN_STICK); i++)
      LEDS.setPixelColor(i, 0, 0, 0);
      LEDS.show();

  byte StartPixel_3 = StickNum_3 * PIXEL_IN_STICK;
  
    for (byte j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
      LEDS.setPixelColor(j, 255, 255, 255); //(red,green,blue)
      LEDS.show();
      delay (d);
      
    for (byte j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
      LEDS.setPixelColor(j, 0, 0, 0);
      LEDS.show();
}

//----------------------------------------
void LEDS_3() // Ліва/Права сторона (лінійка 0 і 3) разом моргають білим
{
  //Serial.println("LEDS_3");
  LEDS.show();
  byte StartPixel = StickNum_0 * PIXEL_IN_STICK;
  
    for (byte i = StartPixel; i < (StartPixel + PIXEL_IN_STICK); i++)
      LEDS.setPixelColor(i, 255, 255, 255); //(red,green,blue)
      LEDS.show();
      delay (d);

    for (byte i = StartPixel; i < (StartPixel + PIXEL_IN_STICK); i++)
      LEDS.setPixelColor(i, 0, 0, 0);
      LEDS.show();

  byte StartPixel_3 = StickNum_3 * PIXEL_IN_STICK;
  
    for (byte j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
      LEDS.setPixelColor(j, 0, 0, 0); //(red,green,blue)
      LEDS.show();
      delay (d);
      
    for (byte j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
      LEDS.setPixelColor(j, 255, 255, 255);
      LEDS.show();
}

//----------------------------------------
void LEDS_4() // Ліва/Права сторона (лінійка 0 і 3) по-очереді моргають синім і червоним
{
  //Serial.println("LEDS_4");
  LEDS.show();
  byte StartPixel = StickNum_0 * PIXEL_IN_STICK;
  
    for (byte i = StartPixel; i < (StartPixel + PIXEL_IN_STICK); i++)
      LEDS.setPixelColor(i, 255, 0, 0); //(red,green,blue)
      LEDS.show();
      delay (d);

    for (byte i = StartPixel; i < (StartPixel + PIXEL_IN_STICK); i++)
      LEDS.setPixelColor(i, 0, 0, 0);
      LEDS.show();

  byte StartPixel_3 = StickNum_3 * PIXEL_IN_STICK;
  
    for (byte j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
      LEDS.setPixelColor(j, 0, 0, 255);//(red,green,blue)
      //LEDS.setPixelColor(j, 255, 255, 255); 
      LEDS.show();
      delay (d);
      
    for (byte j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
      LEDS.setPixelColor(j, 0, 0, 0);
      LEDS.show();
}
//----------------------------------------

void LEDS_5() // Ліва/Права сторона (лінійка 0 і 3) разом моргають ЖОВТИМ
{
  //Serial.println("LEDS_5");
  LEDS.show();
  byte StartPixel = StickNum_0 * PIXEL_IN_STICK;
  
    for (byte i = StartPixel; i < (StartPixel + PIXEL_IN_STICK); i++)
      LEDS.setPixelColor(i, 0, 0, 0); //(red,green,blue)
      LEDS.show();
      delay (d);

    for (byte i = StartPixel; i < (StartPixel + PIXEL_IN_STICK); i++)
      LEDS.setPixelColor(i, 255, 255, 0);
      LEDS.show();

  byte StartPixel_1 = StickNum_1 * PIXEL_IN_STICK;
  
    for (byte j = StartPixel_1; j < (StartPixel_1 + PIXEL_IN_STICK); j++)
      LEDS.setPixelColor(j, 255, 255, 0); //(red,green,blue)
      LEDS.show();
      delay (d);
      
    for (byte j = StartPixel_1; j < (StartPixel_1 + PIXEL_IN_STICK); j++)
      LEDS.setPixelColor(j, 0, 0, 0);
      LEDS.show();
}

//----------------------------------------
void LEDS_6() // Вся лінійка моргає білим, стробоскоп
{
  //Serial.println("LEDS_6");
  for(int j = 0; j < StrobeCount_6; j++) {
    setAll_6(red_6,green_6,blue_6);
    showStrip_6();
    delay(FlashDelay_6);
    setAll_6(0,0,0);
    showStrip_6();
    delay(FlashDelay_6);
  }
 
 delay(EndPause_6);
}

//----------------------------------------
void LEDS_7() // Вся одночасно лінійка переливається різними кольрами
{
  //Serial.println("LEDS_7");
  for(int j = 0; j < 3; j++ ) { 
    // Fade IN
    for(int k = 0; k < 256; k++) { 
      switch(j) { 
        case 0: setAll_6(k,0,0); break;
        case 1: setAll_6(0,k,0); break;
        case 2: setAll_6(0,0,k); break;
      }
      showStrip_6();
      delay(3);
    }
    // Fade OUT
    for(int k = 255; k >= 0; k--) { 
      switch(j) { 
        case 0: setAll_6(k,0,0); break;
        case 1: setAll_6(0,k,0); break;
        case 2: setAll_6(0,0,k); break;
      }
      showStrip_6();
      delay(3);
    }
  }
}

//----------------------------------------
void LEDS_8()  // Червоний кусочок бігає туди-сюди
{
  //Serial.println("LEDS_8");
  for(int i = 0; i < NUM_LEDS-EyeSize_8-2; i++) {
    setAll_6(0,0,0);
    setPixel_6(i, red_8/10, green_8/10, blue_8/10);
    for(int j = 1; j <= EyeSize_8; j++) {
      //setPixel(i+j, red, green, blue);
      setPixel_6(i+j, red_8, green_8, blue_8); 
    }
    setPixel_6(i+EyeSize_8+1, red_8/10, green_8/10, blue_8/10);
    showStrip_6();
    delay(SpeedDelay_8);
  }

  delay(ReturnDelay_8);

  for(int i = NUM_LEDS-EyeSize_8-2; i > 0; i--) {
    setAll_6(0,0,0);
    setPixel_6(i, red_81/10, green_81/10, blue_81/10);
    for(int j = 1; j <= EyeSize_8; j++) {
      setPixel_6(i+j, red_81, green_81, blue_81); 
    }
    setPixel_6(i+EyeSize_8+1, red_81/10, green_81/10, blue_81/10);
    showStrip_6();
    delay(SpeedDelay_8);
  }
  
  delay(ReturnDelay_8);
}

//----------------------------------------
/*
void LEDS_9() // Ліва/Права сторона (лінійка 0 і 3) світяться білим
{
  //Serial.println("LEDS_99");
  LEDS.show();
  byte StartPixel_0 = StickNum_0 * PIXEL_IN_STICK;
  byte StartPixel_1 = StickNum_1 * PIXEL_IN_STICK;
  byte StartPixel_2 = StickNum_2 * PIXEL_IN_STICK;
  byte StartPixel_3 = StickNum_3 * PIXEL_IN_STICK;
  
    for (byte i = StartPixel_0; i < (StartPixel_0 + PIXEL_IN_STICK); i++)
       LEDS.setPixelColor(i, 255, 255, 255);  //(red,green,blue)
    for (byte j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
       LEDS.setPixelColor(j, 255, 255, 255);  //(red,green,blue)
       
    LEDS.show();
    delay (d);

    for (byte i = StartPixel_0; i < (StartPixel_0 + PIXEL_IN_STICK); i++)
       LEDS.setPixelColor(i, 0, 0, 0);  //(red,green,blue)
    for (byte j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
       LEDS.setPixelColor(j, 0, 0, 0);  //(red,green,blue)
    LEDS.show();
      
    for (byte i = StartPixel_1; i < (StartPixel_1 + PIXEL_IN_STICK); i++)
       LEDS.setPixelColor(i, 255, 255, 255);  //(red,green,blue)
    for (byte j = StartPixel_2; j < (StartPixel_2 + PIXEL_IN_STICK); j++)
       LEDS.setPixelColor(j, 255, 255, 255);  //(red,green,blue)

    LEDS.show();
    delay (d);

    for (byte i = StartPixel_1; i < (StartPixel_1 + PIXEL_IN_STICK); i++)
       LEDS.setPixelColor(i, 0, 0, 0);  //(red,green,blue)
    for (byte j = StartPixel_2; j < (StartPixel_2 + PIXEL_IN_STICK); j++)
       LEDS.setPixelColor(j, 0, 0, 0);  //(red,green,blue)
      
     LEDS.show();

}
*/
//----------------------------------------
void LEDS_9() // Ліва/Права сторона (лінійка 0 і 3) світяться білим
{
  //Serial.println("LEDS_99");
  LEDS.show();
  byte StartPixel_0 = StickNum_0 * PIXEL_IN_STICK;
  byte StartPixel_1 = StickNum_1 * PIXEL_IN_STICK;
  byte StartPixel_2 = StickNum_2 * PIXEL_IN_STICK;
  byte StartPixel_3 = StickNum_3 * PIXEL_IN_STICK;

  byte j;
  byte i;

    //LEDS.show();

    for (i = StartPixel_0; i < (StartPixel_0 + PIXEL_IN_STICK); i++)
       LEDS.setPixelColor(i, 255, 255, 255);  //(red,green,blue)
    for (j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
       LEDS.setPixelColor(j, 255, 255, 255);  //(red,green,blue)


    LEDS.show();
    delay (d);

  
    for (i = StartPixel_0; i < (StartPixel_0 + PIXEL_IN_STICK); i++)
       LEDS.setPixelColor(i, 255, 255, 255);  //(red,green,blue)
    for (j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
       LEDS.setPixelColor(j, 255, 255, 255);  //(red,green,blue)

    LEDS.show();
    delay (d);

    for (i = StartPixel_0; i < (StartPixel_0 + PIXEL_IN_STICK); i++)
       LEDS.setPixelColor(i, 0, 0, 0);  //(red,green,blue)
    for (j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
       LEDS.setPixelColor(j, 0, 0, 0);  //(red,green,blue)
    LEDS.show();
      
    for (i = StartPixel_1; i < (StartPixel_1 + PIXEL_IN_STICK); i++)
       LEDS.setPixelColor(i, 255, 255, 255);  //(red,green,blue)
    for (j = StartPixel_2; j < (StartPixel_2 + PIXEL_IN_STICK); j++)
       LEDS.setPixelColor(j, 255, 255, 255);  //(red,green,blue)

    LEDS.show();
    delay (d);

    for (i = StartPixel_1; i < (StartPixel_1 + PIXEL_IN_STICK); i++)
       LEDS.setPixelColor(i, 0, 0, 0);  //(red,green,blue)
    for (j = StartPixel_2; j < (StartPixel_2 + PIXEL_IN_STICK); j++)
       LEDS.setPixelColor(j, 0, 0, 0);  //(red,green,blue)
      
     LEDS.show();

}
//----------------------------------------
//////////// ----------------------------////////////
void showStrip_6() 
{
 #ifdef ADAFRUIT_NEOPIXEL_H 
   // NeoPixel
   LEDS.show();
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H
   // FastLED
   FastLED.show();
 #endif
}

void setPixel_6(int Pixel, byte red, byte green, byte blue) 
{
 #ifdef ADAFRUIT_NEOPIXEL_H 
   // NeoPixel
   LEDS.setPixelColor(Pixel, LEDS.Color(red, green, blue));
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H 
   // FastLED
   leds[Pixel].r = red;
   leds[Pixel].g = green;
   leds[Pixel].b = blue;
 #endif
}

void setAll_6(byte red, byte green, byte blue) 
{
  for(int i = 0; i < NUM_LEDS; i++ ) {
    setPixel_6(i, red, green, blue); 
  }
  showStrip_6();
}

//////////// ----------------------------////////////

 

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

// delay (d);

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

Разные варианты, лишне закомментировано.

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

У Вас нажатие кнопки происходит в прерывании,  это надо исполизовать. Посмотрите пример ниже где это используется для 2х val=0 и =1 Если подойдет остальное напишете сами, только прочитайте коментарий

int val = 9;
int temp_val = val; // Создаем дополнительную переменную temp_val

void loop(){
  if (val == 0)
  { 
    temp_val = val;//В каждой "if (val == ?)присваюем значение temp_val = val;"
    LEDS_0();
    Serial.println("led_0");
  }

  //-----------
  if (val == 1)
  {
   temp_val = val;////В каждой "if (val == ?)присваюем значение temp_val = val;"
   LEDS_1();
    Serial.println("led_1");
  }
}

void LEDS_0() // Вся лінійка вимкнена
{
  //Serial.println("LEDS_0");
  LEDS.show();
  byte StartPixel = StickNum_0 * PIXEL_IN_STICK;

  for (byte i = StartPixel; i < (StartPixel + PIXEL_IN_STICK); i++)
///////////////////////
 //В каждом цыкле проверяем сменился ли "val" в прерывании и если да то выходим из цыкла 
  if(val != temp_val)return;   
///////////////////////////// 
    LEDS.setPixelColor(i, 0, 0, 0); //(red,green,blue)
  LEDS.show();
  delay (d);
   

  for (byte i = StartPixel; i < (StartPixel + PIXEL_IN_STICK); i++)
/////////////////////
//В каждом цыкле проверяем сменился ли "val" в прерывании и если да то выходим из цыкла  
    if(val != temp_val)return;
/////////////////////////////// 
   LEDS.setPixelColor(i, 0, 0, 0);
    LEDS.show();
    byte StartPixel_3 = StickNum_3 * PIXEL_IN_STICK;

  for (byte j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
 ///////////////
//В каждом цыкле проверяем сменился ли "val" в прерывании и если да то выходим из цыкла  
  if(val != temp_val)return; 
/////////////////////
   LEDS.setPixelColor(j, 0, 0, 0); //(red,green,blue)
  LEDS.show();
  delay (d);

  for (byte j = StartPixel_3 j < (StartPixel_3 + PIXEL_IN_STICK); j++)
 //////////////////////
 //В каждом цыкле проверяем сменился ли "val" в прерывании и если да то выходим из цыкла 
  if(val != temp_val)return;
 ////////////////////
    LEDS.setPixelColor(j, 0, 0, 0);
  LEDS.show();
}

//----------------------------------------
void LEDS_1() // Ліва/Права сторона (лінійка 0 і 3) світяться білим
{
  //Serial.println("LEDS_1");
  LEDS.show();
  byte StartPixel = StickNum_0 * PIXEL_IN_STICK;

  for (byte i = StartPixel; i < (StartPixel + PIXEL_IN_STICK); i++)
/////////////////
//В каждом цыкле проверяем сменился ли "val" в прерывании и если да то выходим из цыкла 
 if(val != temp_val)return;
//////////////////////////  
   LEDS.setPixelColor(i, 255, 255, 255); //(red,green,blue)
  LEDS.show();
  delay (d);

  for (byte i = StartPixel; i < (StartPixel + PIXEL_IN_STICK); i++)
////////////////
//В каждом цыкле проверяем сменился ли "val" в прерывании и если да то выходим из цыкла
  if(val != temp_val)return;  
/////////////////////// 
  LEDS.setPixelColor(i, 255, 255, 255);
  LEDS.show();

  byte StartPixel_3 = StickNum_3 * PIXEL_IN_STICK;

  for (byte j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
//////////////
//В каждом цыкле проверяем сменился ли "val" в прерывании и если да то выходим из цыкла
  if(val != temp_val)return; 
//////////////////////
    LEDS.setPixelColor(j, 255, 255, 255); //(red,green,blue)
  LEDS.show();
  delay (d);

  for (byte j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
//////////////////
//В каждом цыкле проверяем сменился ли "val" в прерывании и если да то выходим из цыкла
  if(val != temp_val)return;  
//////////////////////
   LEDS.setPixelColor(j, 255, 255, 255);
  LEDS.show();
}

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Код написан на Даун-Си. А это значит, что он уже глючен уже в задумке. Глубоко изучай Си и Си++, иначе вы врят ли чего-то полезное напишете. 

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

Спасбо, за посказку, пока работает.

Только в ЛЕД_8 не всегда віходит из подпрограмми.

Вопрост про кнопку, неуспеешь дотронутся как нажимается, как будто реагирует на дребезг, проскакует на один-два шага в перед. Как использовать millis() в даном скетче? 

void LEDS_8()  // Червоний кусочок бігає туди-сюди
{
  //Serial.println("LEDS_8");
  for(int i = 0; i < NUM_LEDS-EyeSize_8-2; i++)
  {
    if(val != temp_val)return;
    setAll_6(0,0,0);
    setPixel_6(i, red_8/10, green_8/10, blue_8/10);
  for(int j = 1; j <= EyeSize_8; j++) 
  {
    if(val != temp_val)return;
      //setPixel(i+j, red, green, blue);
      setPixel_6(i+j, red_8, green_8, blue_8); 
    }
    setPixel_6(i+EyeSize_8+1, red_8/10, green_8/10, blue_8/10);
    
    showStrip_6();
    delay(SpeedDelay_8);
  }

  delay(ReturnDelay_8);

  for(int i = NUM_LEDS-EyeSize_8-2; i > 0; i--)
  {
    if(val != temp_val)return;
    setAll_6(0,0,0);
    setPixel_6(i, red_81/10, green_81/10, blue_81/10);
    for(int j = 1; j <= EyeSize_8; j++) 
    {
      if(val != temp_val)return;
      setPixel_6(i+j, red_81, green_81, blue_81); 
    }
    setPixel_6(i+EyeSize_8+1, red_81/10, green_81/10, blue_81/10);
    showStrip_6();
    delay(SpeedDelay_8);
  }
  
  delay(ReturnDelay_8);
}

 

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

  //LEDS_0();   // Вся лінійка вимкнена
  //LEDS_1();   // Ліва/Права сторона (лінійка 0 і 3) світяться білим
  //LEDS_2();   // Ліва/Права сторона (лінійка 0 і 3) по-очереді моргають білим
  //LEDS_3();   // Ліва/Права сторона (лінійка 0 і 3) разом моргають білим
  //LEDS_4();   // Ліва/Права сторона (лінійка 0 і 3) по-очереді моргають синім і червоним
  //LEDS_5();   // Ліва/Права сторона (лінійка 0 і 3) разом моргають ЖОВТИМ
  //LEDS_6();   // Вся лінійка моргає білим, стробоскоп
  //LEDS_7();   // Вся одночасно лінійка переливається різними кольрами
  //LEDS_8();   // Червоний кусочок бігає туди-сюди

#include <Adafruit_NeoPixel.h>

#define   LED_PIN               11     // Вихід на свєтодіоди
#define   KEY_PIN               2     // Кнопка
#define   NUM_LEDS              144    // Кількість діодів на всі лінійці
#define   STICK_NUM             4      // Кількість сборок
#define   PIXEL_IN_STICK        36     // Кількість свєтодіодів в зборці
#define   PIXEL_NUM            (STICK_NUM * PIXEL_IN_STICK) // 4 х 36 = 144

boolean lastButton=LOW;
boolean currentButton=LOW;

int ledMode=0;
int d = 500;                    // Час затримки
int StickNum_0 = 0;             // Порядковий номер сборки 1
int StickNum_1 = 1;             // Порядковий номер сборки 2
int StickNum_2 = 2;             // Порядковий номер сборки 3
int StickNum_3 = 3;             // Порядковий номер сборки 4

//int val=9;
int val;
int temp_val = val;
int state;
int c;



// Змінні для LEDS_6(); // Вся лінійка моргає білим, стробоскоп
    byte red_6=255; 
    byte green_6=255; 
    byte blue_6=255; 
    int StrobeCount_6=10; 
    int FlashDelay_6=50; 
    int EndPause_6=1000; 
/*
// Змінні для LEDS_6(); // Вся лінійка моргає жовтим, стробоскоп
    byte red_6=255; //0xff
    byte green_6=199; //0x77
    byte blue_6=0; //0x00
    int StrobeCount_6=10; //10
    int FlashDelay_6=100; //100
    int EndPause_6=1000; //1000
*/
// Змінні для LEDS_8();  // Червоний кусочок бігає туди-сюди
    byte red_8=0; //255
    byte green_8=0; // 0
    byte blue_8=255; //0
    int EyeSize_8=20;
    int SpeedDelay_8=1;
    int ReturnDelay_8=50;

    byte red_81=255; //255
    byte green_81=0; // 0
    byte blue_81=255; //0


Adafruit_NeoPixel LEDS = Adafruit_NeoPixel(PIXEL_NUM, LED_PIN, NEO_GRB + NEO_KHZ800);

//----------------------------------------
void setup()
{  
  pinMode(KEY_PIN, INPUT_PULLUP);
  digitalWrite(KEY_PIN, HIGH);
  attachInterrupt(0, pinChange, CHANGE);
  Serial.begin(9600);
  LEDS.begin();
  LEDS.show();
  Serial.println("Open");
}

//----------------------------------------
void loop()
{ 
  Serial.println("loop");
  
  

  
//-----------
  if (val == 0) 
  { 
    temp_val = val;
    LEDS_0();
    Serial.println("led_0");
  }
  
//-----------
  if (val == 1) 
  {
    temp_val = val;
    LEDS_1();
    Serial.println("led_1");
  }
  
//-----------
  if (val == 2) 
  {
    temp_val = val;
    LEDS_2();
    Serial.println("led_2");
   }

//-----------
  if (val == 3) 
  {
    temp_val = val;
    LEDS_3();
    Serial.println("led_3");
   }

//-----------
  if (val == 4) 
  {
    temp_val = val;
    LEDS_4();
    Serial.println("led_4");
  }

//-----------
  if (val == 5) 
  {
    temp_val = val;
    LEDS_5();
    Serial.println("led_5");
  }

//-----------
  if (val == 6) 
  {
    temp_val = val;
    LEDS_6();
    Serial.println("led_6");
  }

//-----------
  if (val == 7)
  {
    temp_val = val;
    LEDS_7();
    Serial.println("led_7");
  }

//-----------
  if (val == 8) 
  {
    temp_val = val;
    LEDS_8();
    Serial.println("led_8");
  }

//-----------
  if (val == 9) 
  {
    temp_val = val;
    LEDS_9();
    Serial.println("led_9");
  }

//-----------
  if (val == 10) 
  {
    //LEDS_10();
    //Serial.println("led_10");
  }

//-----------
  if (val == 11) 
  {
    //LEDS_11();
    //Serial.println("led_11");
  }

//-----------
  if (val == 12) 
  {
    //LEDS_2();
    //Serial.println("led_12");
  }

//-----------

delay(10);  

}

//----------------------------------------

void pinChange()
{ 
  state = digitalRead(KEY_PIN);

  if (state == HIGH && c == 0) // нажали кнопку
  {
    c = 1;
  }
  if (state == LOW && c == 1) // отпустили кнопку
  {
    val = ++val;
    if (val == 10)
    {
      val = 0;
    }
    c = 0;
  }
  Serial.println("+*- ");
//delay(3000); 
Serial.print("+ ");
Serial.println(val);

 // **********************************
// ======= Вполняем задачу при выборе режима =======


}

//----------------------------------------
void LEDS_0() // Вся лінійка вимкнена
{
  //Serial.println("LEDS_0");
  LEDS.show();
  byte StartPixel = StickNum_0 * PIXEL_IN_STICK;
  
    for (byte i = StartPixel; i < (StartPixel + PIXEL_IN_STICK); i++)
      LEDS.setPixelColor(i, 0, 0, 0);  //(red,green,blue)
      LEDS.show();
      delay (d);

    for (byte i = StartPixel; i < (StartPixel + PIXEL_IN_STICK); i++)
      LEDS.setPixelColor(i, 0, 0, 0);
      LEDS.show();

  byte StartPixel_3 = StickNum_3 * PIXEL_IN_STICK;
  
    for (byte j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
      LEDS.setPixelColor(j, 0, 0, 0); //(red,green,blue)
      LEDS.show();
      delay (d);
      
    for (byte j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
      LEDS.setPixelColor(j, 0, 0, 0);
      LEDS.show();
}

//----------------------------------------
void LEDS_1() // Ліва/Права сторона (лінійка 0 і 3) світяться білим
{
  //Serial.println("LEDS_1");
  LEDS.show();
  byte StartPixel = StickNum_0 * PIXEL_IN_STICK;
  
    for (byte i = StartPixel; i < (StartPixel + PIXEL_IN_STICK); i++)
      LEDS.setPixelColor(i, 255, 255, 255); //(red,green,blue)
      LEDS.show();
      delay (d);

    for (byte i = StartPixel; i < (StartPixel + PIXEL_IN_STICK); i++)
      LEDS.setPixelColor(i, 255, 255, 255);
      LEDS.show();

  byte StartPixel_3 = StickNum_3 * PIXEL_IN_STICK;
  
    for (byte j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
      LEDS.setPixelColor(j, 255, 255, 255); //(red,green,blue)
      LEDS.show();
      delay (d);
      
    for (byte j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
      LEDS.setPixelColor(j, 255, 255, 255);
      LEDS.show();
}

//----------------------------------------
void LEDS_2() // Ліва/Права сторона (лінійка 0 і 3) по-очереді моргають білим 
{
  //Serial.println("LEDS_2");
  LEDS.show();
  byte StartPixel_0 = StickNum_0 * PIXEL_IN_STICK;
  
    for (byte i = StartPixel_0; i < (StartPixel_0 + PIXEL_IN_STICK); i++)
      if(val != temp_val)return
      LEDS.setPixelColor(i, 255, 255, 255);  //(red,green,blue)
      LEDS.show();
      delay (d);

    for (byte i = StartPixel_0; i < (StartPixel_0 + PIXEL_IN_STICK); i++)
      if(val != temp_val)return
      LEDS.setPixelColor(i, 0, 0, 0);
      LEDS.show();

  byte StartPixel_3 = StickNum_3 * PIXEL_IN_STICK;
  
    for (byte j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
      if(val != temp_val)return
      LEDS.setPixelColor(j, 255, 255, 255); //(red,green,blue)
      LEDS.show();
      delay (d);
      
    for (byte j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
      if(val != temp_val)return
      LEDS.setPixelColor(j, 0, 0, 0);
      LEDS.show();
}

//----------------------------------------
void LEDS_3() // Ліва/Права сторона (лінійка 0 і 3) разом моргають білим
{
  //Serial.println("LEDS_3");
  LEDS.show();
  byte StartPixel = StickNum_0 * PIXEL_IN_STICK;
  
    for (byte i = StartPixel; i < (StartPixel + PIXEL_IN_STICK); i++)
      LEDS.setPixelColor(i, 255, 255, 255); //(red,green,blue)
      LEDS.show();
      delay (d);

    for (byte i = StartPixel; i < (StartPixel + PIXEL_IN_STICK); i++)
      LEDS.setPixelColor(i, 0, 0, 0);
      LEDS.show();

  byte StartPixel_3 = StickNum_3 * PIXEL_IN_STICK;
  
    for (byte j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
      LEDS.setPixelColor(j, 0, 0, 0); //(red,green,blue)
      LEDS.show();
      delay (d);
      
    for (byte j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
      LEDS.setPixelColor(j, 255, 255, 255);
      LEDS.show();
}

//----------------------------------------
void LEDS_4() // Ліва/Права сторона (лінійка 0 і 3) по-очереді моргають синім і червоним
{
  //Serial.println("LEDS_4");
  LEDS.show();
  byte StartPixel = StickNum_0 * PIXEL_IN_STICK;
  
    for (byte i = StartPixel; i < (StartPixel + PIXEL_IN_STICK); i++)
      LEDS.setPixelColor(i, 255, 0, 0); //(red,green,blue)
      LEDS.show();
      delay (d);

    for (byte i = StartPixel; i < (StartPixel + PIXEL_IN_STICK); i++)
      LEDS.setPixelColor(i, 0, 0, 0);
      LEDS.show();

  byte StartPixel_3 = StickNum_3 * PIXEL_IN_STICK;
  
    for (byte j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
      LEDS.setPixelColor(j, 0, 0, 255);//(red,green,blue)
      //LEDS.setPixelColor(j, 255, 255, 255); 
      LEDS.show();
      delay (d);
      
    for (byte j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
      LEDS.setPixelColor(j, 0, 0, 0);
      LEDS.show();
}
//----------------------------------------

void LEDS_5() // Ліва/Права сторона (лінійка 0 і 3) разом моргають ЖОВТИМ
{
  //Serial.println("LEDS_5");
  LEDS.show();
  byte StartPixel_0 = StickNum_0 * PIXEL_IN_STICK;
  
    for (byte i = StartPixel_0; i < (StartPixel_0 + PIXEL_IN_STICK); i++)
      LEDS.setPixelColor(i, 0, 0, 0); //(red,green,blue)
      LEDS.show();
      delay (d);

    for (byte i = StartPixel_0; i < (StartPixel_0 + PIXEL_IN_STICK); i++)
      LEDS.setPixelColor(i, 255, 255, 0);
      LEDS.show();

  byte StartPixel_3 = StickNum_3 * PIXEL_IN_STICK;
  
    for (byte j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
      LEDS.setPixelColor(j, 255, 255, 0); //(red,green,blue)
      LEDS.show();
      delay (d);
      
    for (byte j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
      LEDS.setPixelColor(j, 0, 0, 0);
      LEDS.show();
}

//----------------------------------------
void LEDS_6() // Вся лінійка моргає білим, стробоскоп
{
  //Serial.println("LEDS_6");
  for(int j = 0; j < StrobeCount_6; j++) {
    setAll_6(red_6,green_6,blue_6);
    showStrip_6();
    delay(FlashDelay_6);
    setAll_6(0,0,0);
    showStrip_6();
    delay(FlashDelay_6);
  }
 
 delay(EndPause_6);
}

//----------------------------------------
void LEDS_7() // Вся одночасно лінійка переливається різними кольрами
{
  //Serial.println("LEDS_7");
  for(int j = 0; j < 3; j++ ) { 
    // Fade IN
    for(int k = 0; k < 256; k++) { 
      switch(j) { 
        case 0: setAll_6(k,0,0); break;
        case 1: setAll_6(0,k,0); break;
        case 2: setAll_6(0,0,k); break;
      }
      showStrip_6();
      delay(3);
    }
    // Fade OUT
    for(int k = 255; k >= 0; k--) { 
      switch(j) { 
        case 0: setAll_6(k,0,0); break;
        case 1: setAll_6(0,k,0); break;
        case 2: setAll_6(0,0,k); break;
      }
      showStrip_6();
      delay(3);
    }
  }
}

//----------------------------------------
void LEDS_8()  // Червоний кусочок бігає туди-сюди
{
  //Serial.println("LEDS_8");
  for(int i = 0; i < NUM_LEDS-EyeSize_8-2; i++)
  {
    if(val != temp_val)return;
    setAll_6(0,0,0);
    setPixel_6(i, red_8/10, green_8/10, blue_8/10);
  for(int j = 1; j <= EyeSize_8; j++) 
  {
    if(val != temp_val)return;
      //setPixel(i+j, red, green, blue);
      setPixel_6(i+j, red_8, green_8, blue_8); 
    }
    setPixel_6(i+EyeSize_8+1, red_8/10, green_8/10, blue_8/10);
    
    showStrip_6();
    delay(SpeedDelay_8);
  }

  delay(ReturnDelay_8);

  for(int i = NUM_LEDS-EyeSize_8-2; i > 0; i--)
  {
    if(val != temp_val)return;
    setAll_6(0,0,0);
    setPixel_6(i, red_81/10, green_81/10, blue_81/10);
    for(int j = 1; j <= EyeSize_8; j++) 
    {
      if(val != temp_val)return;
      setPixel_6(i+j, red_81, green_81, blue_81); 
    }
    setPixel_6(i+EyeSize_8+1, red_81/10, green_81/10, blue_81/10);
    showStrip_6();
    delay(SpeedDelay_8);
  }
  
  delay(ReturnDelay_8);
}

//----------------------------------------

//----------------------------------------
void LEDS_9() // Ліва/Права сторона (лінійка 0 і 3) світяться білим
{
  //Serial.println("LEDS_99");
  LEDS.show();
  byte StartPixel_0 = StickNum_0 * PIXEL_IN_STICK;
  byte StartPixel_1 = StickNum_1 * PIXEL_IN_STICK;
  byte StartPixel_2 = StickNum_2 * PIXEL_IN_STICK;
  byte StartPixel_3 = StickNum_3 * PIXEL_IN_STICK;

  byte j;
  byte i;

    //LEDS.show();

    for (i = StartPixel_0; i < (StartPixel_0 + PIXEL_IN_STICK); i++)
       LEDS.setPixelColor(i, 255, 255, 255);  //(red,green,blue)
    for (j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
       LEDS.setPixelColor(j, 255, 255, 255);  //(red,green,blue)


    LEDS.show();
    delay (d);

  
    for (i = StartPixel_0; i < (StartPixel_0 + PIXEL_IN_STICK); i++)
       LEDS.setPixelColor(i, 255, 255, 255);  //(red,green,blue)
    for (j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
       LEDS.setPixelColor(j, 255, 255, 255);  //(red,green,blue)

    LEDS.show();
    delay (d);

    for (i = StartPixel_0; i < (StartPixel_0 + PIXEL_IN_STICK); i++)
       LEDS.setPixelColor(i, 0, 0, 0);  //(red,green,blue)
    for (j = StartPixel_3; j < (StartPixel_3 + PIXEL_IN_STICK); j++)
       LEDS.setPixelColor(j, 0, 0, 0);  //(red,green,blue)
    LEDS.show();
      
    for (i = StartPixel_1; i < (StartPixel_1 + PIXEL_IN_STICK); i++)
       LEDS.setPixelColor(i, 255, 255, 255);  //(red,green,blue)
    for (j = StartPixel_2; j < (StartPixel_2 + PIXEL_IN_STICK); j++)
       LEDS.setPixelColor(j, 255, 255, 255);  //(red,green,blue)

    LEDS.show();
    delay (d);

    for (i = StartPixel_1; i < (StartPixel_1 + PIXEL_IN_STICK); i++)
       LEDS.setPixelColor(i, 0, 0, 0);  //(red,green,blue)
    for (j = StartPixel_2; j < (StartPixel_2 + PIXEL_IN_STICK); j++)
       LEDS.setPixelColor(j, 0, 0, 0);  //(red,green,blue)
      
     LEDS.show();

}
//----------------------------------------
//////////// ----------------------------////////////
void showStrip_6() 
{
 #ifdef ADAFRUIT_NEOPIXEL_H 
   // NeoPixel
   LEDS.show();
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H
   // FastLED
   FastLED.show();
 #endif
}

void setPixel_6(int Pixel, byte red, byte green, byte blue) 
{
 #ifdef ADAFRUIT_NEOPIXEL_H 
   // NeoPixel
   LEDS.setPixelColor(Pixel, LEDS.Color(red, green, blue));
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H 
   // FastLED
   leds[Pixel].r = red;
   leds[Pixel].g = green;
   leds[Pixel].b = blue;
 #endif
}

void setAll_6(byte red, byte green, byte blue) 
{
  for(int i = 0; i < NUM_LEDS; i++ ) {
    if(val != temp_val)return;
    setPixel_6(i, red, green, blue); 
  }
  showStrip_6();
}

//////////// ----------------------------////////////

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Вот ссылка https://lesson.iarduino.ru/page/podklyuchaem-moduli-neopixel-na-baze-ws2812b-svetodiodov-k-arduino/

#include <Adafruit_NeoPixel.h>
const byte Leds_pin=6; // номер порта к которому подключен модуль
const byte max_led=8; // количество светодиодов 
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(max_led, Leds_pin, NEO_GRB + NEO_KHZ800);
void setup() {
  pixels.begin();
  pixels.show(); // Устанавливаем все светодиоды в состояние "Выключено"
  pixels.setPixelColor(0, pixels.Color(250, 150, 0)); // Назначаем для 0 светодиода цвет
  pixels.setPixelColor(1, pixels.Color(0, 150, 0)); // Назначаем для 1 светодиода цвет 
  pixels.setPixelColor(2, pixels.Color(250, 150, 0)); // Назначаем для 2 светодиода цвет 
  pixels.setPixelColor(3, pixels.Color(0, 0, 250)); // Назначаем для 3 светодиода цвет 
  pixels.setPixelColor(4, pixels.Color(0, 150, 0)); // Назначаем для 4 светодиода цвет 
  pixels.setPixelColor(5, pixels.Color(250, 150, 0)); // Назначаем для 5 светодиода цвет 
  pixels.setPixelColor(6, pixels.Color(0, 0, 250)); // Назначаем для 6 светодиода цвет 
  pixels.setPixelColor(7, pixels.Color(250, 150, 0)); // Назначаем для 7 светодиода цвет 
  pixels.show();
}
void loop() {

}

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Вот так надо решать эту задачу. А не писать Даун-Си кодом программы, как делают некоторые.

/*ws2812
   линия светодиодов -->6
   кнопка режим      -->2  программная подтяжка на+5В
*/
#include <Adafruit_NeoPixel.h>
const byte Leds_pin = 6; // номер порта к которому подключен модуль
const byte max_led = 8; // количество светодиодов
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(max_led, Leds_pin, NEO_GRB + NEO_KHZ800);
byte Mode = 0; // переменая режим
const byte Mode_max = 4; // режимы 0,1,2,3,4   4 это максимальный режим
void (*Mode_setup)();// делаем указатель на функцию setup()
void (*Mode_loop)() ;// делаем указатель на функцию loop()
//--- режим 0
void Mode_0_setup() {
  for (byte i = 0; i < max_led; ++i) {
    if (i % 3 == 0)pixels.setPixelColor(i, pixels.Color(250, 0, 0)); // Назначаем для 0 светодиода цвет
    if (i % 3 == 1)pixels.setPixelColor(i, pixels.Color(0, 250, 0)) ; // Назначаем для 1 светодиода цвет
    if (i % 3 == 2)pixels.setPixelColor(i, pixels.Color(0, 0, 250)) ; // Назначаем для 2 светодиода цвет
  }
  pixels.show();
}
void Mode_0_loop() {
  // ничего не меняется в этом режиме
}
//--- режим 1
void Mode_1_setup() {
  for (byte i = 0; i < max_led; ++i) {
    if (i % 3 == 0)pixels.setPixelColor(i, pixels.Color(0, 0, 250)) ; // Назначаем для 2 светодиода цвет
    if (i % 3 == 1)pixels.setPixelColor(i, pixels.Color(250, 0, 0)); // Назначаем для 0 светодиода цвет
    if (i % 3 == 2)pixels.setPixelColor(i, pixels.Color(0, 250, 0)) ; // Назначаем для 1 светодиода цвет
  }
  pixels.show();
}
void Mode_1_loop() {
  // ничего не меняется в этом режиме
}
//--- режим 2
void Mode_2_setup() {
  for (byte i = 0; i < max_led; ++i) {
    if (i % 3 == 0)pixels.setPixelColor(i, pixels.Color(0, 250, 0)) ; // Назначаем для 1 светодиода цвет
    if (i % 3 == 1)pixels.setPixelColor(i, pixels.Color(0, 0, 250)) ; // Назначаем для 2 светодиода цвет
    if (i % 3 == 2)pixels.setPixelColor(i, pixels.Color(250, 0, 0)); // Назначаем для 0 светодиода цвет
  }
  pixels.show();
}
void Mode_2_loop() {
  // ничего не меняется в этом режиме
}
//--- режим 3
void Mode_3_setup() {
  for (byte i = 0; i < max_led; ++i)
    pixels.setPixelColor(i, pixels.Color(0, 0, 0)) ;
  pixels.show();
}
void Mode_3_loop() {
  static uint32_t past = 0;
  static bool j = 0;
  if (millis() - past > 500) {
    past = millis();
    j = !j;
    for (byte i = 0; i < max_led; ++i) {
      if (j)pixels.setPixelColor(i, pixels.Color(250, 250, 250));
      else pixels.setPixelColor(i, pixels.Color(0, 0, 0)) ;
    }
    pixels.show();
  }
}
//--- режим 4
void Mode_4_setup() {
  for (byte i = 0; i < max_led; ++i)
    pixels.setPixelColor(i, pixels.Color(0, 0, 0)) ;
  pixels.show();
}
void Mode_4_loop() {
  static uint32_t past = 0;
  static byte j = 0;
  if (millis() - past > 10) {
    past = millis();
    ++j;
    for (byte i = 0; i < max_led; ++i)
      pixels.setPixelColor(i, pixels.Color(j, j, j)) ;
    pixels.show();
  }
}
//----------------class Cl_Btn----------------------------
class Cl_Btn {
    byte pin ; // номер ноги на кнопке
    void (* Do)();
    bool btn, btn_old;
    bool bounce_btn = 0; // антидребезговый флаг
    uint32_t past = 0 ;
  public:
    Cl_Btn(byte _pin, void (* _Do)()): pin(_pin), Do(_Do) {};
    void setup() {
      pinMode(pin, INPUT_PULLUP);// подключить кнопку  с подтяжкой
      btn = digitalRead(pin); // прочитать реальное значение на выводе};
    }
    void loop() {
      if (! bounce_btn && btn != digitalRead(pin)) { // если прошел фронт изм на выводн
        bounce_btn = 1;                                 // выставить флаг
        past = millis();                         // сделать временую засветку
      }
      else if ( bounce_btn && millis() - past >= 5 ) { // если прошло антидребезговое время
        bounce_btn = 0;      // то снять флаг
        btn_old = btn ;
        btn = digitalRead(pin) ; // прочитать реальное значение на выводе
        if (btn_old && ! btn)  Do();
      }
    }
};
//------------------------------
void Do_Btn1() {
  Mode++;
  Serial.println(Mode);
  if (Mode == 1) {
    Mode_setup = Mode_1_setup;
    Mode_loop = Mode_1_loop;
  } else if (Mode == 2) {
    Mode_setup = Mode_2_setup;
    Mode_loop = Mode_2_loop;
  } else if (Mode == 3) {
    Mode_setup = Mode_3_setup;
    Mode_loop = Mode_3_loop;
  } else if (Mode == 4) {
    Mode_setup = Mode_4_setup;
    Mode_loop = Mode_4_loop;
  } else {
    Mode = 0;
    Mode_setup = Mode_0_setup;
    Mode_loop = Mode_0_loop;
  }
  Mode_setup();
}
Cl_Btn Btn1(2 , Do_Btn1);// подключить кнопку на выв 2
void setup() {
  Serial.begin(9600);
  pixels.begin();
  Do_Btn1();
  Mode_setup();
  Btn1.setup();
}
void loop() {
  Mode_loop();
  Btn1.loop();
}

 

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

Всем спасибо. Я не волшебник, я только учусь )))

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

Благодарствую за помощь.

Все заработало.

Только в одна из подпрогамм не реагирует на кнопку, вошел в режим-6, режим запустился, при последующем нажатии нет реакции на кнопку.

 

void Mode_6_loop() { 
  Serial.println("LEDS_66");

  static uint32_t past = 0;
  static bool j = 0;
  if (millis() - past > 500) {
    past = millis();
    j = !j;

    for(int j = 0; j < 10; j++) { 
      for(int i = 0; i < 144; i++ ) {
        if(val != temp_val)return;
        pixels.setPixelColor(i, pixels.Color(red_6,green_6,blue_6));
      }
    pixels.show();
    delay(100); 

    for(int i = 0; i < 144; i++ ) {
      if(val != temp_val)return;
      pixels.setPixelColor(i, pixels.Color(0,0,0));
      }
    pixels.show();
    delay(100); 
 
    }
  delay(1000); 
}

  
}

 

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

Єто режим стробоскопа 

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

delay(FlashDelay_6); //FlashDelay_6 = 100

шо это за херня?

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

извините исправлю. Задержка 100мс

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

Єто часть кода

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

Насколько я понимаю проблема в задержке  - delay, подскажите как сделать через milles. Спасибо

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

vidro_boltiv пишет:

подскажите как сделать через milles. Спасибо

#392

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
void Mode_6_loop() {
  Serial.println("LEDS_66");
  static uint32_t past = 0;
  static bool j = 0;
  if (millis() - past > 1000) { // длительность пакета или паузы между пакетами 1сек
    past = millis();
    j = !j; if (!j) {
      static uint32_t past1 = 0;
      static bool  j1 = 0;
      if (millis() - past1 > 100) { // полупериод пакета 0,1сек
        past = millis();
        j1 = !j1;
        if (!j1) for (int i = 0; i < 144; i++) pixels.setPixelColor(i, pixels.Color(red_6, green_6, blue_6));
        else     for (int i = 0; i < 144; i++) pixels.setPixelColor(i, pixels.Color(0, 0, 0));
        pixels.show();
      }
    }
  }
}// end Mode_6_loop()

 

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

Спасибо

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

Немного не тот эфект получается ))).

Это требуэмый эфект  - https://drive.google.com/file/d/0B6Q_8K_WZ8uuUXprUXB4TzQ0VEE/view?usp=sharing

Он работает как надо. Только не реагирует на нажатия кнопки.

Это эвект по вашему испраленому коду https://drive.google.com/file/d/0B6Q_8K_WZ8uuanRkdHRlem0wODQ/view?usp=sharing

Я понима что проблема в ДЕЛЕЙ, но никак неполучается сделать этот эфеткр на МИЛЛИС,

Спасибо, всем помогающим

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Попробуйте так

void Mode_6_loop() {
  Serial.println("LEDS_66");
  static uint32_t past = 0;
  static bool j = 0;
  if (millis() - past > 1000) { // длительность пакета или паузы между пакетами 1сек
    past = millis();
    j = !j;
  }
  if (!j) {
    static uint32_t past1 = 0;
    static bool  j1 = 0;
    static bool flag = 0;
    if (millis() - past1 > 100) { // полупериод пакета 0,1сек
      past = millis();
      j1 = !j1;
      flag = j1;
    }
    if (!j1 && !flag) {
      for (int j = 0; j < 10; j++) {
       if (val != temp_val)return;
        for (int i = 0; i < 144; i++ ) {
          if (val != temp_val)return;
          pixels.setPixelColor(i, pixels.Color(red_6, green_6, blue_6));
        }
        flag = !flag;
      }
    }
    if (j1 && flag) {
      for (int i = 0; i < 144; i++ ) {
        if (val != temp_val)return;
        pixels.setPixelColor(i, pixels.Color(0, 0, 0));
      }
      flag = !flag;
    }
    pixels.show();
  }
}

 

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

Спасибо

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

Неработает как надо.

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

void mode_6_loop() { 
  Serial.println("leds_66");  // Для отладки
  // Змінні для Режима-6; 
  byte red = 255; 
  byte green = 255; 
  byte blue = 255; 
  int strobe_count = 10; 

  static uint32_t past = 0;
  static bool j = 0;

  if (millis() - past > 1000) {
    past = millis();
    j = !j; if (!j) { 
      for(int k = 0; k < strobe_count; k++) {
        for(int i = 0; i < max_led; i++ ) {
          pixels.setPixelColor(i, pixels.Color(red,green,blue));
        }
        pixels.show();
        delay(100);

        for(int i = 0; i < max_led; i++ ) {
          pixels.setPixelColor(i, pixels.Color(0,0,0));
        }
        pixels.show();
        delay(100); 
      }
    }
    //delay(1000);
  }

}

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

Весь код переписан по примеру в посте #9

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

По этому коду  моргает линейка постоянно ,без пауз. Должно быть 10 вспышек, пауза 1 сек, и опять 10 вспышек.

void mode_6_loop() { 
  Serial.println("leds_66");  // Для отладки
  // Змінні для Режима-6; 
  byte red = 255; 
  byte green = 255; 
  byte blue = 255; 
  int strobe_count = 10; 

  static uint32_t past = 0;
  static bool j = 0;
  static bool flag = 0;

  if (millis() - past > 1000) {
    past = millis();
    j = !j; 
  } 
  
  if (!j) {
    static uint32_t past1 = 0;
    static bool  j1 = 0;
    static bool flag = 0;
    
    if (millis() - past1 > 100) { // полупериод пакета 0,1сек
      past = millis();
      j1 = !j1;
      flag = j1;
    }

    if (!j1 && !flag) {
      for (int j = 0; j < 10; j++) 
        for (int i = 0; i < 144; i++ ) 
          pixels.setPixelColor(i, pixels.Color(red, green, blue));
          flag = !flag;
        }

    if (j1 && flag) {
      for (int i = 0; i < 144; i++ )
      pixels.setPixelColor(i, pixels.Color(0, 0, 0));
      flag = !flag;
    }
    pixels.show();
  }

}

 

b707
Offline
Зарегистрирован: 26.05.2017

в 24 строке явно должно быть past1, а не past

Кроме того, непонятно, зачем вы обьявляете flag дважды и не ясно. зачем он и куча других переменных обьявлено static - я не вижу. чтобы вы их использовали между циклами.

И еще в 30-й строке я бы заменил итератор с j на какую-то другую букву - просто чтобы не путаться

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

Я не профи, я только иследую ардуино, так что уж извиняйте )))) . Сейчас попобую.

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

Спасибо всем, этот режим-6 заработал!!!! 

Режим-8. Работает как нада, но не реагирует на кнопку.

часть с 20 сведодиодов "бегает" с края в край.

void mode_8_loop() { 
  Serial.println("leds_88");  // Для отладки
  // Змінні для Режима-8;  
  byte red = 0; 
  byte green = 0; 
  byte blue = 255; 
  int pixel_size = 20;

      for(int i = 0; i < max_led - pixel_size - 2; i++) {
        for(int i = 0; i < max_led; i++ ) {
          pixels.setPixelColor(i, pixels.Color(0, 0, 0));
        }
        pixels.setPixelColor(i, pixels.Color(red, green, blue));
        pixels.show();
        
        
            for(int k = 1; k <= pixel_size; k++) {
              pixels.setPixelColor(i+k, pixels.Color(red, green, blue));
            }
            pixels.setPixelColor(i + pixel_size + 1, pixels.Color(red, green, blue));
            pixels.show();
            delay(1);
      
  }

      for(int i = max_led - pixel_size - 2; i > 0; i--) {
        for(int i = 0; i < max_led; i++ ) {
          pixels.setPixelColor(i, pixels.Color(0, 0, 0));
        }
        pixels.setPixelColor(i, pixels.Color(red, green, blue));
        pixels.show();

            for(int k = 1; k <= pixel_size; k++) {
              pixels.setPixelColor(i+k, pixels.Color(red, green, blue));
            }
            pixels.setPixelColor(i + pixel_size + 1, pixels.Color(red, green, blue));
            pixels.show();
            delay(1);
  
  }
  
}

 

 

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

И по режиму-6, все заработало, только между вспышками, не тухнет вся линейка, а горит. Работает так - 10 вспышек, и гори 1 сек, и опять 10 вспышек, нужно - 10 вспышек и ТУХНЕТ ))) 

b707
Offline
Зарегистрирован: 26.05.2017

vidro_boltiv пишет:

И по режиму-6, все заработало, только между вспышками, не тухнет вся линейка, а горит. Работает так - 10 вспышек, и гори 1 сек, и опять 10 вспышек, нужно - 10 вспышек и ТУХНЕТ ))) 

Самое простое - период большего цикла у вас должен включать нечетное кол-во малых циклов. Например, в строке 13 период вместо 1000 поставьте или 900 или 1100

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

b707 пишет:

vidro_boltiv пишет:

И по режиму-6, все заработало, только между вспышками, не тухнет вся линейка, а горит. Работает так - 10 вспышек, и гори 1 сек, и опять 10 вспышек, нужно - 10 вспышек и ТУХНЕТ ))) 

Самое простое - период большего цикла у вас должен включать нечетное кол-во малых циклов. Например, в строке 13 период вместо 1000 поставьте или 900 или 1100

Пробывал - ничего неизменилось. 

Суть в том что некоторое время поргает и светится, потом моргает и тухнет, потом все повторяется.

Могу видео снять или выложить весь код.

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

Изменяя период в троке 13 и 23 (режим-6), лента ведет себя по разному, ни не так как нада .

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

#25

b707
Offline
Зарегистрирован: 26.05.2017

Все правильно. У вас малый цикл исполняется каждые 100мсек, но перключение лент тоже требует времени и 10 таких циклов занимают не 1000 мсек, а немного больше. Разница эта все время растет и поэтому переключение программы "плавает".

Вам надо в большем цикле переключать параметр j не по времени, а по числу малых циклов. 10 малых циклов отыграло - поменяли j на !j

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

b707 пишет:

Вам надо в большем цикле переключать параметр j не по времени, а по числу малых циклов. 10 малых циклов отыграло - поменяли j на !j

С этим чет не понял, сори.

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

По коду из #25

В 13 строчке увеличте время ~ 2000 (if (millis() - past > 2000)

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Для того чтобы потушить, между вспышками, после окончания цыкла , for, выход установите в 0

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

Пробывал увеличивать - не помогло.

Также пробывал тушить в конце - не тот эфект получается.

Возможно не там тушил

Спаибо что откликнулись

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Можно узнать что у Вас "не помогло" нет паузы между 10ю вспышками, Нет отключения после вспышек или то и другое?

 

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

Запуск режима - потухла лента на 1 сек - 10 вспышек - засветилась 1 сек - 10 вспышек - зесветилась 1 сек, иногда тухнет на 1 сек, нужно чтоб после вспышек тухла! А НЕ Засвечивалась! 

Если нада - могу снять видео!

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016
vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Жаль проверить не на чем. попробуйте и отпишите


void mode_6_loop() {
  Serial.println("leds_66");  // Для отладки
  // Змінні для Режима-6;
  byte red = 255;
  byte green = 255;
  byte blue = 255;
  int strobe_count = 10;

  static uint32_t past = 0;
  static bool j = 1;
  static bool flag = 0;

  if (j && millis() - past > 1000) {

    j = !j;
  }

  if (!j) {
    static uint32_t past1 = 0;
    static bool  j1 = 1;
    // static bool flag = 0;

    if (millis() - past1 > 100) { // полупериод пакета 0,1сек
      past = millis();
      j1 = !j1;
      flag = j1;
    }

    if (!j1 && !flag) {
      for (int j = 0; j < 10; j++) {
        for (int i = 0; i < 144; i++ ) {
          pixels.setPixelColor(i, pixels.Color(red, green, blue));
          flag = !flag;
        }
      }
    }
    LEDS_0();

    if (j1 && flag) {
      for (int i = 0; i < 144; i++ ) {
        pixels.setPixelColor(i, pixels.Color(0, 0, 0));
        flag = !flag;
        j = 1;
        past = millis();
      }
    }
    LEDS_0();
    pixels.show();
  }

}

 

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

https://drive.google.com/open?id=0B6Q_8K_WZ8uuUGYwV0RBcUd0c2M - Эфект как у меня, смотрите эфект-6, после вспышек - горит вся лента.

https://drive.google.com/open?id=0B6Q_8K_WZ8uubGVydHZSTUdPMEk - эфект по примеру #42, не работает как надо.

Весь код (неправильно работает эфект 6 и 8)


/*  ws2812 - Переключение множества режимов одной кнопкой.
  Режим-1 - Вся лінійка вимкнена
  Режим-2 - Вся лінійка горить трьома кольорами, через два діоди - червоний, зелений, синій
  Режим-3 - Ліва/Права сторона (лінійка 1 і 4) світяться білим
  Режим-4 - Ліва/Права сторона (лінійка 1 і 4) по-очереді моргають білим
  Режим-5 - Вся лінійка моргає білим
  Режим-6 - Вся лінійка моргає білим, стробоскоп
  Режим-7 - Ліва/Права сторона (лінійка 1 і 4) по-очереді моргають синім і червоним
  Режим-8 - Синя лініка  бігає туди-сюди

*/

#include <Adafruit_NeoPixel.h>

#define   leds_pin        11    // Вихід на свєтодіоди (на лінійку) / Вывод на светодиоды (на линейку)
#define   key_pin         2     // Вивід на кнопка / Вывод на кнопку
#define   max_led         144   // Кількість всіх діодів / Количество всех диодом
#define   stick_num       4     // Кількість сборок (лінійок) / Количество сборок (линеек)
#define   pixel_in_stick  36    // Кількість свєтодіодів в зборці (лінійці) / Количество светодиодов в сборке (линейке)
//#define   pixel_num            (stick_num * pixel_in_stick) // 4 х 36 = 144

byte mode = 0;                  // Змінна режиму / Переменая режима
const byte mode_max = 8;        // Режими 0,1,2,3,4...   8 це максимальний режим / Режимы 0,1,2,3,4... 8 это максимальный режим

//int d1 = 500;                   // Час затримки / Время задержки
int stick_num_0 = 0;            // Порядковий номер зборки (лінійки) 1 / Последовательный номер сборки (линейки) 1
int stick_num_1 = 1;            // Порядковий номер зборки (лінійки) 2 / Последовательный номер сборки (линейки) 2
int stick_num_2 = 2;            // Порядковий номер зборки (лінійки) 3 / Последовательный номер сборки (линейки) 3
int stick_num_3 = 3;            // Порядковий номер зборки (лінійки) 4 / Последовательный номер сборки (линейки) 4

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(max_led, leds_pin, NEO_GRB + NEO_KHZ800);

void (*mode_setup)();           // робимо вказівник на функцію setup() / делаем указатель на функцию setup()
void (*mode_loop)() ;           // робимо вказівник на функцію loop() / делаем указатель на функцию loop()

//------------------------------- режим 1 -------------------------------
// Вся лінійка вимкнена
void mode_1_setup() {
  Serial.println("leds_1");  // Для отладки
  for (byte i = 0; i < max_led; ++i) {
    if (i % 3 == 0)pixels.setPixelColor(i, pixels.Color(0, 0, 0));  // Назначаем для 0 светодиода цвет //(red,green,blue)
    if (i % 3 == 1)pixels.setPixelColor(i, pixels.Color(0, 0, 0));  // Назначаем для 1 светодиода цвет //(red,green,blue)
    if (i % 3 == 2)pixels.setPixelColor(i, pixels.Color(0, 0, 0));  // Назначаем для 2 светодиода цвет //(red,green,blue)
  }
  pixels.show();
}

void mode_1_loop() {
  Serial.println("leds_11");  // Для отладки
  // ничего не меняется в этом режиме
}

//------------------------------- режим 2 -------------------------------
// Вся лінійка горить трьома кольорами, через два діоди - червоний, зелений, синій
void mode_2_setup() {
  Serial.println("leds_2");  // Для отладки
  
  for (byte i = 0; i < max_led; ++i) {
    if (i % 3 == 0)pixels.setPixelColor(i, pixels.Color(250, 0, 0));  // Назначаем для 0 светодиода цвет //(red,green,blue)
    if (i % 3 == 1)pixels.setPixelColor(i, pixels.Color(0, 250, 0));  // Назначаем для 1 светодиода цвет //(red,green,blue)
    if (i % 3 == 2)pixels.setPixelColor(i, pixels.Color(0, 0, 250));  // Назначаем для 2 светодиода цвет //(red,green,blue)
  }
  pixels.show();
}
 
void mode_2_loop() {
  // ничего не меняется в этом режиме
  Serial.println("leds_22");  // Для отладки
}

//------------------------------- режим 3 -------------------------------
// Ліва/Права сторона (лінійка 1 і 4) світяться білим
void mode_3_setup() {
  Serial.println("leds_3");  // Для отладки
  for (byte i = 0; i < max_led; ++i)
    pixels.setPixelColor(i, pixels.Color(0, 0, 0)); //(red,green,blue)
  pixels.show();
}

void mode_3_loop() { 
  Serial.println("leds_33");  // Для отладки
  byte start_pixel_0 = stick_num_0 * pixel_in_stick;
  byte start_pixel_3 = stick_num_3 * pixel_in_stick;
  static uint32_t past = 0;
  static bool j = 0;
  
  if (millis() - past > 500) {
    past = millis();
    j = !j;

//--- лінійка-1
    for (byte i = start_pixel_0; i < (start_pixel_0 + pixel_in_stick); ++i) {
      pixels.setPixelColor(i, pixels.Color(255, 255, 255)) ;
    }
    
//--- лінійка-4
    for (byte i = start_pixel_3; i < (start_pixel_3 + pixel_in_stick); ++i) {
      pixels.setPixelColor(i, pixels.Color(255, 255, 255)) ;
    }
  pixels.show();
  }
}

//------------------------------- режим 4 -------------------------------
// Ліва/Права сторона (лінійка 1 і 4) по-очереді моргають білим
void mode_4_setup() {
  Serial.println("leds_4");  // Для отладки
  for (byte i = 0; i < max_led; ++i)
    pixels.setPixelColor(i, pixels.Color(0, 0, 0)); //(red,green,blue)
  pixels.show();
}

void mode_4_loop() {
  Serial.println("leds_44");  // Для отладки
  byte start_pixel_0 = stick_num_0 * pixel_in_stick;
  byte start_pixel_3 = stick_num_3 * pixel_in_stick;
  static uint32_t past = 0;
  static bool j = 0;
  
  if (millis() - past > 500) {
    past = millis();
    j = !j;

//--- лінійка-1
    for (byte i = start_pixel_0; i < (start_pixel_0 + pixel_in_stick); ++i) {
      if (j)pixels.setPixelColor(i, pixels.Color(255, 255, 255));
      else pixels.setPixelColor(i, pixels.Color(0, 0, 0)) ;
    }

//--- лінійка-4
    for (byte i = start_pixel_3; i < (start_pixel_3 + pixel_in_stick); ++i) {
      if (j)pixels.setPixelColor(i, pixels.Color(255, 255, 255));
      else pixels.setPixelColor(i, pixels.Color(0, 0, 0)) ;
    }
  pixels.show();
  }
}

//------------------------------- режим 5 -------------------------------
// Вся лінійка моргає білим
void mode_5_setup() { 
  Serial.println("leds_5");  // Для отладки
  for (byte i = 0; i < max_led; ++i)
    pixels.setPixelColor(i, pixels.Color(0, 0, 0)); //(red,green,blue)
  pixels.show();
}

void mode_5_loop() {
  Serial.println("leds_55");  // Для отладки
  static uint32_t past = 0;
  static bool j = 0;
  
  if (millis() - past > 500) {
    past = millis();
    j = !j;
    for (byte i = 0; i < max_led; ++i) {
      if (j)pixels.setPixelColor(i, pixels.Color(255, 255, 255));
      else pixels.setPixelColor(i, pixels.Color(0, 0, 0)) ;
    }
    pixels.show();
  }
}

//------------------------------- режим 6 -------------------------------
// Вся лінійка моргає білим, стробоскоп
void mode_6_setup() { 
  Serial.println("leds_6");  // Для отладки
  for (byte i = 0; i < max_led; ++i)
    pixels.setPixelColor(i, pixels.Color(0, 0, 0)); //(red,green,blue)
  pixels.show();
}

void mode_6_loop() { 
  Serial.println("leds_66");  // Для отладки
  // Змінні для Режима-6; 
  byte red = 255; 
  byte green = 255; 
  byte blue = 255; 
  int strobe_count = 10; 

  static uint32_t past = 0;
  static bool j = 0;
  static bool flag = 0;

  
  if (millis() - past > 1000) {
    past = millis();
    j = !j; 
  } 
  
  if (!j) {
    static uint32_t past1 = 0;
    static bool  j1 = 0;
    //static bool flag = 0;
    
    if (millis() - past1 > 50) { // полупериод пакета 0,1сек
      past1 = millis();
      j1 = !j1;
      flag = j1;
    }

    if (!j1 && !flag) {
      for (int k = 0; k < 10; k++) 
        for (int m = 0; m < 144; m++ ) 
          pixels.setPixelColor(m, pixels.Color(red, green, blue));
          flag = !flag;
        }

    if (j1 && flag) {
      for (int l = 0; l < 144; l++ )
      pixels.setPixelColor(l, pixels.Color(0, 0, 0));
      flag = !flag;
    }
    pixels.show();
  }
/*
if (j1 && flag) {
for (byte m = 0; m < max_led; ++m)
    pixels.setPixelColor(m, pixels.Color(0, 0, 0)); //(red,green,blue)
  pixels.show();
  flag = !flag;}
  */
}

//------------------------------- режим 7 -------------------------------
// Ліва/Права сторона (лінійка 1 і 4) по-очереді моргають синім і червоним
void mode_7_setup() {
  Serial.println("leds_7");  // Для отладки
  for (byte i = 0; i < max_led; ++i)
    pixels.setPixelColor(i, pixels.Color(0, 0, 0)); //(red,green,blue)
  pixels.show();
}

void mode_7_loop() {
  Serial.println("leds_77");  // Для отладки
  byte start_pixel_0 = stick_num_0 * pixel_in_stick;
  byte start_pixel_3 = stick_num_3 * pixel_in_stick;
  static uint32_t past = 0;
  static bool j = 0;
  
  if (millis() - past > 500) {
    past = millis();
    j = !j;

//--- лінійка-1
    for (byte i = start_pixel_0; i < (start_pixel_0 + pixel_in_stick); ++i) {
      if (j)pixels.setPixelColor(i, pixels.Color(255, 0, 0));
      else pixels.setPixelColor(i, pixels.Color(0, 0, 0)) ;
    }

//--- лінійка-4
    for (byte i = start_pixel_3; i < (start_pixel_3 + pixel_in_stick); ++i) {
      if (j)pixels.setPixelColor(i, pixels.Color(0, 0, 0));
      else pixels.setPixelColor(i, pixels.Color(0, 0, 255)) ;
    }
  pixels.show();
  }
}

//------------------------------- режим 8 -------------------------------
// Синя лініка  бігає туди-сюди
void mode_8_setup() { 
  Serial.println("leds_8");  // Для отладки 
  for (byte i = 0; i < max_led; ++i)
    pixels.setPixelColor(i, pixels.Color(0, 0, 0));  //(red,green,blue)
  pixels.show();
}

void mode_8_loop() { 
  Serial.println("leds_88");  // Для отладки
  // Змінні для Режима-8;  
  byte red = 0; 
  byte green = 0; 
  byte blue = 255; 
  int pixel_size = 20;

      for(int i = 0; i < max_led - pixel_size - 2; i++) {
        for(int i = 0; i < max_led; i++ ) {
          pixels.setPixelColor(i, pixels.Color(0, 0, 0));
        }
        pixels.setPixelColor(i, pixels.Color(red, green, blue));
        pixels.show();
        
        
            for(int k = 1; k <= pixel_size; k++) {
              pixels.setPixelColor(i+k, pixels.Color(red, green, blue));
            }
            pixels.setPixelColor(i + pixel_size + 1, pixels.Color(red, green, blue));
            pixels.show();
            delay(1);
      
  }

      for(int i = max_led - pixel_size - 2; i > 0; i--) {
        for(int i = 0; i < max_led; i++ ) {
          pixels.setPixelColor(i, pixels.Color(0, 0, 0));
        }
        pixels.setPixelColor(i, pixels.Color(red, green, blue));
        pixels.show();

            for(int k = 1; k <= pixel_size; k++) {
              pixels.setPixelColor(i+k, pixels.Color(red, green, blue));
            }
            pixels.setPixelColor(i + pixel_size + 1, pixels.Color(red, green, blue));
            pixels.show();
            delay(1);
  
  }
  
}

//--------------------------- Кінець режимів ----------------------------

//----------------class Cl_Btn----------------------------
class Cl_Btn {
  byte pin ;                                            // номер ноги на кнопке
  void (* Do)();
  bool btn, btn_old;
  bool bounce_btn = 0;                                  // антидребезговый флаг
  uint32_t past = 0 ;
  public:
    Cl_Btn(byte _pin, void (* _Do)()): pin(_pin), Do(_Do) {};
    void setup() {
      pinMode(pin, INPUT_PULLUP);                       // подключить кнопку  с подтяжкой
      btn = digitalRead(pin);                           // прочитать реальное значение на выводе};
    }
    void loop() {
      if (! bounce_btn && btn != digitalRead(pin)) {    // если прошел фронт изм на выводн
        bounce_btn = 1;                                 // выставить флаг
        past = millis();                                // сделать временую засветку
      }
      else if ( bounce_btn && millis() - past >= 5 ) {  // если прошло антидребезговое время
        bounce_btn = 0;                                 // то снять флаг
        btn_old = btn ;
        btn = digitalRead(pin) ;                        // прочитать реальное значение на выводе
        if (btn_old && ! btn)  Do();
      }
    }
};
//------------------------------
void Do_Btn1() {
  mode++;
  Serial.println(mode);  // Для отладки
  
  if (mode == 1) {
    mode_setup = mode_1_setup;
    mode_loop = mode_1_loop;
    
  } else if (mode == 2) {
    mode_setup = mode_2_setup;
    mode_loop = mode_2_loop;
    
  } else if (mode == 3) {
    mode_setup = mode_3_setup;
    mode_loop = mode_3_loop;
    
  } else if (mode == 4) {
    mode_setup = mode_4_setup;
    mode_loop = mode_4_loop;
    
} else if (mode == 5) {
    mode_setup = mode_5_setup;
    mode_loop = mode_5_loop;

} else if (mode == 6) {
    mode_setup = mode_6_setup;
    mode_loop = mode_6_loop;

} else if (mode == 7) {
    mode_setup = mode_7_setup;
    mode_loop = mode_7_loop;

} else {
    mode = 0;
    mode_setup = mode_8_setup;
    mode_loop = mode_8_loop;
  }
  mode_setup();
}

Cl_Btn Btn1(key_pin , Do_Btn1);  // подключить кнопку на выв 2

void setup() {
  Serial.begin(9600);
  pixels.begin();
  Do_Btn1();
  mode_setup();
  Btn1.setup();
  Serial.print("mode ");  // Для отладки
  Serial.println(mode);   // Для отладки
}

void loop() {
  mode_loop();
  Btn1.loop();
}

 

b707
Offline
Зарегистрирован: 26.05.2017

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

Другой вариант - разобраться с лишними static переменными. Они у вас хранят значения между циклами, а вам нужно обнулять состояние ленты каждые 10 вспышек. Но это труднее обьяснить на пальцах, а переписывать за вас ваш код мне некогда, сорри

или третий вариант - сделайте как вам советуют в сообщении #37

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

Мигает постоянно

void mode_6_loop() { 
  Serial.println("leds_66");  // Для отладки
  // Змінні для Режима-6; 
  byte red = 255; 
  byte green = 255; 
  byte blue = 255; 
  int strobe_count = 10; 

  static uint32_t past = 0;
  static bool j = 0;
  static bool flag = 0;

  for (int v = 0; v < 10; v++) {
  
    j = !j;
      
  
  if (!j) {
    static uint32_t past1 = 0;
    static bool  j1 = 0;
    //static bool flag = 0;
    
    if (millis() - past1 > 50) { // полупериод пакета 0,1сек
      past1 = millis();
      j1 = !j1;
      flag = j1;
    }

    if (!j1 && !flag) {
      for (int k = 0; k < 10; k++) 
        for (int m = 0; m < 144; m++ ) 
          pixels.setPixelColor(m, pixels.Color(red, green, blue));
          flag = !flag;
        }

    if (j1 && flag) {
      for (int l = 0; l < 144; l++ )
      pixels.setPixelColor(l, pixels.Color(0, 0, 0));
      flag = !flag;
    }
    pixels.show();
  }

  }
}

 

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

Задержки нету между вспышками

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

Через - delay работает эфект как надо, но не реагирует на кнопку

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

или третий вариант - сделайте как вам советуют в сообщении #37  - работет, но не тот эфект.

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

b707 пишет:

 

Другой вариант - разобраться с лишними static переменными. Они у вас хранят значения между циклами, а вам нужно обнулять состояние ленты каждые 10 вспышек. Но это труднее обьяснить на пальцах, а переписывать за вас ваш код мне некогда, сорри

 

 

Насколько я понял, переменная - past сохраняется после выхода из подпрограммы, и нужно поменя названия меременных  - past в других подпрограммах (уже сделано, в каждой подпрограмме, другая переменная). 

Непомоголо.

b707 пишет:

 

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

 

Скорре всего неправильно реализовую в коде. 

 
b707
Offline
Зарегистрирован: 26.05.2017

Попробуйте вот так - это проще, чем обьяснять счет вспышек

void mode_6_setup() { 
  Serial.println("leds_6");  // Для отладки
  for (byte i = 0; i < max_led; ++i)
    pixels.setPixelColor(i, pixels.Color(0, 0, 0)); //(red,green,blue)
  pixels.show();
}

void mode_6_loop() { 
  Serial.println("leds_66");  // Для отладки
  // Змінні для Режима-6; 
  byte red = 255; 
  byte green = 255; 
  byte blue = 255; 
  int strobe_count = 10; 

  static uint32_t past = 0;
  static bool j = 0;
  static bool flag = 0;
  static uint32_t past1 = 0;
  static bool  j1 = 0;
    
  
  if (millis() - past > 1090) {
    past = millis();
    j = !j; 
    past1 = 0;
    j1 = 0;
  } 
  
  if (!j) {
    
    
    if (millis() - past1 > 50) { // полупериод пакета 0,1сек
      past1 = millis();
      j1 = !j1;
      flag = j1;
    }

    if (!j1 && !flag) {
      for (int k = 0; k < 10; k++) 
        for (int m = 0; m < 144; m++ ) 
          pixels.setPixelColor(m, pixels.Color(red, green, blue));
          flag = !flag;
        }

    if (j1 && flag) {
      for (int l = 0; l < 144; l++ )
      pixels.setPixelColor(l, pixels.Color(0, 0, 0));
      flag = !flag;
    }
    pixels.show();
  }
/*
if (j1 && flag) {
for (byte m = 0; m < max_led; ++m)
    pixels.setPixelColor(m, pixels.Color(0, 0, 0)); //(red,green,blue)
  pixels.show();
  flag = !flag;}
  */
}