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.
  • Ну и конечно, в идеале, использовать четыре датчика, либо два дальномера вдоль лестницы, чтобы точно определять количество человек и их поведение на лестнице.

ссылка на оригинал статьи http://habrahabr.ru/post/181336/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *