RGB лента 5 метров,12 Вольт
- Войдите на сайт для отправки комментариев
Сб, 29/12/2018 - 12:27

Не удержался и раскурочил коробку, думая не сильно ли греются транзисторы. Немного удивлён увиденному. Хочу заменить пульт (глючный он какой то) на приложение в смартфоне, а штатный микроконтроллер на УНО и блютуз модуль, оставив ключи и стабилизатор на 5 Вольт (с ним облом - стабилитрон и резистор вместо него на плате). Не ясно (нет схемы) куда подпаиваться к каналам ? Что за чёрный ящик справа?
Наверное что-то типа этого:
U1 = MCU
U2 = EEPROM
Q1..Q3 = BL2300 or SI2300
Ага, вроде ясно. Но резисторов к транзисторам нет, они лишние? :) - режем дорожки около Q1-Q3 и к Ардуино, туда же GND и 12 В к Vin.
Экономия на спичках. Быстрее сгорит - быстрее новую прикупишь.
Сдается мне, что проще и надежней на зеленой макетке накидать то же самое.
Экономия на спичках. Быстрее сгорит - быстрее новую прикупишь.
Сдается мне, что проще и надежней на зеленой макетке накидать то же самое.
Да коробочка вообще пустая, туда можно напихать тройку резисторов, разъём. Цель сделать "врезку", побаловаться и вернуть всё в исходное состояние. Делать скетч и приложение можно и на одном RGB светодиоде, как я понял, а лента для окончательного удовольствия.
Для спортивного интереса и на случай НГ удачная идея. После празников унку на стол для новых проэктов, а коробочку на чердак до следуюего НГ ;) Ну... если уж совсем понравится тогда скетч залить в Нано и сделать законченный продукт!
#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 всё как задумано.
все просто
байт не может хранить больше 255, а увас по условию переменная i может ровняться 256 (i++) т.е. она обнуляется из-за переполнения. или ставьте 254 или выкиньте из условия i<=Mx заменив на i<Mx - тогда достигнув 254, переменная инкременируется и станет 255 и исполнит условие последний раз.
пару раз ловил глюк компилятора, как попадались непонятки - перезапусказ ИДЭ сохранив скетч, потом открывал и все работало как задумано.
Спасибо, теперь ясно, исправил.
все просто
байт не может хранить больше 255, а увас по условию переменная i может ровняться 256 (i++) т.е. она обнуляется из-за переполнения. или ставьте 254 или выкиньте из условия i<=Mx заменив на i<Mx - тогда достигнув 254, переменная инкременируется и станет 255 и исполнит условие последний раз.
К этому можно добавить, что цикл for (byte i=0; i<=255; i++) будет выполняться бесконечно.
К этому можно добавить, что цикл for (byte i=0; i<=255; i++) будет выполняться бесконечно.
не совсем и невсегда, тут на откуп компилятору... т.к. последним и решающим является условие сравнения i=255, после которого программа может выйти из цикла по флагу или еще раз выполнить сравнение, встречал такой глюк, но его, вроде бы, уже давно пофиксили как избыточный...
вот именно для того-чтобы не проверять условие "лишний" раз пишут i<=254, а если без " = " (i<255) условие проверяется, но не выполняется!!! А это лишнее время на выполнение программы, что "замедляет" выполнение кода - но это сильно зависит от компилятора, в основном они "умные" теперь и сами исправляют на двойное условие.
Да, именно и запустилось в бесконечный цикл переключение зелёный-синий. Просто мне думалось, что условие от 0 до 255 включительно или от 0 до 255 (без крайнего) выполняется жёстко и ни при каких условиях i не выйдет за него.
Цикл for (byte i=0; i<=255; i++) будет выполняться бесконечно,
потому что переменная byte i всегда находится в диапазоне от 0 до 255.
// ПЕРЕКЛЮЧАТЕЛЬ СВЕТОДИОДНОЙ 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;} } ///////////////////////////////////////////////////////////////////////////////////////////////////////Пока новогодняя фантазия кончилась, надо отсмотреть в сумерках.
уже второй год встречаю с WS2813 5м 60 IP67 - купил потестить, залил какой-то тестовый скетч из библиотеки и понял - иного и не нужно :)))) заметно,конечно, такую полосу на елке да и светит в одну сторону, но всех моих устраивает.
Я свою гирлянду в гусеницу замотал (ну, такие веревки пушистые на елку и шею вешают) - провода не так заметны, отблескивает поинтересней, рассеивает дополнительно. Мои 2801 не греются, ваши - не знаю. Может и опасно в пластик мотать.
Я свою гирлянду в гусеницу замотал (ну, такие веревки пушистые на елку и шею вешают) - провода не так заметны, отблескивает поинтересней, рассеивает дополнительно. Мои 2801 не греются, ваши - не знаю. Может и опасно в пластик мотать.
Интересно, а в коробе пластиковом для электропроводки свет будет проходить наружу?
Будет что-то выходить, но наврядли это конструктивное решение будет на ёлке смотреться.
ws2813 18Вт/1м при 5В, кормлю 4,5В им хватает, особого нагрева не ощущаю - режим динамический и средняя мощьность не более 9Вт/1м. Так что если не увлекаться и не мотать очень плотно, создавая "шубу" проблем не должно быть. Полагаю, что это справедливо для всех RGB.
Я себе метр RGBW 144 IP67, вроде 6813, взял поиграться. Вчера вспомнил, просто вдоль ствола прицепил и тестовый скетч из неопиксел библиотеки. Всем понравилось, мощность 50%, холодная, яркости хватает даже при свете.
Где, почем?
Вроде добился осмысленного варианта с регулировкой яркости, скорости,номера эффекта. Можно приступать к приложению. Конечно такой лентой только окно подсвечивать удобно. С умными лентами была мысля салют-гирлянду соорудить. Но пока стены подходящей нет :) // ПЕРЕКЛЮЧАТЕЛЬ СВЕТОДИОДНОЙ 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;} } ///////////////////////////////////////////////////////////////////////////////////////////////////////Где, почем?
На Алишке, недешево. Бралась, на посмотреть, единственное достоинство, для белого надо 20мА. В боевой девайс заказал обычную 2812.
// ПЕРЕКЛЮЧАТЕЛЬ СВЕТОДИОДНОЙ 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 и лента стопорится после включения - на синем цвете. В чём секрет?
Чудеса новогодние, всё работает из приложения как и задумано, но при n меньше 130 мс (в данной версии 120). Стоит взять и изменить исходное значение в 130 и лента стопорится после включения - на синем цвете. В чём секрет?
разбирайтесь со строкой 113 (вся функция), там явно зацикливание при переходе из стргоки 33. так и не понял чего вы там навертели, но попытатесь убить goto
// ПЕРЕКЛЮЧАТЕЛЬ СВЕТОДИОДНОЙ 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 лента никак не переключается.
Фантастика!, пишу вместо delay_(n*255/Mx); - delay_(n); когда встречается в скетче первый раз и лента переключается хоть при 130, хоть при 160 при прочих "делай". Возвращаю обратно значение аргумента и стопор на синем! Ну как так???
Попробуйте написать delay_(int(n)*255/Mx)
Попробовал, не помогает. Вставил после первого включения синего delay_(n); и заработало :) даже на 160. Вообщем неясно в чём фишка. Функция не может принимать аргумент в виде формулы при больших значениях? (пока не привыкнет :)