Проходной включатель на 2х HC-SR04

Тема в разделе "Силовая электроника", создана пользователем эдик, 29 июн 2015.

  1. ИгорьК

    ИгорьК Гуру

    M5451 - это микросхема с большим количеством выходных ног, к которым присоединяются куски светодиодной ленты и которые последовательно включаются, для достижения эффекта бегущей волны.
    Эта схема связана с Ардуино специальным протоколом. Там, проще говоря, между ардуиной и этой микросхемой шуруют массивы данных. Для этого и написан весь скетч. Специально под эту схему.
    Вместо нее не то что реле - ничего другого поставить нельзя.
     
  2. Radius

    Radius Гик

    Вот схема. Сей час лампочка выключена. Переключите любой из тумблеров и она загорится. Если переключить другой тумблер то лампочка погаснет. Схема.jpg
     
  3. ИгорьК

    ИгорьК Гуру

    Ультрасоники, конечно, можно использовать. Полагаю, первый у Вас выйдет из строя в течение 6-8 месяцев. Но в принципе - можно. Реле (одно или два - так и не понял зачем два) надо просто присоединить к ногам ардуино. Скетч надо написать другой. И, кажется, на вики у Амперки что-то на эту тему есть.
     
  4. эдик

    эдик Нерд

    нету.
     
  5. эдик

    эдик Нерд

    я электрик я такие схемы знаю и монтировал неоднократно. я же говорю у родителей всё осв. на ик датчиках
    но они реагируют на тепло а там стоят радиаторы и поэтому ик. неприменим вот я и выписал ультразвуковые думал на них сделаю.
     
  6. ИгорьК

    ИгорьК Гуру

    Ок, значит на них. Какие конкретно датчики?
    Вот пока скетч на ИКдатчиках.
    Код (C):
    #include <stdint.h>

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

    #define PIN_NIGHT A0                    // Нога для сенсора освещенности
    #define PIN_RELAY 6                        // Сюда вешаем реле
    #define TIME_DELAY_LIGHT 15000            // Задержка выключения подсветки
    #define SENSOR_NIGHT 10                    // Если ниже - то ночь;

    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_RELAY, OUTPUT);
    }

    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)) {
                        digitalWrite(PIN_RELAY, 1);
                        lightIsSwitchedOn = 1;
                        gotMotion = 0;
                        timeToNextDecision = millis() + TIME_DELAY_LIGHT;
                    }

                    if((!gotMotion) && (lightIsSwitchedOn) && (millis() > timeToNextDecision)){
                        digitalWrite(PIN_RELAY, 0);
                        lightIsSwitchedOn = 0;
                        timeToNextDecision = 0;
                    }
                    if((gotMotion) && (lightIsSwitchedOn) && (millis() > timeToNextDecision)) {
                        timeToNextDecision = millis() + TIME_DELAY_LIGHT;
                        gotMotion = 0;
                    }
                }
    }
     
     
    Последнее редактирование: 30 июн 2015
  7. эдик

    эдик Нерд

  8. ИгорьК

    ИгорьК Гуру

  9. эдик

    эдик Нерд

    сори. я нетак понял.
    HC-SR04
     
  10. эдик

    эдик Нерд

  11. ИгорьК

    ИгорьК Гуру

    Замечу, что это не проект на заказ, где исполнитель доводит все до ума и несет ответственность перед заказчиком, а набросок Вам в помощь.
    Он будет работать, но в зависимости от вашей ситуации и расположения элементов его придется настраивать самостоятельно.

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

    #define PIN_DIST01  3    // Нога Echo первого датчика
    #define TRIG_PIN01  4    // Нога Trig первого датчика
    #define DISTANCE01   40    // Расстояние от первого датчика, меньше которого происходит включение

    #define PIN_DIST02  5      // Нога Echo второго датчика
    #define TRIG_PIN02  6    // Нога Trig второго датчика
    #define DISTANCE02   40    // Расстояние от второго датчика, меньше которого происходит включение

    #define PIN_NIGHT A0                    // Нога для сенсора освещенности
    #define PIN_RELAY 7                    // Сюда вешаем реле
    #define TIME_DELAY_LIGHT 15000          // Задержка выключения подсветки
    #define SENSOR_NIGHT 10                // Если ниже - то ночь;

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

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

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

    bool checkSensors(byte numberOfSensor) {    // Проверка сенсоров
        if (numberOfSensor == 1) {
            int result = getDistance(TRIG_PIN01, PIN_DIST01);
            if (result < DISTANCE01) {
                return true;
            }
            else {
                return false;
            }
        }
        if (numberOfSensor == 2) {
            int result = getDistance(TRIG_PIN02, PIN_DIST02);
            if (result < DISTANCE02) {
                return true;
            }
            else {
                return false;
            }
        }

    }

    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);
        unsigned int distance = duration/29/2;
        return distance;
    }

    void setup()
    {
        pinMode(PIN_RELAY, OUTPUT);
        pinMode(TRIG_PIN01, OUTPUT);
        pinMode(TRIG_PIN02, OUTPUT);
    }

    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 (checkSensors(1) || checkSensors(2)) gotMotion = true;

                    if((!lightIsSwitchedOn) && (gotMotion)) {
                        digitalWrite(PIN_RELAY, 1);
                        lightIsSwitchedOn = 1;
                        gotMotion = 0;
                        timeToNextDecision = millis() + TIME_DELAY_LIGHT;
                    }

                    if((!gotMotion) && (lightIsSwitchedOn) && (millis() > timeToNextDecision)){
                        digitalWrite(PIN_RELAY, 0);
                        lightIsSwitchedOn = 0;
                        timeToNextDecision = 0;
                    }
                    if((gotMotion) && (lightIsSwitchedOn) && (millis() > timeToNextDecision)) {
                        timeToNextDecision = millis() + TIME_DELAY_LIGHT;
                        gotMotion = 0;
                    }
                }
    }
     
     
    Последнее редактирование: 30 июн 2015
    эдик нравится это.
  12. эдик

    эдик Нерд

    Да конечно, я все понимаю. Сегодня в вечером попробую залить и отпишусь. А
    сколько стоит написать на заказ?
     
  13. ИгорьК

    ИгорьК Гуру

    Не знаю. Я на заказ не работаю.
     
  14. эдик

    эдик Нерд

    нет не работает, пытался изменить дистанцию, освещнность но нечего не получается.
     
  15. ИгорьК

    ИгорьК Гуру

    Не спешите с выводами.

    1. Разберитесь, пожалуйста, в коде прежде. Поймите его логику. Если Вы этого не сделаете двигаться никуда не стоит.

    Вы должны прежде всего понять логику кода, согласиться с ней или указать на ошибки.

    2. Вставьте в места кода, которые покажутся Вам критическими строки, типа Serial.println("Funktsija getDistance"); или Serial.println(distance); или Serial.println(nightNow);
    3. Соберите все, загрузите скетч и смотрите в сериал порт - что происходит.

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

    :) Хотя одну ошибку нашел. Сейчас скетч исправлю. В функцию определения расстояния передавал номера ног не в том порядке.
     
    Последнее редактирование: 30 июн 2015
  16. эдик

    эдик Нерд

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

    ИгорьК Гуру

    Попробуйте заново. Ошибку я исправил.
     
  18. эдик

    эдик Нерд

    если я сейчас просто отключу сенсер освещённости она будет работать?
     
  19. эдик

    эдик Нерд

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

    ИгорьК Гуру

    Нет. Сейчас я код для тестирования допишу.