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

Тема в разделе "Глядите, что я сделал", создана пользователем ИгорьК, 19 сен 2013.

  1. ИгорьК

    ИгорьК Гуру

    Хорошо, сделаю, но дня через два. Я пока на смартфоне.
     
    Slaiterx нравится это.
  2. Saniok

    Saniok Нерд

    Огромное спасибо вам за помощь
     
  3. ИгорьК

    ИгорьК Гуру

    А Вы пока займитесь вот чем. ИК датчики работают следующим образом: в нормальном состоянии у них на выходе ноль, при срабатывании - единица. Для ваших условий это будет ещё больше ошибок чем с УЗ.
    Разберитесь как электрически сделать так, чтобы все было наоборот: нет движения - единица, есть движение - ноль.
     
    Ivanenkoav нравится это.
  4. Saniok

    Saniok Нерд

    Единственное что приходит в голову это поставить реле с NC контактом, но тогда минус тот, что она при каждом срабатывании будет щелкать. Еще вариант - поставить еще одну ардуинку мини или микро чтоб она тихо занималась конвертацией сигнала.
    Наверно есть и более легкий способ думаю, надо погуглить.
     
  5. ИгорьК

    ИгорьК Гуру

    Вот скетч для PIR датчиков. Эти датчики должны выдавать в нормальном состоянии 1, а при срабатывании - 0. Иначе их применение в условиях сильных помех смысла не имеет.
    Скетч я не проверял на макетке, поэтому возможны ошибки.
     

    Вложения:

    Limoney нравится это.
  6. sergey_dp

    sergey_dp Нуб

    попробуйте другие датчики у меня работают только те у которых название "HC_SR04" возле кварца, а не по центру и микросхема "MAX3232" затерта без надписи.
    IMG_20160308_090325.jpg IMG_20160308_090340.jpg
    PS. И кстати и те что нормальные их не слышно , а плохие издают треск.
     
    Последнее редактирование: 8 мар 2016
  7. ИгорьК

    ИгорьК Гуру

    У меня потому и SEN-136, что их не подделывают все подряд.
     
  8. Saniok

    Saniok Нерд

    Спасибо за скеч, проверить смогу в воскресенье, сейчас в командировке. Попробую отпишусь.
     
  9. ИгорьК

    ИгорьК Гуру

    Как инвертировать выход разобрались?
     
  10. Slaiterx

    Slaiterx Гик

    а если сделать выключение подсветки после срабатывания противоположного датчика тогда время свечения не ограничено 15 секундами
     
  11. ИгорьК

    ИгорьК Гуру

    Но бывает, что в этот момент кто-то идёт с другой стороны.
     
  12. Slaiterx

    Slaiterx Гик

    это я не подумал
     
  13. Slaiterx

    Slaiterx Гик

    тоже собрался себе сделать у меня 12 ступенек что нужно заказать для этого только датчиков как у вас не нашол че-то на али экспрес
     
  14. ИгорьК

    ИгорьК Гуру

    Можно и такой. Под него здесь весь последний код.
    SEN136 он дорог и не факт что надёжнее ширпотребовских.
     
    Последнее редактирование: 13 мар 2016
  15. Slaiterx

    Slaiterx Гик

    ардуину мега и сборку дарлингтона
    ULN2003AN такую ну и блок питания и спасибо за подсказки
     
  16. Slaiterx

    Slaiterx Гик

    не тыкните носом в скетч где подправить чтобы 12 ступенек сделать с датчиком HC-SR04
     
  17. ИгорьК

    ИгорьК Гуру

    Проще написать, чем объяснять.
    Код (C++):
    // Скетч для датчика hc-sr04 и ArduinoMega 2560 - у нее 15 PWM ног.
    #define sensorPin A0                    // Нога для фоторезистора включается в A0 http://goo.gl/9gupvj;
    #define ledNight 24                        // Нога для LED - показывает включение ночного режима;
    unsigned int sensorValue = 0;            // Переменная для снятия показаний сенсора освещенности;
    boolean night = 0;                        // Если 1 - то ночь;
    byte OutPins[12] = {2,3,4,5,6,7,8,9,10,11,12,13}; // Массив PWM ног, сюда включаются входы http://goo.gl/ZM3xCw;
    int i;                                    // Счетчик для зажигания и тушения диодов, определения день/ночь;
    #define pingPin00 30                    // SEN00 - нижний ультрасоник, PWM Выход на ноге 30;
    #define trigPin00 31                    // сюда присоединяем тригерную ногу нижнего ультрасоника;
    #define pingPin01 32                    // SEN01 - верхний ультрасоник, PWM Выход на ноге 32;
    #define trigPin01 33                    // сюда присоединяем тригерную ногу верхнего ультрасоника;
    #define LedUltra 25                        // Нога светодиода - в ночном режиме показывает что любой ультрасоник схватил дистанцию, в дневном режиме просто светится;
    unsigned int Distance=0;                // Дистанция с ультрасоника;

    //************************* Все что ниже - определить самостоятельно ************************************************
    unsigned int sensorRef = 1010;            // Референсное значение сенсора освещенности, выше которого считается ночь;
    #define timer 20                        // Таймер для задержек при включении/выключении последовательности ступенек;
    #define SwitchOffDelay 15000            // Задержка выключения посветки, милисекунды (здесь 15 секунд) ;
    #define SwitchOnBright 180                // Яркость включенных ступенек, максимально - 255;
    #define NightBright  80                    // Яркость подсвеченных ступенек в ночном режиме (первая, последняя);
    //int timeForBlink = 100;                    // Число циклов мерцания включенной подсветки;
    #define bottomDistance 140                // Расстояние в см для срабатывания нижнего ультрасоника
    #define topDistance 55                    // Расстояние в см для срабатывания верхнего ультрасоника
    #define smoothSwitchDelayStep 3            // Скорость нарастания яркости ступеньки мс., чем меньше тем быстрее нарастает;
    //*******************************************************************************************************************
    void setup() {
      //Serial.begin(9600);
      pinMode(ledNight, OUTPUT);            // Ночной диод  ;
      pinMode(LedUltra, OUTPUT);            // Диод, индикатор "день" а ночью - чтобы видно было как действует ультрасоник;
      digitalWrite(LedUltra,LOW);
      pinMode(trigPin00,OUTPUT);
      pinMode(trigPin01,OUTPUT);
      pinMode(pingPin00,INPUT);
      pinMode(pingPin01,INPUT);

      for(i=0; i<15; i++) {                    // Режим работы PWM ног - выход;
        pinMode(OutPins[i], OUTPUT);
      }
    }

    //===================================================================================================================
    void loop() {
        NightIn();                            // Получаем данные День/Ночь;
        //Serial.print(night);
        //Serial.print(" - boolean night");
        //Serial.println();

        if(1 == night) {                    // Если ночь;
            getDistance(trigPin00, pingPin00);            // Опрашиваем нижний ультрасоник;
            //Serial.print(Distance);
            //Serial.print(" - First Distance");
            //Serial.println();
            //delay(1000);
            if(Distance < bottomDistance) {    // Проверка дистанции для нижнего ультрасоника;
                SwitchOnSmoothly(0);        // Включаем подсветку снизу вверх;
            }

            getDistance(trigPin01, pingPin01);            // Опрашиваем верхний ультрасоник;
            //Serial.print(Distance);
            //Serial.print(" - Second Distance");
            //Serial.println();
            //delay(1000);

            if(Distance < topDistance) {    // Проверка дистанции для верхнего ультрасоника;
                SwitchOnSmoothly(1);        // Включаем подсветку сверху вниз;
            }
      }
    }
    //===========================================================================================
    unsigned int getDistance(byte trig, byte ping) {// Чтение ультрасоника - получение дистанции;
        unsigned int duration = 0;
        digitalWrite(trig, LOW);
        delayMicroseconds(2);
        digitalWrite(trig, HIGH);
        delayMicroseconds(10);
        digitalWrite(trig, LOW);
        duration = pulseIn(ping,HIGH);
        Distance = duration/29/2;

        return Distance;
    }
    //===========================================================================================
    boolean NightIn() {                                        // Чтение день или ночь;
        sensorValue = 0;
        unsigned int a = 0, b = 0;                            // Счетчики превышения сенсора над референсным значанием и значением минус гистерезис

        for(i = 0; i < 50; i++) {
            sensorValue = analogRead(sensorPin);            // Чтение показаний датчика;
            if (sensorValue > sensorRef) a++;                // Увеличиваем а, если темнее референсного значения;
            if (sensorValue > (sensorRef - 25)) b++;        // Увеличиваем b, если темнее чем референсное значение минус допуск на гистерезис;
        }

        if ((night == 0) && (a > 49)) {                        // Если сейчас режим день и 50 раз значение датчика оказалось выше референсного,
                                                            // то переключаемся в ночной режим, включаем дежурную подсветку ступенек.
            digitalWrite(ledNight, HIGH);
            digitalWrite(LedUltra, LOW);
            analogWrite(2,20);
            analogWrite(13,20);
            night = 1;
        }

        if ((night == 1) && (b == 0)) {                        // Если сейчас режим ночь, и 50 раз значение датчика оказалось ниже референсного за
                                                            // вычетом запаса на гистерезис - включаем режим "день", гасим подсветку ступенек.
            digitalWrite(ledNight, LOW);
            digitalWrite(LedUltra, HIGH);
            analogWrite(2,0);
            analogWrite(13,0);
            night = 0;
        }

        return night;
    }
    //===========================================================================================
    //void blink (int timeForBlink) {                            // Мерцание во время задержки
    //   unsigned char brightness = 0;
    //    for (int a = 0; a < timeForBlink; a++) {            // Цикл определяет длительность мерцания;
    //       for(i = 1; i < 12; i++) {                        // Мерцаем диодами;
    //           brightness = random((SwitchOnBright-25), SwitchOnBright);
    //           analogWrite(OutPins[i], brightness);
    //           delay(2);                                    // Маленькая задержка;
    //       }
    //    }

    //   for(i = 1; i < 12; i++) {                            // Восстанавливаем свечение лестницы;
    //       analogWrite(OutPins[i], SwitchOnBright);
    //    }
    //   return;
    //}
    //===========================================================================================
    void SwitchOnSmoothly(bool direction) {                    // Включаем/выключаем в указанном направлении ;
        int brightness;
        digitalWrite(LedUltra, HIGH);

        if (!direction) {
            for (i=0; i<12; i++) {
                for (brightness = 0; brightness < SwitchOnBright; brightness++) {
                    analogWrite(OutPins[i], brightness);
                    delay(smoothSwitchDelayStep);
                }
            }
            delay(SwitchOffDelay);
            //blink (timeForBlink);                            // Померцаем;

            for (i=0; i<12; i++) {
                for (brightness = SwitchOnBright; brightness >= 0; brightness--) {
                    analogWrite(OutPins[i], brightness);
                    delay(smoothSwitchDelayStep);
                }
            }

        }
        else {
            for (i=12; i>=0; i--) {
                for (brightness = 0; brightness < SwitchOnBright; brightness++) {
                    analogWrite(OutPins[i], brightness);
                    delay(smoothSwitchDelayStep);
                }
            }
            delay(SwitchOffDelay);
            //blink (timeForBlink);                            // Померцаем;

            for (i=12; i>=0; i--) {
                for (brightness = SwitchOnBright; brightness >= 0; brightness--) {
                    analogWrite(OutPins[i], brightness);
                    delay(smoothSwitchDelayStep);
                }
            }
        }

    analogWrite(2,NightBright); // Включим первую и последнюю ступеньки.
    analogWrite(13,NightBright);

    }
     
    Последнее редактирование: 13 мар 2016
    Limoney нравится это.
  18. Slaiterx

    Slaiterx Гик

    46 надо везде переправить на 13
    analogWrite(46,NightBright); здесь тоже
     
  19. Slaiterx

    Slaiterx Гик

    if((night ==0)&&(a >49)){ // Если сейчас режим день и 50 раз значение датчика оказалось выше референсного,
    // то переключаемся в ночной режим, включаем дежурную подсветку ступенек.
    digitalWrite(ledNight, HIGH);
    digitalWrite(LedUltra, LOW);
    analogWrite(2,20);
    analogWrite(46,20);и здесь или нет
    night =1;
    }

    if((night ==1)&&(b ==0)){ // Если сейчас режим ночь, и 50 раз значение датчика оказалось ниже референсного за
    // вычетом запаса на гистерезис - включаем режим "день", гасим подсветку ступенек.
    digitalWrite(ledNight, LOW);
    digitalWrite(LedUltra, HIGH);
    analogWrite(2,0);
    analogWrite(46,0);и здесь или нет
    night =0;
    }

    return night;
    просто хочется самому понять хоть маленько а то это у меня первый проект
     
    Последнее редактирование: 13 мар 2016
  20. ИгорьК

    ИгорьК Гуру

    Ну да. У меня это тоже был первый проект. Разбирайтесь. Так, без проверки на плате можно что-то и забыть.