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

Подвох

✩✩✩✩✩✩✩
1 Фев 2020
10
1
@Slaiterx, тоже решил делать на адресной для возможности на новый год гирлянду сделать
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
Смотри , при загрузке библиотек всегда есть несколько примеров с ней. Меню файл -примеры- и выбираешь соотв. библиотеке. примеры рабочие. запускаешь их, проверяешь, что бы работало.
Библиотеки лучше ставить через управление библиотеками , особенно если не очень понимаешь что куда копировать. Там и версии можно обновить. Может лучше удалить этот каталог, ультрасоник, и поставить библиотеку заново, там есть поиск, по ультрасонику должно найтись.
 

Подвох

✩✩✩✩✩✩✩
1 Фев 2020
10
1
@Старик Похабыч,@Старик Похабыч, я ставил пример библиотек и проверял работу и ленты и ультразвуковых датчиков отдельно все работает,
библиотеки ставил и автоматически и в ручную, в ручную как в директорию программы так и в документы все по инструкции гугла)
но повторюсь представленная библиотека автора "\Ultrasonic " выдает ошибку описанную выше, а скаченные самостоятельно имеют добавочно номер версии в назывании библиотек!
после замены ставиться но не работает, возможно ли проверить частями что бы найти проблему? например отключить датчики звука, точнее сделать их постоянно включенными
или датчик света
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
@Подвох, если по отдельности работает и лента из примеров, и ультразвуковой датчик , то варианта всего 2. 1) программа не работает верно. но автор сказал, что работает. 2) Неверное подключение для данного проекта. Автор указал в начале какие пины куда подключать. Возможно проблема в этом.
На картинке схема проекта, то как это делал автор. А как у тебя ? я не знаю.
Может быть фоторезистор не тот, тогда показание будет другое. Вывести то, что он передает на ардуину в монитор порта и посмотреть что бы это все менялось, определить порог
 

Подвох

✩✩✩✩✩✩✩
1 Фев 2020
10
1
@Старик Похабыч, я тоже на фоторезистор грешу, как его исключить их схемы для проверки? на по@Старик Похабыч, распиновка полная копия автора, только количество светодиодов 90.

сейчас глянул " Монитор порта" датчики звуковые реагируют а фоторезистор всегда без изменений и что интересно задержка вывода информации на монитор примерно 20 секунд ( но как я понимаю это не имеет отношения к скорости считывания данных с датчика, а только вывод на монитор порта
 

Вложения

Старик Похабыч

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
67, 68 строки выглядят так
if (photocellReading <= lightLevel) {
if (upSensor < 20 && !go_up && !go_down ) {
сделать так
//if (photocellReading <= lightLevel)
{ if (upSensor < 20 && !go_up && !go_down ) {
Будет работать без датчика, вне зависимости от освещенности
еще!
строки с 108-113 сделать так:
/* } else {
for (int i = 0; i <= NUMPIXELS; i++) {
pixels.setPixelColor(i, pixels.Color(0, 0, 0));
pixels.show();
delay(delayVal);
} */
 
Изменено:
  • Лойс +1
Реакции: Подвох

Подвох

✩✩✩✩✩✩✩
1 Фев 2020
10
1
@Старик Похабыч, замена 67-68 выдало ошибку, убрал "//" ошибка пропала, но на работе нечего не изменилось.

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

@Старик Похабыч,
датчики работают нормально
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
Вот проверочный код. если все верно подключено, он должен пробежать белым огоньком по ленте,
а потом раз в секунду выдавать значения со всех 3-х датчиков, 2 расстояния и значения фоторезистора. проверь работает ли все как надо
C++:
#include <Adafruit_NeoPixel.h>                                              // Подключение библитотек
#include <Ultrasonic.h>                                                       //--

// ===================== Регулируемые настройки ========================================================================================================================
#define PIN         13                                                      // Пин на ардуино для ленты
#define NUMPIXELS   90                                                       // Количество светодиодов

#define trigPin     8                                                       // Пины на первом сенсоре расстояния
#define echoPin     7                                                         //--
#define trigPin_2   10                                                      // Пины на втором сенсоре расстояния
#define echoPin_2   9                                                         //--

#define always      2                                                       // Количество постоянно горящих светодиодов в начале и конце лестницы

#define lightLevel  5                                                       // Уровень освещенности в комнате, при котором система начинает работу (можно протестировать через монитор порта)

int delayVal = 200;                                                         // Время задержки зажигания в милисекундах между каждым светодиодом
int photocellPin = A6;                                                      // Аналоговый вывод, к которому подключены сенсор и понижающий резистор 10 кОм

// ===================== Код программы ================================================================================================================================

Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);             // Инициализация адресной светодиодной ленты

Ultrasonic readDownSensor(trigPin, echoPin);                                // Инициализация сенсора на подъем по лестнице
Ultrasonic readUpSensor(trigPin_2, echoPin_2);                              // Инициализация сенсора на спуск по лестнице


void setup() {
  pixels.begin();                                                           // Подготавливаем вывод данных для NeoPixel (НЕОБХОДИМО)
  Serial.begin(9600);                                                       // Указываем порт для монитора порта

  for ( int i = 0; i <NUMPIXELS - always; i++) {                  // Задаем начальное свечение верхних "дежурных светодиодов"
    pixels.setPixelColor(i, pixels.Color(255, 255, 255));                      //--
    pixels.show();                                                             //--
    delay(200);
    pixels.setPixelColor(i, pixels.Color(255, 255, 255));                      //--
  }
}

void loop() {
  int photocellReading = analogRead(photocellPin);                              // Считывание данных с фоторезистора
  Serial.print("Фото = ");                                 // Вывод значения с фоторезистора
  Serial.print(photocellReading);                                            //--
  Serial.print(" ULTRA1: ");                         // Вывод значений с сенсоров
  Serial.print(readDownSensor.read());                                      //--
  Serial.print(" ULTRA2: ");                           //--
  Serial.println(readUpSensor.read());                                        //--
  delay(1000);
}
 
Изменено:
  • Лойс +1
Реакции: Wildnet

Подвох

✩✩✩✩✩✩✩
1 Фев 2020
10
1
@Старик Похабыч, жалуеться на 41 строчка " photocellReading = analogRead(photocellPin); // Считывание данных с фоторезистора"

и выдает ошибку



C:\Users\User\Documents\Arduino\sketch_feb04b\sketch_feb04b.ino: In function 'void loop()':

sketch_feb04b:41:3: error: 'photocellReading' was not declared in this scope

photocellReading = analogRead(photocellPin); // Считывание данных с фоторезистора

^~~~~~~~~~~~~~~~

C:\Users\User\Documents\Arduino\sketch_feb04b\sketch_feb04b.ino:41:3: note: suggested alternative: 'photocellPin'

photocellReading = analogRead(photocellPin); // Считывание данных с фоторезистора

^~~~~~~~~~~~~~~~

photocellPin

exit status 1
'photocellReading' was not declared in this scope
 

Подвох

✩✩✩✩✩✩✩
1 Фев 2020
10
1
@Старик Похабыч, лента пробежала теперь светится белым, датчика все реагируют и дальномер и фоторезистор.

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

Старик Похабыч

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
Датчика все реагируют и дальномер и фоторезистор.
Значит собрано все верно и теперь аппаратную часть можно полностью исключить.
У автора расстояние срабатывания 20 см,
И если я правильно понял подход автора, то подсветка лестницы включается только если темно. Т.е. значение с фоторезистора меньше 5. Не знаю какие выдают показатели ваши фоторезисторы, но если поставить lightLevel 2000 , то срабатывать будет всегда, для теста самое оно.
А так надо подбирать по уровню темноты
И непонятно почему так редко обновляется монитор...
 

Slaiterx

✩✩✩✩✩✩✩
4 Фев 2020
6
1
вот такой вариант тоже интересный


FODXLFYIGTY8XVX.MEDIUM.jpg
C++:
// Edit by Serge Niko June 2015

#include <Adafruit_NeoPixel.h>

#define PIN 6

// Parameter 1 = number of pixels in strip
// Parameter 2 = Arduino pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)

Adafruit_NeoPixel strip = Adafruit_NeoPixel(525, PIN, NEO_GRB + NEO_KHZ800);

// IMPORTANT: To reduce NeoPixel burnout risk, add 1000 uF capacitor across
// pixel power leads, add 300 - 500 Ohm resistor on first pixel's data input
// and minimize distance between Arduino and first pixel.  Avoid connecting
// on a live circuit...if you must, connect GND first.

// Set up Variables
unsigned long timeOut=60000; // timestamp to remember when the PIR was triggered.
int downUp = 0;              // variable to rememer the direction of travel up or down the stairs
int alarmPinTop = 10;        // PIR at the top of the stairs
int alarmPinBottom =11;      // PIR at the bottom of the stairs
int alarmValueTop = LOW;    // Variable to hold the PIR status
int alarmValueBottom = LOW; // Variable to hold the PIR status
int ledPin = 13;           // LED on the arduino board flashes when PIR activated
int LDRSensor = A0;        // Light dependant resistor
int LDRValue = 0;          // Variable to hold the LDR value
int colourArray[350];      // An array to hold RGB values
int change = 1;            // used in 'breathing' the LED's
int breathe = 0;           // used in 'breathing' the LED's


void setup() {
   strip.begin();
   strip.setBrightness(40); //adjust brightness here
   strip.show(); // Initialize all pixels to 'off'
   Serial.begin (9600);  // only requred for debugging
   pinMode(ledPin, OUTPUT);  // initilise the onboard pin 13 LED as an indicator
   pinMode(alarmPinTop, INPUT_PULLUP);     // for PIR at top of stairs initialise the input pin and use the internal restistor
   pinMode(alarmPinBottom, INPUT_PULLUP);  // for PIR at bottom of stairs initialise the input pin and use the internal restistor
   delay (2000); // it takes the sensor 2 seconds to scan the area around it before it can
   //detect infrared presence.

}

void loop() {

    if (timeOut+15700 < millis()) {        // idle state - 'breathe' the top and bottom LED to show program is looping
       uint32_t blue = (0, 0, breathe);
       breathe = breathe + change;
       strip.setPixelColor(0, blue);
       strip.setPixelColor(34, blue);
       strip.setPixelColor(35, blue);
       strip.setPixelColor(69, blue);
       strip.setPixelColor(70, blue);
       strip.setPixelColor(104, blue);
       strip.setPixelColor(105, blue);
       strip.setPixelColor(139, blue);
       strip.setPixelColor(140, blue);
       strip.setPixelColor(174, blue);
       strip.setPixelColor(175, blue);
       strip.setPixelColor(209, blue);
       strip.setPixelColor(210, blue);
       strip.setPixelColor(244, blue);
       strip.setPixelColor(245, blue);
       strip.setPixelColor(279, blue);
       strip.setPixelColor(280, blue);
       strip.setPixelColor(314, blue);
       strip.setPixelColor(315, blue);
       strip.setPixelColor(349, blue);
       strip.setPixelColor(350, blue);
       strip.setPixelColor(384, blue);
       strip.setPixelColor(385, blue);
       strip.setPixelColor(419, blue);
       strip.setPixelColor(420, blue);
       strip.setPixelColor(454, blue);
       strip.setPixelColor(455, blue);
       strip.setPixelColor(489, blue);
       strip.setPixelColor(490, blue);
       strip.setPixelColor(524, blue);
       strip.show();
       if (breathe == 100 || breathe == 0) change = -change;      // breathe the LED from 0 = off to 100 = fairly bright
       if (breathe == 100 || breathe == 0); delay (100);           // Pause at beginning and end of each breath
       delay(10);

   
  }

    alarmValueTop = digitalRead(alarmPinTop);    // Constantly poll the PIR at the top of the stairs
    //Serial.println(alarmPinTop);
    alarmValueBottom = digitalRead(alarmPinBottom);  // Constantly poll the PIR at the bottom of the stairs
    //Serial.println(alarmPinBottom);
   
    if (alarmValueTop == HIGH && downUp != 2)  {      // the 2nd term allows timeOut to be contantly reset if one lingers at the top of the stairs before decending but will not allow the bottom PIR to reset timeOut as you decend past it.
      timeOut=millis();  // Timestamp when the PIR is triggered.  The LED cycle wil then start.
      downUp = 1;
      //clearStrip();
      topdown();         // lights up the strip from top down
    }

    if (alarmValueBottom == HIGH && downUp != 1)  {    // the 2nd term allows timeOut to be contantly reset if one lingers at the bottom of the stairs before decending but will not allow the top PIR to reset timeOut as you decend past it.
      timeOut=millis();    // Timestamp when the PIR is triggered.  The LED cycle wil then start.
      downUp = 2;
      //clearStrip();
      bottomup();         // lights up the strip from bottom up
    }

    if (timeOut+10000 < millis() && timeOut+15000 < millis()) {    //switch off LED's in the direction of travel.
       if (downUp == 1) {
          colourWipeDown(strip.Color(0, 0, 0), 100); // Off
       }
       if (downUp == 2)  {
        colourWipeUp(strip.Color(0, 0, 0), 100);   // Off
       }
      downUp = 0;
     
    }
           
 

}

void topdown() {
    Serial.println ("detected top");                  // Helpful debug message
    colourWipeDown(strip.Color(255, 255, 250), 25 );  // Warm White
    //for(int i=0; i<3; i++) {                        // Helpful debug indication flashes led on Arduino board twice
      //digitalWrite(ledPin,HIGH);
      //delay(200);
      //digitalWrite(ledPin,LOW);
      //delay(200);
    //}
}



void bottomup() {
    Serial.println ("detected bottom");            // Helpful debug message
    colourWipeUp(strip.Color(255, 255, 250), 25);  // Warm White
    //for(int i=0; i<3; i++) {                     // Helpful debug indication flashes led on Arduino board twice
      //digitalWrite(ledPin,HIGH);
      //delay(200);
      //digitalWrite(ledPin,LOW);
      //delay(200);
    //}
  }

// Fade light each step strip
void colourWipeDown(uint32_t c, uint16_t wait) {

  for (uint16_t j = 0; j < 15; j++){
  int start = strip.numPixels()/15 *j;
  Serial.println(j);
   
        for (uint16_t i = start; i < start + 35; i++){
      strip.setPixelColor(i, c);
        }
         strip.show();
  delay(wait);
  }

}


void clearStrip(){
  for (int l=0; l<strip.numPixels(); l++){
    strip.setPixelColor(l, (0,0,0));
  }
     
}
// Fade light each step strip
void colourWipeUp(uint32_t c, uint16_t wait) {
   for (uint16_t j = 15; j > 0; j--){
   int start = strip.numPixels()/15 *j;
   Serial.println(j);
      //start = start-1;
          for (uint16_t i = start; i > start - 35; i--){
            strip.setPixelColor(i-1, c);
         }
          strip.show();
  delay(wait);
  }

}
 
  • Лойс +1
Реакции: skachati

Dimasssiusis

★✩✩✩✩✩✩
20 Янв 2020
128
49
Добрый день.
при попытке залить скетч выдает ошибку жалуется на библиотеку #include <Ultrasonic.h>
скачать новую "Ultrasonic-3.0.0" и переименовал в "Ultrasonic" скетч загрузился но не работает.

может быть связанно с версией Ultrasonic-3.0.0?
до этого с Ардуино не работал
Скачайте библиотеки, которые я прикрепил к посту и поставьте их, все должно запуститься, а если нет, то вот видео в помощь, с которого я сам взял информацию, как с этими датчиками работать:

Библиотека в менеджере библиотек:1580930620827.png
 
Изменено:

Dimasssiusis

★✩✩✩✩✩✩
20 Янв 2020
128
49
Теоретически можно на одном датчике сделать. А еще лучше переключится на ИК датчик движения(присутствия) тогда проблема отключения отпадает сама собой.
В теории ты ставишь один датчик вверху или внизу а можно и там и там. И если есть срабатывание, точнее, пока хотя бы одно срабатывание есть свет горит иначе не горит.
Пишется это так:
Код:
if ((условие 1)||(условие 2))
{
//лента гори;
}
else
{
//лента не гори;
}
Не очень понимаю разницу в использовании этого датчика и ИК
Этот тоже срабатывает только тогда, когда рядом человек, в чем разница? Прошел первый - свет загорелся, прошел второй - он потух.

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

Dimasssiusis

★✩✩✩✩✩✩
20 Янв 2020
128
49
@Старик Похабыч, жалуеться на 41 строчка " photocellReading = analogRead(photocellPin); // Считывание данных с фоторезистора"

и выдает ошибку



C:\Users\User\Documents\Arduino\sketch_feb04b\sketch_feb04b.ino: In function 'void loop()':

sketch_feb04b:41:3: error: 'photocellReading' was not declared in this scope

photocellReading = analogRead(photocellPin); // Считывание данных с фоторезистора

^~~~~~~~~~~~~~~~

C:\Users\User\Documents\Arduino\sketch_feb04b\sketch_feb04b.ino:41:3: note: suggested alternative: 'photocellPin'

photocellReading = analogRead(photocellPin); // Считывание данных с фоторезистора

^~~~~~~~~~~~~~~~

photocellPin

exit status 1
'photocellReading' was not declared in this scope
Вот код с выключенным фоторезистором, подправьте свои пины и количество светодиодов

C++:
#include <Adafruit_NeoPixel.h>                                              // Подключение библитотек
#include <Ultrasonic.h>                                                       //--

// ===================== Регулируемые настройки ========================================================================================================================
#define PIN         13                                                      // Пин на ардуино для ленты
#define NUMPIXELS   8                                                       // Количество светодиодов

#define trigPin     8                                                       // Пины на первом сенсоре расстояния
#define echoPin     7                                                         //--
#define trigPin_2   10                                                      // Пины на втором сенсоре расстояния
#define echoPin_2   9                                                         //--

#define always      2                                                       // Количество постоянно горящих светодиодов в начале и конце лестницы

#define lightLevel  5                                                       // Уровень освещенности в комнате, при котором система начинает работу (можно протестировать через монитор порта)

int delayVal = 200;                                                         // Время задержки зажигания в милисекундах между каждым светодиодом
int photocellPin = A6;                                                      // Аналоговый вывод, к которому подключены сенсор и понижающий резистор 10 кОм

// ===================== Код программы ================================================================================================================================

Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);             // Инициализация адресной светодиодной ленты

Ultrasonic readDownSensor(trigPin, echoPin);                                // Инициализация сенсора на подъем по лестнице
Ultrasonic readUpSensor(trigPin_2, echoPin_2);                              // Инициализация сенсора на спуск по лестнице

int upSensor = 0;                                                           // Начальное значение расстояния
int downSensor = 0;                                                             //--

int photocellReading;                                                       // Считываем аналоговые значения с делителя сенсора

bool go_up = false;                                                         // Булевы переменные
bool go_down = false;                                                         //--
bool night = false;                                                           //--

void setup() {
  pixels.begin();                                                           // Подготавливаем вывод данных для NeoPixel (НЕОБХОДИМО)
  Serial.begin(9600);                                                       // Указываем порт для монитора порта

  for ( int i = 0; i < always; i++) {                                       // Задаем начальное свечение нижних "дежурных светодиодов"
    pixels.setPixelColor(i, pixels.Color(255, 255, 255));                      //--
    pixels.show();                                                             //--
  }

  for ( int i = NUMPIXELS; i >= NUMPIXELS - always; i--) {                  // Задаем начальное свечение верхних "дежурных светодиодов"
    pixels.setPixelColor(i, pixels.Color(255, 255, 255));                      //--
    pixels.show();                                                             //--
  }
}

void loop() {

  downSensor = readDownSensor.read();                                       // Считывание расстояния с датчиков
  upSensor = readUpSensor.read();                                             //--

//  photocellReading = analogRead(photocellPin);                              // Считывание данных с фоторезистора

//  Serial.print("Analog reading =        ");                                 // Вывод значения с фоторезистора
//  Serial.println(photocellReading);                                            //--

  Serial.print("Distance_of_downSensor in CM:   ");                         // Вывод значений с сенсоров
  Serial.println(readDownSensor.read());                                      //--
  Serial.print("Distance_of_upSensor in CM:     ");                           //--
  Serial.println(readUpSensor.read());                                        //--

  // ===================== Основной код =================================================================================================================================
//  if (photocellReading <= lightLevel) {
    if (upSensor < 20 && !go_up && !go_down ) {
      Serial.println("upSensor is on! Wating for downSensor");
      go_down = true;
      for (int i = NUMPIXELS - 1; i >= 0; i--) {                            // Перебор всех пикселей
        pixels.setPixelColor(i, pixels.Color(255, 255, 255));               // Выбор белого цвета
        pixels.show();                                                      // Включаем светодиод
        delay(delayVal);                                                    // Задержка перед включением следующего светодиода
      }
    }

    if (downSensor < 20 ) {
      if (go_down == true) {
        Serial.println("downSensor is on! Strip is shuting down!");
        for (int i = NUMPIXELS - 1 - always; i >= always; i--) {
          pixels.setPixelColor(i, pixels.Color(0, 0, 0));                   // Выбор черного цвета (то есть светодиод не горит)
          pixels.show();
          delay(delayVal);
        }
        go_down = false;
        delay(2000);
      }
      else {
        Serial.println("downSensor is on! Wating for upSensor");
        go_up = true;
        for (int i = 0; i < NUMPIXELS; i++) {
          pixels.setPixelColor(i, pixels.Color(255, 255, 255));
          pixels.show();
          delay(delayVal);
        }
      }
    }
    if (upSensor < 20 && go_up == true) {
      Serial.println("upSensor is on! Strip is shuting down!");
      for (int i = always; i < NUMPIXELS - always; i++) {
        pixels.setPixelColor(i, pixels.Color(0, 0, 0));
        pixels.show();
        delay(delayVal);
      }
      go_up = false;
    }
//  } else {
//    for (int i = 0; i <= NUMPIXELS; i++) {
//      pixels.setPixelColor(i, pixels.Color(0, 0, 0));
//      pixels.show();
//      delay(delayVal);
//    }
  }
//}
 

Кирюша

✩✩✩✩✩✩✩
14 Янв 2020
11
1
Киев
@Dimasssiusis, Принципиально нет никакой разницы в том какой датчик использовать. Но есть нюансы.
Ультразвук определяет уже по факту прохождения человека мимо датчика, в то время как датчик движения или присутствия определяет наличие человека в зоне работы. Ультразвук меряет расстояние постоянно и у него уходит что то около 100-150 милисекунд на выполнение работы, плюс нужно еще посчитать, сравнить, выполнить какие то действия. Ардуинка будет все это время работать и потреблять ток. Датчик движения опрашивается один раз в какой то промежуток времени и в зависимости от результата код выполняется или не выполняется, после чего все начинается сначала. Несомненно он удобнее. Но работаем с тем что имеем. Дело ваше и я вас понимаю.

Если по логике работы может лучше сделать следующим образом?
C++:
void setup
{
int sens1 = 0;
int sens2 = 0;
int long = 120;
}
/*это для примера какие то переменные для значений показаний датчика. и последняя условно расстояние или время необходимое сигналу на преодоление расстояния от перила до стенки и назад.*/
void loop
{
sens1=digitalRead(1); //предположим это функция эхолокации.
sens2=digitalRead(2); //тут же еще раз зондируем второй датчик.
if (sens1<long || sens2<long)
{
/*Если на любом из датчиков есть препятствие мешающее прохождению сигнала то срабатывает условие и запускает этот участок кода. В свою очередь мы включаем реле ставим задержку и тупо ждем.*/
digitalWrite(3, high); //посылаем на третий пин с релюхой высокий сигнал. он типа замыкает релюху.
delay(99999); //ждем тепловой смерти вселенной и выходим из этой части условия и цикл на этом закончился.
}
else
{
digitalWrite(3, LOW);
/*после того как цикл начался заного у нас человек уже давно ушел. Первое условие не сработало, сработало текущее иначе и выключило реле на котором диодная лента.*/
}
}
 

Seik

✩✩✩✩✩✩✩
15 Май 2020
3
5
вот такой вариант тоже интересный


Посмотреть вложение 9115
C++:
// Edit by Serge Niko June 2015

#include <Adafruit_NeoPixel.h>

#define PIN 6

// Parameter 1 = number of pixels in strip
// Parameter 2 = Arduino pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)

Adafruit_NeoPixel strip = Adafruit_NeoPixel(525, PIN, NEO_GRB + NEO_KHZ800);

// IMPORTANT: To reduce NeoPixel burnout risk, add 1000 uF capacitor across
// pixel power leads, add 300 - 500 Ohm resistor on first pixel's data input
// and minimize distance between Arduino and first pixel.  Avoid connecting
// on a live circuit...if you must, connect GND first.

// Set up Variables
unsigned long timeOut=60000; // timestamp to remember when the PIR was triggered.
int downUp = 0;              // variable to rememer the direction of travel up or down the stairs
int alarmPinTop = 10;        // PIR at the top of the stairs
int alarmPinBottom =11;      // PIR at the bottom of the stairs
int alarmValueTop = LOW;    // Variable to hold the PIR status
int alarmValueBottom = LOW; // Variable to hold the PIR status
int ledPin = 13;           // LED on the arduino board flashes when PIR activated
int LDRSensor = A0;        // Light dependant resistor
int LDRValue = 0;          // Variable to hold the LDR value
int colourArray[350];      // An array to hold RGB values
int change = 1;            // used in 'breathing' the LED's
int breathe = 0;           // used in 'breathing' the LED's


void setup() {
   strip.begin();
   strip.setBrightness(40); //adjust brightness here
   strip.show(); // Initialize all pixels to 'off'
   Serial.begin (9600);  // only requred for debugging
   pinMode(ledPin, OUTPUT);  // initilise the onboard pin 13 LED as an indicator
   pinMode(alarmPinTop, INPUT_PULLUP);     // for PIR at top of stairs initialise the input pin and use the internal restistor
   pinMode(alarmPinBottom, INPUT_PULLUP);  // for PIR at bottom of stairs initialise the input pin and use the internal restistor
   delay (2000); // it takes the sensor 2 seconds to scan the area around it before it can
   //detect infrared presence.

}

void loop() {

    if (timeOut+15700 < millis()) {        // idle state - 'breathe' the top and bottom LED to show program is looping
       uint32_t blue = (0, 0, breathe);
       breathe = breathe + change;
       strip.setPixelColor(0, blue);
       strip.setPixelColor(34, blue);
       strip.setPixelColor(35, blue);
       strip.setPixelColor(69, blue);
       strip.setPixelColor(70, blue);
       strip.setPixelColor(104, blue);
       strip.setPixelColor(105, blue);
       strip.setPixelColor(139, blue);
       strip.setPixelColor(140, blue);
       strip.setPixelColor(174, blue);
       strip.setPixelColor(175, blue);
       strip.setPixelColor(209, blue);
       strip.setPixelColor(210, blue);
       strip.setPixelColor(244, blue);
       strip.setPixelColor(245, blue);
       strip.setPixelColor(279, blue);
       strip.setPixelColor(280, blue);
       strip.setPixelColor(314, blue);
       strip.setPixelColor(315, blue);
       strip.setPixelColor(349, blue);
       strip.setPixelColor(350, blue);
       strip.setPixelColor(384, blue);
       strip.setPixelColor(385, blue);
       strip.setPixelColor(419, blue);
       strip.setPixelColor(420, blue);
       strip.setPixelColor(454, blue);
       strip.setPixelColor(455, blue);
       strip.setPixelColor(489, blue);
       strip.setPixelColor(490, blue);
       strip.setPixelColor(524, blue);
       strip.show();
       if (breathe == 100 || breathe == 0) change = -change;      // breathe the LED from 0 = off to 100 = fairly bright
       if (breathe == 100 || breathe == 0); delay (100);           // Pause at beginning and end of each breath
       delay(10);

  
  }

    alarmValueTop = digitalRead(alarmPinTop);    // Constantly poll the PIR at the top of the stairs
    //Serial.println(alarmPinTop);
    alarmValueBottom = digitalRead(alarmPinBottom);  // Constantly poll the PIR at the bottom of the stairs
    //Serial.println(alarmPinBottom);
  
    if (alarmValueTop == HIGH && downUp != 2)  {      // the 2nd term allows timeOut to be contantly reset if one lingers at the top of the stairs before decending but will not allow the bottom PIR to reset timeOut as you decend past it.
      timeOut=millis();  // Timestamp when the PIR is triggered.  The LED cycle wil then start.
      downUp = 1;
      //clearStrip();
      topdown();         // lights up the strip from top down
    }

    if (alarmValueBottom == HIGH && downUp != 1)  {    // the 2nd term allows timeOut to be contantly reset if one lingers at the bottom of the stairs before decending but will not allow the top PIR to reset timeOut as you decend past it.
      timeOut=millis();    // Timestamp when the PIR is triggered.  The LED cycle wil then start.
      downUp = 2;
      //clearStrip();
      bottomup();         // lights up the strip from bottom up
    }

    if (timeOut+10000 < millis() && timeOut+15000 < millis()) {    //switch off LED's in the direction of travel.
       if (downUp == 1) {
          colourWipeDown(strip.Color(0, 0, 0), 100); // Off
       }
       if (downUp == 2)  {
        colourWipeUp(strip.Color(0, 0, 0), 100);   // Off
       }
      downUp = 0;
    
    }
          


}

void topdown() {
    Serial.println ("detected top");                  // Helpful debug message
    colourWipeDown(strip.Color(255, 255, 250), 25 );  // Warm White
    //for(int i=0; i<3; i++) {                        // Helpful debug indication flashes led on Arduino board twice
      //digitalWrite(ledPin,HIGH);
      //delay(200);
      //digitalWrite(ledPin,LOW);
      //delay(200);
    //}
}



void bottomup() {
    Serial.println ("detected bottom");            // Helpful debug message
    colourWipeUp(strip.Color(255, 255, 250), 25);  // Warm White
    //for(int i=0; i<3; i++) {                     // Helpful debug indication flashes led on Arduino board twice
      //digitalWrite(ledPin,HIGH);
      //delay(200);
      //digitalWrite(ledPin,LOW);
      //delay(200);
    //}
  }

// Fade light each step strip
void colourWipeDown(uint32_t c, uint16_t wait) {

  for (uint16_t j = 0; j < 15; j++){
  int start = strip.numPixels()/15 *j;
  Serial.println(j);
  
        for (uint16_t i = start; i < start + 35; i++){
      strip.setPixelColor(i, c);
        }
         strip.show();
  delay(wait);
  }

}


void clearStrip(){
  for (int l=0; l<strip.numPixels(); l++){
    strip.setPixelColor(l, (0,0,0));
  }
    
}
// Fade light each step strip
void colourWipeUp(uint32_t c, uint16_t wait) {
   for (uint16_t j = 15; j > 0; j--){
   int start = strip.numPixels()/15 *j;
   Serial.println(j);
      //start = start-1;
          for (uint16_t i = start; i > start - 35; i--){
            strip.setPixelColor(i-1, c);
         }
          strip.show();
  delay(wait);
  }

}

Вариант интересный, не подскажите где здесь задается количество ступеней и количество светодиодов на ступень?
Спасибо
 
  • Лойс +1
Реакции: vikn72 и ivang

vanilayz

✩✩✩✩✩✩✩
6 Апр 2020
3
3
Меня вот тоже озадачил друг в связи с постройкой нового дома сегодня решил утром немного свой вариант накидать часть по заимствовал у автора так как тоже начинающий знаю что есть недочеты это просто набросок проверенный на Uno

яркость снизил так как лента в катушке 5 метров греется исправил 255 на 50 единственный у меня вопрос остался прохода следующего человека до гашения ленты и лента горит по задержке без пересечения второго датчика
 

Вложения

  • Лойс +1
Реакции: Dimasssiusis

Dimasssiusis

★✩✩✩✩✩✩
20 Янв 2020
128
49
Меня вот тоже озадачил друг в связи с постройкой нового дома сегодня решил утром немного свой вариант накидать часть по заимствовал у автора так как тоже начинающий знаю что есть недочеты это просто набросок проверенный на Uno
Круто! Но я уже забросил проект, почему-то
Надо бы его доделать, в идеале сделать датчики инфракрасные, а то эти очень не стабильно работают
Плюс уже опыта работы с ардуиной гораздо больше, можно написать код лучше, но я с головой ушел в разработку часов на ГРИ, возможно когда нибудь доведу до ума лестницу, а то она никуда не исчезла))
 

vikn72

✩✩✩✩✩✩✩
31 Июл 2018
26
6
Вариант интересный, не подскажите где здесь задается количество ступеней и количество светодиодов на ступень?
Спасибо
(меня тоже этот вопрос озадачил, я тоже не нашол количество ступеней,) там получается вся лента постепенно должна загореться и также потухнуть , там получается нет никаких эффектов переливания радуги или смены цвета, помогите добавить смену цвета через кнопку или в случайном порядке в виде радуги
 
Изменено:

Dimasssiusis

★✩✩✩✩✩✩
20 Янв 2020
128
49
(меня тоже этот вопрос озадачил, я тоже не нашол количество ступеней,) там получается вся лента постепенно должна загореться и также потухнуть , там получается нет никаких эффектов переливания радуги или смены цвета, помогите добавить смену цвета через кнопку или в случайном порядке в виде радуги
Там, по моему, просто количество светодиодов указано, я не помню уже
И да, цвет один

Товарищи, гораздо легче взять за основу проект гайвера по ступенькам и переделать под такой вид, там не сложно

А мой код, что тут, написан не на FastLED, а на Neopixel, что было большой ошибкой, все надо перенести на FastLed
Может займусь этим, просто нет в доступности ни ленты, ни датчиков

А датчики надо заменить на инфракрасные как у Гайвера по любому, ибо этот, что я использовал, совсем не подходит и постоянно дает ложные или неверные показания

В общем сейчас опыта в программировании на ардуино поднабрался и видно все ошибки и какие глупости были сделаны