Свет в туалете

Тема в разделе "Arduino & Shields", создана пользователем light-winged, 13 май 2017.

  1. light-winged

    light-winged Нуб

    Здравствуйте. Много искал, но готового не нашёл. Есть задача автоматизировать свет в туалете, но логикой работы датчиков движения и концевиком двери. Логику представляю такой.
    Сработал концевик двери, открылась дверь - свет включить и не выключать заданное время.
    Есть сработки датчика движения, но дверь закрыта - свет НЕ выключать.
    Сработал датчик двери, закрылась дверь, при отсутствии сработки датчика движения - выключить свет.
    Если дверь открыта, а сработки датчика движения есть - включить свет на заданное время.
    Есть скетчи для работы либо с датчиком движения, либо с концевиком - герконом.
    Как объединить код для описанной логики работы???
     
  2. mcureenab

    mcureenab Гуру

    По отдельности скетчи делают то что нужно? Понятно, за исключением условий совместной работы...

    Выкладывайте оба. Всяко не с нуля писать.
     
  3. Airbus

    Airbus Радиохулиган Модератор

    Зачем геркон если есть датчик движения?Можно вообще УЗ дальномер есть кто в радиусе 30 см свет горит если нет не горит.Вообще можно на одном транзисторе сделать без ардуино.Или на датчике движения он автономно может работать без ардуино.Гугель Вам в помощь!
     
  4. qwone

    qwone Гик

    Скорее с нуля писать все равно придется. А вот проверить объем знаний ТС и не нуля объяснять не мешало. Для этого и нужны скетчи написаные самим ТС, а не свежесдутые с интернета.
     
  5. light-winged

    light-winged Нуб

    Скетч для PIR
    Код (C++):
    //Время калибровки датчика (10-60 сек. по даташиту)
    int calibrationTime = 30;      

    //Время, в которое был принят сигнал отсутствия движения(LOW)
    long unsigned int lowIn;      

    //Пауза, после которой движение считается оконченным
    long unsigned int pause = 5000;

    //Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет
    boolean lockLow = true;
    //Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения
    boolean takeLowTime;

    int pirPin = 2;    //вывод подключения PIR датчика
    int ledPin = 13;   //вывод сигнального диода
    int relayPin = 7;  //реле пин

    void setup()
    {
      pinMode(pirPin, INPUT);
      pinMode(ledPin, OUTPUT);
      pinMode(relayPin, OUTPUT);

      //!ВНИМАНИЕ! При использовании n-p-n реле необходимо в след. строчке поменять HIGH на LOW
      digitalWrite(relayPin, LOW);
      delay(4000);
      digitalWrite(pirPin, LOW);

      //дадим датчику время на калибровку
      for(int i = 0; i < calibrationTime; i++)
      {
        //Во время калибровки будет мигать сигнальный диод
        i % 2 ? digitalWrite(ledPin, HIGH) : digitalWrite(ledPin, LOW);
        delay(1000);
      }
      //По окончанию калибровки зажжем сигнальный диод
      digitalWrite(ledPin, HIGH);
      delay(50);
    }

    void loop()
    {
      //Если обнаружено движение
      if(digitalRead(pirPin) == HIGH)
      {
        //Если до этого момента еще не включили реле
        if(lockLow)
        {
          lockLow = false;    
          //Включаем реле.
          //!ВНИМАНИЕ! При использовании n-p-n реле необходимо в след. строчке поменять LOW на HIGH
          digitalWrite(relayPin, LOW);
          delay(50);
        }      
        takeLowTime = true;
      }

      //Ели движения нет
      if(digitalRead(pirPin) == LOW)
      {    
        //Если время окончания движения еще не записано
        if(takeLowTime)
        {
          lowIn = millis();          //Сохраним время окончания движения
          takeLowTime = false;       //Изменим значения флага, чтобы больше не брать время, пока не будет нового движения
        }
        //Если время без движение превышает паузу => движение окончено
        if(!lockLow && millis() - lowIn > pause)
        {
          //Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения
          lockLow = true;              
          digitalWrite(relayPin, HIGH);
          delay(50);
        }
      }
    }
    Скетч для геркона, по нему при замыкании, при закрытой двери включает реле или светодиод.
    Код (C++):
    int switchPin = 3; // к выводу 2 подключён геркон
    int ledPin = 7; // к пину 13 подключён встроенный светодиод

    void setup() {
      pinMode(switchPin, INPUT); // задаём вывод 2 в качестве входа (будем считывать с него)
      digitalWrite(switchPin, HIGH); // активируем внутренний подтягивающий резистор вывода
      pinMode(ledPin, OUTPUT); // задаём вывод 13 в качестве выхода
      Serial.begin(9600); // задействуем последовательный порт
    }

    void loop() {
      int g = digitalRead(switchPin); // считываем показания с геркона
      digitalWrite(ledPin, !g); // инвертированные показания записываем в порт со светодиодом
      Serial.println(g); // посылаем в последовательный порт значения с геркона
      //когда геркон замкнут, значение "0" (LOW), когда разомкнут - "1" (HIGH)
      delay(20); // повторяем цикл через 20 мсек
     
  6. Airbus

    Airbus Радиохулиган Модератор

    А во втором скетче куда сигнал из туалета посылаете?Я про println(g)?
     
  7. qwone

    qwone Гик

    Рассказывать вам о вреде delay(20);???
     
  8. Airbus

    Airbus Радиохулиган Модератор

    Расскажите о вреде.Именно в этом коде.
     
  9. light-winged

    light-winged Нуб

    Можно упростить.
    Код (C++):
    int switchPin = 3; // к выводу 3 подключён геркон
    int relayPin = 7; // к пину 7 подключёно реле

    void setup() {
      pinMode(switchPin, INPUT); // задаём вывод 2 в качестве входа (будем считывать с него)
      pinMode(relayPin, OUTPUT);
      }

    void loop() {
      if(digitalRead(switchPin) == HIGH)//Если до этого момента еще не включили реле
        if(lockLow)
        {
          lockLow = false;//Включаем реле.
          digitalWrite(relayPin, LOW);
          delay(50);
        }      
        takeLowTime = true;
      }
     
  10. ostrov

    ostrov Гуру

    Датчик движения с задержкой отключения сек на 30, мало кто сможет 30 сек не пошевелиться. Остальное лишнее. Такие датчики продаются в сборе вместе со светильниками, рублей от 300.
     
  11. mcureenab

    mcureenab Гуру

    Как знать, если книга интересная...
     
    YeS нравится это.
  12. ostrov

    ostrov Гуру

    Запоры надо лечить. ))
     
  13. Airbus

    Airbus Радиохулиган Модератор

    Можно PIR датчик можно и (даже лучше!) HC-SR04
     
  14. light-winged

    light-winged Нуб

    Добавив в первый скетч датчик двери, получил включения света по таймеру от двух датчиков!
    Код (C++):
    //Время калибровки датчика (10-60 сек. по даташиту)
    int calibrationTime = 30;    

    //Время, в которое был принят сигнал отсутствия движения(LOW)
    long unsigned int lowIn;      

    //Пауза, после которой движение считается оконченным
    long unsigned int pause = 5000;

    //Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет
    boolean lockLow = true;
    //Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения
    boolean takeLowTime;

    int pirPin = 2;    //вывод подключения PIR датчика
    int DoorPin = 3;    //вывод НЗ концевика
    int ledPin = 13;   //вывод сигнального диода
    int relayPin = 7;  //реле пин

    void setup()
    {
      pinMode(pirPin, INPUT);
      pinMode(DoorPin, INPUT);
      pinMode(ledPin, OUTPUT);
      pinMode(relayPin, OUTPUT);

      //!ВНИМАНИЕ! При использовании n-p-n реле необходимо в след. строчке поменять HIGH на LOW
      digitalWrite(relayPin, LOW);
      delay(4000);
      digitalWrite(pirPin, LOW);

      //дадим датчику время на калибровку
      for(int i = 0; i < calibrationTime; i++)
      {
        //Во время калибровки будет мигать сигнальный диод
        i % 2 ? digitalWrite(ledPin, HIGH) : digitalWrite(ledPin, LOW);
        delay(1000);
      }
      //По окончанию калибровки зажжем сигнальный диод
      digitalWrite(ledPin, HIGH);
      delay(50);
    }

    void loop()
    {
      //Если обнаружено движение
      if(digitalRead(pirPin) == HIGH || digitalRead(DoorPin) == LOW)
      {
        //Если до этого момента еще не включили реле
        if(lockLow)
        {
          lockLow = false;    
          //Включаем реле.
          //!ВНИМАНИЕ! При использовании n-p-n реле необходимо в след. строчке поменять LOW на HIGH
          digitalWrite(relayPin, LOW);
          delay(50);
        }      
        takeLowTime = true;
      }

      //Ели движения нет
      if(digitalRead(pirPin) == LOW || digitalRead(DoorPin) == HIGH)
      {    
        //Если время окончания движения еще не записано
        if(takeLowTime)
        {
          lowIn = millis();          //Сохраним время окончания движения
          takeLowTime = false;       //Изменим значения флага, чтобы больше не брать время, пока не будет нового движения
        }
        //Если время без движение превышает паузу => движение окончено
        if(!lockLow && millis() - lowIn > pause)
        {
          //Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения
          lockLow = true;              
          digitalWrite(relayPin, HIGH);
          delay(50);
        }
      }
    }
     
  15. smile

    smile Нерд

    Может для долгого чтения на горшке можно температуру ободка унитаза измерять? )))
    Больше 30 - вкл, меньше 30 - выкл )))
     
  16. qwone

    qwone Гик

    А еще датчик влажности. Нечего толчек занимать если от клиента не добиться хотя бы влажности.:rolleyes:
     
  17. smile

    smile Нерд

    :D так и до датчика метана и других природных газов дойдем )))
     
  18. ostrov

    ostrov Гуру

    Можно датчик звука на журчание и кряхчение. ))
     
  19. smile

    smile Нерд

    :D
    Ну вот, я пришел и скатил тему в трэш )))
    Тут как с лояльностью? Не сильно банят? ))