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

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

  1. megaice

    megaice Нуб

    Просто я в программировании новичок :( Попробую разобраться с кодом:)
     
  2. ИгорьК

    ИгорьК Гуру

    Вот в таком состоянии я и начинал этот проект :) По этому первоисточнику он у меня не скомпилировался, но я решил, что я его все равно сделаю.
     
  3. megaice

    megaice Нуб

    В таком случае мне до Вашего уровня новичка еще пилить и пилить;)
     
  4. megaice

    megaice Нуб

    Игорь, не могли бы вы помочь разобраться с кодом. Второй день копаюсь, никак не могу разобрать.
    Мною выявлены пару непонятных моментов:
    1. Использую датчики HC-sr04. Когда в коде выставляю расстояние на срабатывание датчиков больше 40 см. диоды загораются но не потухают. Подумал что друг друга цепляют. Удлинил один датчик на три метра, он стал периодически срабатывать произвольно, затем также после включения не выключаются диоды, а если выключаются то сбивается программа отключения. Диоды начинают очень медленно потухать, каждый секунд по 4-5 и интервал между ними секунд 3.
    2. Никак не могу настроить датчик освещения. Он все время в режиме ночь. Когда в коде выставляю больше 1020 то диоды потухают, и в темноте не загораются. Пробовал уменьшать значение, ничего не меняется. Датчик как по схеме подключен между выходом А0 и +
    Заметил один момент. Когда отключаешь датчик из схемы, диоды потухают. Когда подносишь палец к проводу подключенному к контакту А0 диоды начинают мерцать и загораются.

    Уже весь мозг себе вынес, не пойму в чем дело))
    Спасибо.
     
  5. megaice

    megaice Нуб

    Перечитал всю тему. С сенсорами разобрался. А вот с датчиком освещенности непонятно.
     
  6. ИгорьК

    ИгорьК Гуру

    А надо ведь так. В датчике еще и минус есть.
     
  7. megaice

    megaice Нуб

    Да, но у меня датчик двух-контактный. Разобрался с датчиком, нашел схему в сети.
    Спасибо!
     
  8. Firesprite

    Firesprite Нуб

    собрал по инструкции, все работает, но как и у предыдущего участника у меня проблемы с датчиками приближения (HC-sr04), испотрошил тему ответа так и не нашел. Проблема заключается в том, что если сделать провод идущий к ECHO длиннее чем метр, он начинает срабатывать сам по себе, даже без подключения к датчику. Пробовал экранировать, не помогает. Можно грешить на сам датчик, но срабатывание происходит и без него. Куда копать, помогите плиаз....
     
  9. ИгорьК

    ИгорьК Гуру

    Без паники! У всех в конце концов работает. ;)
    (1.) Сам датчик, (2.) блок питания, (3.) наводки, (4.) контакты.
     
  10. Firesprite

    Firesprite Нуб

    Датчик вряд ли, так как срабатывет и без него, может и блок питания. Использую китайский в металлическом корпусе. Может нужно его фильтровать дополнительно емкостью?
     

    Вложения:

  11. ИгорьК

    ИгорьК Гуру

    Пробуйте! Вы уже смотнировали? То есть бредит смонтированная подсветка?
    Если происходит срабатывание на отсутствующем датчике - это наводки. Первый генератор наводок - блок питания.
    Напомню, что я для верхнего датчика так и не смог избавиться от наводок при включенной подсветке, поэтому у меня верхняя супенька в темноте не подсвечивается.
     
  12. Firesprite

    Firesprite Нуб

    В том то и дело, на столе все работало как надо,а в смонтированном виде начинает глючить. Буду пробовать заменять Блок питания для начала или фильтровать.
     
  13. Firesprite

    Firesprite Нуб

    кто какие блоки питания использует для питания в данном проекте? Ибо я думал что выбрал самы распространенный вариант.
     
  14. Firesprite

    Firesprite Нуб

    кстати, я использую для коммутации ULN2003AN, может еще в этом дело, ну и плюс надо фильтровать питание ферритовыми кольцами, дросселями и кондерами от импульсников.
     
  15. Firesprite

    Firesprite Нуб

    нашел одну из причин - подгорела вот эта деталь http://take.ms/4ManX и как узнать, что это было? Дроссель или кондер?
    Плата работает, но постоянно срабатывает судя по всему из за наводок даже без обвеса, то есть без подключений датчиков и всех остальных компонентов.
     
  16. Firesprite

    Firesprite Нуб

    на правах одинокого сумасшедшего этой ветки продолжу...
    Заменил дроссель на аналогичный (вроде бы как в соседней ветке говорят, что он особо ни на что не влияет).

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

    Код (Text):
    // Скетч для датчика hc-sr04 и ArduinoMega 2560 - у нее 15 PWM ног.
    #define sensorPin A0                    // Нога для фоторезистора включается в A0 http://goo.gl/9gupvj;
    #define ledNight 24                        // Нога для LED - показывает включение ночного режима;
    unsigned int sensorValue = 0;            // Переменная для снятия показаний сенсора освещенности;
    boolean night = 1;                        // Если 1 - то ночь;
    byte OutPins[15] = {2,3,4,5,6,7,8,9,10,11,12,13,44,45,46}; // Массив 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 = 650;            // Референсное значение сенсора освещенности, выше которого считается ночь;
    #define timer 100                        // 100 Таймер для задержек при включении/выключении последовательности ступенек;
    #define SwitchOffDelay 1000            // 15000 Задержка выключения посветки, милисекунды (здесь 15 секунд) ;
    #define SwitchOnBright 200                // Яркость включенных ступенек, максимально - 255;
    #define NightBright  20                    // Яркость подсвеченных ступенек в ночном режиме (первая, последняя);
    //int timeForBlink = 100;                    // Число циклов мерцания включенной подсветки;
    #define bottomDistance 15              // Расстояние в см для срабатывания нижнего ультрасоника
    #define topDistance 15                    // Расстояние в см для срабатывания верхнего ультрасоника
    #define smoothSwitchDelayStep 1          // Скорость нарастания яркости ступеньки мс., чем меньше тем быстрее нарастает;
    //*******************************************************************************************************************
    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(1);
            if(Distance < bottomDistance) {    // Проверка дистанции для нижнего ультрасоника;
                SwitchOnSmoothly(0);        // Включаем подсветку снизу вверх;
            }

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

            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;                            // Счетчики превышения сенсора над референсным значанием и значением минус гистерезис
    int brightness;
        digitalWrite(LedUltra, HIGH);
        for(i = 0; i < 50; i++) {
            sensorValue = analogRead(sensorPin);            // Чтение показаний датчика;
            if (sensorValue < sensorRef) a++;                // Увеличиваем а, если темнее референсного значения;
            if (sensorValue <  (sensorRef - 3)) b++;        // Увеличиваем b, если темнее чем референсное значение минус допуск на гистерезис;
        }

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

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

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

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

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

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

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

            for (i=15; i>=0; i--) {
                for (brightness = SwitchOnBright; brightness >= 0; brightness--) {
                    analogWrite(OutPins[i], brightness);
                    delay(smoothSwitchDelayStep);
                }
            }
        }
       
    for (brightness = 0; brightness < NightBright; brightness++) {
                    analogWrite(2, brightness);
                   
                    delay(15);
                }
    for (brightness = 0; brightness < NightBright; brightness++) {
                    analogWrite(46,brightness);
                   
                    delay(15);
                }        
                // Включим первую и последнюю ступеньки.


    }
     
  17. Firesprite

    Firesprite Нуб

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

    ИгорьК Гуру

    Без подключенных датчиков осуществляется опрос линии, которая висит в воздухе - в неопределенном состоянии. Может быть что угодно.
     
  19. Firesprite

    Firesprite Нуб

    в общем была проблема в умерших ультрасониках. Поменял и все работает как надо теперь. ИгорьК, отдельная благодарность за советы
     
  20. kruzhnoff

    kruzhnoff Нуб

    ИгорьК
    Здравствуйте Игорь. Я к сожалению поздно увидел Вашу тему с подсветкой лестницы и пошол по более сложному пути госпадина Лукьянова. Единственное только, я добавил на выходе схемы полевые транзисторные сборки irf7314 для увеличения мощности. Улучшить схему Лукьянова в плане железа получилось, а вот в програмировании я полный профан. А хотелось бы добавить плавное включение ступений, бегущую тень во время работы всей подсветки и подсветку первой и последней ступеньки в ночное время. Т.е. все то что вы реализовали в своём проекте. Не могли бы Вы помочь с решением этой задачи? И вообже возможно ли эти световые эфекты применить в схеме г. Лукьянова?