Автоматическая подсветка лестницы и MM5450

Brutal
Offline
Зарегистрирован: 14.03.2013

student94 пишет:

Вопрос снят.

Проблемой битый контакт.)

Бывает. Всегда есть 2 причины неисправости - есть контакт там где не нужно или нету контакта там где нужно ;)

pogriban
Offline
Зарегистрирован: 28.12.2014

скажите пожалуйста R14 для чего нужна, а то я уже 4-ый раз пробую и никак не получяется

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

student94 пишет:

Проблемой битый контакт.)

за один битый контакт два небитых дают.

Litoza
Offline
Зарегистрирован: 08.10.2015
Jazzmen
Offline
Зарегистрирован: 10.02.2016

Maksim, я с програмированием вообще никак. Стыдно конечно. Но, в 45 лет не лезит в голову, как не стараюсь. Решил сделать подсветку в прихожей, залил соответственно этот скетч, с 42 поста. Все настроил, работает. У меня вопрос, нелья сделать так если в момент включенного освещения,  проходит второй человек, свечение не выключалось по заданному в программе времени, а продливалось на некоторое время. И  по последнему срабатыванию сенсора измнялось направление выключения светодиодов. 

volchok
Offline
Зарегистрирован: 28.08.2015

Чувак намудрил слишком. Но в общем понять можно. Это все "инженерно и с запасом" получилось :)

volchok
Offline
Зарегистрирован: 28.08.2015

Нет. Нужно переписывать код на "риалтайм", без delay

Jazzmen
Offline
Зарегистрирован: 10.02.2016

На данный момент, получается так. Человек вышел, подсветка ещё горит. Второй пошел, а у него на половине пути, освещение  выключится. Т.е, топай в потёмках.

qwes12
Offline
Зарегистрирован: 16.02.2016

здравствуйте, не подскажете а как можно использовать m5451 для семисегментных дисплеев, в режиме динамической индикации, есть ли какие нибудь библиотеки

Myero
Offline
Зарегистрирован: 20.10.2015

Здравствуйте.. попытался сделать ШИМ на 5451... впринципе выходит вполне красиво... 

но он полу ручной, то есть некоторые цифры прописаны вручную.

у кого есть идеи как унифицировать - давайте подумаем...


//Устанавливаем контакты для драйвера
#define  DATA  8
#define  CLOCK 12
//Устанавливаем контакт фоторезистора
#define  FOTO A0
//Устанавливаем контакты для первого датчика
#define  T1  10
#define  E1  6
//Устанавливаем контакты для второго датчика
#define  T2  5
#define  E2  4
//Устанавливаем контакты для Третьего датчика
#define  T3  3
#define  E3  2
//Устанавливаем контакт управления яркостью светодиодов
#define  BR  9
const byte brightset = 250;// яркость включенной лестницы
const byte brightsetFirstLast = 1; // яркость первой и последнй ступеньки
//Задаем количество светодиодов
#define NUM_LEDS 14
#define NUM_MIDDLE_LEDS 9
const uint32_t masky []= {
0b0000000000000000000000000000001,
0b0000000000000000000000000000001,
0b0000000000000000000000000000001,
0b0000000000000000000000000000001,
0b1000000000000000000000000000001,
0b1000000000000000000000000000001,
0b1000000000000000000000000000001,
0b1000000000000000100000000000001,
0b1000000000100000000000100000001,
0b1000000000000000100000000000001,
0b1000000100000001000000010000001,
0b1000000100000001000000010000001,
0b1000010000010000001000001000001,
0b1000010000010000001000001000001,
0b1000100001000010000100001000001,
0b1000100001000010000100001000001,
0b1010101010101010101010101010101,
0b1101101101101101101101101101101,
0b1111011111011111101111110111111,
0b1111111111111111111111111111111,
};
const uint32_t shadow[] = 
{ // бегущая тень
  0b11111111111111111110,
  0b11111111111111111101,
  0b11111111111111111011,
  0b11111111111111110111,
  0b11111111111111101111,
  0b11111111111111011111,
  0b11111111111110111111,
  0b11111111111101111111,
  0b11111111111011111111,
  0b11111111110111111111,
  0b11111111101111111111,
  0b11111111011111111111,
  0b11111110111111111111,
  0b11111101111111111111,
  0b11111011111111111111,
  0b11110111111111111111,
  0b11111111111111111111,
  }; 
unsigned long FirstLastBitDec; // количество ступенек в двоичном коде типо 0b100000000000000000000....
unsigned long MidleBitDec; // количество ступенек до первого перерыва в двоичном коде типо 0b0000000100000000000000....
uint32_t piss;
uint32_t data;

void setup()
{
  Serial.begin(9600);
  pinMode(DATA, OUTPUT);
  pinMode(CLOCK, OUTPUT);
  digitalWrite(CLOCK, HIGH);
  digitalWrite(FOTO, HIGH);
  pinMode(BR, OUTPUT);
  pinMode(T1, OUTPUT);
  pinMode(T2, OUTPUT);
  pinMode(E1, INPUT);
  pinMode(T3, OUTPUT);
  pinMode(E3, INPUT);
  pinMode(E2, INPUT);
  digitalWrite(E1, HIGH);
  digitalWrite(E2, HIGH);
  DetectBitNumLeds();
  FirstLast();
 
}
void loop()  // Основной цикл.
{
  //Serial.println(analogRead(FOTO)); //Serial.println(BitDec); // Serial.println(" ");
  delay(10);
  static bool state, state0;
  if (analogRead(FOTO) > 500) state0 = 1; // включение выключеие дежурки
  if (analogRead(FOTO) < 200)             // гистерезис отключения дежурки
  {
    state0 = 0;
    analogWrite(BR, LOW);
  }
  if (state0 == 1) FirstLast();
  if (analogRead(FOTO) > 500) state = 1; // порог освещенности включения
  //else analogWrite(9, LOW);            // выключаем ночную подсветку
  if (analogRead(FOTO) < 200) state = 0; // порог освещенности выключения
  // else analogWrite(9, HIGH);           // включаем ночную подсветку
  if (state)
  {
    int D1 = Ultrasonic(T1, E1);    // измеряем расстояние НИЖНЕГО датчика
   // Serial.print("BOT");
  //  Serial.println(D1);
    if (D1 > 0 && D1 < 80)          // если расстояние меньше 70см, то
    TurnOnBotTop ();   
    int D2 = Ultrasonic(T2, E2);    // измеряем расстояние ВЕРХНЕГО датчика
   // Serial.print("TOP");
   // Serial.println(D2);
    if (D2 > 0 && D2 < 80)          // если расстояние меньше 70см, то
    TurnOnTopBot ();
    int D3 = Ultrasonic(T3, E3);    // измеряем расстояние ВЕРХНЕГО датчика
  //  Serial.print("MID");
  //  Serial.println(D3);
    if (D3 > 0 && D3 < 80)          // если расстояние меньше 70см, то
    TurnOnMidle ();
    //delay (5000);
    //TurnOffMidle();
   }
}

void TurnOnMidle ()
{
  unsigned long PriviusMidleBitDecBot=0;
  unsigned long PriviusMidleBitDecTop=0;
  analogWrite (BR,  brightset);
  if ((NUM_LEDS-NUM_MIDDLE_LEDS)>=NUM_MIDDLE_LEDS)
  {
  for (char i = 1; i <NUM_MIDDLE_LEDS-1; i++)
    {
       unsigned long LesenkaTop = (MidleBitDec << i)+PriviusMidleBitDecTop;   
       unsigned long LesenkaBot = (MidleBitDec >> i)+PriviusMidleBitDecBot;
       PWM_MM5450(LesenkaTop+LesenkaBot+FirstLastBitDec+1+MidleBitDec);        
       //delay(300);                                                                   // задержка зажигания
       PriviusMidleBitDecBot=LesenkaBot;
       PriviusMidleBitDecTop=LesenkaTop;
    }
  for (char i = NUM_MIDDLE_LEDS-1; i <NUM_LEDS-NUM_MIDDLE_LEDS; i++)
    {
       unsigned long LesenkaTop = (MidleBitDec << i)+PriviusMidleBitDecTop;   
       unsigned long LesenkaBot = (MidleBitDec >> i)+PriviusMidleBitDecBot;
       PWM_MM5450(LesenkaTop+LesenkaBot+FirstLastBitDec+MidleBitDec);        
      // delay(300);                                                                   // задержка зажигания
       PriviusMidleBitDecBot=LesenkaBot;
       PriviusMidleBitDecTop=LesenkaTop;
    }   
  //delay(500);  
  for (char i= 1; i< NUM_MIDDLE_LEDS-1 ;i++)
      {
        unsigned long LesenkaTop = ((FirstLastBitDec-MidleBitDec) << i);
        unsigned long LesenkaBot = ((MidleBitDec*2-1) >> i);
       PWMOFF_MM5450(LesenkaTop+LesenkaBot+MidleBitDec);
     
        //delay(300);
      }
   for (char i= NUM_MIDDLE_LEDS-1; i<= NUM_LEDS-NUM_MIDDLE_LEDS ;i++)
      {//Serial.println(i);
        unsigned long LesenkaTop = ((FirstLastBitDec-MidleBitDec) << i);
        unsigned long LesenkaBot = ((MidleBitDec*2-1) >> i);
        PWMOFF_MM5450(LesenkaTop+MidleBitDec+1);
       
       // delay(300);
      }
  }
  else
  {
    for (char i = 1; i <= NUM_LEDS-NUM_MIDDLE_LEDS-1; i++)
    {
       unsigned long LesenkaTop = (MidleBitDec >> i)+PriviusMidleBitDecTop;   
       unsigned long LesenkaBot = (MidleBitDec << i)+PriviusMidleBitDecBot;
       PWM_MM5450(LesenkaTop+LesenkaBot+FirstLastBitDec+1+MidleBitDec);                                                                            
       PriviusMidleBitDecBot=LesenkaBot;
       PriviusMidleBitDecTop=LesenkaTop;
       //delay(300);// задержка зажигания
    }
  for (char i = NUM_LEDS-NUM_MIDDLE_LEDS; i < NUM_MIDDLE_LEDS-1; i++)
    {
       unsigned long LesenkaTop = (MidleBitDec >> i)+PriviusMidleBitDecTop;   
       unsigned long LesenkaBot = (MidleBitDec << i)+PriviusMidleBitDecBot;
       PWM_MM5450(LesenkaTop+LesenkaBot+MidleBitDec+1);                                                                         
       PriviusMidleBitDecBot=LesenkaBot;
       PriviusMidleBitDecTop=LesenkaTop;
       //delay(300);// задержка зажигания
    }   
 // delay(500);
  for (char i= 1; i<= NUM_LEDS-NUM_MIDDLE_LEDS ;i++)
      {
        unsigned long LesenkaTop = ((FirstLastBitDec-MidleBitDec) << i);
        unsigned long LesenkaBot = ((MidleBitDec*2-1) >> i);
        PWMOFF_MM5450(LesenkaTop+LesenkaBot+MidleBitDec);
        //delay(300);
      }
   for (char i= NUM_LEDS-NUM_MIDDLE_LEDS+1; i< NUM_MIDDLE_LEDS ;i++)
      {
        unsigned long LesenkaTop = ((FirstLastBitDec-MidleBitDec) << i);
        unsigned long LesenkaBot = ((MidleBitDec*2-1) >> i);
        PWMOFF_MM5450(LesenkaBot+MidleBitDec+LesenkaTop+FirstLastBitDec);
      // delay(300);
      }
  
    }FirstLastAfterON();
}
void TurnOnBotTop ()                                                                  //Зажигаем лестницу снизу вверх
 {
      analogWrite (BR,  brightset);
      for (char i = NUM_LEDS - 1; i >NUM_LEDS-NUM_MIDDLE_LEDS; i--)                   // зажигаем светодиоды в другую сторону
      {
        PWM_MM5450((FirstLastBitDec*2-1  >> i)+FirstLastBitDec+MidleBitDec);
        //delay(300);                                                                   // задержка зажигания
      }
     
      for (char i = NUM_LEDS-NUM_MIDDLE_LEDS - 1; i >0; i--)                          // зажигаем светодиоды в другую сторону
      {
        PWM_MM5450((FirstLastBitDec*2-1  >> i)+FirstLastBitDec);
        //delay(300);                                                                   // задержка зажигания
      }
     // delay(500);                                                                     // ждем 0,5 секунд
       for (int j = 0; j <= 2; j++)                                                  // бегущая тень
      {
      // delay(1000);
      for (int k = 0; k <= NUM_LEDS; k++)
      {
        PWM_MM5450(shadow[k]);
     //  delay(100);
       }
      }
      for (char i = 1; i < NUM_MIDDLE_LEDS; i++) // тушим светодиоды
      {
        PWMOFF_MM5450((FirstLastBitDec*2-1  << i)+1);
        //delay(300);                 // задержка затухания
      }
      for (char i = NUM_MIDDLE_LEDS+1; i < NUM_LEDS; i++) // тушим светодиоды
      {
        PWMOFF_MM5450((FirstLastBitDec*2-1  << i)+1+MidleBitDec);
        //delay(300);                 // задержка затухания
      }
       FirstLastAfterON();
    }
void TurnOnTopBot ()  // зажигаем лестницу сверху вниз
    {
      analogWrite (BR,  brightset);
      for (char i = NUM_LEDS-1; i > NUM_MIDDLE_LEDS; i--) // зажигаем светодиоды в одну сторону
      {
       PWM_MM5450((FirstLastBitDec*2-1 << i)+1+MidleBitDec);
       // delay(300);                 // задержка зажигания
      }
      for (char i = NUM_MIDDLE_LEDS-1; i > 0; i--) // зажигаем светодиоды в одну сторону
      {
        PWM_MM5450((FirstLastBitDec*2-1 << i)+1);
      //  delay(300);                 // задержка зажигания
      }
     // delay(500);                  // ждем 15 секунд
       for (int j = 0; j <= 2; j++)  //бегущая тень
       {
         PWM_MM5450(shadow[16]);        
        for (int k = NUM_LEDS; k >=0; k--)
       {
         PWM_MM5450(shadow[k]);
      //    delay(100);
        }
        }
      for (char i = 1; i <NUM_LEDS-NUM_MIDDLE_LEDS; i++) // тушим светодиоды
      {
        PWMOFF_MM5450((FirstLastBitDec*2-1 >> i)+FirstLastBitDec);
      //  delay(300);                 // задержка затухания
      }
       for (char i = NUM_LEDS-NUM_MIDDLE_LEDS+1; i < NUM_LEDS; i++) // тушим светодиоды
      {
        PWMOFF_MM5450((FirstLastBitDec*2-1 >> i)+FirstLastBitDec+MidleBitDec);
      //  delay(300);                 // задержка затухания
      }
       FirstLastAfterON();
   }


void DetectBitNumLeds()//определяем число ступенек в BIN формате первой, последней и той что по середине исходя из количества ступенек
{
  FirstLastBitDec=1;
  MidleBitDec=1;
  for (int i=1;i<NUM_LEDS;i++)
    {
      FirstLastBitDec=FirstLastBitDec*2;
      Serial.println(FirstLastBitDec);
    }
  for (int j=1;j<NUM_MIDDLE_LEDS;j++)
    {
       MidleBitDec=MidleBitDec*2;
       Serial.println(MidleBitDec);
    }
  }
void FirstLastAfterON()// зажигаем первую последнюю и ту что посередине после того как прошел

{  for (int i=brightset;i>=brightsetFirstLast;i--)
  {analogWrite (BR,  i);
    MM5450(FirstLastBitDec+MidleBitDec+1);
  }
  
  analogWrite (BR,  brightsetFirstLast);
  MM5450(FirstLastBitDec+MidleBitDec+1);

 
}
  
void FirstLast()// зажигаем первую последнюю и ту что посередине

{   
  analogWrite (BR,  brightsetFirstLast);
  MM5450(FirstLastBitDec+MidleBitDec+1);
 
}
int Ultrasonic(byte Trig_pin, byte Echo_pin)// расчитвыем расстояние ультрасоников
{
  digitalWrite(Trig_pin, HIGH);
  delayMicroseconds(20);
  digitalWrite(Trig_pin, LOW);
  return pulseIn(Echo_pin, HIGH, 20000) / 29.0 / 2;// возвращение дистанции в см
}

void PWM_MM5450(uint32_t data) // шим включения ступеньки
{
  
for (int j=0;j<=19;j++)
{
for (int i=0;i<=32;i++)
{
  if (masky[j] & (1UL << i))
  { 
MM5450(data);
}
else 
{MM5450(piss);
}
}
}piss=data;
}

void PWMOFF_MM5450(uint32_t data) // шим выключения ступеньки
{
  
for (int j=19;j>=0;j--)
{
for (int i=0;i<=32;i++)
{
  if (masky[j] & (1UL << i))
  { 
MM5450(piss);
}
else 
{MM5450(data);
}
}
}piss=data;
}

void MM5450(uint32_t jopa) // програмка зажигания ступеньки
{byte i;

  digitalWrite(DATA, 1);
  digitalWrite(CLOCK, LOW);
  digitalWrite(CLOCK, HIGH);
  
  for (i = 0; i < NUM_LEDS; i++)
  {
    if (jopa & (1UL << i)) digitalWrite(DATA, HIGH);
    else digitalWrite(DATA, LOW);
    digitalWrite(CLOCK, LOW);
    digitalWrite(CLOCK, HIGH);
   }
  digitalWrite(DATA, 0);
  for (byte j = 0; j < 35 - NUM_LEDS; j++)
  {
    digitalWrite(CLOCK, LOW);
    digitalWrite(CLOCK, HIGH);
  }  

}

код писал для себя, у меня есть еще  вход в комнату по середине лестницы, поэтому используется три датчика (не обращайте внимание на горящую посерединке ступеньку либо закомментируйте). проверьте pinы от ардуины.

проблемы в том что не использую delay(); а значит установить какие то временные рамки не могу нормально, приходится изголяться..

volchok
Offline
Зарегистрирован: 28.08.2015

qwes12 пишет:

здравствуйте, не подскажете а как можно использовать m5451 для семисегментных дисплеев, в режиме динамической индикации, есть ли какие нибудь библиотеки

Не очень понятно, что имеете ввиду под "динамической" индикацией. Как минимум есть https://github.com/supercrab/arduino-seven-segment

dukes
Offline
Зарегистрирован: 20.03.2016

Всем привет. Тоже задумался соорудить такую подсветку, для своей будущей лестницы.

Практически все купил. Остался пока один вопрос. Какой фоторезистор брать? Я правильно понимаю, что можно вообще любой? под какой отлажена программа с 339 поста? Спасибо.

birdtlt
Offline
Зарегистрирован: 19.01.2015

dukes пишет:

Всем привет. Тоже задумался соорудить такую подсветку, для своей будущей лестницы.

Практически все купил. Остался пока один вопрос. Какой фоторезистор брать? Я правильно понимаю, что можно вообще любой? под какой отлажена программа с 339 поста? Спасибо.

 

вообще любой пойдет, какой понравится - такой бери....

dukes
Offline
Зарегистрирован: 20.03.2016

понятно. спасибо) буду тренироваться.

 

dukes
Offline
Зарегистрирован: 20.03.2016

У меня ардуину будет питает один маломощный БП, а на ленты питание будет идти от другого мощного ватт на 150 БП. Я тут задумался над таким вопросом: зачем постоянно держать под напругой этот мощный БП особенно днем, может запитать его через доп. реле, а этим реле будет управлять ардуина? Кто-нибудь делал такое?

YRA
Offline
Зарегистрирован: 10.01.2015

dukes, можно и через реле освещенности 

dukes
Offline
Зарегистрирован: 20.03.2016

тогда надо ставить реле освещенности и синхронизировать его работу с ардуиной плюс отдельное питание на него заводить.

 

 

YRA
Offline
Зарегистрирован: 10.01.2015

Так что ж там заводить розетка 220 вольт в которую ,кстати,  будет подключены и Ваши блоки питания, и для Андруино, и для  лент, а нагрузкой  у него те же  блоки питания и 2-3 метра провода вот и вся синхронизация, потемнело- пиалово подалось на всю систему.

YRA
Offline
Зарегистрирован: 10.01.2015

Так что ж там заводить розетка 220 вольт в которую ,кстати,  будет подключены и Ваши блоки питания, и для Андруино, и для  лент, а нагрузкой  у него те же  блоки питания и 2-3 метра провода вот и вся синхронизация, потемнело- пиалово подалось на всю систему.

dukes
Offline
Зарегистрирован: 20.03.2016

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

birdtlt
Offline
Зарегистрирован: 19.01.2015

Свет включили - все отрубилось по датчику... Зачем вам отрубать БП? пусть даже и мощный, на холостом ходу сколько он потребляет? полватта? ватт? 1.5-2 рубля мнимой экономии в месяц вам погоду не сделают, а дергать питание ардуины лишний раз смысла нет... Вспомните свой опыт - лампочки в 90% случаях сгорают при включении, ардуина не лампочка, но лишний раз ее дергать не стоит.

dukes
Offline
Зарегистрирован: 20.03.2016

а зачем его держать постоянно под напряжением? он же 75% времени будет бездействовать

birdtlt
Offline
Зарегистрирован: 19.01.2015

dukes пишет:

а зачем его держать постоянно под напряжением? он же 75% времени будет бездействовать

Обесточивать или нет - ваше личное дело. К чему вас переубеждать? тем более вы сами себя убедили уже в необходимости экономить 1.5-2р в месяц))

У меня куча сотрудников, которые работают за компами, компы никогда не выключаются (по причине того, что по ночам устанавливаются обновления и часть процессов запускаются в ночь). Через 1 час бездействия они конечно "засыпают", потребление снижается в разы, но они все равно потребляют энергию. Но это не суть, есть у меня безопасник, который в силу своей профессиональной специфики постоянно выключает монитор, а когда уходит вечером домой, то и компьютер. Так вот ему я меняю монитор и комп каждые 3 года, другие сотрудники уже и по 5 лет отработали: компы живут, на паре мониторов подсветку меняли... и все))

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

pogriban
Offline
Зарегистрирован: 28.12.2014

linker1185 скажи пожалуйста как севить правильно irf714  к светодиодом какие выходы и к смд какие выходы

pogriban
Offline
Зарегистрирован: 28.12.2014

linker1185 скажите както так должно выйти http://forum.amperka.ru/attachments/img_20150206_160256-2-jpg.2324/

?????????????

спосибо

volchok
Offline
Зарегистрирован: 28.08.2015

Главная беда с ШИМ на 5450, длинный цикл загрузки данных. После того как в предел по даташиту его упихал, получается добрых 60мкс, что весьма не мало и оставляет нам пространство только для 16кГц несущей частоты, если мы берем 8бит ШИМ, еле выходит 60Гц частоты ШИМ... К тому же, при таких накладных, держать дежурку на ШИМ вообще не реально и надо ее выставлять через Brightness pin. 

pogriban
Offline
Зарегистрирован: 28.12.2014

linker1185 пишет:

вид снизу

скажите пожалуйста какой номинал у  R10, R12 R33

и зачем нужен R34

Myero
Offline
Зарегистрирован: 20.10.2015

выдели красным где они стоят, по картинке не видно

pogriban
Offline
Зарегистрирован: 28.12.2014

Дай Бох паймете

pogriban
Offline
Зарегистрирован: 28.12.2014

И если возможна поставьте реальную фото с верзнем и нижнем видом спосибо

Myero
Offline
Зарегистрирован: 20.10.2015

R10 и R12 по 10 кОм

R33 это перемычка, поставь 10Ом если хочешь, разницы никакой.. больше 1 кОм - работать не будет...   Имхо, резистора там не нужно...

R34 это переменный резистор, на сколько понял от датчика освещения или для замены датчика... там надо подбирать в зависимости от датчика освещения, думаю не больше 1-10 кОм  , програмно потом подбираются состояния... 

pogriban
Offline
Зарегистрирован: 28.12.2014

а у Вас готовый проект есть можете сфотографировать

Myero
Offline
Зарегистрирован: 20.10.2015

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

 

это лежит сейчас на тумбочке.. лестница еще не до конца готова.. все проверено, все работает

pogriban
Offline
Зарегистрирован: 28.12.2014

Спосибо

merzavec
Offline
Зарегистрирован: 04.09.2015

Здравствуйте, пробовал ваш скейтч для умной лестницы из 182 поста, работает супер, не подскажите как в программе ступени лишние отключать, я начинающий, хочется сделать своми руками:) и схема если есть есть нарисованная тоже посмотреть, не могу с этими полевиками разобраться, спасибо:)).

pogriban
Offline
Зарегистрирован: 28.12.2014

merzavec пишет:

Здравствуйте, пробовал ваш скейтч для умной лестницы из 182 поста, работает супер, не подскажите как в программе ступени лишние отключать, я начинающий, хочется сделать своми руками:) и схема если есть есть нарисованная тоже посмотреть, не могу с этими полевиками разобраться, спасибо:)).


Скажите пожалуйста на какой схеме вы попробовали данный скейч и работает супер выложите пожалуйста линк

Myero
Offline
Зарегистрирован: 20.10.2015

В 17 и 18 строке же написано.. 

задаём кол-во ступенек

#define NUM_LEDS 16

в данном случае вместо 16 пишите сколько вам надо

схемы смотрите где то там же , выкладывали уже не раз , во всех возможных форматах))

merzavec
Offline
Зарегистрирован: 04.09.2015

Всмысле на какой схеме?На столе собрал,к микросхеме 5450 подключил по отрезку ленты из трёх светодиодов,смотрел и наслаждался как работает),теперь задача поставить транзисторы для усиления каналов и уменьшить количество ступеней и всё).Неужели так просто вместо цифры 16,поставить например 14 для уменьшения количества ступеней,или ещё где то в программе изменять надо?

Myero
Offline
Зарегистрирован: 20.10.2015

если собрано, то просто проверьте... помоему в 182 посту уже подправлено, и там достаточно изменить цифру.. 

 

полевики если используете irf7314 или подобный подключаются так

почти монтажная схема выглядит так.

резисторы что от +12В ставь на 10 кОм, те что от ног м5450 ставь 1 кОм

От делителя напряжения я лично отказался. посколько по даташиту ардуинка нано

Входное напряжение (рекомендуемое) 7-12 В

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

pogriban
Offline
Зарегистрирован: 28.12.2014

merzavec пишет:

Всмысле на какой схеме?На столе собрал,к микросхеме 5450 подключил по отрезку ленты из трёх светодиодов,смотрел и наслаждался как работает),теперь задача поставить транзисторы для усиления каналов и уменьшить количество ступеней и всё).Неужели так просто вместо цифры 16,поставить например 14 для уменьшения количества ступеней,или ещё где то в программе изменять надо?


В смысле по какому рисунку подключял компоненты

pogriban
Offline
Зарегистрирован: 28.12.2014

Myero пишет:

если собрано, то просто проверьте... помоему в 182 посту уже подправлено, и там достаточно изменить цифру.. 

 

полевики если используете irf7314 или подобный подключаются так

почти монтажная схема выглядит так.

резисторы что от +12В ставь на 10 кОм, те что от ног м5450 ставь 1 кОм

От делителя напряжения я лично отказался. посколько по даташиту ардуинка нано

Входное напряжение (рекомендуемое) 7-12 В

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


А что вы имеете в виду из-за блока какой ток нужен если у мкня 16 светильников по 9ват, и что не нужны резисторы на 47 а на 10ком

Myero
Offline
Зарегистрирован: 20.10.2015

pogriban пишет:
А что вы имеете в виду из-за блока какой ток нужен если у мкня 16 светильников по 9ват, и что не нужны резисторы на 47 а на 10ком

то что у меня китайский импульсный блок питания, не обращай внимание...   если у тебя 16 светиков по 9ват, то и нужно около 150 вт +25%. итого бери 200 вт, не ошибешься... 

pogriban
Offline
Зарегистрирован: 28.12.2014

А монтажную плату без делителя напряжение можеш поставить

merzavec
Offline
Зарегистрирован: 04.09.2015

попробую, спасибо, а такие полевики в DIP корпусе бывают?

merzavec
Offline
Зарегистрирован: 04.09.2015

количество ступеней понял как менять, в 182 посту что такое : //Устанавливаем контакт управления яркостью светодиодов

#define  BR  9, я его не подключал все работает, можно узнать что и как это готовить?:)), если можно схему, спасибо.
chemix
Offline
Зарегистрирован: 25.05.2016

Привет ! К сожалению, я не знаю русский язык , так пишет tranzlator . У меня есть проблема , что я не могу добавить вручную датчика hcsr04 на этот код , если вы можете мне помочь? приветствия

http://technika-laika.blogspot.com/2014/09/sterownik-oswietlenia-schodow...

#include <Tlc5940.h>
#include "ClickButton.h"
const int downButtonPin = 8;
const int upButtonPin = 6;
const int midButtonPin = 7;
int ledCount = 18; //liczba aktywnych wyjść (taśm led)
int brightness = 4095; //maksymalna jasność 
int delayTime = 1;
int midStep = 13;
int outs[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17}; //wyjścia do których podpinane są taśmy
int outState[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
// Nr. of buttons in the array
const int buttons = 3;
ClickButton button[3] = {
  ClickButton (downButtonPin, LOW, CLICKBTN_PULLUP),
  ClickButton (upButtonPin, LOW, CLICKBTN_PULLUP),
  ClickButton (midButtonPin, LOW, CLICKBTN_PULLUP),
};
int LEDfunction[buttons]  = { 0, 0, 0 };
const int DOWN_BUTTON = 0;
const int UP_BUTTON = 1;
const int MID_BUTTON = 2;
const int STAN_WYLACZONY = 0;
const int STAN_ROZJASNIANIE_OD_DOLU = 1;
const int STAN_SCIEMNIANIE_OD_DOLU = 2;
const int STAN_ROZJASNIANIE_OD_GORY = 3;
const int STAN_SCIEMNIANIE_OD_GORY = 4;
const int STAN_ROZJASNIANIE_OD_SRODKA = 5;
const int STAN_SCIEMNIANIE_OD_SRODKA = 6;
const int STAN_ROZJASNIANIE_CALOSCI = 7;
const int STAN_SCIEMNIANIE_CALOSCI = 8;
const int STAN_WLACZONY = 9;

const int SCIEMNIANIE_POJEDYNCZE_STEP = 5;
const int SCIEMNIANIE_CALOSCI_STEP = 10;
const int ROZJASNIANIE_POJEDYNCZE_STEP = 25;
const int ROZJASNIANIE_CALOSCI_STEP = 10;
int STAN = STAN_WYLACZONY;
void setup()
{

  Tlc.init();
  for (int i=0; i<buttons; i++)
  {
    // Setup button timers (all in milliseconds / ms)
    // (These are default if not set, but changeable for convenience)
    button[i].debounceTime   = 20;   // Debounce timer in ms
    button[i].multiclickTime = 250;  // Time limit for multi clicks
    button[i].longClickTime  = 800; // Time until long clicks register
  }    
   updateLed();

}


void loop()
{
  
for (int i=0; i<buttons; i++) {
    // Update state of all buitton
    button[i].Update();
  
    // Save click codes in LEDfunction, as clicks counts are reset at next Update()
    if (button[i].clicks != 0) LEDfunction[i] = button[i].clicks;
  
      // Simply toggle LED on single clicks
    // (Cant use LEDfunction like the others here,
    //  as it would toggle on and off all the time)
    if(button[i].clicks == 1) {
      wlaczPianino(i);
    }

    // slow blink (must hold down button. 1 second long blinks)
    if(LEDfunction[i] == -1) {
      ustawStanStaly(i);
      LEDfunction[i] = 0;
    }
  }  
  
  updateCircuitState(); 
  updateLed();
   delay(delayTime);  
}

void updateLed() {
   for (byte diode = 0; diode<ledCount;diode++) {
     Tlc.set(outs[diode], brightness-outState[diode]);
    }
    Tlc.update();
}

void updateCircuitState() {
  if (STAN == STAN_ROZJASNIANIE_OD_DOLU) {
    rozjasnianieOdDolu();
  }
  if (STAN == STAN_SCIEMNIANIE_OD_DOLU) {
    sciemnianieOdDolu();
  }

  if (STAN == STAN_ROZJASNIANIE_OD_GORY) {
    rozjasnianieOdGory();
  }
  if (STAN == STAN_SCIEMNIANIE_OD_GORY) {
    sciemnianieOdGory();
  }
  if (STAN == STAN_ROZJASNIANIE_CALOSCI) {
    rozjasnianieCalosci();
  }
  if (STAN == STAN_SCIEMNIANIE_CALOSCI) {
    sciemnianieCalosci();
  }

  if (STAN == STAN_ROZJASNIANIE_OD_SRODKA) {
    rozjasnianieOdSrodka();
  }
  if (STAN == STAN_SCIEMNIANIE_OD_SRODKA) {
    sciemnianieOdSrodka();
  }

}

void rozjasnianieOdSrodka() {
  bool changed = false;

  for (int diode = midStep; diode<ledCount;diode++) {   
    if (outState[diode] < brightness) {
      int newState = outState[diode];
      newState = newState + ROZJASNIANIE_POJEDYNCZE_STEP;
      if (newState > brightness) {
        newState = brightness;
      }
      outState[diode] = newState;
      changed = true;
      break;
    }
  }
  for (int diode = midStep-1; diode>=0;diode--) {   
    if (outState[diode] < brightness) {
      int newState = outState[diode];
      newState = newState + ROZJASNIANIE_POJEDYNCZE_STEP;
      if (newState > brightness) {
        newState = brightness;
      }
      outState[diode] = newState;
      changed = true;
      break;
    }
    
  }
      if (!changed) {
      STAN = STAN_SCIEMNIANIE_OD_SRODKA;
    }    

}

void sciemnianieOdSrodka() {
 bool changed = false;

  for (int diode = midStep; diode<ledCount;diode++) {   
    if (outState[diode] > 0) {
      int newState = outState[diode];
      newState = newState - SCIEMNIANIE_POJEDYNCZE_STEP;
      if (newState < 0 ) {
        newState = 0;
      }
      outState[diode] = newState;
      changed = true;
      break;
    }
  }
  for (int diode = midStep-1; diode>=0;diode--) {   
    if (outState[diode] > 0) {
      int newState = outState[diode];
      newState = newState - SCIEMNIANIE_POJEDYNCZE_STEP;
      if (newState < 0) {
        newState = 0;
      }
      outState[diode] = newState;
      changed = true;
      break;
    }
    
     
  }
   if (!changed) {
      STAN = STAN_WYLACZONY;
    }  
}

void rozjasnianieCalosci() {
  bool changed = false;
  for (int diode = 0; diode<ledCount;diode++) {   
    if (outState[diode] < brightness) {
      int newState = outState[diode];
      newState = newState + ROZJASNIANIE_CALOSCI_STEP;
      if (newState > brightness) {
        newState = brightness;
      }
      outState[diode] = newState;
      changed = true;
    }
    
     
  }
   if (!changed) {
      STAN = STAN_WLACZONY;
    }  
}

void sciemnianieCalosci() {
  bool changed = false;
  for (int diode = 0; diode<ledCount;diode++) {   
    if (outState[diode] > 0) {
      int newState = outState[diode];
      newState = newState - SCIEMNIANIE_CALOSCI_STEP;
      if (newState < 0) {
        newState = 0;
      }
      outState[diode] = newState;
      changed = true;

    }
    
   
  }
   if (!changed) {
      STAN = STAN_WYLACZONY;
    }    
}

void rozjasnianieOdDolu() {
  bool changed = false;
  for (int diode = 0; diode<ledCount;diode++) {   
    if (outState[diode] < brightness) {
      int newState = outState[diode];
      newState = newState + ROZJASNIANIE_POJEDYNCZE_STEP;
      if (newState > brightness) {
        newState = brightness;
      
      }
      outState[diode] = newState;
      changed = true;
      break;
    }    
  }
    if (!changed) {
      STAN = STAN_SCIEMNIANIE_OD_DOLU;
    }    

}

void sciemnianieOdDolu() {
  bool changed = false;
  for (int diode = 0; diode<ledCount;diode++) {   
    if (outState[diode] > 0) {
      int newState = outState[diode];
      newState = newState - SCIEMNIANIE_POJEDYNCZE_STEP;
      if (newState < 0) {
        newState = 0;
      }
      outState[diode] = newState;
      changed = true;
      break;
    }
    
   }
    if (!changed) {
      STAN = STAN_WYLACZONY;
    }    

}

void rozjasnianieOdGory() {
  bool changed = false;
  for (int diode = ledCount-1; diode>=0;diode--) {   
    if (outState[diode] < brightness) {
      int newState = outState[diode];
      newState = newState + ROZJASNIANIE_POJEDYNCZE_STEP;
      if (newState > brightness) {
        newState = brightness;
      }
      outState[diode] = newState;
      changed = true;
      break;
    }
    
        
  }
  if (!changed) {
      STAN = STAN_SCIEMNIANIE_OD_GORY;
    }
}

void sciemnianieOdGory() {
  bool changed = false;
  for (int diode = ledCount-1; diode>=0;diode--) {   
    if (outState[diode] > 0) {
      int newState = outState[diode];
      newState = newState - SCIEMNIANIE_POJEDYNCZE_STEP;
      if (newState < 0) {
        newState = 0;
      }
      outState[diode] = newState;
      changed = true;
      break;
    }
    
  }
     if (!changed) {
      STAN = STAN_WYLACZONY;
    }    
 
}

void wlaczPianino(int button) {
  /*
  jesli swiatla byly wlaczone, tylko plynnie wylaczamy
  */
  if (STAN == STAN_WLACZONY) {
      if (button == DOWN_BUTTON) {
        STAN = STAN_SCIEMNIANIE_OD_DOLU;
      }
      if (button == UP_BUTTON) {
        STAN = STAN_SCIEMNIANIE_OD_GORY;
      }
      if (button == MID_BUTTON) {
        STAN = STAN_SCIEMNIANIE_OD_SRODKA;
      }
  }
  
  /*
  jesli swiatla byly wylaczone, wtedy plynnie wlaczamy
  */
    if (STAN == STAN_WYLACZONY) {
      if (button == DOWN_BUTTON) {
        STAN = STAN_ROZJASNIANIE_OD_DOLU;
      }
      if (button == UP_BUTTON) {
        STAN = STAN_ROZJASNIANIE_OD_GORY;
      }
      if (button == MID_BUTTON) {
        STAN = STAN_ROZJASNIANIE_OD_SRODKA;
      }
  }

}

void ustawStanStaly(int button) {
    Serial.print("ustawStanStaly ");
  Serial.print(button);
  Serial.print(" ");
  Serial.println(STAN);
  if (
      STAN == STAN_WLACZONY ||
      STAN == STAN_SCIEMNIANIE_OD_DOLU ||      
      STAN == STAN_SCIEMNIANIE_OD_GORY ||            
      STAN == STAN_SCIEMNIANIE_OD_SRODKA            
      ) {
    STAN = STAN_SCIEMNIANIE_CALOSCI;
  }
  
  if (
      STAN == STAN_WYLACZONY ||
      STAN == STAN_ROZJASNIANIE_OD_DOLU ||      
      STAN == STAN_ROZJASNIANIE_OD_GORY ||            
      STAN == STAN_ROZJASNIANIE_OD_SRODKA            
     ) {
    STAN = STAN_ROZJASNIANIE_CALOSCI;
  }
}

 

stasstroy
Offline
Зарегистрирован: 09.01.2016

#define BR 9, я его не подключал все работает, можно узнать что и как это готовить?

Этим контактом задается яркость первой и последней ступеней в тёмное время.

merzavec
Offline
Зарегистрирован: 04.09.2015

Подскажите пожалуйста, как сделать чтобы первая и и последняя ступень горела в пол накала

//Устанавливаем контакты для драйвера
#define  DATA  6
#define  CLOCK 7
//Устанавливаем контакт фоторезистора
#define  FOTO A0
//Устанавливаем контакты для первого датчика
#define  T1  4
#define  E1  5
//Устанавливаем контакты для второго датчика
#define  T2  2
#define  E2  3
//Устанавливаем контакт управления яркостью светодиодов
#define  BR  9

const byte brightset = 255;

//Задаем количество светодиодов
#define NUM_LEDS 16
const uint32_t mask = 0b1111111111111111;

void setup() 
{
  pinMode(DATA, OUTPUT);
  pinMode(CLOCK, OUTPUT);
  digitalWrite(CLOCK, HIGH);
  digitalWrite(FOTO, HIGH);
  pinMode(BR, OUTPUT);
  pinMode(T1, OUTPUT);
  pinMode(T2, OUTPUT);
  pinMode(E1, INPUT);
  pinMode(E2, INPUT);
  digitalWrite(E1, HIGH);
  digitalWrite(E2, HIGH);
  FirstLast();
}

void loop() 
{

  int D1 = Ultrasonic(T1, E1);    // измеряем расстояние первого датчика
  if(D1 > 0 && D1 < 100)          // если расстояние меньше 100см, то
  {
    analogWrite (BR,  brightset);
    for(char i = NUM_LEDS-1; i >= 0; i--) // зажигаем светодиоды в одну сторону
    {
      MM5450(mask<<i);
      delay(200);                 // задержка зажигания
    }
    delay(10000);                  // ждем 3 секунды
    for(char i = 0; i <= NUM_LEDS; i++)  // тушим светодиоды 
    {
      MM5450(mask>>i);
      delay(200);                 // задержка затухания
    }
    FirstLast();
  }

  int D2 = Ultrasonic(T2, E2);    // измеряем расстояние второго датчика
  if(D2 > 0 && D2 < 100)          // если расстояние меньше 100см, то
  {
    analogWrite (BR,  brightset);
    for(char i = NUM_LEDS-1; i >= 0; i--) // зажигаем светодиоды в другую сторону
    {
      MM5450(mask>>i);
      delay(200);                 // задержка зажигания
    }
    delay(10000);                  // ждем 3 секунды
    for(char i = 0; i <= NUM_LEDS; i++)  // тушим светодиоды 
    {
      MM5450(mask<<i);
      delay(200);                 // задержка затухания
    }
    FirstLast();
  }
  delay(20);
}


void FirstLast()
{
  analogWrite (BR,  25);
  MM5450(0b1000000000000001);
}


int Ultrasonic(byte Trig_pin, byte Echo_pin)
{
  digitalWrite(Trig_pin, HIGH);
  delayMicroseconds(10);
  digitalWrite(Trig_pin, LOW);   
  return pulseIn(Echo_pin, HIGH, 20000)/29.0/2;
}

void MM5450(uint32_t data)
{  
  digitalWrite(DATA, 1);
  digitalWrite(CLOCK, LOW);
  digitalWrite(CLOCK, HIGH);
  for(byte i = 0; i < NUM_LEDS; i++)
  {
    if(data & (1UL<<i)) digitalWrite(DATA, HIGH);
    else digitalWrite(DATA, LOW);
    digitalWrite(CLOCK, LOW);
    digitalWrite(CLOCK, HIGH);
  }
  digitalWrite(DATA, 0);
  for(byte i = 0; i < 35-NUM_LEDS; i++)
  {    
    digitalWrite(CLOCK, LOW);
    digitalWrite(CLOCK, HIGH);
  }
}
stasstroy
Offline
Зарегистрирован: 09.01.2016

А в чем проблема? Первая с последней горят ярко или совсем не горят?

merzavec
Offline
Зарегистрирован: 04.09.2015

ярко горят, как и все, хочется чтобы ночью горели в пол накала, а то ночью по глазам сильно светят