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

    Продолжая изучать возможности платформы Arduino, решил подсветить лестницу дачного дома.

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

    Цель:


    «Автоматическая подсветка лестницы в тёмное время суток»


    Задачи:



    1) Собрать электрическую схему управления




    2) Изготовить печатную плату схемы и корпус

    Проектировать научился быстро, попробовал много CAD программ, самой удобной оказалась EAGLE. А один из способов изготовления объяснил и продемонстрировал друг, увлекающийся этой темой. FILES(brd,sch)




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


    Коробку смастерил из гетинакса. Разъемы оторвал от ненужных устройств и приклеил на холодную сварку.



    3) Написать программу

    Код спрятан ТУТ >>
    int DS_Pin = 11;   //pin 14 DS/SDI on the 75HC595 сдвиговый регистр
    int ST_Pin = 8;    //pin 12 ST_CP/RCLK on the 75HC595 сдвиговый регистр
    int SH_Pin = 12;   //pin 11 SH_CP/SRCLK on the 75HC595 сдвиговый регистр
    const int PIR1 = 5;//    Первый ИК-датчик
    const int PIR2 = 6;//    Второй ИК-датчик
    int sensorPin = A0;//    Фототранзистор
    //    ***ПАРМЕТРЫ***
    int OverTime =15000; // Время отключения в случае сбоя (мс)
    const int N=14;      //Кол-во ступенек
    int Qck_tm = 300;    // Время включения одной ступеньки
    int Wt_tm = 2000;    // Время ожидания до полного выключения
    int L=30;            // Значение пороговой освещенности 
    
    //    ***ЗНАЧЕНИЯ***
    int a1,a2;   // Расстояние считанное ультразвуковыми датчиками
    long pM=0;   //Предыдущее значение millis()
    long pM1=0;  //Предыдущее значение millis()
    long pM10=0; //Предыдущее значение millis()
    unsigned int sensorValue = 0;  // цифровое значение фоторезистора
    int registers[N+1]; // Массив ступенек
    boolean b2=false;   //Отслеживание была ли включена лестница
    boolean b3=false;   // Если было прерывание во время выключения
    
    
    void setup(){ 
      pinMode(PIR1, INPUT); 
      pinMode(PIR2, INPUT); 
      pinMode(DS_Pin, OUTPUT);
      pinMode(ST_Pin, OUTPUT);
      pinMode(SH_Pin, OUTPUT);
      Serial.begin(9600);  
      clearRegisters();
      writeRegisters();
    }
    
     // Погасить все ступеньки
    void clearRegisters(){
      for(int i = N; i >=  0; i--){
         registers[i] = LOW;
      }
    }
     //Включаем ступеньки
    void writeRegisters(){
      digitalWrite(ST_Pin, LOW);
      for(int i = N; i >=  0; i--){
        digitalWrite(SH_Pin, LOW);
           
        int val = registers[i];
           
        digitalWrite(DS_Pin, val);
        digitalWrite(SH_Pin, HIGH);
      }
      digitalWrite(ST_Pin, HIGH);
    }
    // Выставляем индивидуальные значения ступенек
    void setRegister(int index, int value){
      registers[index] = value;    
    }
    
    //Процедура включения лестницы
    void LightON(boolean a){
      b2=true;
      if(a)
            for (int k=0;k<=N;)
                {  
                    a1=digitalRead(PIR1);        
                    if ( a1==HIGH && millis() - pM1 > 1000)
                     {                    
                         pM1 = millis();
                     }
                    if (millis() - pM > Qck_tm)
                     {
                         pM = millis();
                         setRegister(k, HIGH);     
                         writeRegisters();
                         k++; 
                     }   
                }
      else
            for (int k=N;k>=0;)
                {
                  a2=digitalRead(PIR2);
                 if ( a2 == HIGH && millis() - pM1 > 1000)
                 {         
                   pM1 = millis();
                  } 
                    if (millis() - pM > Qck_tm)
                    {
                      pM = millis();
                      setRegister(k, HIGH);     
                      writeRegisters();
                      k--; 
                    }   
                }
    }
    
    //Процедура выключения лестницы 
    void LightOFF(boolean a){
      b2=false;
      if(a){
            int k=0;
            while(k<=N)
            { a1=digitalRead(PIR1);
              if (a1== HIGH){
               LightON(true);
               break;
               }
              if (millis() - pM > Qck_tm){
              pM = millis();  
              setRegister(k, LOW);     
              writeRegisters();  
              k++;          
            }}}
      else 
           {
            int k=N;
            while(k>=0)
            { a2=digitalRead(PIR2);
              if (a2 == HIGH){
               LightON(false);
               break;
               }
              if (millis() - pM > Qck_tm){
              pM = millis();  
              setRegister(k, LOW);     
              writeRegisters();  
              k--;          
            }}}
    }
    
     void loop(){
     sensorValue = analogRead(sensorPin);  // считываем значение с фоторезистора
     Serial.println(sensorValue, DEC); 
    if (sensorValue < L){
      
     a1=digitalRead(PIR1);
       if ( a1 == HIGH && a2== LOW)// Если задет первый датчик
          { 
            pM=millis();
            LightON(true);
            while (b2)
             { 
               a2=digitalRead(PIR2);        
               if (a2 == HIGH && millis() - pM10 > 1000 || (millis() - pM > OverTime))
                {   pM10 = millis();
                    LightOFF(true);
                }}}
         a2=digitalRead(PIR2);  
         if (a2 == HIGH && a1 == LOW)
             { 
            pM=millis();
            LightON(false);        
            while (b2)
             {   
                 a1=digitalRead(PIR1); 
                     
                 if (a1== HIGH && millis() - pM10 > 1000 || (millis() - pM > OverTime))
                  {   pM10 = millis();
                      LightOFF(false);                     
                  }}}}}
    

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


    4) Произвести монтаж на лестницу

    Самый трудоемкий и утомительный этап работы, нужно было проложить 40м кабеля и припаять около 80 проводников.
    Управляющее оборудование разместил под лестницей.


    Провода убраны в кабель-каналы.
    Датчики спрятаны под первыми ступеньками сверху и снизу, их размещение находилось экспериментально, главная задача ограничить угол обзора, чтобы не включать лестницу напрасно.
    Фототранзистор установлен по центру лестницы, где хуже всего со светом, поэтому и в пасмурную погоду лестница работает отлично.
    Светодиодные ленты приклеены на обратные стороны ступенек, чтобы не били по глазам при подъеме наверх. Так как ленты были разных фирм и IP, пришлось чередовал их через ступеньку, что вышло даже оригинально.


    На полную установку всего оборудования ушло 3 дня, есть еще недочёты в дизайне:
    • Датчики приклеены на двухсторонний скотч, хочется закрепить их понадежней
    • Получше замаскировать проводники под ступеньками
    • Перенести блоки питания и управления, чтобы закрыть их шторкой


    5) Подсчитать затраты



    ***ВИДЕО***








    6) Вывод:

    Получилось даже лучше, чем я это себе представлял. В целом дорабатывать проект можно бесконечно, но на этапе beta-версии он стабильно и надежно работает.
    Естественно, это устройство Америку не открывает, но безусловно КРУТО, когда идея из головы рождается на свет и начинает работать. Всем удачи и неиссякаемого творческого вдохновения!

    7) Если бы начинал проект сейчас, чтобы сделал по-другому?

    • Разъемы должны быть установлены на плату, устройство станет компактней, а пайки станет в два раза меньше.
    • Микросхему ULN2003A заменить на нормальный светодиодный драйвер, либо на транзисторную микросхему, чтобы появилась возможность ШИМ (плавного включения).
    • Использовать менее навороченный блок питания, вполне подойдет обычный светодиодный на 12V. Arduino питать через стабилизатор на 5V.
    • Ну и конечно, в идеале, использовать четыре датчика, либо два дальномера вдоль лестницы, чтобы точно определять количество человек и их поведение на лестнице.
    Метки:
    Поделиться публикацией
    Похожие публикации
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 46
    • +9
      Видос зачетный! :)
      И в целом работа понравилась! Так держатЬ!
    • 0
      Супер. Спасибо!
      Как раз думал чего же не хватает моей лестнице :)
      • +1
        Конструкция корпуса зачетная. Надо будет взять на вооружение.
        • +3
          >>микроконтроллера Arduino

          Arduino — это не микроконтроллер, это платформа.

          А так — очень хорошая работа — так держать!!!
          • 0
            Ага, косяк. Спасибо, исправил!
          • НЛО прилетело и опубликовало эту надпись здесь
            • 0
              Не поверите, но так оно и есть, во всех проходных помещениях датчики движения стоят. На лестнице не хватало, пришлось самому делать.
            • 0
              Класс! Самое сложное это нахождение места для установки PIR датчиков. В своем проекте я отказался от их использования из за слишком большого угла обзора. Поэтому использовал ультрасоники. Их очень легко устанавливать, а также легко ограничить радиус. Яркость можно регулировать? Так же заметил, что вы использовали кабель от сигнализации как и я в своем проекте.
              • +1
                Вам спасибо за пост, я хоть себя не первооткрывателем чувствовал. У меня собака в доме живет, я решил поберечь её ушки. А так ультрасоники это хорошее решение. Пока нельзя из-за ULN микросхемы, ШИМ не возможен, а снижением напряжения яркость менять — жестоко.
                • 0
                  Странно. Моя собака вообще не реагирует на ультрасоники.
                • 0
                  Так у датчиков же частота выше, чем слышат собаки?
              • +4
                А если подняться до половины лестницы и спуститься?
                • +2
                  Горит 10 секунд и гаснет
                  • +3
                    Вы не тестером работаете?
                    • 0
                      Разработчику и тестером приходиться работать)
                      На самом деле это больше подходит к проектировщику, а не к тестеру) Я бы изначально счел это состояние системы как возможное.
                  • +2
                    Первую и последнюю ступеньки лучше подсвечивать постоянно, иначе в темноте можно споткнуться.
                    • +3
                      На первом и втором этаже автоматически свет включается, поэтому видно куда ступаешь.
                    • +3
                      «Микросхему ULN2003A заменить на нормальный светодиодный драйвер, либо на транзисторную микросхему, чтобы появилась возможность ШИМ (плавного включения).» возможность ШИМ и сейчас у Вас есть — сдвиговые регистры вполне себе работают на частотах 20 МГц — а то и выше в зависимости от разводки/шлефов — более чем достаточно для реализации ШИМ. а микросхема ULN2003A — транзисторная сборка Дарлингтона — не совсем понятно что вы имели в виду под транзисторной микросхемой. хотя проще реально такие вещи с готовым драйвером делать — например pca9685 — у него есть возможноть настроить выходы как открытый коллектор или тяни-толкай, если по мощности хватает — можно вообще от внешних сборок отказаться
                      • 0
                        Меня смутило, что ULN2003A управляет нулями. На этих выходных попробую сделать ШИМ, потом отпишусь!
                      • 0
                        Не подскажите автора и название первого трека?
                        • 0
                          В оригинале XX — Intro
                          • 0
                            Покорнейше благодарю :)
                        • +3
                          А если бежать?
                          • 0
                            Бегать по лестнице, тем более такой крутой — может плохо закончиться :)
                          • 0
                            Возможно будет симпатичнее более плавное включение и выключение лент, так как — то топорненько…
                            • 0
                              Можете сказать, во сколько всё в конечном итоге обошлось? Спасибо
                              • +1
                                Так пункт 5 — затраты.
                                • –1
                                  Уупс, извиняюсь, я как-то пропустил этот пункт… Прошелся поиском по "$" и ничего не нашел, а там в рублях указано.
                                  Спасибо!
                              • +6
                                Под высокими нагрузками тестировали? Сколько надо поднимающихся/спускающихся человек, и в какой очередности, что бы система дала сбой?
                                • +1
                                  Штук 5 детишек запустить и хватит… :-)
                                  • +22
                                    — Дорогая, как тебе подсветка лестницы?
                                    — Милый, ты у меня настоящий мастер!
                                    — Знаешь, мне бы хотелось испытать ее под высокими нагрузками…
                                    — Что ты имеешь в виду?
                                    — Ммм, ну, это серьезный разговор.
                                  • +2
                                    Чтобы лестница дала сбой, достаточно идти на встречу друг другу, но так ночью лучше не делать!
                                  • 0
                                    Если бы начинал проект сейчас, чтобы сделал по-другому?

                                    Плавное нарастание яркости и затухание
                                    • +2
                                      У меня при виде деревянной лестницы почему-то статья про плотников сразу в голове вылезла ;) habrahabr.ru/post/181836/
                                      • +1
                                        Не зря у номеров статей разница всего в одну цифру =)
                                      • 0
                                        А не мешает тем кто спит вот такие постоянные мигания и переливания? Если, например тихо хочешь спуститься, без визуализации — это можно?
                                        • 0
                                          Спальни все за дверями находятся. Некоторые ступеньки скрипят как их не подгоняй, так что свет это наименьший раздражитель!
                                          Для тихого и бесшумного ухода всегда есть окно или балкон, кому как нравится =)
                                        • –2
                                          Каждый раз читаю с удовольствием и завидую. Не был бы таким ленивым занятым, обязательно бы тоже сделал что-то подобное… Эх.
                                          • 0
                                            Зачем-же так сложно?
                                            С этим вполне также красиво справится один таймер + один сдвиговый регистр
                                            для полного комплекта только добавить датчик за 2$ (http://www.ebay.com/itm/KDQ14-NEW-1PCS-YROELECTRIC-INFRARED-PIR-MOTION-SENSOR-DETECTOR-MODULE-SCA-1716-/121112180908?pt=LH_DefaultDomain_0&hash=item1c32d938ac) и по транзистору на ступеньку.
                                            и всё
                                            • 0
                                              Люди, помогите разобраться со схемой.
                                              Если я правильно понал, вся логика работает от 5В. Как подается 12В на ленты?
                                              • 0
                                                ULN2003 представляет собой набор составных транзисторов. Грубо говоря, по сигналу с логики она замыкает свои выходы (ноги 10-16) на землю. Светодиодные ленты подключаются катодами каждая на свой выход. Аноды лент соединяются вместе и подключаются к источнику +12В.
                                                Нога 9 — защитные диоды, нужны при работе с индуктивной нагрузкой. Для световых лент этот выход можно никуда не подключать, а можно бросить на +12В.

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