помогите новичку ШИМ -led
- Войдите на сайт для отправки комментариев
Пт, 19/11/2021 - 13:15
Добрый!
сам не справился прошу вашей помощи!
есть необходимость собрать контроллер для управления 6ю светодиодами (уменьшать яркость)
управление через синий зуб с телефона.
програмулину на телефоне собрал (там ползунки меняется значение 0-255)
и так на каждом из 6 каналов.
но вот как заставить ардуну менять значения не на одном на разных пинах? я не осилил...
понимаю что надо для каждого цвета кроме 0-255 отправить еще что то, но в мониторе порта все это отправляется второй строкой и значения не меняются.
подскажите плиз как правильно сделать?
если хотите научится сами - давайте схему и код (код вставлять в форум ПРАВИЛЬНО)
если хотите просто получить готовое - в раздел Ищу исполнителя, за небольшую плату соберут
я хочу сам разобраться- готовых решений полно! я сам хочу понять!
не думаю что схема особо важна
постараюсь описать чтоб не рисовать...
Arduino nano (328)
пины для управления шим (0-5в): 3,5,6,9,10,11
светодиоды запитаны через драйверы.
естественно подключен блютус.
код я на данном этапе использовал из стандартных и пытался как мог его подогнать под себя- но увы...
const int ledPin = 10; // the pin that the LED is attached to unsigned long brightness = 0; // для хранения полученного байта void setup() { Serial.begin(9600); pinMode(ledPin, OUTPUT); } void loop() { byte brightness; if (Serial.available()) { brightness = Serial.read(); analogWrite(ledPin, brightness); Serial.print("получено: "); Serial.println(brightness, DEC); } }тут только 1 пин (10) монитор порта читает все ползунки как 0-255.
и соответственно меняется только один порт от любых движений!
А что передаёте на ардуино ?
не думаю что схема особо важна
не думаю, что твои проблемы особо важны
ну для меня этот вопрос очень не простой.... так как я делал приложение так же по урокам - и тыкался в темноте.
предположу что моя программа отправляет: Send1ByteNumber - "Декодирует заданное число String в целое число и записывает его как один байт в выходной поток."
по крайней мере я в мониторе порта вижу значения положения ползунка.
и на 10 пине получаю 5в.
если я выбираю: Send2ByteNumber -"Декодирует заданное число String в целое число и записывает его как два байта в выходной поток."
то в мониторе порта я вижу положение ползунка и вторую строку ="0" и соответственно ничего не меняется на 10 пине! так как "0"
не думаю что схема особо важна
Ну, на нет и суда нет. Разбирайтесь сами.
Спасибо. Я тут новенький в этой теме... и только еще делаю первые шаги.
А вот в теме нахамить я уже далеко не ребенок. Однако мне не хочется демонстрировать тут этот навык!
Возможно для вас я и сделаю исключение. Но не сейчас...
Надеюсь все же дождаться умных и добрых людей! К сожалению персон с вашей аватарки хватает в любом обществе.
Колхозным способом так: с инвентора шлете например 'A' и сразу же байт-значение ШИМ ("яркость"). На ардуине в переменную читаете символ и следом сразу байт "яркость". Потом анализируете - символ равен 'A'? Если да, то на выводе 3 ставите значение яркости. Если 'B', то на выводе 5 и т.д.
Иногда это будет работать.
Вы уверены что принимаете данные именно от блютуз ???
да. так как я двигаю ползунок на телефоне - вижу значение- и это значение вижу в мониторе порта.
Колхозным способом так: с инвентора шлете например 'A' и сразу же байт-значение ШИМ ("яркость"). На ардуине в переменную читаете символ и следом сразу байт "яркость". Потом анализируете - символ равен 'A'? Если да, то на выводе 3 ставите значение яркости. Если 'B', то на выводе 5 и т.д.
Иногда это будет работать.
Правильно ли я понимаю что должен послать на каждый "ПИН" 2 сообщения - условно это кодовое имя цвета и второе сообщение это 0-255.
Думаю я это осилю... - колхоз
А если не колхоз?
управление цветом ползунками это так сказать только начало - надо будет еще несколько функций... но для начала мне бы научиться просто менять яркость на каждом канале
Колхозным способом так: с инвентора шлете например 'A' и сразу же байт-значение ШИМ ("яркость"). На ардуине в переменную читаете символ и следом сразу байт "яркость". Потом анализируете - символ равен 'A'? Если да, то на выводе 3 ставите значение яркости. Если 'B', то на выводе 5 и т.д.
Иногда это будет работать.
Правильно ли я понимаю что должен послать на каждый "ПИН" 2 сообщения - условно это кодовое имя цвета и второе сообщение это 0-255.
Думаю я это осилю... - колхоз
А если не колхоз?
управление цветом ползунками это так сказать только начало - надо будет еще несколько функций... но для начала мне бы научиться просто менять яркость на каждом канале
ну а если не колхоз берём какой-нибудь протокол радиоуправления, IBUS, SBUS, PPM к примеру )))
Коллеги!
Первое: Я настоятельно прошу прекратить обсуждение без схемы и кода. Мы сами пишем правила не для того, чтобы новички их игнорили!
Второе: Детские вопросы - в Песочнице, мы это тоже сами установили и снова поощряем засирание темы "Программирование"?
Колхозным способом так: с инвентора шлете например 'A' и сразу же байт-значение ШИМ ("яркость"). На ардуине в переменную читаете символ и следом сразу байт "яркость". Потом анализируете - символ равен 'A'? Если да, то на выводе 3 ставите значение яркости. Если 'B', то на выводе 5 и т.д.
Иногда это будет работать.
Правильно ли я понимаю что должен послать на каждый "ПИН" 2 сообщения - условно это кодовое имя цвета и второе сообщение это 0-255.
Думаю я это осилю... - колхоз
А если не колхоз?
управление цветом ползунками это так сказать только начало - надо будет еще несколько функций... но для начала мне бы научиться просто менять яркость на каждом канале
ну а если не колхоз берём какой-нибудь протокол радиоуправления, IBUS, SBUS, PPM к примеру )))
намек понял....мне в колхоз....
не подскажите как правильно сказать пину "10" что если в порт пришло "65" (указал в приложении отравить текст "A") а следом "230" что соответствует положению ползунка для цвета 1
а вот пину "9" что если в порт пришло "66" (указал в приложении отравить текст "B") а следом "200" что соответствует положению ползунка для цвета 2?
Коллеги!
Первое: Я настоятельно прошу прекратить обсуждение без схемы и кода. Мы сами пишем правила не для того, чтобы новички их игнорили!
Второе: Детские вопросы - в Песочнице, мы это тоже сами установили и снова поощряем засирание темы "Программирование"?
Арошу прощения что нарушил правила.
Но для данного вопроса схеме не нужна! Тут нет кучи датчиков от которых что то зависит и правильность подключения и прочего. Нет дисплея...
Поэтому я нарушил правило чертить схему...
Ну а про песочницу каюсь- не знал- искал в сет нужную мне инфу- наткнулся на тему похожую- увидел раздел форума... тут и создал свою тему! Если это принципиально и есть тех возможность перенести в правильны раздел форума. Буду только рад.
Не все мы переходим улицу в указанных местах!!!
tiger63rus, поищите здесь на форуме или в интернете вообще что-нибудь про "парсинг значений поступающих из ком-порта", "парсинг команд ...". Один байт Вы посылаете и принимаете. Теперь нужно научиться отсылать, принимать и разбирать несколько значений за раз. Примеров много, логично что пересказывать их никому не охота. (На примеры идущие с Arduino IDE тоже стоит посмотреть)
tiger63rus, поищите здесь на форуме или в интернете вообще что-нибудь про "парсинг значений поступающих из ком-порта", "парсинг команд ...". Один байт Вы посылаете и принимаете. Теперь нужно научиться отсылать, принимать и разбирать несколько значений за раз. Примеров много, логично что пересказывать их никому не охота. (На примеры идущие с Arduino IDE тоже стоит посмотреть)
спасибо. буду искать- но задам еще один вопрос: я отправляю с телефона по блютусу "А" а в порт приходит "65"
как заставить в порт приходить буквы? ведь если будет в диапазоне яркости 0-255 значение "65" но у другого канала (скажем у "D") все будет работать криво...
намек понял....мне в колхоз....
Если вы в последствии собираетесь отправлять по serial команды не только для светодиодов, то самодельный вариант (а это тоже протокол обмена) может сильно усложниться и стать запутанным.
'A' - это и есть DEC 65. См. ASCII Table.
это я понял! вопрос в другом.
буковки как в порт послать? не цыфирки.... раз уж я уровня песочницы...
шлите цифрами 65 66 67, только как вы поймете это уровень яркости 65 или канал 65
Я бы слал 01 02 03 04 - 10 для каналов и 00, 11, 12, 13 ...255 яркость
это я понял! вопрос в другом.
буковки как в порт послать? не цыфирки.... раз уж я уровня песочницы...
Буковки - это графические символы, предназначенные для отображения на бумаге или на экране специально для визуального восприятия человеком. В компьютере (микроконтроллере) никаких буковок нет, есть только байты, т.е. цифры, которыми эти буквы кодируются. Соответственно в порт посылаются не сами буквы, а их байт-коды, что и наблюдается в мониторе порта. Можно а) преобразовывать эти коды в буквы (накуа. если их все равно обрабатывает МК, который глаз не имеет) или б) работать напрямую со значениями байтов
это я понял! вопрос в другом.
буковки как в порт послать? не цыфирки.... раз уж я уровня песочницы...
Буковки - это графические символы, предназначенные для отображения на бумаге или на экране специально для визуального восприятия человеком. В компьютере (микроконтроллере) никаких буковок нет, есть только байты, т.е. цифры, которыми эти буквы кодируются. Соответственно в порт посылаются не сами буквы, а их байт-коды, что и наблюдается в мониторе порта. Можно а) преобразовывать эти коды в буквы (накуа. если их все равно обрабатывает МК, который глаз не имеет) или б) работать напрямую со значениями байтов
Хорошо. может я не понимаю чего.
я написал условие: если прилетает "а" то мы меняем значение пина 10
если прилетает "b" значение пина 9 и тд... и вот как мне сказать ардуине что я послал "а" - если я его посылаю а прилетает его цифровой аналог!
'A' экивалентно 65. В условии можно писать хоть то, хоть это.
Я настоятельно прошу прекратить ...
Глас вопиющего. Тут любят тереть шары, а потом материться. что всем форумом три дня трахались, а оказалось, что ТС с ресета читает.
Ну так языки то чешутся... Аж удержаться невозможно.(
Хорошо. может я не понимаю чего.
я написал условие: если прилетает "а" то мы меняем значение пина 10
если прилетает "b" значение пина 9 и тд... и вот как мне сказать ардуине что я послал "а" - если я его посылаю а прилетает его цифровой аналог!
если прилетает 65 то мы меняем значение пина 10, если прилетает 66 значение пина 9 и тд...
и вот как мне сказать ардуине что я послал "а" - если я его посылаю а прилетает его цифровой аналог!
Вариант - посылайте все текстом, тогда буквы - определяют номера пинов, а цифры после букв составляют строку - число величину яркости. Соответственно буквы являются разделителями "пакетов" в этом самодельном "протоколе".
буковки как в порт послать? не цыфирки.... раз уж я уровня песочницы...
Компьютер никак не отличает "буковки" от "циферок", для него это абсолютно одно и то же.
А чтобы человек мог в удобной ему форме понимать, что выдает компьютер, придумали разные типы данных.
Прочтите же, наконец, учебник!
и вот как мне сказать ардуине что я послал "а" - если я его посылаю а прилетает его цифровой аналог!
Вариант - посылайте все текстом, тогда буквы - определяют номера пинов, а цифры после букв составляют строку - число величину яркости. Соответственно буквы являются разделителями "пакетов" в этом самодельном "протоколе".
вот в этом месте видимо у меня и проблема... я не могу заставить послать текст.
так как готовый скетч который я вроде как переделал уже меняет все нужные значения если их вводить с клавиатуры в порт. по блютусу так не пролетает!
void setup() { Serial.begin(9600); Serial.setTimeout(5); pinMode(3, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); pinMode(11, OUTPUT); } void loop() { if (Serial.available()>1){ char var = Serial.read(); int val = Serial.parseInt(); switch (var) { case 'a': analogWrite(3,val); case 'b': analogWrite(5,val); case 'c': analogWrite(6,val); case 'd': analogWrite(9,val); case 'e': analogWrite(10,val); case 'f': analogWrite(11,val); break; } } }SendText(text)
Converts the given text to bytes and writes them to the output stream.
Свич написан так, что работать будет криво. Читайте про break внимательней.
SendText(text) это где? в приложении? так оно и стоит... и переводит букф в цыфр.
а в чем кривизна? я опять же делаю по тому что нахожу... сильный пробел у меня в программировании... но я не сдаюсь и хочу заполнить этот пробел.
Какая в итоге строка прилетает из блютуса?
две строки
65
255
если ползунок в край
Казалось бы - все, что нужно, на этом сайте есть, нужно только зайти и почитать ))
http://arduino.ru/Reference/SwitchCase
[qoute]
Ключевое слово break является командой выхода из оператора case и обычно используется в конце каждого case. Без оператора break оператор switch будет продолжать вычислять следующие выражения, пока не достигнет break или конец оператора switch.
switch (var) { case 1: //выполняется, когда var равно 1 break; case 2: //выполняется когда var равно 2 break; default: // выполняется, если не выбрана ни одна альтернатива // default необязателен }[/quote]
две строки
65
255
если ползунок в край
Ну так и пиши в кейсе вместо 'a' 65
Казалось бы - все, что нужно, на этом сайте есть, нужно только зайти и почитать ))
http://arduino.ru/Reference/SwitchCase
[qoute]
Ключевое слово break является командой выхода из оператора case и обычно используется в конце каждого case. Без оператора break оператор switch будет продолжать вычислять следующие выражения, пока не достигнет break или конец оператора switch.
switch (var) { case 1: //выполняется, когда var равно 1 break; case 2: //выполняется когда var равно 2 break; default: // выполняется, если не выбрана ни одна альтернатива // default необязателен }[/qute]
я и не спорю.... но поиск выводит по запросу "уроки ардуино....." много всякий важных людей- с крутыми каналами уроками всего и вся.... и как то верится что та все правильно! урок жеж.... а там вон оно как...
две строки
65
255
если ползунок в край
ParseInt разбирает строку символов "123", а не байт со значением 123. Вам нужно хорошо понять отличие между символом и числом.
две строки
65
255
если ползунок в край
Ну так и пиши в кейсе вместо 'a' 65
глупо конечно... и смешно... но не выходит... и еще вопрос. а если значение ползунка будет =65! ардуина это как воспримет? как ключ "65"
две строки
65
255
если ползунок в край
если не сложно ткните носом где почитать... я уже столько всего начитался-голова пухнет- месяц собираю этот светильник...
Почитать любой учебник по языку Си.
Но сейчас лучше просто заменить parseInt() на второй read()
две строки
65
255
если ползунок в край
Ну так и пиши в кейсе вместо 'a' 65
а зачем? 'A' удобнее жеж
А и а - большая разница для компа !!!
...или Send1ByteNumber на SendText. Может и прокатит. Я инвентора не знаю - позволяет ли он такие фокусы с конвертацией типов.
А и а - большая разница для компа !!!
Командир прав 'a' <> 'A'. Аски-код другой. Свич не словит.
/////////////////// ТЕСТ для ленты ws2812b с помощью приложения на ПК ////////////////////// // Подключаем библиотеку Adafruit NeoPixel. #include "Adafruit_NeoPixel.h" // Указываем, какое количество пикселей у нашей ленты. #define LED_COUNT1 10 // Указываем, к какому порту подключен вход ленты DIN. #define LED_PIN1 6 Adafruit_NeoPixel strip1 = Adafruit_NeoPixel(LED_COUNT1, LED_PIN1, NEO_RGB + NEO_KHZ400);// Создаем переменную strip для управления нашей лентой. String inputString;// строки данных long Y=0;//переменная хранения моментов времени int pos = 0;//переменная хранения текущего значения полученных данных int i=0;//счётчик long CVET=0;//переменная хранения запрашиваемого цвета пикселя long CVET_=0;//переменная хранения запрашиваемого цвета крайнего пикселя bool fl_=false; int r=0;int g=0; int b=0; int n=0;//переменные хранения параметров включений пикселей void setup() { Serial.begin(9600); strip1.begin(); for(i=0;i<LED_COUNT1;i++) { strip1.setPixelColor(i,0,0,0);// }strip1.show(); } void loop() { CheckSerial();//ЖДЁМ ПОСТУПЛЕНИЯ КОМАНДЫ } ////////////////////////////////////////////////////////////////////////////////// //// ФУНКЦИИ ОПИСАНИЕ // вместо задержки времени через delay //////////////////////////////////////// void delay_(int T1) { Y=millis(); while(millis()-Y<T1) { //CheckSerial();//ЖДЁМ ПОСТУПЛЕНИЯ КОМАНДЫ } } //////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////// //ФУНКЦИИ ПРИЁМА И ОБРАБОТКИ ДАННЫХ 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 > 3)return; //если их меньше 1 или больше 3, выходим из функции String cmd = inputString; // передаём строку другой переменной inputString = "";//"обнуляем переменную" pos=cmd.toInt();//преобразовать строку в число if(pos==951){fl_=true;}//если в приложении включили пиксель... if(fl_==true){strip1.setPixelColor(n,r,g,b);strip1.show();}//включение пикселя по текущим данным if(pos==950){fl_=false;}//если в приложении выключили пиксель... if(pos>=768&&pos<=777){n=pos-768;}//обновляем значение номера пикселя if(pos>=0&&pos<=255){r=pos;}//обновляем значение красной составляющей цвета if(pos>=256&&pos<=511){g=pos-256;}//обновляем значение зелёной составляющей цвета if(pos>=512&&pos<=767){b=pos-512;}//обновляем значение синей составляющей цвета if(pos==952){ for(i=0;i<LED_COUNT1;i++)//сдвиг на один пиксель по кнопке { CVET=strip1.getPixelColor(i);//определяем цвет пикселя... if(i-1==-1){CVET_=strip1.getPixelColor(LED_COUNT1-1);strip1.setPixelColor(LED_COUNT1-1,CVET);}//условие закольцовки сдвига пикселей else{if(i==LED_COUNT1-1){strip1.setPixelColor(i-1,CVET_);}else{strip1.setPixelColor(i-1,CVET);}}//...записываем его в предыдущий }strip1.show();}//обновляем ленту }Автор темы, вот вам пример от меня. Обратите внимание как числами можно строить протокол передачи данных. Сам уже не помню как работает :-)
Обратите внимание также на необходимость присутствия символа окончания строки в своём приложении к каждой команде типа "А".
и еще вопрос. а если значение ползунка будет =65! ардуина это как воспримет? как ключ "65"
Первая строка - ключ, вторая строка - значение. В таком порядке и разбирать. А ардуина воспримет ровно так, как ты ей пропишешь
А и а - большая разница для компа !!!
так у 'A' как раз 65 код, я буковку на клаве кодом набирал )))
я и не спорю.... но поиск выводит по запросу "уроки ардуино....." много всякий важных людей- с крутыми каналами уроками всего и вся.... и как то верится что та все правильно! урок жеж.... а там вон оно как...
Так Вы неправильную строку запроса вводите, поэтому и получаете всякую чушь.
Искать нужно не "уроки по Ардуино", а "учебник по Си/Си++".