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

в 15:40, , рубрики: arduino, автоматическое освещение, подсветка лестницы, умный дом, Электроника для начинающих

Добрый день, уважаемые читатели, хотел бы вас ознакомить со своей версией проекта автоматической подсветки лестницы на основе контроллера Arduino Pro Mini. Возможно, для кого-то эта статья станет основой для своих собственных проектов, ну а мне будет приятно прочитать строгую критику в комментариях.

Цель проекта: смонтировать подсветку лестницы на второй этаж при следующих условиях.

  1. Автоматика срабатывает только в темное время суток.
  2. Каждая ступенька лестницы подсвечивается после включения предыдущей.
  3. Ступеньки подсвечиваются снизу вверх и наоборот.
  4. Есть запас времени полностью подсвеченной лестницы.

Подготовка к монтажу

В качестве контроллера использовал всем знакомый Arduino Pro Mini.

Сначала о самой лестнице количество ступеней 11, ширина 550 мм. В общей сложности необходимо 6 м светодиодной ленты (заказал 2 шт по 5 м 5050 SMD), со степенью защиты IP67 (то есть защита от пыли и воды), чтобы можно было протереть пыль и не задумываться о том, попадешь ли под напряжение или повредишь ленту.

После подключения 5-ти м светодиодной ленты ток через нее оказался всего 2,5 A, то есть, для 6-ти м светодиодной ленты нужен блок питания на 36 Вт. Выбор остановился на китайском блоке питания 12 В 8.3 А 100 Вт. 100, конечно, много, но 12 В понадобилось для другого проекта, поэтому подключился к нему же.

В качестве питания самого контроллера, а также сенсоров (питание 5 В) использовал простенькую схему понижения напряжения с помощью стабилизатора напряжения L7805CV и двух керамических конденсаторов 0,1 мкФ и 0,33 мкФ.

image

В качестве датчиков фиксирующих движение остановился на ультразвуковых сенсорах HC-SR04, так как испускают узкий пучок ультразвуковых импульсов и можно настроить расстояние срабатывания. Таким образом, можно установить на отслеживании пересечения импульса на первой и последней ступенях. Вдаваться в подробности характеристик, способа подключения, принципа работы сенсора не вижу смысла в интернете достаточно много информации о них.

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

Далее рассмотрим вопрос количества использованных контактов 11 цифровых для ступеней, 4 для двух сенсоров и один аналоговый для измерения освещенности. Итого 15 цифровых, что не дает нам Arduino. Недолго думая, использовал микросхему 74НС595N, а точнее каскад из двух сдвиговых регистров для увеличения количества цифровых выходов Arduino.

Почитав литературу и мнения радиолюбителей, поставил керамический конденсатор 0,1 мкФ на 12-ой ножке STcp первого регистра, якобы для минимизации шума при подачи «защелкивающего» импульса. При опробовании мною каскада «на столе», действительно с конденсатором работает лучше, в особенности при первой подачи питания на микросхемы.

Одно дело подключать к Arduino слабую нагрузку, наподобие светодиода, другое подключать кусок светодиодной ленты, длиной 500-550 мм (максимальный ток цифрового выхода Arduino 40 мА). Более доступно для меня оказалась микросхема ULN2003A (сборка Дарлингтона), максимальный ток через один выход которой составляет 0,5 А.

image

Хочу обратить внимание, что контакт Echo второго сенсора приходит на 13-й контакт Arduino, на котором находится светодиод самого контроллера.

Сделано это специально, для удобства, в тот момент, когда удовлетворяется условие «достаточно ли темно для начало опроса сенсоров?», светодиод на 13-ом контакте начинает мигать.

Плату рисовал в Sprint-Layout. Делал акцент на том, чтобы микросхемы и контроллер снимались, припаивал панельки SCS-14 и 16, а также гнездо на плату PBS 2×12 2.54. Единственный минус пришлось выгибать в другую сторону ножки микросхем 74НС595N.

image

Составление скетча

При составлении скетча использовалась только одна библиотека Ultrasonic (для работы с сенсорами HC-SR04) и то можно было обойтись без неё. Пришлось повозиться с битовыми операциями, так как необходимо определенным образом загружать два байта в каскад сдвиговых регистров (в самом скетче сделал доходчивые пояснения).

Скетч

// ***Скетч подсветка лестницы V1***
// Библиотеки
#include "Ultrasonic.h"

// Пины
#define Trig_1 10 // Устанавливаем контакты для первого датчика.
#define Echo_1 11
#define Trig_2 12 // Устанавливаем контакты для второго датчика.
#define Echo_2 13
#define Ds 8 // Ds/SDI первого сдвигового регистра 75HC595N_1.
#define STcp 7 // STcp/RCLK сдвиговых регистров 75HC595_1, 2.
#define SHcp 6 // SHcp/SRCLK сдвиговых регистров 75HC595_1, 2.
#define LDR A0 // Аналоговый сигнал с фоторезистора.

Ultrasonic Sensor_1(Trig_1, Echo_1); // Определяем первый датчик.
Ultrasonic Sensor_2(Trig_2, Echo_2); // Определяем второй датчик.

// Параметры
const int Limit = 100; // Переменная для хранения предела сравнения с освещенностью.
const float Min_Disrance = 50.0; /* Диапазон, при котором сработает сенсор
Ширина ступеньки 55 см.*/

boolean Up_Sensor_Started = false; // Переменная отражающая факт срабатывания верхнего сенсора.
boolean Down_Sensor_Started = false; // Переменная отражающая факт срабатывания нижнего сенсора.

const int Read_Delay = 50; // Переменная для хранения времени задержки опроса сенсоров.

unsigned int leds = 0; // Переменная для хранения передаваемых битов в регистры.
const int N = 10; /* Переменная для хранения количества ступеней лестницы.
Отсчет идет с нуля! Максимум выходов 14-ть 2 Сборки Дарлингтона.*/
const int T_Ladder = 3000; // Переменная для хранения времени включенной лестницы.
const int T_Stair = 500; // Переменная для хранения времени между включениями.

void setup()
{
pinMode(Ds, OUTPUT);
pinMode(STcp, OUTPUT);
pinMode(SHcp, OUTPUT);
// Serial.begin(9600); // Инициализация последовательного порта на скорости 9600 бойд.
}

void loop()
{
int LDR_Value = analogRead(LDR); // Считываем значение с фоторезистора.
// Serial.println(LDR_Value); // Проверяем уровень освещенности в пределах от 0 до 1023.
if(LDR_Value < Limit) // Сравнение "Достаточно ли темно для подсветки?".
{
Down_Sensor(); // Вызов процедуры опроса нижнего сенсора.
if(Down_Sensor_Started) // Проверка факта срабатывания нижнего сенсора.
// Если есть, выполняем действия...
{
Down_Sensor_Started = false; // Возвращение фактов срабатывания в исходное состояние.
Up_Sensor_Started = false;
Turing_Upward(); // Вызов процедуры включения лестницы снизу вверх.
}
else
// Если нет факта срабатывания нижнего сенсора...
{
Up_Sensor(); // вызываем процедуру опроса верхнего сенсора...
if(Up_Sensor_Started) // и проверяем факт его срабатывания.
// Если есть, выполняем действия...
{
Down_Sensor_Started = false; // Возвращение фактов срабатывания в исходное состояние.
Up_Sensor_Started = false;
Turing_Downward(); // Вызов процедуры включения лестницы сверху вниз.
}
}
delay(Read_Delay); // Задержка чтения сенсоров.
}
}

// Процедура опроса верхнего датчика
void Up_Sensor()
{
if((Sensor_1.Ranging(CM) < Min_Disrance) && (Sensor_1.Ranging(CM) > 0))
// Если измеренное расстояние больше нуля, но меньше предела то...
{
Up_Sensor_Started = true; // Факт срабатывания верхнего сенсора.
}
}

// Процедура опрос нижнего датчика
void Down_Sensor()
{
if((Sensor_2.Ranging(CM) < Min_Disrance) && (Sensor_2.Ranging(CM) > 0))
// Если измеренное расстояние больше нуля, но меньше предела то...
{
Down_Sensor_Started = true; // Факт срабатывания нижнего сенсора.
}
}

// Процедура загрузки битов в регистры
void updateShiftRegister()
{
digitalWrite(STcp, LOW); // Подаем низкий сигнал для загрузки битов в регистры.
byte First = lowByte(leds); /* Разделяем наш байт на младший и старший,
так как функция shiftOut за раз пропускает только 8 бит.*/
byte Second = highByte(leds);
shiftOut(Ds, SHcp, MSBFIRST, Second); // Проталкиваем 1-й байт и читаем его слева направо.
shiftOut(Ds, SHcp, MSBFIRST, First); // Проталкиваем 2-й байт.
digitalWrite(STcp, HIGH); // Сбрасываем на выходы полученные биты.
}

// Процедура включения подсветки снизу вверх
void Turing_Upward()
{
for (int i = 0; i <= N; i++)
{
bitSet(leds, i); // Изменение всех N битов на состояние 1 (или HIGH).
updateShiftRegister(); // Включение подсветки загрузкой измененного байта.
delay(T_Stair); // Задержка между включением ступеней.
}
// Serial.println(leds, BIN); // Проверяем какой вид байта.
delay(T_Ladder); // Задержка включенной лестницы.
leds = 0; // Обнуление байта.
updateShiftRegister(); // Потушить подсветку.
}

// Процедура включения подсветки сверху вниз
void Turing_Downward()
{
for (int i = N; i >= 0; i--)
{
bitSet(leds, i); // Изменение всех N битов на состояние 1 (или HIGH).
updateShiftRegister(); // Включение подсветки загрузкой измененного байта.
delay(T_Stair); // Задержка между включением ступеней.
}
delay(T_Ladder); // Задержка включенной лестницы.
leds = 0; // Обнуление байта.
updateShiftRegister(); // Потушить подсветку.
}

Особенности монтажа

Теперь про монтаж, укладывать светодиодную ленту, конечно же, лучше в специально для неё созданный профиль, но стоимость его довольно высока. Я брал кабель канал 12×12, срезал раскаленным канцелярским ножом лишнее, получилось следующее.

image

Чтобы спрятать сенсоры HC-SR04, нашел для них по размеру коробку IEK 20 мм.

image

Монтаж щитка особого труда тоже не составил, так как на плате заранее задумывалось установка винтовых клеммников.

image

Итог

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

Единственное, по моему мнению, можно было бы сделать щиток более компактным и полностью его закрыть от посторонних рук.

Комплектация

Контроллер Arduino Pro Mini Atmega 328 5 В 16 МГц 1
Ультразвуковой сенсор HC-SR04 2
Блок питания 12 В 8.3 А 100 Вт 1
Светодиодная лента 5050 SMD 5 м IP65 2
Микросхема 74НС595N 2
Микросхема ULN2003A 2
Гнездо на плату PBS 1×40 2.54 1
Провод МГШВ 0.75
Кабель ПУНП 2×2.5
Кабель телефонный ШТЛП-4 0,12×7
Однополюсный автоматический выключатель 1 А 1
Однополюсный автоматический выключатель 10 А 1
Фоторезистор Gl5516 1
Стабилизатор напряжения L7805CV 1
Конденсатор керамический 0,33 мкФ 1
Конденсатор керамический 0,1 мкФ 2
Резистор 10 кОм 1
Панелька для микросхемы SCS-14 2
Панелька для микросхемы SCS-16 2
Коробка распределительная IEK 20 мм 2
Клеммник винтовой двухконтактный 13
Стеклотексталит 95×105 мм
Текстолит
Клемма проходная SRK 12
Кабель канал 12×12×2000
Кабель канал 16×16×2000
Расходники (термоклей, клей Момент Кристалл, припой, канифоль, флюс ТАГС)
Крепежные элементы (болты, гайки, саморезы, дюбеля, хомуты)

Спасибо за уделённое внимание.

Автор: R1on

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js