Подсветим... ночной путь: подсветка кровати.

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

Метки:
  1. ИгорьК

    ИгорьК Победитель модулей

    Тривиальный скетч. Простая идея. Немало пользы в вопросах сохранности носа и коленок.
    Состоит из:
    Arduino Nano, или UNO (что одно и то же, кроме размеров), или Iskra .
    2 х Инфракрасный датчик движения
    Датчик освещённости
    Транзистор полевой MOSFET IRL540 , резистор 100 к, резистор 100 ом.
    Кусок светодиодной ленты
    Разъемы, провода
    Блок питания на 12 вольт​

    Drawing 1.png
    Паяем Nano, вставляем в распределительную коробку для деревянных домов:
    IMG_20141122_211220.jpg
    Делаем коробочки для сенсоров, красим, вставляем сенсоры:

    IMG_20141123_154913.jpg

    IMG_20141123_155344.jpg

    Ленту, провода приклеиваем. Лента самоклейка, провода и сенсоры - на 3М автомобильный скотч:
    IMG_20141123_154235.jpg

    Монтируем управление и датчик света. Клеим на тот-же автомобильный скотч:
    IMG_20141123_153442.jpg

    Получаем темно и не страшно.
    Только опускаешь ноги с кровати, или заходишь в темную комнату, а тут раз - и контуры лежбища обозначены...

    IMG_20141122_212608.jpg

    И быдлокод для всего этого.
     

    Вложения:

    • Bed002001.zip
      Размер файла:
      1,1 КБ
      Просмотров:
      422
    Последнее редактирование: 18 июл 2017
    CYITEP_BAC9I, Igor68, sys и 7 другим нравится это.
  2. эдик

    эдик Нерд

    Здравствуйте! подскажите распиновку? пожалуйста.
     
  3. ИгорьК

    ИгорьК Победитель модулей

    Вот:
    Код (C):
    #define PIN_MOTION01 3                    // Ноги для ИК датчиков
    #define PIN_MOTION02 4

    #define PIN_NIGHT A0                    // Нога для сенсора освещенности
    #define PIN_PWM 6                        // Сюда вешаем MOSFET
    #define TIME_DELAY_LIGHT 15000            // Задержка включения подсветки
    #define SENSOR_NIGHT 10                    // Если ниже - то ночь;
    #define LIGHT_NIGHT 35                    // Яркость свечения ленты
    #define DELAY_TO_NEXT_LIGHT 30            // Плавность изменения света
    А0 - сенсор освещенности
    6 - выход на ленту
    3 и 4 ноги - два сенсора движения.
     
  4. acos

    acos Официальный гик Команда форума

    Класс! Это та самая знаменитая светящаяся кровать!
     
  5. ИгорьК

    ИгорьК Победитель модулей

    Знаменитая? :)
     
    Последнее редактирование: 3 июн 2015
  6. эдик

    эдик Нерд

    а зачем 2 сенсора движения?
     
  7. ИгорьК

    ИгорьК Победитель модулей

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

    эдик Нерд

    ясно! спасибо за распиновку и вообще. а не пробовали на дальнометре сделать? мне кажется он лучше в этом плане!?
     
  9. ИгорьК

    ИгорьК Победитель модулей

    Хуже. И гораздо хуже. Потому что капризный, ломучий, иногда свистит (ночью - здорово, да? :) ) и имеет гораздо меньший угол обзора. Поэтому даже не пробовал.
    Но сделать в принципе можно.
     
  10. эдик

    эдик Нерд

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

    ИгорьК Победитель модулей

    С радостью, но не могу. Занят.
    Но здесь много народа всегда готовы помочь. Реально. Создайте новую тему и Вам наверняка помогут. Это очень простой проект. Наверно самый простой из всех возможных.
     
  12. эдик

    эдик Нерд

    Но всё равно спасибо за помощь вашу систему поставлю сыновьям под кровати ато ночью бояться вставать)
     
    ИгорьК нравится это.
  13. ИгорьК

    ИгорьК Победитель модулей

    Тогда картинка в помощь.
    bedlight22.jpg
     
    Последнее редактирование: 18 июл 2017
    Sparkfire, Henc и эдик нравится это.
  14. Kotofey

    Kotofey Нуб

    Здравствуйте.Скопировал этот проект,правда для кухни.Но вот незадача,у меня другой датчик освещения и он выдает значения 1023-темно, 38 светло(смотрел в мониторе порта).Как задать условие "если выше- то ночь"?
     
  15. Tomasina

    Tomasina Иномирянин

    Код (C++):
    value = 1024 - analogRead(A0);
    if (value > 300 && digitalRead(8) == HIGH)
    {
      digitalWrite(13, HIGH);
      delay(30000);
      digitalWrite(13, LOW);
    }
     
    sergey sk нравится это.
  16. alp69

    alp69 Гик

    Я такое соорудил для передвижения в коридоре квартиры. Светодиодная лента будет уложена в планку промышленного изготовления, которая, в свою очередь, смонтирована вместо пластины, закрывающей встроенный в плинтус кабель-канал. Планка куплена, но все нет возможности отпилить нужный размер. Разница по сравнению с изделием ИгоряК в том, что у меня:
    1. не два, а один сенсор,
    2. для контроля освещенности используется не фоторезистор, а модуль освещенности на компараторе LM393,
    3. на затвор полевика резисторы не вешал (он у меня "голый" стоит ))).
    4. как у PIR-сенсора, так и у модуля освещенности мониторится только два состояния (используются как цифровые).
    Кроме того - добавил функцию "энергосбережения" ))) Если при сработавшей подсветке включить свет - она погаснет.
    Одно но - помогите оптимизировать код после коммента
    ====Если подсветка включена и внезапно стало светло - гасим подсветку======
    - там дважды прописана функция (? правильный термин?) плавного гашения. Употребляется она при гашении по истечении времени задержки в отсутствие движения и при "досрочном" гашении подсветки при включении света. Если это дело оптимизировать - код получится короче ;)
    Пробовал Go to использовать - не вышло. Пробовал в void SwichOf() один раз расписать и в viod loop() использовать - не получилось.
    Очевидно знаний не хватает.
    Код (C++):
    /*
    Подсветка плинтуса в помещении
    Основное тело кода взято отсюда http://zelectro.cc/PIR_sensor , что в свою очередь,
    похоже, утянуто из http://playground.arduino.cc/Code/PIRsense.
    Добавлен контроль освещенности помещения и "энергосберегающая" функция
    гашения подсветки при внезапном включении света в помещении и отсутствие реакции
    при включенном свете.
    Железо:
    Источник питания DC 12V (мощность - в зависимости от нагрузки)
    Arduino Nano V.3
    PIR сенсор типа HC-SR501
    Сенсор освещенности на компараторе LM393
    Полевой MOSFET транзистор IRF530 с N-каналом
    Светодиодная лента
    Провода, разъемы, расходники.
    */


    int calibrationTime = 15;        //Время калибровки PIR-сенсора (10-60 сек. по даташиту)
    long unsigned int lowIn;         //Время, в которое был принят сигнал отсутствия движения(LOW)
    long unsigned int pause = 5000;  //Пауза, после которой движение считается оконченным и подсветка горит "по инерции"
    boolean lockLow = true;          //Флаг обнаружения движения (false-движение есть, true-движения нет)
    boolean takeLowTime;             //Флаг необходимости запомнить время начала отсутствия движения
    int pirPin = 2;                  //вывод подключения PIR-сенсора
    int ledPin = 13;                 //вывод сигнального диода на Нане
    int podsvetkaPin = 3;            //вывод подключения светодиодов подсветки (входа ULN2003A)
    int light_senPin = 4;            //вывод подключения датчика освещенности

    void setup()
    {
    pinMode(light_senPin, INPUT);
    pinMode(pirPin, INPUT);
    pinMode(ledPin, OUTPUT);
    pinMode(podsvetkaPin, OUTPUT);

    for(int i = 0; i < calibrationTime; i++) //время на калибровку PIR-сенсора
      {
      i % 2 ? digitalWrite(ledPin, HIGH) : digitalWrite(ledPin, LOW); //Во время калибровки будет мигать сигнальный диод (13-й пин)
      delay(100);
      }
    digitalWrite(ledPin, HIGH);    //По окончанию калибровки зажжем сигнальный диод
    delay(50);
    }

    void loop()
    {
    if(digitalRead(pirPin) == HIGH)    //Если обнаружено движение
      {
      if(lockLow)    //Если до этого момента еще не включена подсветка
        {
        if(digitalRead(light_senPin) == HIGH)    //Если датчик освещенности выдает "темно"
          {
          lockLow = false;    //Плавно включаем подсветку
          for (int s=0; s <= 255; s++)
            {
            analogWrite(podsvetkaPin, s);
            delay(7); // Скорость нарастания яркости (5 миллисекунд * 255=1,785 сек.)
            }
          }
        }
          takeLowTime = true;  // Запоминаем время отсутствия движения
      }
    //=====================================================================================
    //============Если подсветка включена и внезапно стало светло - гасим подсветку================
    //=====================================================================================
    if(digitalRead(light_senPin) == LOW) //Если датчик освещенности выдает "светло"
      {
      if(!lockLow) //Если включена подсветка
        {
        lockLow = true; //Плавно гасим подсветку
        for (int f=255; f >= 0; f--)
          {
          analogWrite(podsvetkaPin, f);
          delay(3);    // Скорость убывания яркости (3 миллисекунд * 255=0,765 сек.)
          }
        }
      }
    //=====================================================================================================
    if(digitalRead(pirPin) == LOW) //Если движения нет
      {
      if(takeLowTime)        //Если время окончания движения еще не записано
        {
        lowIn = millis();      //Сохраним время окончания движения
        takeLowTime = false;   //Изменим значения флага, чтобы больше не брать время, пока не будет нового движения
        }
          if(!lockLow && millis() - lowIn > pause)    //Если время без движение превышает паузу => движение окончено
            {
            lockLow = true; //Плавно гасим подсветку
            for (int f=255; f >= 0; f--)
              {
              analogWrite(podsvetkaPin, f);
              delay(3);    // Скорость убывания яркости (3 миллисекунд * 255=0,765 сек.)
              }
            }
      }
    }
    Если что не так, или возникнут пожелания пожурить или похвалить - welcome!!!
    Это мой первый осмысленно реализованный проект на Ардуино. К тому же внедренный в жизнь.
    Прошу высказываться. В том числе по кривизне кода.

    P.S. Кстати, а в самом деле - зачем на затворе делитель?
     
    Последнее редактирование: 7 окт 2015
    эдик и ИгорьК нравится это.
  17. alp69

    alp69 Гик

    ИгорьК, не могли бы Вы вкратце пояснить алгоритм своего кода?
    И еще - на схеме коммутации на Nano земля не заведена.
     
  18. ИгорьК

    ИгорьК Победитель модулей

    Ну да. Землю исправил.
    Код простейший. Он писался именно под подсветку кровати, когда датчик света стоит в непосредственной близости от подсветки. В этом случае проверять освещенность в момент, когда включена подсветка - бесполезно. Там светло и включенная подсветка немедленно заставит устройство считать что сейчас день.
    Если в вашей ситуации есть возможность отличить верхний свет или дневной от подстветки, то мой алгоритм не подойдет.
     
    Последнее редактирование: 8 окт 2015
  19. ИгорьК

    ИгорьК Победитель модулей

    Понятный код. Ну, подумаешь, дважды одна функция, считайте что она inline :)
    Если будете дальше заниматься МК - попробуйте сделать эту функцию отдельно и вызывать ее в необходимом месте.
    А можете сделать универсальную функцию - вызываете ее с параметром, например, 0 или 1 - и она уже будет либо включать либо выключать. Но нужно ли это?
    Главное - работает! Радует Вас и ваших домашних. Отлично!

    Делитель на затворе - притягиает его к земле и ограничивает ток ноги МК от возможных превышений вследствие каких-то непредвиденных обстоятельств. Так, кажется, правильно, но можно обходиться и без этого.
     
    alp69 нравится это.
  20. ИгорьК

    ИгорьК Победитель модулей

    Вот код для датчика, который с наступлением темноты увеличивает показания.
    За одно и добавил пояснения в коде.
    Код (C++):
    #include <Arduino.h>
    #include <stdint.h>

    #define PIN_MOTION01 3                    // Ноги для ИК датчиков
    #define PIN_MOTION02 4

    #define PIN_NIGHT A0                    // Нога для сенсора освещенности
    #define PIN_PWM 6                        // Сюда вешаем MOSFET
    #define TIME_DELAY_LIGHT 15000            // Задержка включения подсветки
    #define SENSOR_NIGHT 1000                    // Если выше - то ночь;
    #define LIGHT_NIGHT 35                    // Яркость свечения ленты
    #define DELAY_TO_NEXT_LIGHT 30            // Плавность изменения света

    bool nightNow = false;                    // Флаг ночь
    bool gotMotion = false;                    // Флаг движение
    bool lightIsSwitchedOn = false;            // Флаг включения подсветки

    uint8_t sensorA=0, sensorB = 0, sensorStep = 0; // Разные счетчики
    int sensorNow;

    unsigned long timeToNextDecision = 0;    // Когда принять решение о выключении

    void setup()
    {

    }

    void loop()
    {

        ////////////////////////  Check day or night //////////////////////////////////

                if (!lightIsSwitchedOn) {                // Проверяем день/ночь только если подсветка выключена
                    sensorNow = analogRead(PIN_NIGHT);    // Читаем сенсор освещености
                    if (sensorNow > SENSOR_NIGHT) {        // Если его показания больше, чем установлены для ночи
                        sensorA++;                        // Увеличиваем счетчик ночных проверок
                    }
                    if (sensorNow > (SENSOR_NIGHT - 5)) { // Если сенсор больше, чем установлено для ночи минус 5 единиц
                        sensorB++;                        // Увеличиваем счетчик дневной проверки
                    }
                    sensorStep++;                      

                    if (sensorStep == 20) {                // Если 20 раз проверили освещенность
                        if (sensorA >18) {                // и ночной сенсор оказался 18 раз выше установленного -
                            nightNow = 1;                // это ночь
                            digitalWrite(13,1);            // Зажигаем диод на плате
                        }
                        if (sensorB == 0) {                // Если дневной счетчик ни разу не увеличился
                            nightNow = 0;                // Сейчас день
                            digitalWrite(13,0);            // Гасим диод на плате
                        }                                // Обнуляем счетчики для новой проверки
                        sensorStep = 0; sensorA = 0; sensorB = 0;
                    }
                }
        ///////////////////////// Night now ////////////////////////////////////

                if (nightNow) {                            // Если сейчас ночь
                                                        // И сработал любой из датчиков движения
                                                        // устанавливаем флаг обнаружения движения
                    if ( (digitalRead(PIN_MOTION01)) || (digitalRead(PIN_MOTION02))  ) gotMotion = true;
                                                        // Если подсветка не включена и обнаружено движение
                    if((!lightIsSwitchedOn) && (gotMotion)) {
                        for(int i = 0; i <LIGHT_NIGHT; i++) {    // Плавно включаем подсветку
                            analogWrite(PIN_PWM, i);
                            delay(DELAY_TO_NEXT_LIGHT);
                        }
                        lightIsSwitchedOn = 1;            // Устанавливаем флаг о включении
                        gotMotion = 0;                    // Сбрасываем флаг обнаружения движения
                                                        // Вычисляем время, когда будем проверять что подсветку пора выключать
                        timeToNextDecision = millis() + TIME_DELAY_LIGHT;
                    }
                                                        // Если движения нет, подсветка включена и наступило время ее выключать
                    if((!gotMotion) && (lightIsSwitchedOn) && (millis() > timeToNextDecision)){
                        for(int i = LIGHT_NIGHT; i >0; i--) { // Плавно выключаем
                            analogWrite(PIN_PWM, i);
                            delay(DELAY_TO_NEXT_LIGHT);
                        }
                        analogWrite(PIN_PWM, 0);
                        lightIsSwitchedOn = 0;                // Сбрасываем флаг включенной подсветки
                        timeToNextDecision = 0;                // Обнуляем время следующей проверки отсутствия движения
                    }                                        // Если подсветка включена и движение продолжвается
                    if((gotMotion) && (lightIsSwitchedOn) && (millis() > timeToNextDecision)) {
                        timeToNextDecision = millis() + TIME_DELAY_LIGHT; // Устанавливаем новое время проверки отсутствия движения
                        gotMotion = 0;
                    }

                }
    }
     
     
    эдик и alp69 нравится это.