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

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

  1. ИгорьК

    ИгорьК Оракул Модератор

    Загрузите этот код, включите монитор порта и смотрите что будет написано:
    Код (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 1500

    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;
      }
      }
    }

     
     
    Последнее редактирование: 30 июн 2015
  2. эдик

    эдик Нерд

    пишет день ноч освещение 600 закрываю пальцем пишет 200.
     
  3. эдик

    эдик Нерд

    изменил на тысячу
     
  4. эдик

    эдик Нерд

    Rasstojanie: 136
    Net Dvizhenie 2
    Proverka Sensorov
    Rasstojanie: 359
    Net Dvizhenie 1
    Proverka Sensorov
    Rasstojanie: 137
    Net Dvizhenie 2
    Proverka Sensorov
    Rasstojanie: 348
    Net Dvizhenie 1
    Proverka Sensorov
    Rasstojanie: 136
    Net Dvizhenie 2
    Proverka Sensorov
    Rasstojanie: 557
    Net Dvizhenie 1
    Proverka Sensorov
    Rasstojanie: 138
    Net Dvizhenie 2
    Proverka Sensorov
    Rasstojanie: 559
    Net Dvizhenie 1
    Proverka Sensorov
    Rasstojanie: 137
    Net Dvizhenie 2
    Proverka Sensorov
    Rasstojanie: 346
    Net Dvizhenie 1
    Proverka Sensorov
    Rasstojanie: 139
    Net Dvizhenie 2
    Proverka Sensorov
    Rasstojanie: 353
    Net Dvizhenie 1
    Proverka Sensorov
    Rasstojanie: 137
    Net Dvizhenie 2
    Proverka Sensorov
    Rasstojanie: 346
    Net Dvizhenie 1
    Proverka Sensorov
    Rasstojanie: 138
    Net Dvizhenie 2
    Proverka Sensorov
    Rasstojanie: 339
    Net Dvizhenie 1
    Proverka Sensorov
    Rasstojanie: 137
    Net Dvizhenie 2
    Proverka Sensorov
    Rasstojanie: 358
    Net Dvizhenie 1
    Proverka Sensorov
    Rasstojanie: 140
    Net Dvizhenie
     
  5. эдик

    эдик Нерд

    теперь всё работает но! релеле неправельно настроено.
     
  6. ИгорьК

    ИгорьК Оракул Модератор

    Я добавил в тестовый код паузы, чтобы все работало медленнее.
    И... Я не телепат :) Что значит не правильно?
     
  7. эдик

    эдик Нерд

    :D:D при двежении оно выключает свет а когда движения нет включает.
     
  8. ИгорьК

    ИгорьК Оракул Модератор

    А в остальном все работает?
    Сейчас исправим код под ваше реле. Догадываюсь что это за штука, оно управляется не единицей, а нулем.
     
  9. эдик

    эдик Нерд

    Osveshenie :701
    Den Noch :0Osveshenie :700
    Den Noch :0Osveshenie :700
    Den Noch :0Osveshenie :700
    Den Noch :0Osveshenie :692
    Den Noch :0Osveshenie :692
    Den Noch :0Osveshenie :698
    Den Noch :0Osveshenie :697
    Den Noch :0Osveshenie :697
    Den Noch :0Osveshenie :697
    Den Noch :0Osveshenie :697
    Den Noch :0Osveshenie :697
    Den Noch :0Osveshenie :697
    сенсеры перестали работать
     
  10. эдик

    эдик Нерд

    а нет я ошибся просто они стали ну очень медленно работать)))
     
  11. ИгорьК

    ИгорьК Оракул Модератор

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

    Я изменил код для вашего реле.
     
  12. эдик

    эдик Нерд

  13. эдик

    эдик Нерд

    я его выставил на тысячу для настройки потом переставлю.
     
  14. ИгорьК

    ИгорьК Оракул Модератор

    Чтобы вернуть код к прежней скорости закомментируйте строки delay(ZAMEDLITEL);
     
  15. ИгорьК

    ИгорьК Оракул Модератор

  16. эдик

    эдик Нерд

    а просто увеличить скорость считывани раза в 2 можно? надо 750 поставить?
     
  17. эдик

    эдик Нерд

    точно!
     
  18. ИгорьК

    ИгорьК Оракул Модератор

    Замените:
    #define ZAMEDLITEL 700
     
  19. эдик

    эдик Нерд

    но реле работает в прежнем режиме.:(
     
  20. ИгорьК

    ИгорьК Оракул Модератор

    Я поменял полярность управляющего сигнала. Значит Вы его неправильно подключили.