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

Добрый день! В этом посте хочу поделится с  интернет сообществом о том, как мне довелось сделать автоматическое освещение лестницы в своем двухэтажном коттедже.  Около четырех месяцев назад, возвращаясь с работы в полной темноте, я не удачно подскользнулся и сломал две плюсниевых кости (пальца) на левой ступне. Целый месяц пришлось провалятся в постеле, так как наступать на ногу было невероятно больно. Потом еще пол месяца хромал без гипса (у кого были переломы меня сразу поймут). После этой печальной истории я начал задумываться об автоматизации освещения ступенек лестницы. Немного поиграв с поисковыми запросами, нашел для себя очень простое решение в этом блоге, как раз на основе моего любимого микроконтроллера Arduino. Схема не вызвала каких то трудностей, но отпугивало количество и длина проводов, которые мне предстояло смонтировать. До этого ничего подобного не делал. Покупать готовые решения или нанимать кого-то — накладно. В течении месяца заказал нужные комплектующие и не торопясь смонтировал за несколько дней на свою лестницу. Всем кому интересно, что из этого получилось, добро пожаловать под кат!

Компоненты

Приведу примерную стоимость всех компонентов, которые были использованы в работе. Большинство комплектующих куплены в магазинах моего города поэтому приведу все в рублях.

Arduino Pro Mini 300 р
Ultrasonic Module HC-SR04 Distance Sensor — 2 шт 230 р
Драйвер светодиодов M5450 88 р
Регулятор напряжения L78M05CV 26 р
Фоторезистор ФР-764 16 р
Кабель-канал 20×10 мм — 10 М 100 р
Провод 2×0,12 — 100 М (с запасом для лент) 190 р
Провод 4×0,12 — 20 М (для сенсоров) 60 р
Светодиодная лента LSP0603W15 White — 17 шт по 30 см 1020 р
Мелочевка: текстолит 15×15 см, хлорное железо, сверло 0,9 мм, штыревые соединители типа PLS, разъемы на плату BLS, термоусадочная трубка, конденсаторы и резисторы 200 р
Блок питания 12В (он же корпус) от сигнализации «Парус 4» Бесплатно
Итого 2230 р

Прототип

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

Схема

С помощью небезызвестной среды для проектирования Eagle CAD была доработана схема автора и печатная плата. Здесь я добавил регулятор напряжения на 5 В, изменил датчики с 3х контактных дорогих Ping на четырех контактные дешевые HC-SR04. Для того, что бы подсветка лестницы срабатывала только в темное время суток, в схему добавлен советский фоторезистор  ФР-764 (можно использовать и другой).

Скетч

В скетче используется свободно распространяемая библиотека для работы со светодиодным драйвером M5450, а также библиотека для работы с ультразвуковым дальномером  HC-SR04.

[php]

#include "lightuino3.h"
#include "Ultrasonic.h"

//Устанавливаем контакты для первого датчика
#define TRIG_PIN 12
#define ECHO_PIN 13
//Устанавливаем контакты для второго датчика
#define TRIG2_PIN 10
#define ECHO2_PIN 11
//Определяем первый датчик
Ultrasonic OurModuleUp(TRIG_PIN, ECHO_PIN);
//Определяем второй датчик
Ultrasonic OurModuleDown(TRIG2_PIN, ECHO2_PIN);
// pins 0, 1 used by Serial
const unsigned char DataPin = 6;
const unsigned char clockPin = 7;

// задержка между ступеньками
const long lightSpacing = 280;
//задержка свечения всей лестницы
const long lightHold = 10000;
//задержка выстрела сенсоров
const long pingReadDelay = 50;

// Диапазон при котором сработает сенсор
const float minBottomIn = 33.0f;
const float minTopIn = minBottomIn;

LightuinoSink sinks(clockPin, DataPin, 100, 4);

boolean bClimbStarted = false;
boolean bDescentStarted = false;

int val;
void setup() {
Serial.begin(9600);
pinMode(DataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
delay(1000);
sinks.set(0,0,0);
}

void loop() {
val = analogRead(0);
//Проверяем освещенность в помещении
if (val>=1020){

UltrasonicDownFire();//Выстрел нижнего датчика
if(bClimbStarted) {
bClimbStarted = false;
bDescentStarted = false;
climbLightSequence();
}
else {
// Выстрел верхнего датчика
UltrasonicUpFire();
if(bDescentStarted) {
bClimbStarted = false;
bDescentStarted = false;
descentLightSequence();
}
}
delay(pingReadDelay);
}
}

//Обработка верхнего датчика
void UltrasonicUpFire() {

if((OurModuleUp.Ranging(INC) < minTopIn) && (OurModuleUp.Ranging(INC) > 0))
{
Serial.println("Top sensor tripped.");
bDescentStarted = true;
}
}

//Обработка нижнего датчика]
void UltrasonicDownFire() {

if((OurModuleDown.Ranging(INC) < minTopIn) && (OurModuleDown.Ranging(INC) > 0)) {
Serial.println("Bottom sensor tripped.");
bClimbStarted = true;
}
}

void climbLightSequence(){
LedsOnDown();
}
void LedsOnDown(){
//Обнуляем
byte ledState[9];
for (int j=0;j=0;k—)
{
for (int j=8;j>=1;j—)
{
ledState[k] = (ledState[k] >> 1) + 128;
sinks.set(ledState);
delay(lightSpacing);
}
}
//Задержка
delay(lightHold);
//Гасим
for (int k=1;k>=0;k—)
{
for (int j=8;j>=1;j—)
{
ledState[k] = (ledState[k] >> 1);
sinks.set(ledState);
delay(lightSpacing);
}
}
delay(pingReadDelay);
}

void descentLightSequence(){
LedsOnUp();
}

void LedsOnUp(){
//Обнуляем
byte ledState[9];
for (int j=0;j ledState[j] = B00000000;
}
//Зажигаем
for (int k=0;k {
for (int j=0;j {
ledState[k]=(ledState[k] << 1) + 1;
sinks.set(ledState);
delay(lightSpacing);
} }
delay(lightHold);
for (int k=0;k {
for (int j=0;j {
ledState[k]=(ledState[k] << 1);
sinks.set(ledState);
delay(lightSpacing);
}
}
delay(pingReadDelay);
}

[/php]

Немного про монтаж

Так как у меня самая простая деревянная лестница (без подступенной доски), крепление светодиодных лент осуществил с торца каждой ступеньки.

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

Крышка на месте. Размещаем контроллер под лестничной площадкой.

Результат

На самом деле видео не отражает реальной картины. Лестница освещается намного красивее и ярче.

[stextbox id=»custom» caption=»Скачать все необходимые файлы»]

[download id=»56″]
[/stextbox]

96 комментариев к “Автоматическая подсветка лестницы с помощью Arduino”

  1. Arduino: 1.8.9 (Windows 7), Плата:»Arduino Pro or Pro Mini, ATmega328P (5V, 16 MHz)»

    In file included from d:\Documents\Arduino\libraries\lightuino5/lightuino3.h:28:0,

    from D:\Documents\Arduino\________\________.ino:1:

    d:\Documents\Arduino\libraries\lightuino5/lightuinoSink.h:158:31: error: ‘prog_uchar’ has not been declared

    AniPattern(Lightuino& shld, prog_uchar* anim,prog_uint16_t* delayLst, int total_frames): shield(shld) {flags=0; delays=delayLst; ani=anim; numFrames=total_frames; curFrame=0; curDelay=0; anidir=1;}

    ^

    d:\Documents\Arduino\libraries\lightuino5/lightuinoSink.h:158:48: error: ‘prog_uint16_t’ has not been declared

    AniPattern(Lightuino& shld, prog_uchar* anim,prog_uint16_t* delayLst, int total_frames): shield(shld) {flags=0; delays=delayLst; ani=anim; numFrames=total_frames; curFrame=0; curDelay=0; anidir=1;}

    ^

    d:\Documents\Arduino\libraries\lightuino5/lightuinoSink.h:166:3: error: ‘prog_uchar’ does not name a type

    prog_uchar* ani;

    ^

    d:\Documents\Arduino\libraries\lightuino5/lightuinoSink.h:167:3: error: ‘prog_uint16_t’ does not name a type

    prog_uint16_t* delays;

    ^

    d:\Documents\Arduino\libraries\lightuino5/lightuinoSink.h: In constructor ‘AniPattern::AniPattern(Lightuino&, int*, int*, int)’:

    d:\Documents\Arduino\libraries\lightuino5/lightuinoSink.h:158:115: error: ‘delays’ was not declared in this scope

    AniPattern(Lightuino& shld, prog_uchar* anim,prog_uint16_t* delayLst, int total_frames): shield(shld) {flags=0; delays=delayLst; ani=anim; numFrames=total_frames; curFrame=0; curDelay=0; anidir=1;}

    ^

    d:\Documents\Arduino\libraries\lightuino5/lightuinoSink.h:158:132: error: ‘ani’ was not declared in this scope

    AniPattern(Lightuino& shld, prog_uchar* anim,prog_uint16_t* delayLst, int total_frames): shield(shld) {flags=0; delays=delayLst; ani=anim; numFrames=total_frames; curFrame=0; curDelay=0; anidir=1;}

    ^

    D:\Documents\Arduino\________\________.ino: In function ‘void LedsOnDown()’:

    ________:92:20: error: ‘k’ was not declared in this scope

    for (int j=0;j=0;k—)

    ^

    D:\Documents\Arduino\________\________.ino: In function ‘void LedsOnUp()’:

    ________:123:21: error: expected ‘;’ before ‘ledState’

    for (int j=0;j ledState[j] = B00000000;

    ^

    ________:123:44: error: expected ‘)’ before ‘;’ token

    for (int j=0;j ledState[j] = B00000000;

    ^

    D:\Documents\Arduino\________\________.ino: At global scope:

    ________:126:3: error: expected unqualified-id before ‘for’

    for (int k=0;k {

    ^

    ________:126:16: error: ‘k’ does not name a type

    for (int k=0;k {

    ^

    ________:132:8: error: expected constructor, destructor, or type conversion before ‘(‘ token

    delay(lightHold);

    ^

    ________:133:3: error: expected unqualified-id before ‘for’

    for (int k=0;k {

    ^

    ________:133:16: error: ‘k’ does not name a type

    for (int k=0;k {

    ^

    ________:140:7: error: expected constructor, destructor, or type conversion before ‘(‘ token

    delay(pingReadDelay);

    ^

    ________:141:1: error: expected declaration before ‘}’ token

    }

    ^

    exit status 1
    ‘k’ was not declared in this scope

    Этот отчёт будет иметь больше информации с
    включенной опцией Файл -> Настройки ->
    «Показать подробный вывод во время компиляции»

    Ответить
  2. Добрый день. не могу найти библиотеку для HC-SR04 ссылка не работает. если можно отправьте мне на почту. Заранее благодарен.

    Ответить

Добавить комментарий для polk8 Отменить ответ

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.