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

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

  1. эдик

    эдик Нерд

    а это как? земля к земле, +5 к +5 управляющий на 7 пине.
     
  2. ИгорьК

    ИгорьК Гуру

    Ну да. И что, работает, но наоборот?
     
  3. эдик

    эдик Нерд

    да.
    :(
     
  4. ИгорьК

    ИгорьК Гуру

    А Вы код перегрузили? Давайте еще раз:
    Код (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                // Если ниже - то ночь;

    #define ZAMEDLITEL 500

    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) {
      Serial.println("Proverka Sensorov");
      if (numberOfSensor == 1) {
        int result = getDistance(TRIG_PIN01, PIN_DIST01);
        if (result < DISTANCE01) {
          Serial.println("Dvizhenie 1");
          delay(ZAMEDLITEL);
          return true;
        }
        else {
          Serial.println("Net Dvizhenie 1");
          delay(ZAMEDLITEL);
          return false;
        }
      }
      if (numberOfSensor == 2) {
        int result = getDistance(TRIG_PIN02, PIN_DIST02);
        if (result < DISTANCE02) {
          Serial.println("Dvizhenie 2");
          delay(ZAMEDLITEL);
          return true;
        }
        else {
          Serial.println("Net Dvizhenie 2");
          delay(ZAMEDLITEL);
          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;
        Serial.print("Rasstojanie :");
        Serial.println(distance);
        delay(ZAMEDLITEL);
        return distance;
    }

    void setup()
    {
        Serial.begin(9600);
        pinMode(PIN_RELAY, OUTPUT);
        digitalWrite(PIN_RELAY, 1);
        pinMode(TRIG_PIN01, OUTPUT);
        pinMode(TRIG_PIN02, OUTPUT);
       
    }

    void loop()
    {

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

                if (!lightIsSwitchedOn) {                // Проверяем день/ночь только если подсветка выключена
                    sensorNow = analogRead(PIN_NIGHT);
                    Serial.print("Osveshenie :");
                    Serial.println(sensorNow);
                    delay(ZAMEDLITEL);
                    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;
                    }
                    Serial.print("Den Noch :");
                    Serial.println(nightNow);
                    delay(ZAMEDLITEL);
                }
        ///////////////////////// Night now ////////////////////////////////////

                if (nightNow) {

                    if ( checkSensors(1) || checkSensors(2)  ) gotMotion = true;

                    if((!lightIsSwitchedOn) && (gotMotion)) {
                        Serial.println("Vkluchaem Svet!");
                        delay(ZAMEDLITEL);
                        digitalWrite(PIN_RELAY, 0);
                        lightIsSwitchedOn = 1;
                        gotMotion = 0;
                        timeToNextDecision = millis() + TIME_DELAY_LIGHT;
                    }

                    if((!gotMotion) && (lightIsSwitchedOn) && (millis() > timeToNextDecision)){
                        Serial.println("Vikluchaem Svet!");
                        delay(ZAMEDLITEL);
                        digitalWrite(PIN_RELAY, 1);
                        lightIsSwitchedOn = 0;
                        timeToNextDecision = 0;
                    }
                    if((gotMotion) && (lightIsSwitchedOn) && (millis() > timeToNextDecision)) {
                        Serial.println("Dobavljaem vremja!");
                        delay(ZAMEDLITEL);
                        timeToNextDecision = millis() + TIME_DELAY_LIGHT;
                        gotMotion = 0;
                    }
                }
    }
     
     
    эдик нравится это.
  5. эдик

    эдик Нерд

    урряяя!!! теперь всё правельно работает! СПАСИБО ВАМ ОГРОМАДНЕЙШЕЕ!!!! я даже непредстовляю как вас благодарить!!!
     
  6. ИгорьК

    ИгорьК Гуру

    Переименовать тему так, чтобы кому-то это еще помогло. То есть сформулировать название темы согласно ее сути.
     
    эдик нравится это.
  7. эдик

    эдик Нерд

    пренепременнейше!
     
  8. эдик

    эдик Нерд

    Сделано! Надеюсь эта система будет востребована.
     
    ИгорьК нравится это.
  9. эдик

    эдик Нерд

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

    ИгорьК Гуру

    У меня - 5 метров. Дальше - не знаю.
    Не исключаю, что с некоторой длины датчики правильно работать не будут - будут ложные срабатывания.
    Сразу отвечаю на вопрос "И что тогда делать".
    Ответ будет таков: сажать датчик на отдельный микроконтроллер, который будет по месту датчика управлять проверкой расстояния, все время держать линию в единице, а когда определяется расстояние срабатывания - сбрасывать линию в ноль.
    :) Думаю, стало яснее.
     
    Последнее редактирование: 2 июл 2015
    эдик нравится это.
  11. эдик

    эдик Нерд

    а мне всего по 4м от датчика развести надо. Спасибо снова выручили))
     
  12. эдик

    эдик Нерд

    первый не работает. менял местами нечего не дало.
     
  13. ИгорьК

    ИгорьК Гуру

    О как! А я предполагал 6-7 месяцев. Ну... Вот такие они, эти датчики.
    У меня на лестнице они летят именно с такой периодичностью. Правда, датчики другие, подороже. Те что у Вас штампуют все кому не лень, качество их не слишком хорошее.
    Сейчас, если уезжаю на неделе, - выключаю лестницу с целью экономии датчиков. Стремно - приходится лезть очень глубоко, наощупь рукой выключать. Сейчас с OpenHAB уже понимаю как этот процесс автоматизировать. Но придется железо допиливать.
     
    Последнее редактирование: 8 июл 2015
  14. эдик

    эдик Нерд

    у меня таких 3 шт. осталось вот решил в кладовку и погреб поставить на одной дуне но нет. тот выход что числиться первым не работает.
     
  15. ИгорьК

    ИгорьК Гуру

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