Быстрые ссылки на Aliexpress
Наткнулся на очень интересный проект, где реализована красивая подсветка лестницы с помощью arduino. Но к сожалению код и библиотеки, которые выложил автор уже давно устарели и не запускались у меня, пришлось написать свой скетч.
Подумал что это может быть полезным для многих, по этому решил написать целую статью на эту тему.
Что я использовал
- Arduino uno 1шт.
- HC-SR 04 2шт.
- M5450B7 1шт
- Провода
Как это выглядит на схеме:
Так выглядит схема для простых светодиодов, где 5в достаточно для тестов. Но скорей всего для подсветки лестницы вы будете использовать диодную ленту, а тут уже потребуется 12 вольт. Для этого нам понадобиться регулятор напряжения: L78M05. Он нужен для того, чтобы снизить с 12в. до 5в., чтобы питать ардуино.
Примерно так будет выглядеть вариант для 12в.:
Как это выглядит на фотографии:
Как это выглядит на видео:
Скетч
Библиотека для HCSR04
#include <HCSR04.h>
//Устанавливаем контакты для драйвера
#define DATA 6
#define CLOCK 7
//Устанавливаем верхний датчик
int triggerPin = 13;
int echoPin = 12;
UltraSonicDistanceSensor distanceSensor(triggerPin, echoPin);
//Устанавливаем нижний датчик
int triggerPin2 = 11;
int echoPin2 = 10;
UltraSonicDistanceSensor distanceSensor2(triggerPin2, echoPin2);
// задержка между ступеньками
const long lightSpacing = 180;
//задержка свечения всей лестницы
const long lightHold = 1000;
//задержка выстрела сенсоров
const long pingReadDelay = 100;
// Диапазон при котором сработает сенсор
const float minBottomIn = 50.00;
const float minTopIn = minBottomIn;
// Значения для старта
boolean bClimbStarted = false;
boolean bDescentStarted = false;
//Задаем количество светодиодов
#define NUM_LEDS 20
const uint32_t mask = 0b11111111111111111111;
void setup()
{
Serial.begin(9600); // We initialize serial connection so that we could print values from sensor.
pinMode(DATA, OUTPUT);
pinMode(CLOCK, OUTPUT);
digitalWrite(CLOCK, HIGH);
}
void UltrasonicUpFire() {
if((distanceSensor2.measureDistanceCm() < minTopIn) && (distanceSensor2.measureDistanceCm() > 0)){
Serial.println("Top sensor tripped.");
bDescentStarted = true;
}
}
//Обработка нижнего датчика]
void UltrasonicDownFire() {
if((distanceSensor.measureDistanceCm() < minTopIn) && (distanceSensor.measureDistanceCm() > 0)) {
Serial.println("Bottom sensor tripped.");
bClimbStarted = true;
}
}
void loop() {
UltrasonicDownFire();//Выстрел нижнего датчика
if(bClimbStarted) {
bClimbStarted = false;
bDescentStarted = false;
climbLightSequence();
}else{
// Выстрел верхнего датчика
UltrasonicUpFire();
if(bDescentStarted) {
bClimbStarted = false;
bDescentStarted = false;
descentLightSequence();
}
}
delay(pingReadDelay);
}
void climbLightSequence(){
for(char i = NUM_LEDS-1; i >= 0; i--) // зажигаем светодиоды в одну сторону
{
MM5450(mask>>i);
delay(lightSpacing); // задержка зажигания
}
delay(lightHold); // ждем 3 секунды
for(char i = 0; i <= NUM_LEDS; i++) // тушим светодиоды
{
MM5450(mask<<i);
delay(lightSpacing); // задержка затухания
}
}
void descentLightSequence(){
for(char i = NUM_LEDS-1; i >= 0; i--) // зажигаем светодиоды в одну сторону
{
MM5450(mask<<i);
delay(lightSpacing); // задержка зажигания
}
delay(lightHold); // ждем 3 секунды
for(char i = 0; i <= NUM_LEDS; i++) // тушим светодиоды
{
MM5450(mask>>i);
delay(lightSpacing); // задержка затухания
}
}
void MM5450(uint32_t data)
{
digitalWrite(DATA, 1);
digitalWrite(CLOCK, LOW);
digitalWrite(CLOCK, HIGH);
for(byte i = 0; i < NUM_LEDS; i++)
{
if(data & (1UL<<i)) digitalWrite(DATA, HIGH);
else digitalWrite(DATA, LOW);
digitalWrite(CLOCK, LOW);
digitalWrite(CLOCK, HIGH);
}
digitalWrite(DATA, 0);
for(byte i = 0; i < 35-NUM_LEDS; i++)
{
digitalWrite(CLOCK, LOW);
digitalWrite(CLOCK, HIGH);
}
}
В скетче, вначале вы можете задать время горения диодов, а также скорость зажигания. Все практически прокомментировал, так что должно быть понятно. Конечно, самый большой вопрос остается с проводами. Так как проводов нужно очень много, а как их аккуратно спрятать возле лестницы.. Так что для меня, этот вопрос остался открытым. Если кто реализовывал подсветку лестницы на ардуино, делитесь опытом в комментариях!
Пытался сделать, тоже уперся в проблему проводов.
Сейчас думаю:
— об адресной светодиодной ленте, но не уверен что получится избежать наводок;
— и о нескольких сдвиговых регистрах.
Кстати, не смотрел саму библиотеку, там есть фильтр ложных срабатываний? а то датчики раз, через пять, показывают ерунду от 4 см до 4 км ))
используйте или витую пару как удлениетль проводов, или развяжите сенсоры по безпроводу
Подскажите пожалуйста, на сколько ступеней возможно реализовать эту схему?
и сколько светодиодов выдержит на канал
без силового ключа, и в зависимости от мощности светодиода, опять же соответственно даташиту нагрузка на канал не более 40 мА, т.е 3-5 светодиодов, чтобы запитать ленту , ну хотя бы от полуметра необходимы силовые ключи
драйвер светодиодов имеет 34 выхода согласно даташиту