Ночник RGB. Прошу критики по моему первому изделию

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

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

Схема :

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

 Скетч :

//-----------------------------------------------------------------------
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 - вкл/выкл режима автоперебора цветов
//-----------------------------------------------------------------------

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

.

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

А гле видео? Или предлагается собрать, чтобы оценить? А почему не в "проектах"? А длинные коды сворачивать не умеете (там на второй страничке галочку поставить)?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

 :) видео ? радиоэлектронщик военный - боится сжечь Ардуинку......

платку травить тока собрался.....

Вы с leshak виртуально все косяки увидете.... не агитирую собирать.....

В "Проектах" ? Не всё строение сайта изучил истчё :(

....галочку - изучу ! это которая скрыть-свернуть прогу ?

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Волков бояться - в лес не ходить. Для боящихся что-то сжечь есть Протеус.

Критика? есть ее у меня! Вам внешние резисторы подтяхки зачем? Вы же внутренними пользуетесь? А диоды зачем? Выкинуть их и все будет работать нан прежде. А матрица мз 4-х кнопок зачем? 4 кнопки и так займут 4 входа. Будете поле кнопок 5х5 делать?

Галочка - да, скрыть-развернуть.

P.S. Злой что-то я сегодня... прошу извинить, если что...

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

 а без них, тока с подтяжкой - что есть сканирующий ноль, что нет - одно и тоже считывается

Киньте ссылку на Протеус, пожста.... 

Диоды - развязывающие ! Без них мона считать тока 4 комбинации нажатых кнопок ( с неоднозначьностью ), а с ними - 16 комбинаций - все возможные одновременные нажатия от 1 до 4 кнопок сразу.....

Нет ?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

 Матричная клава 2 х 2 - типа моё техзадание, мона и до 3 х 3 развить - режимов много мона придумать.

....... 4 кнопки на 4 пина - это просто, но расширить при этом функционал невозможно.

leshak
Offline
Зарегистрирован: 29.09.2011

SU-27-16 пишет:

В "Проектах" ? Не всё строение сайта изучил истчё :(

Для этого не обязательно книгу покупать. Достаточно нажать на ссылку "Форум" в шапке сайта. И 5-секунд подумать какой из списка появившихся форумов больше подходит той теме кторую вы хотите поднять.

А вообще, если заведете себе правило делать хотя-бы 30-сек паузу между тем как "набрали" и "послали", то думаю процентов 50% ваших "ошибок в работе с форумом" - исчезнет.

Тему перенес в форум "Проекты". Так же поправил ее название. Тоже желательно называть темы с расчетом на то, что-бы люди понимали о чем в теме идет речь. 

 

leshak
Offline
Зарегистрирован: 29.09.2011

 

SU-27-16 пишет:

Вы с leshak виртуально все косяки увидете....

А самому не видно? Ну если вы программист (выступаете в его роли), то вы должны быть ленивы. Человек должен думать, а компьютер - работать. Ну вот разве не лениво было набирать фактически одно и тоже для KeyBoardD0,KeyBoardD1 и т.п. Неужели не возникает позыва как-то это свернуть? Положить в массив и бегать по нему циклом?

Сам размер скетча должен намекать "что-тут не так". Постарайтесь привести его в состония, что бы человеку бросившему беглый взгляд было сразу понятно что в нем происходит.

Погуглите примеры работы с матричными клавиатурами. Валом же подобных проектов.

И еще, если это ночник, то IMHO вещи типа

   ValueBright = ValueBright - 1 ;   // уменьшить яркость
    if ( ValueBright < 0 )
    {
      ValueBright = 32 ;
    }

Не самая светлая идея. Ночью, с просоня в темноте промахнулся кнопкой (или просто хотел сделать еще менее ярким), и вдруг получил "полную яркость" по глазам :( Лучше не делать "зацикленного перехода", а просто не давать возможности зальнейших изменений. 

Как-то так

ValueBright--; // уменьшили яркость
if(ValueBright<0)ValueBright=0

Далее, зачем вы все свои KeyBoardA1 и проч. пообъявляли int-ами? У вас планируются отрицательные номера пинов? Или вышла новая версия дуины где бывают пины с номерами больше 255?

Пойдите в раздел Программирование, ознакомтесь с тем какие типы бывают. И пользуйтесь теми которые "минимально-достаточны", а не "других я не знаю". Нужно привыкат экономить память.

Кстати, так как номера пинов не меняются по ходу скетча, то вполне можно было вообще не использовать переменные. Обойтисть #define  (раз уж не используете массивы).

leshak
Offline
Зарегистрирован: 29.09.2011

SU-27-16 пишет:

Киньте ссылку на Протеус, пожста.... 

А погуглить?

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

Вообщем проявите сообразительность :)

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Диоды становятся совершенно не нужны, если сканирующий вывод после сканирования переводить в состояние "INPUT". Скажу больше. Ноль туда можно записать еще в инициализации, потом каждое переключение на вывод будет выводить этот ноль наружу, а переключение на вход переводить вывод в высокоимпанденсное состояние.

А если хотите убрать все неоднозначности при одновременном нажатии нескольких кнопок, то ставте диоды правильно - вот так:

По этому поводу мне идея со "сканирующей клавиатурой" пришла. Додумаю - выложу. По предварительным оценкам на N выводах можно сделать кнопок. В качестве недостатка - клавиатура фактически треугольная.

 

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

leshak пишет:

SU-27-16 пишет:

Киньте ссылку на Протеус, пожста.... 

А погуглить?

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

Вообщем проявите сообразительность :)

Для ленивых - можно просто форум почитать или поискать по нему - натыкаешься на полезную тему http://arduino.ru/forum/programmirovanie/arduino-i-proteus

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

клава матричная минимальная - для изучения, для дальнейших работ, пиновая клава - пины жалко.

Галочка - да, скрыть-развернуть. - конечно же, изучу и буду испольдовать !

P.S. Злой что-то я сегодня... прошу извинить, если что... - нормально :)

Тему перенес в форум "Проекты". Так же поправил ее название. ........... - спасибо, да - тормознул с размещением и названием.....

Положить в массив и бегать по нему циклом? - это я ещё не умею, ибо не понял как.

Пилообразное изменение яркости - не косяк, но буду переделавать, чтобы как в одноклавишных диммерах при достижении максимума начиналось уменьшение яркости, а не замораживание значения.

..... зачем ...... пообъявляли int-ами? С int-тами - забывчивость :( , предполагалось сразу, что int-ы - только Pause_Rezim_Auto и ValueColor, все остальные - byte. Спасибо.

#define - переделал.....

А погуглить? - трудно искать не зная что это и зачем...... теперь понятно - эмулятор

leshak
Offline
Зарегистрирован: 29.09.2011

 Похоже что вы теперь дорвались кто кнопки "жирный шрифт". Вы хоть раз пробовали, перед тем как посылать, нажать "Предпросмотр"?

А с цитированием у вас что случилось? Что из всего этого винигрета можно понять? Где вы цитируете, где-то отвечаете - ничего не понять.

Или вы жирным шрифтом пытались свои ответы выделить? Так вообщем-то для цитирования есть ктопка "Цитировать". Посмотрите какую разметку она вставляет (можно и руками делать так-же).

leshak
Offline
Зарегистрирован: 29.09.2011

SU-27-16 пишет:

А погуглить? - трудно искать не зная что это и зачем...... теперь понятно - эмулятор

Это отмазки. Поиск по сайту на слово "Протеус" вряд ли приведет вас к веткам про аквариумные рыбки. Да и гугл первым результатом возвращает искомое. А если поискать, то на первой странице гугловского поиска и линк на статью найти можно.

Вообщем если-бы было желание и вбили в гугл думаю сами бы догаладись что "Защита растений" - это не потеме, а первое что "по теме" уже объяснило бы что это эмулятор.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

 вот в разметке я ничё и не понял..... получаются какие-то вложенные таблички, с глубиной 3.....

если можно расскажите - как текст на схему добавить ? типа Label - как в Delphi. Обозначить на схеме линии A0, A1, D0, D1....

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Хоть это и оффтоп (старайтесь не задавать сильно отвлеченных вопросов), но отвечу. Цитата обрамляется тегами

[quote] - начало цитаты
[/quote] - конец цитаты

 . 

Как текст на схему добавить - смотрите в хелпе программы, в которой рисуете, мы не экстрасенсы и через плечо на Ваш монитор не смотрим! 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

AlexFisher пишет:

Хоть это и оффтоп (старайтесь не задавать сильно отвлеченных вопросов), но отвечу. Цитата обрамляется тегами

Спасибо :)

AlexFisher пишет:

Как текст на схему добавить - смотрите в хелпе программы, в которой рисуете, мы не экстрасенсы и через плечо на Ваш монитор не смотрим!

дык, во Fritzing-е и делаю.... с английским - вааще никак.... только Тейбл :(

 

Спасибо за советы и воспитание !

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

SU-27-16 пишет:

дык, во Fritzing-е и делаю.... с английским - вааще никак.... только Тейбл :(

А что, русский язык в настройках включить никак?

Там есть элемент "Note" (желтенький такой) - можно пользоваться им.

leshak
Offline
Зарегистрирован: 29.09.2011

 

AlexFisher пишет:

А что, русский язык в настройках включить никак?

Я же говорил:

leshak пишет:

Это отмазки.

У моего зауча школьного, была замечательная фраза на любые объяснения почему не сделал ДЗ: "Ваши подробности".

leshak
Offline
Зарегистрирован: 29.09.2011

AlexFisher пишет:

клавиатура фактически треугольная. 

Что-то в голову сразу пришла детская математическая загадка.

Есть 27 монет. Одна из них - фальшивая (она легче). Есть весы-две-чашки (умеет показывать только какая чашка легче, но не насколько). Нужно за ТРИ взвешивания определить фальшивую монету.

Что-то крутится в голове что на этом принципе клавиатуру можно соорудить (весы==делитель напряжения+аналоговый вход), но... что-то не могу сообразить.

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

 Задачка простая - монеты каждый раз на 3 кучки надо делить. Как к клавиатуре привязать, не понимаю пока... хотя что-то подсказывает, что возможно :) Я собирался обойтись без аналоговых входов... но надо подумать :) Пока пришло в голову только 8 независимых кнопок на 1 вход на R-2R матрице...
 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

AlexFisher пишет:

А что, русский язык в настройках включить никак?

Никак..... вааще нету выбора

Спасибо ! .....нашёл "Note" :)

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

SU-27-16 пишет:

AlexFisher пишет:

А что, русский язык в настройках включить никак?

Никак..... вааще нету выбора

Спасибо ! .....нашёл "Note" :)

Скачайте сежую версию с оф сайта - там куча языков. У меня сразу на русском встала.

vov4ik
Offline
Зарегистрирован: 10.09.2013

Предлагаю код для люстры 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();
}
}