Ночник RGB. Прошу критики по моему первому изделию
- Войдите на сайт для отправки комментариев
Пнд, 10/09/2012 - 21:41
Задумка - ночник - тут реализаций много видел, но хоцца самому, с нуля.....
Схема :

Задумка - ночник - тут реализаций много видел, но хоцца самому, с нуля.....
Схема :

Скетч :
//----------------------------------------------------------------------- int KeyBoardA1 = 11 ; // входы клавиатуры 2 х 2 int KeyBoardA0 = 10 ; // входы клавиатуры 2 х 2 int KeyBoardD1 = 9 ; // выходы клавиатуры 2 х 2 int KeyBoardD0 = 8 ; // выходы клавиатуры 2 х 2 int KeyBoardByte = 0 ; // 0 - нет нажатия // 1 - 1 --------------- "+цвет" или выкл авторежима перебора цветов // 2 - 2 --------------- "-цвет" или выкл авторежима перебора цветов // 3 - 2 и 1 ----------- ........................ // 4 - 3 --------------- ........................ // 5 - 3 и 1 ----------- "+яркость" // 6 - 3 и 2 ----------- "-яркость" // 7 - 3 и 2 и 1 ------- ........................ // 8 - 4 --------------- вкл/выкл авторежима перебора цветов ( триггер ) // 9 - 4 и 1 ----------- ........................ // 10 - 4 и 2 ----------- ........................ // 11 - 4 и 2 и 1 ------- ........................ // 12 - 4 и 3 ----------- ........................ // 13 - 4 и 3 и 1 ------- ........................ // 14 - 4 и 3 и 2 ------- ........................ // 15 - 4 и 3 и 2 и 1 --- ........................ boolean Rezim_Auto = true ; // true - автоперебор, false - ручной режим int Pause_Rezim_Auto = 750 ; int ValueColor = 1 ; // значение цвета R = 7 , G = 56 , B = 448 по умолчанию , 1 - тусклый красный int ValueBright = 32 ; // значение яркости по умолчанию 32 int LedR = 6 ; // подключение ленты int LedG = 3 ; // подключение ленты int LedB = 5 ; // подключение ленты int ValueR = 0 ; // значение каналов цвета int ValueG = 0 ; // значение каналов цвета int ValueB = 0 ; // значение каналов цвета //----------------------------------------------------------------------- void setup() { // Serial.begin(9600) ; // диагностика pinMode( KeyBoardA1 , OUTPUT ) ; // опрос клавиатуры digitalWrite( KeyBoardA1 , HIGH ) ; // опрос клавиатуры pinMode( KeyBoardA0 , OUTPUT ) ; // опрос клавиатуры digitalWrite( KeyBoardA0 , HIGH ) ; // опрос клавиатуры pinMode( KeyBoardD1 , INPUT ) ; // считывание клавиатуры digitalWrite( KeyBoardD1 , HIGH ) ; // подтянули к + pinMode( KeyBoardD0 , INPUT ) ; // считывание клавиатуры digitalWrite( KeyBoardD0 , HIGH ) ; // подтянули к + pinMode( LedR , OUTPUT ) ; // подключение ленты pinMode( LedG , OUTPUT ) ; // подключение ленты pinMode( LedB , OUTPUT ) ; // подключение ленты OutColor() ; // вывод цвета и яркости по умолчанию } //----------------------------------------------------------------------- void KeyBoardRead() // считывание состояния 4-ёх кнопок { int TempByte = 0 ; KeyBoardByte = 0 ; digitalWrite( KeyBoardA0 , LOW ) ; if ( digitalRead( KeyBoardD0 ) == LOW ) { TempByte = 1 ; } if ( digitalRead( KeyBoardD0 ) == HIGH ) { TempByte = 0 ; } KeyBoardByte = KeyBoardByte + TempByte ; if ( digitalRead( KeyBoardD1 ) == LOW ) { TempByte = 2 ; } if ( digitalRead( KeyBoardD1 ) == HIGH ) { TempByte = 0 ; } KeyBoardByte = KeyBoardByte + TempByte ; digitalWrite( KeyBoardA0 , HIGH ) ; digitalWrite( KeyBoardA1 , LOW ) ; if ( digitalRead( KeyBoardD0 ) == LOW ) { TempByte = 4 ; } if ( digitalRead( KeyBoardD0 ) == HIGH ) { TempByte = 0 ; } KeyBoardByte = KeyBoardByte + TempByte ; if ( digitalRead( KeyBoardD1 ) == LOW ) { TempByte = 8 ; } if ( digitalRead( KeyBoardD1 ) == HIGH ) { TempByte = 0 ; } KeyBoardByte = KeyBoardByte + TempByte ; digitalWrite( KeyBoardA1 , HIGH ) ; delay( 100 ) ; } //----------------------------------------------------------------------- void OutColor() // по значению ValueRGB выводит ШИМ на ленту или АВТОПЕРЕБОР цветов { int TempColor = ValueColor ; if ( Rezim_Auto == true ) { ValueColor = ValueColor + 1 ; delay( Pause_Rezim_Auto ) ; } else { ValueR = TempColor & 7 ; ValueR = ValueR * ValueBright ; TempColor = TempColor >> 3 ; ValueG = TempColor & 7 ; ValueG = ValueG * ValueBright ; TempColor = TempColor >> 3 ; ValueB = TempColor & 7 ; ValueB = ValueB * ValueBright ; } analogWrite( LedR , ValueR ) ; analogWrite( LedG , ValueG ) ; analogWrite( LedB , ValueB ) ; } //-------- --------------------------------------------------------------- void loop() { KeyBoardRead() ; if ( KeyBoardByte == 1 ) { if ( Rezim_Auto == true ) { Rezim_Auto = false ; // стоп АВТОПЕРЕБОР } else { ValueColor = ValueColor + 1 ; // увеличить цвет if ( ValueColor > 511 ) { ValueColor = 0 ; } } } if ( KeyBoardByte == 2 ) { if ( Rezim_Auto == true ) { Rezim_Auto = false ; // стоп АВТОПЕРЕБОР } else { ValueColor = ValueColor - 1 ; // уменьшить цвет if ( ValueColor < 0 ) { ValueColor = 511 ; } } } if ( KeyBoardByte == 5 ) { ValueBright = ValueBright + 1 ; // увеличить яркость if ( ValueBright > 32 ) { ValueBright = 0 ; } } if ( KeyBoardByte == 6 ) { ValueBright = ValueBright - 1 ; // уменьшить яркость if ( ValueBright < 0 ) { ValueBright = 32 ; } } if ( KeyBoardByte == 8 ) { Rezim_Auto = !Rezim_Auto ; // вкл/выкл режима АВТОПЕРЕБОР цвета } OutColor() ; // Serial.println( KeyBoardByte ) ; // диагностика } //----------------------------------------------------------------------- // кнопка 1 - увеличить цвет или выйти из режима АВТО // кнопка 2 - уменьшить цвет или выйти из режима АВТО // кнопки 3 и 1 - увеличить яркость ( в любом режиме ) // кнопки 3 и 2 - уменьшить яркость ( в любом режиме ) // кнопка 4 - вкл/выкл режима автоперебора цветов //-----------------------------------------------------------------------.
А гле видео? Или предлагается собрать, чтобы оценить? А почему не в "проектах"? А длинные коды сворачивать не умеете (там на второй страничке галочку поставить)?
:) видео ? радиоэлектронщик военный - боится сжечь Ардуинку......
платку травить тока собрался.....
Вы с leshak виртуально все косяки увидете.... не агитирую собирать.....
В "Проектах" ? Не всё строение сайта изучил истчё :(
....галочку - изучу ! это которая скрыть-свернуть прогу ?
Волков бояться - в лес не ходить. Для боящихся что-то сжечь есть Протеус.
Критика? есть ее у меня! Вам внешние резисторы подтяхки зачем? Вы же внутренними пользуетесь? А диоды зачем? Выкинуть их и все будет работать нан прежде. А матрица мз 4-х кнопок зачем? 4 кнопки и так займут 4 входа. Будете поле кнопок 5х5 делать?
Галочка - да, скрыть-развернуть.
P.S. Злой что-то я сегодня... прошу извинить, если что...
а без них, тока с подтяжкой - что есть сканирующий ноль, что нет - одно и тоже считывается
Киньте ссылку на Протеус, пожста....
Диоды - развязывающие ! Без них мона считать тока 4 комбинации нажатых кнопок ( с неоднозначьностью ), а с ними - 16 комбинаций - все возможные одновременные нажатия от 1 до 4 кнопок сразу.....
Нет ?
Матричная клава 2 х 2 - типа моё техзадание, мона и до 3 х 3 развить - режимов много мона придумать.
....... 4 кнопки на 4 пина - это просто, но расширить при этом функционал невозможно.
В "Проектах" ? Не всё строение сайта изучил истчё :(
Для этого не обязательно книгу покупать. Достаточно нажать на ссылку "Форум" в шапке сайта. И 5-секунд подумать какой из списка появившихся форумов больше подходит той теме кторую вы хотите поднять.
А вообще, если заведете себе правило делать хотя-бы 30-сек паузу между тем как "набрали" и "послали", то думаю процентов 50% ваших "ошибок в работе с форумом" - исчезнет.
Тему перенес в форум "Проекты". Так же поправил ее название. Тоже желательно называть темы с расчетом на то, что-бы люди понимали о чем в теме идет речь.
Вы с leshak виртуально все косяки увидете....
А самому не видно? Ну если вы программист (выступаете в его роли), то вы должны быть ленивы. Человек должен думать, а компьютер - работать. Ну вот разве не лениво было набирать фактически одно и тоже для KeyBoardD0,KeyBoardD1 и т.п. Неужели не возникает позыва как-то это свернуть? Положить в массив и бегать по нему циклом?
Сам размер скетча должен намекать "что-тут не так". Постарайтесь привести его в состония, что бы человеку бросившему беглый взгляд было сразу понятно что в нем происходит.
Погуглите примеры работы с матричными клавиатурами. Валом же подобных проектов.
И еще, если это ночник, то IMHO вещи типа
ValueBright = ValueBright - 1 ; // уменьшить яркость if ( ValueBright < 0 ) { ValueBright = 32 ; }Не самая светлая идея. Ночью, с просоня в темноте промахнулся кнопкой (или просто хотел сделать еще менее ярким), и вдруг получил "полную яркость" по глазам :( Лучше не делать "зацикленного перехода", а просто не давать возможности зальнейших изменений.
Как-то так
Далее, зачем вы все свои KeyBoardA1 и проч. пообъявляли int-ами? У вас планируются отрицательные номера пинов? Или вышла новая версия дуины где бывают пины с номерами больше 255?
Пойдите в раздел Программирование, ознакомтесь с тем какие типы бывают. И пользуйтесь теми которые "минимально-достаточны", а не "других я не знаю". Нужно привыкат экономить память.
Кстати, так как номера пинов не меняются по ходу скетча, то вполне можно было вообще не использовать переменные. Обойтисть #define (раз уж не используете массивы).
Киньте ссылку на Протеус, пожста....
А погуглить?
Даже если кому-то не лениво будет искать для вас, вместо вас, ссылки, то официальная которая стоит "много-много-денег" вам вряд ли поможет, а ссылку типа "скачать на торрентах" - так я сам же сразу замочу как только увижу.
Вообщем проявите сообразительность :)
Диоды становятся совершенно не нужны, если сканирующий вывод после сканирования переводить в состояние "INPUT". Скажу больше. Ноль туда можно записать еще в инициализации, потом каждое переключение на вывод будет выводить этот ноль наружу, а переключение на вход переводить вывод в высокоимпанденсное состояние.
А если хотите убрать все неоднозначности при одновременном нажатии нескольких кнопок, то ставте диоды правильно - вот так:
По этому поводу мне идея со "сканирующей клавиатурой" пришла. Додумаю - выложу. По предварительным оценкам на N выводах можно сделать
кнопок. В качестве недостатка - клавиатура фактически треугольная.
Киньте ссылку на Протеус, пожста....
А погуглить?
Даже если кому-то не лениво будет искать для вас, вместо вас, ссылки, то официальная которая стоит "много-много-денег" вам вряд ли поможет, а ссылку типа "скачать на торрентах" - так я сам же сразу замочу как только увижу.
Вообщем проявите сообразительность :)
Для ленивых - можно просто форум почитать или поискать по нему - натыкаешься на полезную тему http://arduino.ru/forum/programmirovanie/arduino-i-proteus
клава матричная минимальная - для изучения, для дальнейших работ, пиновая клава - пины жалко.
Галочка - да, скрыть-развернуть. - конечно же, изучу и буду испольдовать !
P.S. Злой что-то я сегодня... прошу извинить, если что... - нормально :)
Тему перенес в форум "Проекты". Так же поправил ее название. ........... - спасибо, да - тормознул с размещением и названием.....
Положить в массив и бегать по нему циклом? - это я ещё не умею, ибо не понял как.
Пилообразное изменение яркости - не косяк, но буду переделавать, чтобы как в одноклавишных диммерах при достижении максимума начиналось уменьшение яркости, а не замораживание значения.
..... зачем ...... пообъявляли int-ами? С int-тами - забывчивость :( , предполагалось сразу, что int-ы - только Pause_Rezim_Auto и ValueColor, все остальные - byte. Спасибо.
#define - переделал.....
А погуглить? - трудно искать не зная что это и зачем...... теперь понятно - эмулятор
Похоже что вы теперь дорвались кто кнопки "жирный шрифт". Вы хоть раз пробовали, перед тем как посылать, нажать "Предпросмотр"?
А с цитированием у вас что случилось? Что из всего этого винигрета можно понять? Где вы цитируете, где-то отвечаете - ничего не понять.
Или вы жирным шрифтом пытались свои ответы выделить? Так вообщем-то для цитирования есть ктопка "Цитировать". Посмотрите какую разметку она вставляет (можно и руками делать так-же).
А погуглить? - трудно искать не зная что это и зачем...... теперь понятно - эмулятор
Это отмазки. Поиск по сайту на слово "Протеус" вряд ли приведет вас к веткам про аквариумные рыбки. Да и гугл первым результатом возвращает искомое. А если поискать, то на первой странице гугловского поиска и линк на статью найти можно.
Вообщем если-бы было желание и вбили в гугл думаю сами бы догаладись что "Защита растений" - это не потеме, а первое что "по теме" уже объяснило бы что это эмулятор.
вот в разметке я ничё и не понял..... получаются какие-то вложенные таблички, с глубиной 3.....
если можно расскажите - как текст на схему добавить ? типа Label - как в Delphi. Обозначить на схеме линии A0, A1, D0, D1....
Хоть это и оффтоп (старайтесь не задавать сильно отвлеченных вопросов), но отвечу. Цитата обрамляется тегами
.
Как текст на схему добавить - смотрите в хелпе программы, в которой рисуете, мы не экстрасенсы и через плечо на Ваш монитор не смотрим!
Хоть это и оффтоп (старайтесь не задавать сильно отвлеченных вопросов), но отвечу. Цитата обрамляется тегами
Спасибо :)
Как текст на схему добавить - смотрите в хелпе программы, в которой рисуете, мы не экстрасенсы и через плечо на Ваш монитор не смотрим!
дык, во Fritzing-е и делаю.... с английским - вааще никак.... только Тейбл :(
Спасибо за советы и воспитание !
дык, во Fritzing-е и делаю.... с английским - вааще никак.... только Тейбл :(
А что, русский язык в настройках включить никак?
Там есть элемент "Note" (желтенький такой) - можно пользоваться им.
А что, русский язык в настройках включить никак?
Я же говорил:
Это отмазки.
У моего зауча школьного, была замечательная фраза на любые объяснения почему не сделал ДЗ: "Ваши подробности".
клавиатура фактически треугольная.
Что-то в голову сразу пришла детская математическая загадка.
Есть 27 монет. Одна из них - фальшивая (она легче). Есть весы-две-чашки (умеет показывать только какая чашка легче, но не насколько). Нужно за ТРИ взвешивания определить фальшивую монету.
Что-то крутится в голове что на этом принципе клавиатуру можно соорудить (весы==делитель напряжения+аналоговый вход), но... что-то не могу сообразить.
Задачка простая - монеты каждый раз на 3 кучки надо делить. Как к клавиатуре привязать, не понимаю пока... хотя что-то подсказывает, что возможно :) Я собирался обойтись без аналоговых входов... но надо подумать :) Пока пришло в голову только 8 независимых кнопок на 1 вход на R-2R матрице...
А что, русский язык в настройках включить никак?
Никак..... вааще нету выбора
Спасибо ! .....нашёл "Note" :)
А что, русский язык в настройках включить никак?
Никак..... вааще нету выбора
Спасибо ! .....нашёл "Note" :)
Скачайте сежую версию с оф сайта - там куча языков. У меня сразу на русском встала.
Предлагаю код для люстры RGB + 10 светодиодов по 3ват, работает с пульта RGB смостоятельно меняют свет 3-х ватники 9 уровней яркости, видео выкладывать не буду лень, библиотеку и как работать с пультом см https://www.youtube.com/watch?v=PjR9jlP4644
#include <IRremote.h> unsigned long currentTime; // задание переменной времени unsigned long loopTime; // задание переменной отрыва от времени boolean rg = 1; // заданное уставки rgb byte vik = 250; // яркость rgb byte r = 0; //уровень красного byte g = 0; //уровень зеленого byte b = 0; //уровень синего byte led = 0; //яркость света основного byte led1 = 0; //уровень света основного void svet(byte r, byte g, byte b, byte led) {analogWrite(5,r);analogWrite(6,g);analogWrite(9,b);analogWrite(10,led);} byte d1 ; //рандом 1-4 byte d2 ; //рандом 0-255 int RECV_PIN = 11; //вход ИК приемника IRrecv irrecv(RECV_PIN); decode_results results; void setup() { currentTime = millis(); // считываем время, прошедшее с момента запуска программы loopTime = currentTime; irrecv.enableIRIn(); // включить ИК приемник pinMode(5, OUTPUT); // назначаем пины как выходы pinMode(6, OUTPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); } void loop() { currentTime = millis(); // считываем время, прошедшее с момента запуска программы if(currentTime >= (loopTime + 22000)){ // сравниваем текущий таймер с переменной loopTime + 22 секунда d1 = random(1,4); d2 = random(0,vik); loopTime = currentTime; } if (rg == 1 && d1 == 1 && d2 > r) { r++; } if (rg == 1 && d1 == 1 && d2 < r) { r--; } if (rg == 1 && d1 == 2 && d2 > g) { g++; } if (rg == 1 && d1 == 2 && d2 < g) { g--; } if (rg == 1 && d1 == 3 && d2 > b) { b++; } if (rg == 1 && d1 == 3 && d2 < b) { b--; } if (rg == 0) {r = 0; g = 0; b = 0;} if (led1 > led && led1 != led) { led++; delay (20);} if (led1 < led && led1 != led) { led--; delay (20);} svet(r,g,b,led); delay (200); if (irrecv.decode(&results)) {delay (100); if (results.value == 0xFFA25D){rg = 0; led1 = 0; r = 0; g = 0; b = 0;} // выкл всего if (results.value == 0xFFE01F){rg = !rg; vik = 250;} // вкл/выкл rgb if (results.value == 0xFFA857 && vik != 0){vik = vik - 50;} // rgb -50 if (results.value == 0xFF906F && vik != 250){vik = vik + 50;} // rgb +50 if (results.value == 0xFF6897){led1 = 0;} if (results.value == 0xFF30CF){led1 = 28;} if (results.value == 0xFF18E7){led1 = 57;} if (results.value == 0xFF7A85){led1 = 85;} if (results.value == 0xFF10EF){led1 = 113;} if (results.value == 0xFF38C7){led1 = 141;} if (results.value == 0xFF5AA5){led1 = 170;} if (results.value == 0xFF42BD){led1 = 198;} if (results.value == 0xFF4AB5){led1 = 226;} if (results.value == 0xFF52AD){led1 = 255;} irrecv.resume(); } }