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

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

tlc5940 управляют минусом. Как же вы будете общий минус кидать? :)

Insolent007
Offline
Зарегистрирован: 29.08.2015

kruzhnoff Спасибо приограменное,  все работает!!! ты МОЗГ!

так парвильно датчик освещенности подключать?

хочу еше с потенциометром последовательно, чтобы по необходимости прибавить можно было или убавить чувстветельность.

 

  

SiZE
Offline
Зарегистрирован: 26.11.2014

volchok пишет:
tlc5940 управляют минусом. Как же вы будете общий минус кидать? :)

Я собственно про эти нюансы и спрашивал, до того как все прокинул. Теперь буду выкручиваться. :(((

kruzhnoff
Offline
Зарегистрирован: 09.02.2015

Insolent007

 Не совсем понял вопрос...

Подключать согласно схеме. Переменник (Килоом на 15-20) вместо подтягивающего резистора (R30 по вашей схеме R1).

 

 

 

linker1185
Offline
Зарегистрирован: 25.09.2015

Тоже делаю лестницу. Сейчас на стадии монтажа. Схему и печатку рисовал в diptrace  данные выкладываю. Прошивка будет такая же что и здесь. Хотел сделать шим но не дождался tlc.  https://yadi.sk/d/lMhKdDI3jN85o

 

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

Да работает программный ШИМ на 5450... Частота не большая, но работает. Для данного применения вполне приемлемо...

linker1185
Offline
Зарегистрирован: 25.09.2015

Работает то работает, я даже ковырял буржуйский код где то тут выложенный ( с примерами разных эффектов) , но так и не понял как этот шим там работает. Очень сложный код, моих познаний не хватает. Если есть у кого код по Шим  в 5450 с подробным описанием как им пользоваться , буду очень признателен. Печатку еще не травил , жду irf . Лестница на 16 ступенек.

linker1185
Offline
Зарегистрирован: 25.09.2015

А если вместо pro mini использовать эту плату http://www.chipdip.ru/product/pic32-pinguino-micro/  частота работы шим повысится? там вроде 80 Mgz

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

Хрен его знает :) Я вообще хочу на Arm Cortex M0+ перейти потихоньку...

Мне даже evaluation board пришел, вот только среда разработки там под Windows, это было неожидано. Вот думаю, где комп под Виндой достать...

linker1185
Offline
Зарегистрирован: 25.09.2015

Выкладываю правильную схему и печтку Diptrace . Предыдущая была неправильной=) https://yadi.sk/d/2W-bUQgujYLEa

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

Кстати, еще интересная тема, драйвер PCA9685. Тоже достаточно недорогой, и, в отличие от прочих решений, сам делает ШИМ покананльно. Прийдет, попробую...

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

что все уже все собрали ? 

Litoza
Offline
Зарегистрирован: 08.10.2015
//Устанавливаем контакты для драйвера
#define  DATA  6
#define  CLOCK 7
//Устанавливаем контакт фоторезистора
#define  FOTO A0
//Устанавливаем контакты для первого датчика
#define  T1  2
#define  E1  3
//Устанавливаем контакты для второго датчика
#define  T2  4
#define  E2  5
//Устанавливаем контакт управления яркостью светодиодов
#define  BR  10
const byte brightset= 10 ;
 


//Задаем количество светодиодов
#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()
{

 analogWrite (BR, 5);
 MM5450(0b1000000000000001);

  static bool state;
  if(analogRead(FOTO) > 1000) state = 1; // порог освещенности включения
  if(analogRead(FOTO) < 990) state = 0; // порог освещенности выключения
  if(state)

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

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

Как сделать так, чтобы при срабатывании  1 я и последняя ступенька горели постоянно? 

maksim
Offline
Зарегистрирован: 12.02.2012

Добавить:

#define FIRST_LAST 0b1000000000000001

Заменить:

MM5450((mask<<i)|FIRST_LAST);
MM5450((mask>>i)|FIRST_LAST);
MM5450((mask>>i)|FIRST_LAST);
MM5450((mask<<i)|FIRST_LAST);
void FirstLast()
{
  analogWrite(BR, 5);
  MM5450(FIRST_LAST);
}

Закомментировать:

 //analogWrite (BR, 5);
 //MM5450(0b1000000000000001);

 

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

Спасибо! Thumb UP .

linker1185
Offline
Зарегистрирован: 25.09.2015

Добрый день! Соорудил наконец то лестницу, испытал, вроде работает. Но есть проблема! Показания фоторезистора сильно скачет +- 300 единиц. При том если совсем закрываю окошко датчика  то в мониторе  значение скачит аш  до 500 единиц . Т.е вместо стабильных 

1023  у меня показывает то 600 то 700 то 1000 и тд. Это происходит если я запитываю  плату от сети 12 вольт. Если же я подключаю  непосредствено ардуино к ноутбуку или к пк через Уарт  програматор то фоторезистор разбрасывается в пределах +-10-15 единиц.

Фоторезистор использую советский. В чем проблема ???? Как победить этот недуг? Из-за этого у меня дежурка мигает хаотично.

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

Добрый день!

Напрашивается ответ, что виновато питание, "не чистое" оно у вас. Чем питаете плату (12В)? Блок питания у вас стабилизированный? Попробуйте около разъема питания поставить конденсатор хотя бы на 470 мкф и посмотрите. Что-то изменилось?

linker1185
Offline
Зарегистрирован: 25.09.2015

Блок питания использую этот http://www.buyincoins.com/item/12258.html Наверное стабильный. Попробую повесить кондёр на 12 В и посмотрю через осцилограф что там творится.

linker1185
Offline
Зарегистрирован: 25.09.2015
Это скетч от моей лестницы
 
//Устанавливаем контакты для драйвера
#define  DATA  6
#define  CLOCK 7
//Устанавливаем контакт фоторезистора
#define  FOTO A0
//Устанавливаем контакты для первого датчика
#define  T1  12
#define  E1  13
//Устанавливаем контакты для второго датчика
#define  T2  10
#define  E2  11
//Устанавливаем контакт управления яркостью светодиодов
#define  BR  9

const byte brightset = 150;

//Задаем количество светодиодов
#define NUM_LEDS 16
const uint32_t mask = 0b01111111111111111;
const uint32_t shadow[] = { // бегущая тень
  0b11111111111111111110,
  0b11111111111111111101,
  0b11111111111111111011,
  0b11111111111111110111,
  0b11111111111111101111,
  0b11111111111111011111,
  0b11111111111110111111,
  0b11111111111101111111,
  0b11111111111011111111,
  0b11111111110111111111,
  0b11111111101111111111,
  0b11111111011111111111,
  0b11111110111111111111,
  0b11111101111111111111,
  0b11111011111111111111,
  0b11110111111111111111,
  0b11111111111111111111,
  };

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(E2, INPUT);
  digitalWrite(E1, HIGH);
  digitalWrite(E2, HIGH);
  //FirstLast();
}

void loop()
{
  Serial.println(analogRead(FOTO));
  Serial.println(" ");
  delay(100);
  static bool state, state0;
  if (analogRead(FOTO) > 986) state0 = 1; // включение выключеие дежурки
  if (analogRead(FOTO) < 972) // гистерезис отключения дежурки
  {
    state0 = 0;
    analogWrite(BR, LOW);
  }
  if (state0 == 1) FirstLast();

  if (analogRead(FOTO) > 1000) state = 1; // порог освещенности включения
  //else analogWrite(9, LOW);   // выключаем ночную подсветку
  if (analogRead(FOTO) < 990) state = 0; // порог освещенности выключения
  // else analogWrite(9, HIGH);   // включаем ночную подсветку
  if (state)
  {
    int D1 = Ultrasonic(T1, E1);    // измеряем расстояние первого датчика
    if (D1 > 0 && D1 < 80)         // если расстояние меньше 70см, то
    {
      analogWrite (BR,  brightset);
      for (char i = NUM_LEDS - 1; i >= 0; i--) // зажигаем светодиоды в одну сторону
      {
        MM5450(mask << i);
        delay(300);                 // задержка зажигания
      }
      delay(500);                  // ждем 15 секунд

      for (int j = 0; j <= 7; j++)  //бегущая тень
      {
         MM5450(shadow[16]);
        delay(1000);
        for (int k = NUM_LEDS; k >=0; k--)
        {
          MM5450(shadow[k]);
          delay(100);
        }
      }

      for (char i = 0; i <= NUM_LEDS; i++) // тушим светодиоды
      {
        MM5450(mask >> i);
        delay(300);                 // задержка затухания
      }
      //FirstLast();
    }

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

      delay(500);                  // ждем 0,5 секунд

       for (int j = 0; j <= 7; j++)    // бегущая тень
      {
        delay(1000);
        for (int k = 0; k <= NUM_LEDS; k++)
        {
          MM5450(shadow[k]);
          delay(100);
        }
      }
     
     

      for (char i = 0; i <= NUM_LEDS; i++) // тушим светодиоды
      {
        MM5450(mask << i);
        delay(300);                 // задержка затухания
      }
      // FirstLast();
    }
    delay(20);
  }
}


void FirstLast()
{
  analogWrite (BR,  30);
  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);
  }
}

 

 

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

А что за бегущая тень, зачем?

linker1185
Offline
Зарегистрирован: 25.09.2015

Это просто эффект при задержке  свечения лестницы,  одна темная ступенька бежит вдоль направления движения по лестнице, количество таких  повторений и есть задержка включения в данном случае у меня =7

соответсвенно в другую сторону тоже 7

 for (int j = 0; j <= 7; j++)  //бегущая тень

 

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

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

ilyer
Offline
Зарегистрирован: 28.11.2013

Прошу объяснить мне еще раз про ULN2003. Управляется плюсом, понятно. Так а если подключить его к шим-ногам, шим ведь должен его открывать, изменение от нуля до максимума 5 вольт если память мне не изменяет?

Сделал один вариант лестницы на первое время. внизу возле лестницы кнопка от звонка, нажал - загорелась на время, погасла. Рядом шкаф - в нем подсветка: кнопка звонка нажал - загорелась, нажал - погасла. С дребезгом боролся библиотекой. Использовал реле - 3 шт. Включение лестницы - реле питания блока 220-12 и цепь светодиодов, установленных на ступеньках. Включение подсветки шкафа - реле питания блока и реле цепи светодиодов в шкафу. Светодиоды брал в виде сборок 5750 на аллюминиевых желобах с рассеивателями. С мощностью не рассчитал, получилось 80 ватт общая, блок питания пришлось ставить 100 ваттный

Уже заказана мега -в ней 15 шим каналов 2003ки. Ступенек у меня 15. С таким железом не получится?

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

kruzhnoff пишет:

DenLiss 

Извиняюсь за поздний ответ.

Резисторы R1-R14 10kOm, R15-R29 1kOm.

На VDD  микросхемы (м5450) подаётся +12V, на BRIGHTNESS +12V через резистор 1кОм.

На S1 и S2 транзистора (IRF7314) подаётся +12V.

Между лентой и выходами транзистора (IRF7314) резистор не нужен.

 

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

почитав даташит на 5451 задаюсь вопросами:

1. по даташиту на 19 ногу (brightness) подается напряжение от +3В до +4.3В (хорошо, 5 В еще понимаю но ) , почему вы туда 12 подаете ? максимальный ток на эту ножку 0.75мА

2. при питании 5451 +12 вольтами, на сколько я понял data и clock должны быть от +10 до +12В

http://datasheet.su/datasheet/STMicroelectronics/M5451B7

почему она не горит , и работает ?

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

В общем однозначно загорелся я на драйвер от NXP, либо PCA9635, либо PCA9685. 16 каналов, каждый с индивидуальным PWM, можно настраивать выход на + или -, управляется по I2C, 7битная адрессация драйвера. Стоит такая штучка буквально доллар с копейками. Очень жду чтобы поковыряться...

linker1185
Offline
Зарегистрирован: 25.09.2015

Myero пишет:

kruzhnoff пишет:

DenLiss 

Извиняюсь за поздний ответ.

Резисторы R1-R14 10kOm, R15-R29 1kOm.

На VDD  микросхемы (м5450) подаётся +12V, на BRIGHTNESS +12V через резистор 1кОм.

На S1 и S2 транзистора (IRF7314) подаётся +12V.

Между лентой и выходами транзистора (IRF7314) резистор не нужен.

 

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

почитав даташит на 5451 задаюсь вопросами:

1. по даташиту на 19 ногу (brightness) подается напряжение от +3В до +4.3В (хорошо, 5 В еще понимаю но ) , почему вы туда 12 подаете ? максимальный ток на эту ножку 0.75мА

2. при питании 5451 +12 вольтами, на сколько я понял data и clock должны быть от +10 до +12В

http://datasheet.su/datasheet/STMicroelectronics/M5451B7

почему она не горит , и работает ?

У меня все работает и горит, на 19 ногу кинул не 12 В , а 9 ногу от ардуино через 1Ком резистор. 9 нога работает в режиме PWM.

Clock и Data идут напрямую от ардуино до 5451. Все работает.  Перед травкой платы и монтажём все проверял на макетке, на светодиодах. При чём  питалось все не от 12 В а от 5 В от усб 3.0 порта  1А. 

Монтаж ступенек производил телефонным проводом , стоит 5-6 руб метр., экономно=)  На счет неадекватности 

показаний фоторезистора , проблему решил паралельно к фоторезистору подключил кондер на 47 мкФ. Показания перестали прыгать.

https://yadi.sk/i/2a5CoF6jjydK8 -ссылка на схему

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

[/quote]

У меня все работает и горит, на 19 ногу кинул не 12 В , а 9 ногу от ардуино через 1Ком резистор. 9 нога работает в режиме PWM.

Clock и Data идут напрямую от ардуино до 5451. Все работает.  Перед травкой платы и монтажём все проверял на макетке, на светодиодах. При чём  питалось все не от 12 В а от 5 В от усб 3.0 порта  1А. 

Монтаж ступенек производил телефонным проводом , стоит 5-6 руб метр., экономно=)  На счет неадекватности 

показаний фоторезистора , проблему решил паралельно к фоторезистору подключил кондер на 47 мкФ. Показания перестали прыгать.

https://yadi.sk/i/2a5CoF6jjydK8 -ссылка на схему

[/quote]

по схеме у тебя 5450 запитана от 5 в, в этом случае и сигнальные должны быть от 2.2 до 5В по даташиту, поэтому все работает.  вопросов не имею..(хотя не очень понимаю зачем 1КОм резистор на 19 ногу даете.). я по случаю когда подают 12В на 5450.. а 5 В на сигналы от ардуины.

linker1185
Offline
Зарегистрирован: 25.09.2015

Схема не самая последняя, я потом исправил питание 5450 на 12 В,   а  на 19 ногу не обязательно 1 кОм резистор ставить, можно удалить, и так и так работает.

linker1185
Offline
Зарегистрирован: 25.09.2015

Залил последнюю версию  https://yadi.sk/d/NegwUXfTk37Y8   сама программа  DipTrace   https://yadi.sk/d/R15OhNVPk38KZ

DenLiss
Offline
Зарегистрирован: 26.04.2015

Добрый день.

linker1185, скажите пожалуйста, удалось ли Вам сделать програмный  плавный розжиг светодиодов? Если да, то как?

Если кто-то может подсказать, то пожалуста подскажите как его сделать.

За ранее большое спасибо.

 

linker1185
Offline
Зарегистрирован: 25.09.2015

Плавного розжига не удалось сделать. Попытки были, тут где то выкладывали код, где демонстрируется возможности 5450. Но  прошивка слишком сложная для меня в освоении. Мне кажеться проще это сделать на tlc5940 , тем более тут уже выкладывали для нее проект. Правда там максимум на 16 ступенек. Лично мне плавность не столь важна.

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

В принципе, я на таймере программный ШИМ на 5450 делал, работает, но очень так себе. Так что 5450 плохо для этого подходит. Лучше брать led-драйверы с поканальным ШИМ. Хочу пробовать NXP, либо PCA9635, либо PCA9685. Но и с 5450 еще побалуюсь... У меня уже вроде все железки подобрались. Буду в ближайшие недели пробовать собирать. Как что получится, отпишусь.

linker1185
Offline
Зарегистрирован: 25.09.2015

Будем ждать=)

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

linker1185 пишет:

Тоже делаю лестницу. Сейчас на стадии монтажа. Схему и печатку рисовал в diptrace  данные выкладываю. Прошивка будет такая же что и здесь. Хотел сделать шим но не дождался tlc.  https://yadi.sk/d/lMhKdDI3jN85o

 

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

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

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

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

я так много форумав изучил :

http://forum.amperka.ru/threads/%D0%90%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%...

 

http://geektimes.ru/post/257972/

http://vprl.ru/publ/umnyj_dom/avtomatika_dlja_doma/podsvetka_lestnicy/20...

http://lukjanow.ru/2013/01/automatic-illumination-stairs-arduino-update/

http://lukjanow.ru/2012/04/automatic-illumination-stairs-arduino/

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

linker1185
Offline
Зарегистрирован: 25.09.2015

вид сверху

linker1185
Offline
Зарегистрирован: 25.09.2015

вид снизу

linker1185
Offline
Зарегистрирован: 25.09.2015
//КОД ПРОГРАММЫ

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

const byte brightset = 200;

//Задаем количество светодиодов
#define NUM_LEDS 16
const uint32_t mask = 0b01111111111111111;
const uint32_t shadow[] = {   //  массив для эфекта бегущая тень
  0b11111111111111111110,
  0b11111111111111111101,
  0b11111111111111111011,
  0b11111111111111110111,
  0b11111111111111101111,
  0b11111111111111011111,
  0b11111111111110111111,
  0b11111111111101111111,
  0b11111111111011111111,
  0b11111111110111111111,
  0b11111111101111111111,
  0b11111111011111111111,
  0b11111110111111111111,
  0b11111101111111111111,
  0b11111011111111111111,
  0b11110111111111111111,
  0b11111111111111111111,
};

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(E2, INPUT);
  digitalWrite(E1, HIGH);
  digitalWrite(E2, HIGH);
  //FirstLast();
}

void loop()
{

  Serial.print("D1 = ");
  Serial.print(Ultrasonic(T1, E1));
  Serial.print("cm      D2 = ");
  Serial.print(Ultrasonic(T2, E2));
  Serial.println("cm");
  Serial.println(analogRead(FOTO));
  Serial.println(" ");
   delay(10);
  static bool state, state0;
  if (analogRead(FOTO) > 960) state0 = 1; // включение выключеие дежурки
  if (analogRead(FOTO) < 940) // гистерезис отключения дежурки
  {
    state0 = 0;
    analogWrite(BR, LOW);
  }
  if (state0 == 1) FirstLast();

  if (analogRead(FOTO) > 1000) state = 1; // порог освещенности включения
  //else analogWrite(9, LOW);   // выключаем ночную подсветку
  if (analogRead(FOTO) < 985) state = 0; // порог освещенности выключения
  // else analogWrite(9, HIGH);   // включаем ночную подсветку
  if (state)
  {
    int D1 = Ultrasonic(T1, E1);    // измеряем расстояние первого датчика
    if (D1 > 0 && D1 < 70)         // если расстояние меньше 70см, то
    {
      analogWrite (BR,  brightset);
L0: for (char i = NUM_LEDS - 1; i >= 0; i--) // зажигаем светодиоды в одну сторону
      {
        MM5450(mask << i);
        delay(300);                 // задержка зажигания
      }

      delay(200);                  // ждем 15 секунд

L1:     for (int j = 0; j <= 7; j++)
      {
        MM5450(shadow[16]);
        delay(500);
        for (int k = NUM_LEDS; k >= 0; k--)
        {
          MM5450(shadow[k]);
          delay(100);
        }
      }

      for (char i = 0; i <= NUM_LEDS; i++) // тушим светодиоды
      {
        MM5450(mask >> i);
        delay(200);                 // задержка затухания
        int D3 = Ultrasonic(T1, E1);    // измеряем расстояние первого датчика
        int D4 = Ultrasonic(T2, E2);    // измеряем расстояние второго датчика
        if (D3 > 0 && D3 < 70) goto L0 ;      // если расстояние меньше 70см, то
        if (D4 > 0 && D4 < 90) goto L1 ;
      }
      //FirstLast();
    }

    int D2 = Ultrasonic(T2, E2);    // измеряем расстояние второго датчика
    if (D2 > 0 && D2 < 90)         // если расстояние меньше 70см, то
    {
      analogWrite (BR,  brightset);
L2:   for (char i = NUM_LEDS - 1; i >= 0; i--) // зажигаем светодиоды в другую сторону
      {
        MM5450(mask >> i);
        delay(300);                 // задержка зажигания

      }

      delay(500);                  // ждем 15 секунд

L3:  for (int j = 0; j <= 7; j++)
      {
        delay(500);
        for (int k = 0; k <= NUM_LEDS; k++)
        {
          MM5450(shadow[k]);
          delay(100);
        }
      }

      for (char i = 0; i <= NUM_LEDS; i++) // тушим светодиоды
      {
        MM5450(mask << i);
        delay(200);                 // задержка затухания
        int D3 = Ultrasonic(T1, E1);    // измеряем расстояние первого датчика
        int D4 = Ultrasonic(T2, E2);    // измеряем расстояние второго датчика
        if (D3 > 0 && D3 < 70) goto L3 ;      // если расстояние меньше 70см, то
        if (D4 > 0 && D4 < 90) goto L2 ;
       
      }
      // FirstLast();
    }
  //  delay(20);
  }
 
}


void FirstLast()
{
  analogWrite (BR,  30);
  MM5450(0b01000000000000001);
}


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);
  }
}

 

linker1185
Offline
Зарегистрирован: 25.09.2015

Ступеньки у меня не выступают, по этому крепить светодиодные ленты под ступеньку не получилось. Вышел из ситуации так: купил кабель канал светло-коричневый 10х16 , нарезал по ширине ступенек, протянул туда светодиодные ленты и приклеил на тонкий двусторонний скотч на нижню кромку фронтальных панелей

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

Огpомное спасибо

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

А когда даю на печять, печятную плату надо отзеркалить или так даю на печять и дальше утюг в дело

linker1185
Offline
Зарегистрирован: 25.09.2015

Печатать лучше всего с программы DIPTRACE !!!! Если печатать с картинок форума,  то можно промахнуться с масштабом. Скачайте проект мой, там всё есть и программа сама. При выводе на печать из программы, верх нужно зеркалить, а низ не надо , не забываем убирать галки :связь и маркировка, а то их тоже распечатаешь. Все эти настройки делаются из меню ФАЙЛ/ Предварительный просмотр. Выбирать нужный слой -  в верхнем левом углу. Заливку лучше оставить - быстрее стравится. После  печати берем маркер пермаментный и проводим все дорожки. Напечатав верхний слой сверлим 3 любых отверстия в ногах, втыкаем в них иголки , гвозди, булавки и тд... , а  с другой стороны нанизываем трафарет обратной стороны, и утюжим. Далее замачиваем и удаляем бумагу, травим...... и тд..... 

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

сплсибо

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

а что за дорошки видны в вид сверху

linker1185
Offline
Зарегистрирован: 25.09.2015

Не обращай внимание, это земля. Просто когда убрал галку заливка - дорожки обнажились .

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

Всем доброго дня!

Я, как и многие, в программировании полный ноль. У меня есть Arduino mega, думаю на ней делать подсветку лестницы без m5450. Может кто поможет с кодом? У меня две лестницы 17 и 19 ступеней.

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

Я на макетке собрал на TLC5940. Хорошо получилось. Кода всего 3,7кб вышло. Осталось еще добавить датчик освещенности, но я не думаю, что там много кода уйдет. Наверное даже на AtTiny44 залить получится :)

student94
Offline
Зарегистрирован: 23.01.2016

Здравствуй народ.

Собрал схехему http://lukjanow.ru/2012/04/automatic-illumination-stairs-arduino/

Использую следующий код

//Устанавливаем контакты для драйвера
#define  DATA  6
#define  CLOCK 7

void setup() 
{
  pinMode(DATA, OUTPUT);
  pinMode(CLOCK, OUTPUT);
  digitalWrite(CLOCK, HIGH);
}

void loop() 
{
  MM5450(0xFFFFFFFF);
  delay(1000);
  MM5450(0x00000000);
  delay(1000);
}

void MM5450(uint32_t data)
{  
  digitalWrite(DATA, HIGH);
  digitalWrite(CLOCK, LOW);
  digitalWrite(CLOCK, HIGH);
  for(byte i = 0; i < 20; i++)
  {
    if(data & (1UL<<i)) digitalWrite(DATA, HIGH);
    else digitalWrite(DATA, LOW);
    digitalWrite(CLOCK, LOW);
    digitalWrite(CLOCK, HIGH);
  }
  digitalWrite(DATA, LOW);
  for(byte i = 0; i < 15; i++)
  {    
    digitalWrite(CLOCK, LOW);
    digitalWrite(CLOCK, HIGH);
  }
}

Проблема в том что диоды не загораются и не гаснут в положеное время.

Первая активность проявляется где то в 30с после запуска ардуины.

Помогите разобраться.

 

student94
Offline
Зарегистрирован: 23.01.2016

Вопрос снят.

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