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

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

Метки:
  1. sergei14

    sergei14 Нерд

    мои мучения были бесполезны получается !
     
  2. ИгорьК

    ИгорьК Гуру

    Интересно о каких мучения речь идёт, что за громкие слова... как в молодости всякая фигня трагически представляется. В жизни еще столько неудач будет и не чего мужику истерить по каждой проблемке.
    МОСФЕТ стоит рублей 25 и 2 резистора не знаю уж сколько. А блок питания то у Вас есть?
     
    Последнее редактирование: 21 июн 2016
  3. sergei14

    sergei14 Нерд

    скоро уезжаю на 3 недели хотел успеть сделать всё и поехать ! придётся покупать а по приезду продолжить.
     
  4. sergei14

    sergei14 Нерд

    у меня всё есть ! кроме мосфета
     
  5. ИгорьК

    ИгорьК Гуру

    Сходите завтра с утра и купите.
     
  6. Pashtet

    Pashtet Нерд

    Добрый вечер.
    Скажите пожалуйста, будет ли работать такая схема и код для Uno?
    И, если Вас не затруднит, объясните, пожалуйста, дебилу начинающему в чём смысл узла отмеченного красным пунктиром на схеме?

    Заранее огромное спасибо. door.jpg

    Код (C++):
    #include <Arduino.h>
    #include <stdint.h>

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

    #define PIN_NIGHT 2                    // Нога для сенсора освещенности
    #define PIN_PWM 4                        // Сюда вешаем MOSFET
    #define TIME_DELAY_LIGHT 15000            // Задержка включения подсветки
    #define SENSOR_NIGHT 10                    // Если ниже - то ночь;
    #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)) {
                        sensorB++;
                    }
                    sensorStep++;

                    if (sensorStep == 20) {
                        if (sensorA >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;
                    }

                }
    }
     
  7. Tomasina

    Tomasina Сушитель лампочек Модератор

    Это резистор подтяжки для MOSFET, нужен для того, чтобы при отсутствии сигнала с пина 4 он сам закрывался.
     
  8. Pashtet

    Pashtet Нерд

    Собрал схему переставив на A0 датчик света.

    Светодиодная лента светит постоянно, т.е. включаем БП и она начинает светить не выключаясь.
    Сопротивления по 0,5 ватт.
    Датчики и ленту по отдельности проверил. (ленту пробовал и 15 см длинной и 0,6м )

    Что может быть не так?
    Заранее огромное спасибо.
     
  9. Tomasina

    Tomasina Сушитель лампочек Модератор

    а где настройка пинов на выход?
     
  10. Pashtet

    Pashtet Нерд

    Tomasina - а что это такое?

    Сейчас код стоит такой:


    Код (C++):
    #include <Arduino.h>
    #include <stdint.h>

    #define PIN_MOTIONONE 7                    // Ноги для ИК датчиков
    //   #define PIN_MOTION02 6

    #define PIN_NIGHT A0                    // Нога для сенсора освещенности
    #define PIN_PWM 4                        // Сюда вешаем MOSFET
    #define TIME_DELAY_LIGHT 1100            // Задержка включения подсветки
    #define SENSOR_NIGHT 800                    // Если выше - то ночь;
    #define LIGHT_NIGHT 70                    // Яркость свечения ленты
    #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)) {
                        sensorB++;
                    }
                    sensorStep++;

                    if (sensorStep == 20) {
                        if (sensorA >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_MOTIONONE)) ) 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;
                    }

                }
    }
    #define SENSOR_NIGHT 800 // Если выше - то ночь;
    у меня другой датчик, у него <50 день, >1000 ночь.
     
    Последнее редактирование: 9 окт 2016
  11. Tomasina

    Tomasina Сушитель лампочек Модератор

    у тебя в setup нет строчек pinMode, без этого команды analogWrite и digitalWrite работать не обязаны (если транзистор подхватит слабый сигнал, то все пучком, а может и не подхватить).
     
  12. alp69

    alp69 Форумчанин

    Вместо полевика диод? Покажите Вашу схему включения с диодом.
    К тому же на последней схеме судя по обозначениям выводов - биполярный транзистор.
     
  13. Pashtet

    Pashtet Нерд

    Такое ощущение, что я где-то системно ошибаюсь.

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

    Решил скетчем принудительно погасить ленту - бесполезно, как только подаём напряжение начинает светить постоянно.

    Код (C++):
    int relayPin = 4;  //реле пин

    void setup()
    {
      pinMode(relayPin, OUTPUT);
    }

    void loop()
    {
    digitalWrite(relayPin, LOW);
    delay(100000);
    }


    door.jpg 20161009130547.jpg
     
  14. alp69

    alp69 Форумчанин

    Начните с простого. Оставьте голую Ардуину. Загрузите пример "блинк", откорректированый на 4 выход. Посмотрите мультиметром меняется ли напряжение на 4 выходе.
    ОтпишИтесь. Все что делали - подробно опишите. Потом двинемся дальше.
     
  15. Limoney

    Limoney Гик

    p-канальный IRF5305
     
  16. Limoney

    Limoney Гик

    Включается минусом, выключается плюсом
     

    Вложения:

    • lenta.jpg
      lenta.jpg
      Размер файла:
      272,6 КБ
      Просмотров:
      563
  17. Pashtet

    Pashtet Нерд

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

    1. Blink при подаче напряжения не на штатный диод а на 4-ю ногу мигает нормально (проверял мелким светодиодом).

    2. door.jpg с кодом
    Код (C++):
    #include <Arduino.h>
    #include <stdint.h>

    #define PIN_MOTIONONE 7                    // Ноги для ИК датчиков
    // #define PIN_MOTION02 6

    #define PIN_NIGHT A0                    // Нога для сенсора освещенности
    #define PIN_PWM 4                        // Сюда вешаем MOSFET
    #define TIME_DELAY_LIGHT 15000            // Задержка включения подсветки
    #define SENSOR_NIGHT 600                   // Если ВЫШЕ - то ночь;
    #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()
    {

      pinMode(PIN_NIGHT, INPUT);

      pinMode(PIN_PWM, OUTPUT);

      pinMode(PIN_MOTIONONE, INPUT);

    }

    void loop()
    {
    if(digitalRead(PIN_MOTIONONE) == HIGH)
    {
           digitalWrite(PIN_PWM, HIGH);
    }

      if(digitalRead(PIN_MOTIONONE) == LOW)
    {
           digitalWrite(PIN_PWM, LOW);
    }
    }
    работает.

    3. А вот при подключении полевика всё заканчивается. Результат во всех случаях один - при подаче напряжения лента светится постоянно. Пробовал закрывать/открывать полевик не -, а +, бесполезно.
    Эта схема с кодом уже не работает (если закрыть полевик не -, а + тоже не работает).
    Untitled Sketch_bb1.png
    Код (C++):
    #define fadePin 3 //пин управления MOSFET транзистором

    int pirPin = 2;  //пин подключения управляющего сигнала PIR датчика
    int light;       //переменная для хранения состояния света (вкл/выкл)
    void setup(){
      pinMode(pirPin, INPUT);  //настариваем 2 пин как вход для сигналов с датчика
      pinMode(fadePin, OUTPUT);// 3 пин на выход, для управления транзисотором
      light = 0;     //устанаваливаем переменную для первого включения света
    }

    void loop(){
       if(digitalRead(pirPin) == HIGH )  //если сигнал с датчика высокого уровня(т.е. есть движение)
       {
         if(light == 0)   //и если свет не был включен
         {
           for(int i=0; i<=150; i++)  //то плавно включаем свет
           {
           analogWrite(fadePin, i);
           delay(10);   //каждые 10мс увелияение на 1
           }
           light = 1; //и передаем значение переменной, что свет включен
         }
       }
       else  //иначе
       {
         if(light == 1) //если свет включен
         {
           for(int i=150; i>=0; i--)//плавно гасим его
           {
           analogWrite(fadePin, i);
           delay(10);
           }
           light = 0; //и передаем значение переменной, что свет выключен
         }
       }
    }

    Limoney - попробовал. Всё одно - лента светит постоянно.
     
    Последнее редактирование: 9 окт 2016
  18. alp69

    alp69 Форумчанин

    Полевик-то живой? Такое впечатление, что у него сток-исток пробит. Сопротивление D/S какое?
    И что там про диод было? Как подключали? Ленту через диод напрямую к ардуине?
     
  19. ИгорьК

    ИгорьК Гуру

    Может, начнем все сначала?
    Я, вот, наблюдаю за развитием ситуации и не пойму в чем смысл затеи.

    1. Что Вы хотите сделать, в отличие от того, о чем здесь говорилось? Чем Ваше изделие должно отличаться от того, что я сделал? Опишите словами. Просто словами.

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

    Теперь... Забудьте о своем изделии:
    2. С управлением лентой надо разобраться отдельно. У меня на картинке нарисовано как она подключается. Нужно правильно сделать соединения. Обязателен резистор на затвор. Резистор, притягивающий его к земле, тоже желателен, но можно обойтись. Обойтись, в случае если Вы сразу после включения назначаете ногу на выход и подаете на нее 0.
    Схема простейшая. Если она не работает - или Вы не правильно соединили, или транзистор загублен.

    Если работает блинк - присоединяйте схему к 13 ноге и лента должна мигать вместе с блинком. Нет ?
    - неправильное соединение;
    - неисправный транзистор.

    Проверить дистанционно это не возможно. Разбирайтесь сами.

    Итак. Задача - помигать лентой и объяснить словами что Вы хотите от железки.
     
  20. Pashtet

    Pashtet Нерд

    Игорь - ничего концептуально отличающегося я не хочу сделать, просто хотел подключить Вашу схему на UNO (в связи с отсутствием Nano). Единственная разница - датчик освещенности, как и у форумца с первой страницы - ~33 - день, ~1023 - ночь.
    Но у меня упорно не хочет ничего работать по схеме :(


    Проверял по
    http://elektrik24.net/instrumentyi/izmeritelnyie/multimetr/kak-proverit-polevoj-tranzistor.html
    На 3 картинке (верхний ряд, самая правая) у меня показывает 100-103. В остальном аналогично комиксам.

    Скажите, если взять N-канальный транзистор (что бы подключить по сценарию), то какие можно взять для подключения нагрузки в 45 ватт (5 метров светодиодной ленты по 9.6 ватт/м, во втором случае 60 модулей по 0,72 ватта/шт)?
    door.jpg
     
    Последнее редактирование: 9 окт 2016