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

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

«Автоматическая подсветка лестницы в тёмное время суток»
1) Собрать электрическую схему управления

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


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

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

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


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


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

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

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

Цель:
«Автоматическая подсветка лестницы в тёмное время суток»
Задачи:
1) Собрать электрическую схему управления
- Мозгом всей конструкции является Arduino Mini
- Датчиками служат два PIR-сенсора
- Для увеличения пинов, микросхема 74HC595
- LED-ленты управляются ИМС ULN2003A
- Датчик освещенности фототранзистор
- Блок питания с двумя выходами +12 и +5

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