Как стать автором
Обновить

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

Время на прочтение 4 мин
Количество просмотров 230K
Продолжая изучать возможности платформы 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.
  • Ну и конечно, в идеале, использовать четыре датчика, либо два дальномера вдоль лестницы, чтобы точно определять количество человек и их поведение на лестнице.
Теги:
Хабы:
+174
Комментарии 46
Комментарии Комментарии 46

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн