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

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

Метки:
  1. alp69

    alp69 Форумчанин

    Нужно. Для самообразования.
    Не совсем понял про вызов функции с параметром. Где почитать? Где пример глянуть (желательно из практически реализованного). Если среди Ваших статей/постов есть - буду признателен хотя бы наводящим ключевым словам.
     
    Последнее редактирование: 8 окт 2015
  2. ИгорьК

    ИгорьК Гуру

    Читать надо книжки. Если это надолго, начните https://yandex.ru/yandsearch?&text=Шилдт С базовый курс

    ИМХО самая простая книга.
     
    Последнее редактирование: 8 окт 2015
    alp69 нравится это.
  3. alp69

    alp69 Форумчанин

    Спасибо!
     
  4. alp69

    alp69 Форумчанин

    Наконец-то выходной! Отпилил нужную длину вставки в плинтус, вклеил ленту, вставил, включил...
    ...полное разочарование! :mad:
    Люди!!! Не встраивайте светодиодную ленту в плинтус!!! При ее включении даже маленькая пылинка на полу становится видна. Брррр! :D
    На семейном совете принято решение ленту упаковать в красивую вазу и туда же напихать стеклянных побрякушек. Так будет намного интереснее.
    Как то так ;)
     
    Последнее редактирование: 10 окт 2015
    Tomasina, эдик и ИгорьК нравится это.
  5. AlexVS

    AlexVS Гик

    Хотел замутить несто подобное (я про подсветку по кроватью), но датчки, закрепленные под планкой будут нещадно отломаны прии первой же уборке, или шваброй или пылесосм :(
     
  6. ИгорьК

    ИгорьК Гуру

    Не факт. Все зависит от кровати. Боковой датчик у меня находится на уровне прикроватной тумбочки. Там не сильно помашешь шваброй.
    А датчик на спинке в ногах прижат к ножке. Датчики крепятся на скотче.
    За все время был снесен лишь один датчик и лишь один раз. Он только отклеился и был водружен на место. Надо просто коробочку для него делать покрепче.
     
    Последнее редактирование: 18 фев 2016
  7. lovec66

    lovec66 Нуб

    Здравствуйте. Повторил вашу разработку, все работает благодарствую. Подскажите, возможно ли доработать код чтоб подсветка с наступлением темноты включалась с 20% яркостью, а при движении на 50-60%. сам начинающий боюсь не осилю.
     
  8. ИгорьК

    ИгорьК Гуру

    Можно. Завтра.
    (Когда же я подсветку лестницы переделаю...)
     
    Последнее редактирование: 25 фев 2016
  9. ИгорьК

    ИгорьК Гуру

    Как-то так. Однако, обратите внимание: если сенсор освещенности будет ловить свет от ночной подсветки, то он будет считать что это день. Соответственно, вся система будет просто мигать. Чтобы этого не происходило, следует либо искать размещение сенсора, либо менять значение, которое он считает светлым временем суток.
    Код (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 127                    // Яркость свечения ленты
    #define DELAY_TO_NEXT_LIGHT 30            // Плавность изменения света

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


    bool flag20 = false;                        // Флаг включения ночной подстветки
    #define LIGHT_VISION 30                        // Яркость постоянной ночной подсветки


    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 (!flag20) {
                                flag20 = true;
                                analogWrite(PIN_PWM, LIGHT_VISION);
                            }
                        }
                        if (sensorB == 0) {                // Если дневной счетчик ни разу не увеличился
                            nightNow = 0;                // Сейчас день
                            if (flag20) {
                                flag20 = false;
                                analogWrite(PIN_PWM, 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 = LIGHT_VISION; 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 >LIGHT_VISION; i--) { // Плавно выключаем
                            analogWrite(PIN_PWM, i);
                            delay(DELAY_TO_NEXT_LIGHT);
                        }
                        analogWrite(PIN_PWM, LIGHT_VISION);
                        lightIsSwitchedOn = 0;                // Сбрасываем флаг включенной подсветки
                        timeToNextDecision = 0;                // Обнуляем время следующей проверки отсутствия движения
                    }                                        // Если подсветка включена и движение продолжвается
                    if((gotMotion) && (lightIsSwitchedOn) && (millis() > timeToNextDecision)) {
                        timeToNextDecision = millis() + TIME_DELAY_LIGHT; // Устанавливаем новое время проверки отсутствия движения
                        gotMotion = 0;
                    }

                }
    }
     
    Последнее редактирование: 25 фев 2016
    alp69 нравится это.
  10. lovec66

    lovec66 Нуб

    Огромное благодарствую, именно то что нужно. Успехов вам!
     
  11. lovec66

    lovec66 Нуб

    Досадная ошибка, после того как отработает по датчику движения, лента полностью гаснет, и чтобы включился дежурный режим, нужно на короткое время осветить фоторезистор. А вот по движению включается на 70% яркости
     
  12. ИгорьК

    ИгорьК Гуру

    1. Исправил.

    2. В скетче есть строки
    #define LIGHT_NIGHT 127 Цифра 127 отвечает за яркость свечения по срабатыванию датчика.
    #define LIGHT_VISION 30 Цифра 30 отвечает за яркость ночной подсветки.

    Подбирайте обе опытным путем как Вам нужно.
     
    Последнее редактирование: 25 фев 2016
  13. lovec66

    lovec66 Нуб

    Все отлично, работает как надо.
     
  14. sergei14

    sergei14 Нерд

    всем привет !!!
    помогите мне с кодом не получается вставить задержку на светодиод после того как он загорелся !
    Код (C++):
    const int Trig = 8;
        const int Echo = 9;
        const int ledPin = 11;  // 13 – если будете использовать встроенный в Arduino светодиод

        void setup()
        {
        pinMode(Trig, OUTPUT);
        pinMode(Echo, INPUT);
        pinMode(ledPin, OUTPUT);
     
        Serial.begin(9600);
        }

        unsigned int time_us=0;

        unsigned int distance_sm=0;

        void loop()
        {
        digitalWrite(Trig, HIGH); // Подаем сигнал на выход микроконтроллера
        delayMicroseconds(10); // Удерживаем 10 микросекунд
        digitalWrite(Trig, LOW); // Затем убираем
        time_us=pulseIn(Echo, HIGH); // Замеряем длину импульса
        distance_sm=time_us/58; // Пересчитываем в сантиметры
        Serial.println(distance_sm); // Выводим на порт

        if (distance_sm<50) // Если расстояние менее 50 сантиметром
        {
           digitalWrite(ledPin, 1); // Зажигаем светодиод
        }
        else
        {
           digitalWrite(ledPin, 0); // иначе тушим
        }
     
        delay(100);
        }
     
  15. sergei14

    sergei14 Нерд

    это всё для ультрасоников ! заранее спасибо !
    надеюсь поможете 3 день уже не могу сделать !
    а время идёт всё стоит не сделанное !!!
     
  16. ИгорьК

    ИгорьК Гуру

    Ну что с тобой делать...
    Код (C++):

    #define LIGHTDELAY 7000  // 7 секунд задержка выключения
    #define TRIG 8
    #define ECHO 9
    #define LED_PIN 11  // 13 – если будете использовать встроенный в Arduino светодиод

    unsigned long timeToSwitchOff;

      void setup() {
      pinMode(TRIG, OUTPUT);
      pinMode(ECHO, INPUT);
      pinMode(LED_PIN, OUTPUT);
      Serial.begin(9600);
      }

      void loop() {
      unsigned long time_us=0;
      unsigned int distance_sm=0;
      digitalWrite(TRIG, HIGH); // Подаем сигнал на выход микроконтроллера
      delayMicroseconds(10); // Удерживаем 10 микросекунд
      digitalWrite(TRIG, LOW); // Затем убираем
      time_us=pulseIn(ECHO, HIGH); // Замеряем длину импульса
      distance_sm=time_us/58; // Пересчитываем в сантиметры
      Serial.println(distance_sm); // Выводим на порт

      if (distance_sm<50) { // Если расстояние менее 50 сантиметром
      digitalWrite(LED_PIN, 1); // Зажигаем светодиод
      timeToSwitchOff = millis() +  LIGHTDELAY;
      }
       
      if (millis() > timeToSwitchOff) {
      digitalWrite(LED_PIN, 0);
      }
      }
     
     
    Последнее редактирование: 19 июн 2016
  17. sergei14

    sergei14 Нерд

    большое спасибо ! но он не загружает изза этого ошибка !
    Код (C++):

    #define LED_PIN = 11  // 13 – если будете использовать встроенный в Arduino светодиод
     


    выделяет красным !
     
  18. ИгорьК

    ИгорьК Гуру

    Исправил все дефайны. Делал с планшета не заметил ошибки.
     
  19. sergei14

    sergei14 Нерд

    не теперь сдесь ошибка !


    Код (C++):
    if (millis() > timetimeToSwitchOff) {
     
  20. sergei14

    sergei14 Нерд

    я просто в этой теме слабоват пока !
    скобка не помогает !(

    извините я с телефона пишу ! бывает не замечаю ошибка !(