Arduino

Как сделать автоматическую подсветку лестницы на Arduino

• 27-12-2018 •

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

Подумал что это может быть полезным для многих, по этому решил написать целую статью на эту тему.

Что я использовал

  1. Arduino uno 1шт.
  2. HC-SR 04 2шт.
  3. M5450B7 1шт
  4. Провода

Как это выглядит на схеме:

Так выглядит схема для простых светодиодов, где 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);
  }
}

В скетче, вначале вы можете задать время горения диодов, а также скорость зажигания. Все практически прокомментировал, так что должно быть понятно. Конечно, самый большой вопрос остается с проводами. Так как проводов нужно очень много, а как их аккуратно спрятать возле лестницы.. Так что для меня, этот вопрос остался открытым. Если кто реализовывал подсветку лестницы на ардуино, делитесь опытом в комментариях!

7 thoughts on “Как сделать автоматическую подсветку лестницы на Arduino

  1. Пытался сделать, тоже уперся в проблему проводов.
    Сейчас думаю:
    — об адресной светодиодной ленте, но не уверен что получится избежать наводок;
    — и о нескольких сдвиговых регистрах.

  2. Кстати, не смотрел саму библиотеку, там есть фильтр ложных срабатываний? а то датчики раз, через пять, показывают ерунду от 4 см до 4 км ))

  3. используйте или витую пару как удлениетль проводов, или развяжите сенсоры по безпроводу

  4. Подскажите пожалуйста, на сколько ступеней возможно реализовать эту схему?

    1. без силового ключа, и в зависимости от мощности светодиода, опять же соответственно даташиту нагрузка на канал не более 40 мА, т.е 3-5 светодиодов, чтобы запитать ленту , ну хотя бы от полуметра необходимы силовые ключи

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