RGB лента 5 метров,12 Вольт

leks
Offline
Зарегистрирован: 22.10.2017

Не удержался и раскурочил коробку, думая не сильно ли греются транзисторы. Немного удивлён увиденному. Хочу заменить пульт (глючный он какой то) на приложение в смартфоне, а штатный микроконтроллер на УНО и блютуз модуль, оставив ключи и стабилизатор на 5 Вольт (с ним облом - стабилитрон и резистор вместо него на плате). Не ясно (нет схемы) куда подпаиваться к каналам ? Что за чёрный ящик справа?

sadman41
Offline
Зарегистрирован: 19.10.2016

Наверное что-то типа этого:

strarbit
Offline
Зарегистрирован: 12.06.2016

U1 = MCU
U2 = EEPROM
Q1..Q3 = BL2300 or SI2300

 

leks
Offline
Зарегистрирован: 22.10.2017

Ага, вроде ясно. Но резисторов к транзисторам нет, они лишние? :) - режем дорожки около Q1-Q3  и к Ардуино, туда же GND и 12 В к Vin. 

sadman41
Offline
Зарегистрирован: 19.10.2016

Экономия на спичках. Быстрее сгорит - быстрее новую прикупишь.

Сдается мне, что проще и надежней на зеленой макетке накидать то же самое.

leks
Offline
Зарегистрирован: 22.10.2017

sadman41 пишет:

Экономия на спичках. Быстрее сгорит - быстрее новую прикупишь.

Сдается мне, что проще и надежней на зеленой макетке накидать то же самое.

Да коробочка вообще пустая, туда можно напихать тройку резисторов, разъём. Цель сделать "врезку", побаловаться и вернуть  всё в исходное состояние. Делать скетч и приложение можно и на одном RGB светодиоде, как я понял, а лента для окончательного удовольствия. 

gorar
Offline
Зарегистрирован: 11.12.2018

Для спортивного интереса и на случай НГ удачная идея. После празников унку на стол для новых проэктов, а коробочку на чердак до следуюего НГ ;) Ну... если уж совсем понравится тогда скетч залить в Нано и сделать законченный продукт! 

leks
Offline
Зарегистрирован: 22.10.2017
#define Re  9
#define Gr  10
#define Bl  11
byte n=100;//переменная длительности между переключениями
byte Mx=150;//переменная для хранения макс. знач. яркости

void setup()
{
        pinMode(Re, OUTPUT);//красный
        digitalWrite(Re, LOW);
        pinMode(Gr, OUTPUT);//зелёный
        digitalWrite(Gr, LOW);
         pinMode(Bl, OUTPUT);//синий
        digitalWrite(Bl, LOW);
        
 }

void loop()
{
 ///////////////////////////////ПЛАВНЫЙ РАДУЖНЫЙ ПЕРЕХОД-СМЕНА ЦВЕТОВ////////////////////////////////////////
 for (byte i=0;i<=Mx;i++)
 {
  analogWrite(Bl,Mx-i);analogWrite(Gr,i);delay (n);//переход синий-зелёный
 }
 for (byte i=0;i<=Mx;i++)
 {
  analogWrite(Gr,Mx-i);analogWrite(Re,i);delay (n);//переход зелёный-красный
 } 
 for (byte i=0;i<=Mx;i++)
 {
  analogWrite(Re,Mx-i);analogWrite(Bl,i);delay (n);//переход красный-синий
 } 
 ////////////////////////////////////////////////////////////////////////////////////////////////////// 
}

Забавно, не могу понять почему если яркость ставить 255 переключение красного цвета исчезает, скетч правильно не работает. При 254 всё как задумано.

Гриша
Offline
Зарегистрирован: 27.04.2014

все просто

for (byte i=0;i<=Mx;i++)

байт не может хранить больше 255, а увас по условию переменная i  может ровняться 256 (i++) т.е. она обнуляется из-за переполнения. или ставьте 254 или выкиньте из условия i<=Mx заменив на i<Mx - тогда достигнув 254, переменная инкременируется  и станет 255 и исполнит условие последний раз.

пару раз ловил глюк компилятора, как попадались непонятки - перезапусказ ИДЭ сохранив скетч, потом открывал и все работало как задумано.

leks
Offline
Зарегистрирован: 22.10.2017

Спасибо, теперь ясно, исправил.

arduinec
Offline
Зарегистрирован: 01.09.2015

Гриша пишет:

все просто

for (byte i=0;i<=Mx;i++)

байт не может хранить больше 255, а увас по условию переменная i  может ровняться 256 (i++) т.е. она обнуляется из-за переполнения. или ставьте 254 или выкиньте из условия i<=Mx заменив на i<Mx - тогда достигнув 254, переменная инкременируется  и станет 255 и исполнит условие последний раз.

К этому можно добавить, что цикл for (byte i=0; i<=255; i++) будет выполняться бесконечно.

Гриша
Offline
Зарегистрирован: 27.04.2014

arduinec пишет:

К этому можно добавить, что цикл for (byte i=0; i<=255; i++) будет выполняться бесконечно.

не совсем и невсегда, тут на откуп компилятору... т.к. последним и решающим является условие сравнения i=255, после которого программа может выйти из цикла по флагу или еще раз выполнить сравнение, встречал такой глюк, но его, вроде бы, уже давно пофиксили как избыточный...    

вот именно для того-чтобы не проверять условие "лишний" раз пишут i<=254, а если без " = " (i<255) условие проверяется, но не выполняется!!! А это лишнее время на выполнение программы, что "замедляет" выполнение кода - но это сильно зависит от компилятора, в основном они "умные" теперь и сами исправляют на двойное условие.   

leks
Offline
Зарегистрирован: 22.10.2017

Да, именно и запустилось в бесконечный цикл переключение зелёный-синий. Просто мне думалось, что условие от 0 до 255 включительно или от 0 до 255 (без крайнего) выполняется жёстко и ни при каких условиях i не выйдет за него. 

arduinec
Offline
Зарегистрирован: 01.09.2015

arduinec пишет:

Цикл for (byte i=0; i<=255; i++) будет выполняться бесконечно,

потому что переменная byte i всегда находится в диапазоне от 0 до 255.

leks
Offline
Зарегистрирован: 22.10.2017
// ПЕРЕКЛЮЧАТЕЛЬ СВЕТОДИОДНОЙ RGB ЛЕНТЫ
//
#define Re  9
#define Gr  10
#define Bl  11
byte n=75;//переменная длительности между переключениями
byte Mx=255;//переменная для хранения макс. знач. яркости
byte N=0;//переменная-номер программы переключений
long Y=0;//переменная для хранения текущего времени
long Y1=0;//переменная для хранения текущего времени
void setup()
{
        pinMode(Re, OUTPUT);//красный
        digitalWrite(Re, LOW);
        pinMode(Gr, OUTPUT);//зелёный
        digitalWrite(Gr, LOW);
        pinMode(Bl, OUTPUT);//синий
        digitalWrite(Bl, LOW);
        pinMode(A0, INPUT);//регулятор скорости - потенциометр
 }

void loop()
{
 /////////////////////////////// №1 ПЛАВНЫЙ РАДУЖНЫЙ ПЕРЕХОД-СМЕНА ЦВЕТОВ////////////////////////////////////////
 if (N==0||N==1)//условие исполнения данной программы
 {
 analogWrite(Bl,Mx);//начальное включение ленты - синий 
 for (byte i=0;i<Mx;i++)
 {
  analogWrite(Bl,Mx-i);analogWrite(Gr,i);delay_(n);//переход синий-зелёный
 }
 for (byte i=0;i<Mx;i++)
 {
  analogWrite(Gr,Mx-i);analogWrite(Re,i);delay_(n);//переход зелёный-красный
 } 
 for (byte i=0;i<Mx;i++)
 {
  analogWrite(Re,Mx-i);analogWrite(Bl,i);delay_(n);//переход красный-синий
 } 
 }
 ////////////////////////////////////////////////////////////////////////////////////////////////////// 
 /////////////////////////////// №2 ПЛАВНЫЙ ПЕРЕХОД НА БЕЛЫЙ С ВОЗВРАТОМ НА ОДИН ИЗ ЦВЕТОВ ///////////////////////
 if (N==0||N==2)//условие исполнения данной программы
 {
 analogWrite(Bl,Mx);//начальное включение ленты - синий
 for (byte i=0;i<Mx;i++)
 {
  analogWrite(Re,i);analogWrite(Gr,i);delay_(n/2);//переход на белый
 }
 for (byte i=0;i<Mx;i++)
 {
  analogWrite(Gr,Mx-i);analogWrite(Bl,Mx-i);delay_(n/2);//переход на красный
 } 
//////////////////////////////////////
for (byte i=0;i<Mx;i++)
 {
  analogWrite(Bl,i);analogWrite(Gr,i);delay_(n/2);//переход на белый
 }
 for (byte i=0;i<Mx;i++)
 {
  analogWrite(Re,Mx-i);analogWrite(Bl,Mx-i);delay_(n/2);//переход на зелёный
 } 
//////////////////////////////////////
for (byte i=0;i<Mx;i++)
 {
  analogWrite(Re,i);analogWrite(Bl,i);delay_(n/2);//переход на белый
 }
 for (byte i=0;i<Mx;i++)
 {
  analogWrite(Gr,Mx-i);analogWrite(Re,Mx-i);delay_(n/2);//переход на синий
 } 
 }
 ////////////////////////////////////////////////////////////////////////////////////////////////////// 
 /////////////////////////////// №3 ПСЕВДОСЛУЧАЙНОЕ ПЕРЕКЛЮЧЕНИЕ ЦВЕТА ЧЕРЕЗ ПАУЗУ ///////////////////////
 if (N==0||N==3)//условие исполнения данной программы
 {
  Y1=millis();
  while(millis()-Y1<25000)//условие длительности исполнения данной программы за 1 проход loop()
  { 
 analogWrite(Bl,random(0,3)*Mx/2);//выбор цвета из 27 с учётом "пусто"- выключение всех цветов
 analogWrite(Re,random(0,3)*Mx/2);
 analogWrite(Gr,random(0,3)*Mx/2);
 delay_(15*n);//пауза между переключением
  }
 analogWrite(Bl,Mx);//начальное включение ленты - синий
 analogWrite(Re,0);
 analogWrite(Gr,0);
 }
 }
////////////////////////////////////////////////////////////////////////////////////////
////  ФУНКЦИИ ОПИСАНИЕ // вместо задержки времени через delay  ////////////////////////////////////////
void delay_(int T1)
{
 Y=millis();metka:if(millis()-Y>=T1){} 
 else { 
 n=map(analogRead(A0), 0,1023, 20, 150);//регулировка скорости переключений ленты по потенциометру 
 goto metka;}
}
 ///////////////////////////////////////////////////////////////////////////////////////////////////////

Пока новогодняя фантазия кончилась, надо отсмотреть в сумерках.

Гриша
Offline
Зарегистрирован: 27.04.2014

уже второй год встречаю с WS2813 5м 60 IP67 - купил потестить, залил какой-то тестовый скетч из библиотеки и понял - иного и не нужно :)))) заметно,конечно, такую полосу на елке да и светит в одну сторону, но всех моих устраивает. 

sadman41
Offline
Зарегистрирован: 19.10.2016

Я свою гирлянду в гусеницу замотал (ну, такие веревки пушистые на елку и шею вешают) - провода не так заметны, отблескивает поинтересней, рассеивает дополнительно. Мои 2801 не греются, ваши - не знаю. Может и опасно в пластик мотать.

leks
Offline
Зарегистрирован: 22.10.2017

sadman41 пишет:

Я свою гирлянду в гусеницу замотал (ну, такие веревки пушистые на елку и шею вешают) - провода не так заметны, отблескивает поинтересней, рассеивает дополнительно. Мои 2801 не греются, ваши - не знаю. Может и опасно в пластик мотать.

Интересно, а в коробе пластиковом для электропроводки свет будет проходить наружу?

sadman41
Offline
Зарегистрирован: 19.10.2016

Будет что-то выходить, но наврядли это конструктивное решение будет на ёлке смотреться.

Гриша
Offline
Зарегистрирован: 27.04.2014

ws2813 18Вт/1м при 5В, кормлю 4,5В им хватает, особого нагрева не ощущаю - режим динамический и средняя мощьность не более 9Вт/1м. Так что если не увлекаться и не мотать очень плотно, создавая "шубу" проблем не должно быть. Полагаю, что это справедливо для всех RGB.  

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

Я себе метр RGBW 144 IP67, вроде 6813, взял поиграться. Вчера вспомнил, просто вдоль ствола прицепил и тестовый скетч из неопиксел библиотеки. Всем понравилось, мощность 50%, холодная, яркости хватает даже при свете.

sadman41
Offline
Зарегистрирован: 19.10.2016

Где, почем?

leks
Offline
Зарегистрирован: 22.10.2017
Вроде добился осмысленного варианта с регулировкой яркости, скорости,номера эффекта. Можно приступать к приложению. 
Конечно такой лентой только окно подсвечивать удобно.
С умными лентами была мысля салют-гирлянду соорудить. Но пока стены подходящей нет :) 
// ПЕРЕКЛЮЧАТЕЛЬ СВЕТОДИОДНОЙ RGB ЛЕНТЫ
//
#define Re  9
#define Gr  10
#define Bl  11
byte n=75;//переменная длительности между переключениями
byte Mx=255;//переменная для хранения макс. знач. яркости
byte N=0;//переменная-номер программы переключений
long Y=0;//переменная для хранения текущего времени
long Y1=0;//переменная для хранения текущего времени
void setup()
{
        pinMode(Re, OUTPUT);//красный
        digitalWrite(Re, LOW);
        pinMode(Gr, OUTPUT);//зелёный
        digitalWrite(Gr, LOW);
        pinMode(Bl, OUTPUT);//синий
        digitalWrite(Bl, LOW);
        pinMode(A0, INPUT);//регулятор скорости - потенциометр
        pinMode(A1, INPUT);//регулятор яркости - потенциометр
 }

void loop()
{
 /////////////////////////////// №1 ПЛАВНЫЙ РАДУЖНЫЙ ПЕРЕХОД-СМЕНА ЦВЕТОВ////////////////////////////////////////
 if (N==0||N==1)//условие исполнения данной программы
 {
 analogWrite(Bl,Mx);//начальное включение ленты - синий 
 for (byte i=0;i<Mx;i++)
 {
  analogWrite(Bl,Mx-i);analogWrite(Gr,i);delay_(n*255/Mx);//переход синий-зелёный
 }
 for (byte i=0;i<Mx;i++)
 {
  analogWrite(Gr,Mx-i);analogWrite(Re,i);delay_(n*255/Mx);//переход зелёный-красный
 } 
 for (byte i=0;i<Mx;i++)
 {
  analogWrite(Re,Mx-i);analogWrite(Bl,i);delay_(n*255/Mx);//переход красный-синий
 } 
 }
 ////////////////////////////////////////////////////////////////////////////////////////////////////// 
 /////////////////////////////// №2 ПЛАВНЫЙ ПЕРЕХОД НА БЕЛЫЙ С ВОЗВРАТОМ НА ОДИН ИЗ ЦВЕТОВ ///////////////////////
 if (N==0||N==2)//условие исполнения данной программы
 {
 analogWrite(Bl,Mx);//начальное включение ленты - синий
 for (byte i=0;i<Mx;i++)
 {
  analogWrite(Re,i);analogWrite(Gr,i);delay_(n*127/Mx);//переход на белый
 }
 for (byte i=0;i<Mx;i++)
 {
  analogWrite(Gr,Mx-i);analogWrite(Bl,Mx-i);delay_(n*127/Mx);//переход на красный
 } 
//////////////////////////////////////
for (byte i=0;i<Mx;i++)
 {
  analogWrite(Bl,i);analogWrite(Gr,i);delay_(n*127/Mx);//переход на белый
 }
 for (byte i=0;i<Mx;i++)
 {
  analogWrite(Re,Mx-i);analogWrite(Bl,Mx-i);delay_(n*127/Mx);//переход на зелёный
 } 
//////////////////////////////////////
for (byte i=0;i<Mx;i++)
 {
  analogWrite(Re,i);analogWrite(Bl,i);delay_(n*127/Mx);//переход на белый
 }
 for (byte i=0;i<Mx;i++)
 {
  analogWrite(Gr,Mx-i);analogWrite(Re,Mx-i);delay_(n*127/Mx);//переход на синий
 } 
 }
 ////////////////////////////////////////////////////////////////////////////////////////////////////// 
 /////////////////////////////// №3 ПСЕВДОСЛУЧАЙНОЕ ПЕРЕКЛЮЧЕНИЕ ЦВЕТА ЧЕРЕЗ ПАУЗУ ///////////////////////
 if (N==0||N==3)//условие исполнения данной программы
 {
  Y1=millis();
  while(millis()-Y1<300*n)//условие длительности исполнения данной программы за 1 проход loop()
  { 
 analogWrite(Bl,random(0,3)*Mx/2);//выбор цвета из 27 с учётом "пусто"- выключение всех цветов
 analogWrite(Re,random(0,3)*Mx/2);
 analogWrite(Gr,random(0,3)*Mx/2);
 delay_(15*n);//пауза между переключением
  }
 analogWrite(Bl,Mx);//начальное включение ленты - синий
 analogWrite(Re,0);
 analogWrite(Gr,0);
 }
 
////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////// №4 ПЛАВНЫЙ УХОД-ПРИХОД ЦВЕТА////////////////////////////////////////
 if (N==0||N==4)//условие исполнения данной программы
 {
 analogWrite(Bl,Mx);//начальное включение ленты - синий 
 for (byte i=0;i<Mx;i++) {analogWrite(Bl,Mx-i);delay_(n*127/Mx);//уход синий
 }
 for (byte i=0;i<Mx;i++) {analogWrite(Gr,i);delay_(n*127/Mx);//приход зелёный
 }
 for (byte i=0;i<Mx;i++) {analogWrite(Gr,Mx-i);delay_(n*127/Mx);//уход зелёный
 }
 for (byte i=0;i<Mx;i++) {analogWrite(Re,i);delay_(n*127/Mx);//приход красный
 }
 for (byte i=0;i<Mx;i++) {analogWrite(Re,Mx-i);delay_(n*127/Mx);//уход красный
 }
 for (byte i=0;i<Mx;i++) {analogWrite(Bl,i);delay_(n*127/Mx);//приход синий
 }
 }
 //////////////////////////////////////////////////////////////////////////////////////////////////////
} 
////  ФУНКЦИИ ОПИСАНИЕ // вместо задержки времени через delay  ////////////////////////////////////////
void delay_(int T1)
{
 Y=millis();metka:if(millis()-Y>=T1){} 
 else { 
 n=map(analogRead(A0), 0,1023, 20, 150);//регулировка скорости переключений ленты по потенциометру 
 Mx=map(analogRead(A1), 0,1023, 40, 255);//регулировка яркости переключений ленты по потенциометру 
 goto metka;}
}
 ///////////////////////////////////////////////////////////////////////////////////////////////////////

 

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

sadman41 пишет:

Где, почем?

На Алишке, недешево. Бралась, на посмотреть, единственное достоинство, для белого надо 20мА. В боевой девайс заказал обычную 2812.

leks
Offline
Зарегистрирован: 22.10.2017
// ПЕРЕКЛЮЧАТЕЛЬ СВЕТОДИОДНОЙ RGB ЛЕНТЫ
//
#define Re  9
#define Gr  10
#define Bl  11
int n=120;//переменная длительности между переключениями
int Mx=255;//переменная для хранения макс. знач. яркости
int N=0;//переменная-номер программы переключений
long Y=0;//переменная для хранения текущего времени
long Y1=0;//переменная для хранения текущего времени
byte v=0;// переменная - переключатель различных состояний
String inputString;// строки данных 
void setup()
{
        Serial.begin(9600);
        pinMode(Re, OUTPUT);//красный
        digitalWrite(Re, LOW);
        pinMode(Gr, OUTPUT);//зелёный
        digitalWrite(Gr, LOW);
        pinMode(Bl, OUTPUT);//синий
        digitalWrite(Bl, LOW);
       
 }

void loop()
{
 /////////////////////////////// №1 ПЛАВНЫЙ РАДУЖНЫЙ ПЕРЕХОД-СМЕНА ЦВЕТОВ////////////////////////////////////////
 if (N==0||N==1)//условие исполнения данной программы
 {
 analogWrite(Bl,Mx);//начальное включение ленты - синий 
 for (int i=0;i<Mx;i++)
 {
  analogWrite(Bl,Mx-i);analogWrite(Gr,i);delay_(n*255/Mx);//переход синий-зелёный
 }
 for (int i=0;i<Mx;i++)
 {
  analogWrite(Gr,Mx-i);analogWrite(Re,i);delay_(n*255/Mx);//переход зелёный-красный
 } 
 for (int i=0;i<Mx;i++)
 {
  analogWrite(Re,Mx-i);analogWrite(Bl,i);delay_(n*255/Mx);//переход красный-синий
 } 
 }
 ////////////////////////////////////////////////////////////////////////////////////////////////////// 
 /////////////////////////////// №2 ПЛАВНЫЙ ПЕРЕХОД НА БЕЛЫЙ С ВОЗВРАТОМ НА ОДИН ИЗ ЦВЕТОВ ///////////////////////
 if (N==0||N==2)//условие исполнения данной программы
 {
 analogWrite(Bl,Mx);//начальное включение ленты - синий
 for (int i=0;i<Mx;i++)
 {
  analogWrite(Re,i);analogWrite(Gr,i);delay_(n*127/Mx);//переход на белый
 }
 for (int i=0;i<Mx;i++)
 {
  analogWrite(Gr,Mx-i);analogWrite(Bl,Mx-i);delay_(n*127/Mx);//переход на красный
 } 
//////////////////////////////////////
for (int i=0;i<Mx;i++)
 {
  analogWrite(Bl,i);analogWrite(Gr,i);delay_(n*127/Mx);//переход на белый
 }
 for (int i=0;i<Mx;i++)
 {
  analogWrite(Re,Mx-i);analogWrite(Bl,Mx-i);delay_(n*127/Mx);//переход на зелёный
 } 
//////////////////////////////////////
for (int i=0;i<Mx;i++)
 {
  analogWrite(Re,i);analogWrite(Bl,i);delay_(n*127/Mx);//переход на белый
 }
 for (int i=0;i<Mx;i++)
 {
  analogWrite(Gr,Mx-i);analogWrite(Re,Mx-i);delay_(n*127/Mx);//переход на синий
 } 
 }
 ////////////////////////////////////////////////////////////////////////////////////////////////////// 
 /////////////////////////////// №3 ПСЕВДОСЛУЧАЙНОЕ ПЕРЕКЛЮЧЕНИЕ ЦВЕТА ЧЕРЕЗ ПАУЗУ ///////////////////////
 if (N==0||N==3)//условие исполнения данной программы
 {
  Y1=millis();
  while(millis()-Y1<15000)//условие длительности исполнения данной программы за 1 проход loop()
  { 
 analogWrite(Bl,random(0,3)*Mx/2);//выбор цвета из 27 с учётом "пусто"- выключение всех цветов
 analogWrite(Re,random(0,3)*Mx/2);
 analogWrite(Gr,random(0,3)*Mx/2);
 delay_(15*n);//пауза между переключением
  }
 analogWrite(Bl,Mx);//начальное включение ленты - синий
 analogWrite(Re,0);
 analogWrite(Gr,0);
 }
 
////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////// №4 ПЛАВНЫЙ УХОД-ПРИХОД ЦВЕТА////////////////////////////////////////
 if (N==0||N==4)//условие исполнения данной программы
 {
 analogWrite(Bl,Mx);//начальное включение ленты - синий 
 for (int i=0;i<Mx;i++) {analogWrite(Bl,Mx-i);delay_(n*127/Mx);//уход синий
 }
 for (int i=0;i<Mx;i++) {analogWrite(Gr,i);delay_(n*127/Mx);//приход зелёный
 }
 for (int i=0;i<Mx;i++) {analogWrite(Gr,Mx-i);delay_(n*127/Mx);//уход зелёный
 }
 for (int i=0;i<Mx;i++) {analogWrite(Re,i);delay_(n*127/Mx);//приход красный
 }
 for (int i=0;i<Mx;i++) {analogWrite(Re,Mx-i);delay_(n*127/Mx);//уход красный
 }
 for (int i=0;i<Mx;i++) {analogWrite(Bl,i);delay_(n*127/Mx);//приход синий
 }
 }
 //////////////////////////////////////////////////////////////////////////////////////////////////////
} 
////  ФУНКЦИИ ОПИСАНИЕ // вместо задержки времени через delay  ////////////////////////////////////////
void delay_(int T1)
{
 Y=millis();metka:if(millis()-Y>=T1){} 
 else {metka1: CheckSerial();//ЖДЁМ ПОСТУПЛЕНИЯ КОМАНДЫ НА ИЗМЕНЕНИЕ ВЫПОЛНЕНИЯ ПЕРЕКЛЮЧЕНИЙ ЛЕНТЫ
 if (v==1){delay(50);goto metka1;}
 if (v==2){delay(50); analogWrite(Re,0); analogWrite(Gr,0); analogWrite(Bl,0);goto metka1;} 
 goto metka;}
}
 ///////////////////////////////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////////////////////////
//ФУНКЦИИ ПРИЁМА И ОБРАБОТКИ ДАННЫХ
void CheckSerial()
{
//////////////////////////////////////////////////////////////////////////////
  while (Serial.available())//считываем строку данных пока они поступают
  {
    char inChar = (char)Serial.read();
    if (inChar == '\n')     //если окончание строки
    {
      MakeCmd();//обрабатываем её данной функцией
      break;
    }
    else inputString += inChar;// иначе удлиняем строку на один символ
  }
}
/////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
void MakeCmd()
{
    int y=inputString.length();// присваиваем переменной у число символов в строке
    if (y<1||y>1)return;//если их меньше 1 или больше, выходим из функции
    String cmd=inputString;// передаём строку другой переменной
    inputString = "";//"обнуляем переменную" 
 if (cmd=="0"){N++;if(N==5){N=4;}}//ИЗМЕНЕНИЕ НОМЕРА ПРОГРАММЫ
 if (cmd=="1"){N--;if(N==-1){N=0;}}//
 if (cmd=="2"){Mx=Mx-30;if(Mx<46){Mx=45;}}//ИЗМЕНЕНИЕ ЯРКОСТИ СВЕЧЕНИЯ
 if (cmd=="3"){if(Mx<255){Mx=Mx+30;}}//
 if (cmd=="4"){n=n-20;if(n<21){n=20;}}//ИЗМЕНЕНИЕ ДЛИТЕЛЬНОСТИ ПЕРЕКЛЮЧЕНИЙ
 if (cmd=="5"){n=n+20;if(n>120){n=120;}}//
 if (cmd=="6"){v++;if(v>=3){v=0;}}//ИЗМЕНЕНИЕ СОСТОЯНИЙ ВКЛЮЧЕНИЯ ЛЕНТЫ
//(стоп-кадр,гашение всей ленты, визуальный запуск заданной программы)
 }
 
///////////////////////////////////////////////////////////////////////////////////////////////////////
 

Чудеса новогодние, всё работает из приложения как и задумано, но при n меньше 130 мс (в данной версии 120). Стоит взять и изменить исходное значение в 130 и лента стопорится после включения - на синем цвете. В чём секрет?

 

Гриша
Offline
Зарегистрирован: 27.04.2014

leks пишет:

Чудеса новогодние, всё работает из приложения как и задумано, но при n меньше 130 мс (в данной версии 120). Стоит взять и изменить исходное значение в 130 и лента стопорится после включения - на синем цвете. В чём секрет?

разбирайтесь со строкой 113 (вся функция), там явно зацикливание при переходе из стргоки 33. так и не понял чего вы там навертели, но попытатесь убить goto

leks
Offline
Зарегистрирован: 22.10.2017
// ПЕРЕКЛЮЧАТЕЛЬ СВЕТОДИОДНОЙ RGB ЛЕНТЫ
//
#define Re  9
#define Gr  10
#define Bl  11
int n=120;//переменная длительности между переключениями
int Mx=255;//переменная для хранения макс. знач. яркости
int N=0;//переменная-номер программы переключений
long Y=0;//переменная для хранения текущего времени
long Y1=0;//переменная для хранения текущего времени
byte v=0;// переменная флаг-переключатель различных состояний
String inputString;// строки данных 
void setup()
{
        Serial.begin(9600);
        pinMode(Re, OUTPUT);//красный
        digitalWrite(Re, LOW);
        pinMode(Gr, OUTPUT);//зелёный
        digitalWrite(Gr, LOW);
        pinMode(Bl, OUTPUT);//синий
        digitalWrite(Bl, LOW);
        pinMode(A0, INPUT);//регулятор скорости - потенциометр
        pinMode(A1, INPUT);//регулятор яркости - потенциометр
        pinMode(A2, INPUT);//регулятор выбора программы - потенциометр
 }

void loop()
{
 /////////////////////////////// №1 ПЛАВНЫЙ РАДУЖНЫЙ ПЕРЕХОД-СМЕНА ЦВЕТОВ////////////////////////////////////////
 if (N==0||N==1)//условие исполнения данной программы
 {
 analogWrite(Bl,Mx);//начальное включение ленты - синий 
 for (int i=0;i<Mx;i++)
 {
  analogWrite(Bl,Mx-i);analogWrite(Gr,i);delay_(n*255/Mx);//переход синий-зелёный
 }
 for (int i=0;i<Mx;i++)
 {
  analogWrite(Gr,Mx-i);analogWrite(Re,i);delay_(n*255/Mx);//переход зелёный-красный
 } 
 for (int i=0;i<Mx;i++)
 {
  analogWrite(Re,Mx-i);analogWrite(Bl,i);delay_(n*255/Mx);//переход красный-синий
 } 
 }
 ////////////////////////////////////////////////////////////////////////////////////////////////////// 
 /////////////////////////////// №2 ПЛАВНЫЙ ПЕРЕХОД НА БЕЛЫЙ С ВОЗВРАТОМ НА ОДИН ИЗ ЦВЕТОВ ///////////////////////
 if (N==0||N==2)//условие исполнения данной программы
 {
 analogWrite(Bl,Mx);//начальное включение ленты - синий
 for (int i=0;i<Mx;i++)
 {
  analogWrite(Re,i);analogWrite(Gr,i);delay_(n*127/Mx);//переход на белый
 }
 for (int i=0;i<Mx;i++)
 {
  analogWrite(Gr,Mx-i);analogWrite(Bl,Mx-i);delay_(n*127/Mx);//переход на красный
 } 
//////////////////////////////////////
for (int i=0;i<Mx;i++)
 {
  analogWrite(Bl,i);analogWrite(Gr,i);delay_(n*127/Mx);//переход на белый
 }
 for (int i=0;i<Mx;i++)
 {
  analogWrite(Re,Mx-i);analogWrite(Bl,Mx-i);delay_(n*127/Mx);//переход на зелёный
 } 
//////////////////////////////////////
for (int i=0;i<Mx;i++)
 {
  analogWrite(Re,i);analogWrite(Bl,i);delay_(n*127/Mx);//переход на белый
 }
 for (int i=0;i<Mx;i++)
 {
  analogWrite(Gr,Mx-i);analogWrite(Re,Mx-i);delay_(n*127/Mx);//переход на синий
 } 
 }
 ////////////////////////////////////////////////////////////////////////////////////////////////////// 
 /////////////////////////////// №3 ПСЕВДОСЛУЧАЙНОЕ ПЕРЕКЛЮЧЕНИЕ ЦВЕТА ЧЕРЕЗ ПАУЗУ ///////////////////////
 if (N==0||N==3)//условие исполнения данной программы
 {
  Y1=millis();
  while(millis()-Y1<15000)//условие длительности исполнения данной программы за 1 проход loop()
  { 
 analogWrite(Bl,random(0,3)*Mx/2);//выбор цвета из 27 с учётом "пусто"- выключение всех цветов
 analogWrite(Re,random(0,3)*Mx/2);
 analogWrite(Gr,random(0,3)*Mx/2);
 delay_(15*n);//пауза между переключением
  }
 analogWrite(Bl,Mx);//начальное включение ленты - синий
 analogWrite(Re,0);
 analogWrite(Gr,0);
 }
 
////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////// №4 ПЛАВНЫЙ УХОД-ПРИХОД ЦВЕТА////////////////////////////////////////
 if (N==0||N==4)//условие исполнения данной программы
 {
 analogWrite(Bl,Mx);//начальное включение ленты - синий 
 for (int i=0;i<Mx;i++) {analogWrite(Bl,Mx-i);delay_(n*127/Mx);//уход синий
 }
 for (int i=0;i<Mx;i++) {analogWrite(Gr,i);delay_(n*127/Mx);//приход зелёный
 }
 for (int i=0;i<Mx;i++) {analogWrite(Gr,Mx-i);delay_(n*127/Mx);//уход зелёный
 }
 for (int i=0;i<Mx;i++) {analogWrite(Re,i);delay_(n*127/Mx);//приход красный
 }
 for (int i=0;i<Mx;i++) {analogWrite(Re,Mx-i);delay_(n*127/Mx);//уход красный
 }
 for (int i=0;i<Mx;i++) {analogWrite(Bl,i);delay_(n*127/Mx);//приход синий
 }
 }
 //////////////////////////////////////////////////////////////////////////////////////////////////////
} 
////  ФУНКЦИИ ОПИСАНИЕ // вместо задержки времени через delay  ////////////////////////////////////////
void delay_(int T1)
{
 Y=millis();
 while(millis()-Y<T1) 
  {
    CheckSerial();//ЖДЁМ ПОСТУПЛЕНИЯ КОМАНДЫ НА ИЗМЕНЕНИЕ ВЫПОЛНЕНИЯ ПЕРЕКЛЮЧЕНИЙ ЛЕНТЫ
    if (v==0){n=map(analogRead(A0), 0,1023, 20, 120);//регулировка скорости переключений ленты по потенциометру 
 Mx=map(analogRead(A1), 0,1023, 40, 255);//регулировка яркости переключений ленты по потенциометру 
 N=map(analogRead(A2), 0,1023, 0, 4);//выбор программы переключений ленты по потенциометру
             }
 while(v==2||v==3) {CheckSerial();//ЖДЁМ ПОСТУПЛЕНИЯ КОМАНДЫ НА ИЗМЕНЕНИЕ ВЫПОЛНЕНИЯ ПЕРЕКЛЮЧЕНИЙ ЛЕНТЫ
 if (v==2){delay(50);}//стоп кадр
 if (v==3){delay(50); analogWrite(Re,0); analogWrite(Gr,0); analogWrite(Bl,0);}// гашение ленты 
 
 }}
}
 ///////////////////////////////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////////////////////////
//ФУНКЦИИ ПРИЁМА И ОБРАБОТКИ ДАННЫХ
void CheckSerial()
{
//////////////////////////////////////////////////////////////////////////////
  while (Serial.available())//считываем строку данных пока они поступают
  {
    char inChar = (char)Serial.read();
    if (inChar == '\n')     //если окончание строки
    {
      MakeCmd();//обрабатываем её данной функцией
      break;
    }
    else inputString += inChar;// иначе удлиняем строку на один символ
  }
}
/////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
void MakeCmd()
{
    int y=inputString.length();// присваиваем переменной у число символов в строке
    if (y<1||y>1)return;//если их меньше 1 или больше, выходим из функции
    String cmd=inputString;// передаём строку другой переменной
    inputString = "";//"обнуляем переменную" 
 if (cmd=="0"){N++;if(N==5){N=4;}}//ИЗМЕНЕНИЕ НОМЕРА ПРОГРАММЫ
 if (cmd=="1"){N--;if(N==-1){N=0;}}//
 if (cmd=="2"){Mx=Mx-30;if(Mx<46){Mx=45;}}//ИЗМЕНЕНИЕ ЯРКОСТИ СВЕЧЕНИЯ
 if (cmd=="3"){if(Mx<255){Mx=Mx+30;}}//
 if (cmd=="4"){n=n-20;if(n<21){n=20;}}//ИЗМЕНЕНИЕ ДЛИТЕЛЬНОСТИ ПЕРЕКЛЮЧЕНИЙ
 if (cmd=="5"){n=n+20;if(n>120){n=120;}}//
 if (cmd=="6"){v++;if(v>=4){v=0;}}//ИЗМЕНЕНИЕ СОСТОЯНИЙ ВКЛЮЧЕНИЯ ЛЕНТЫ
//(стоп-кадр,гашение всей ленты, визуальный запуск заданной программы при управлении потенциометрами)
 }
 
///////////////////////////////////////////////////////////////////////////////////////////////////////
 

Избавился от goto, но магия перехода из 120 на 130 для n осталась. При 130 лента никак не переключается.

 

leks
Offline
Зарегистрирован: 22.10.2017

Фантастика!, пишу вместо delay_(n*255/Mx); - delay_(n); когда встречается в скетче первый раз и лента переключается хоть при 130, хоть при 160 при прочих "делай". Возвращаю обратно значение аргумента и стопор на синем! Ну как так???

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Попробуйте написать delay_(int(n)*255/Mx)

leks
Offline
Зарегистрирован: 22.10.2017

Попробовал, не помогает. Вставил после первого включения синего delay_(n); и заработало :) даже на 160. Вообщем неясно в чём фишка. Функция не может принимать аргумент в виде формулы при больших значениях? (пока не привыкнет :)