Умный дом

Тема в разделе "Arduino & Shields", создана пользователем Ернар, 22 окт 2016.

  1. Ернар

    Ернар Нуб

    Прошу помочь в написание программы для управление сигнализации.

    есть PIR датчик ,кнопка(активация сигнализации), ардуино

    PIR датчик движения:

    1)если кнопка не нажата включает освещение

    2)если кнопка нажата(активируем режим сигнализации) включает пищалку, пищалка должна отключаться после отжатии кнопки



    int ledPin = 9; // инициализируем пин для светодиода
    int inputPin = 4; // инициализируем пин для получения сигнала от пироэлектрического датчика движения
    int pirState = LOW; // начинаем работу программы, предполагая, что движения нет
    int val = 0; // переменная для чтения состояния 4 пина
    int Sigpin = 11; // инициализируем пин для пищалки
    int button = 12; // пин для кнопки
    pinMode(button, INPUT);

    void loop()
    { val = digitalRead(inputPin); // считываем значение с датчика
    if (val == HIGH && button==0)
    {
    digitalWrite(ledPin, HIGH); // включаем светодиод
    if (pirState == LOW)
    pirState = HIGH;
    } else digitalWrite(ledPin, LOW); // выключаем светодиод
    if (pirState == HIGH)
    pirState = LOW;

    if (val == HIGH && button==1 )
    {
    digitalWrite(Sigpin, HIGH);
    } else
    {
    digitalWrite(Sigpin, LOW); // выключаем светодиод
    }
    }
    не получается когда нажимаю на кнопку,если до этого датчик срабатывал то сразу включается пищалка.

    при отключение сигнализации датчик не обнуляется. Помогите с реализации
     
  2. rkit

    rkit Гуру

    Вот это смысла не имеет. Вообще для вставки кода надо пользоваться соответствующей кнопкой.
     
  3. Ернар

    Ернар Нуб

    а как тогда?
     
  4. rkit

    rkit Гуру

  5. Ернар

    Ернар Нуб

    1)не получается когда нажимаю на кнопку(активирую сигнализацию),если до этого датчик срабатывал то сразу включается пищалка. не могу обнулить значение PIR датчика при включение сигнализации, как сделать это?
     
  6. rkit

    rkit Гуру

    Ну наверное надо не просто заменить механически, а подумать, что это значит, и какая разница.
     
  7. Ернар

    Ернар Нуб

    не получается
     
  8. qwone

    qwone Гик

    Код (C++):

    /*
    #1 PIR датчик -> 4(PIR_pin) 1 движение / 0 нет движения
              GND -> GND
    освещение     -> 11 (Led_pin) 1 включено / 0 выключено
              GND -> GND
    тублер        -> 12 (btn_pin) 0  свет  / 1 сигнализация
              GND -> GND
    пищалка       -> 9 (Sign_pin)
              GND -> GND
    */

    //#1
    const int PIR_pin = 4; // пин пирометра
    uint8_t PIR; // величина на пирометре
    const int btn_pin = 12; // пин тумблера  0 включаем свет /  1 включаем сигнализацию
    uint8_t btn; // величина на тумблере
    const int Led_pin = 11; // пин светодиода
    const int Sign_pin = 9; // пин пищалки
    const int frequency = 1000; // частота звука сигнализации Гц
    const int duration = 500; // длительность посылок миллисекундах
    void setup() {
      //#1
      pinMode(PIR_pin, INPUT);
      pinMode(Led_pin, OUTPUT);
      digitalWrite(Led_pin, 0);
      pinMode(btn_pin, INPUT_PULLUP);
    }

    void loop() {
      static uint32_t MILLIS ;
      MILLIS = millis() ;
      //#1
      static uint32_t future1 = 0 ;
      if (MILLIS >= future1)   {
        future1 = MILLIS + 1000 ;
        PIR = digitalRead(PIR_pin);
        btn = digitalRead(btn_pin);
        digitalWrite(Led_pin, PIR && ! btn);
        if (PIR && btn)   tone(Sign_pin, frequency, duration);
      }
    }
     
     
  9. Ернар

    Ернар Нуб

    Код (C++):
    int ledPin = 9;  // инициализируем пин для светодиода
    int inputPin = 4;  // инициализируем пин для получения сигнала от пироэлектрического датчика движения
    int pirState = LOW;  // начинаем работу программы, предполагая, что движения нет
    int sigState = LOW;
    int val = 0;  // переменная для чтения состояния 4 пина
    int Sigpin = 11; //  инициализируем пин для пищалки
    int button = 12; // пин для кнопки
    pinMode(button, INPUT);
    void loop()
    {
    val = digitalRead(inputPin);  // считываем значение с датчика
             if (val == HIGH && button==0)
             {
                digitalWrite(ledPin, HIGH);  // включаем светодиод
                    if (pirState == LOW)
                     pirState = HIGH;
             } else     digitalWrite(ledPin, LOW); // выключаем светодиод
                        if (pirState == HIGH)
                            pirState = LOW;

    if (val == HIGH && button==1 )
            {
               RemoteXY.led_1_r = 255;
               digitalWrite(Sigpin, HIGH);
             }  else
                {
                   digitalWrite(Sigpin, LOW); // выключаем светодиод
           
                 }
    }
     
     
  10. Ернар

    Ернар Нуб

    можете объяснить пожалуйста что делает данный код:
    staticuint32_t MILLIS ;
    MILLIS = millis();
    //#1
    staticuint32_t future1 =0;
    if(MILLIS >= future1)
     
  11. qwone

    qwone Гик

    Есть в ардуине четырехбайтный счетчик . Включается при включении ардуины или ресет. Значение получается millis(). static это переменные которые не уничтожаются при заканчивании функций. uint32_t это формат переменной в 4 байта. future1 это аналог будильника. Вот вам надо в определеное время выйти из дома. Вы пишете на бумаге время. А потом периодически смотрите на часы и на бумагу и сравниваете. Вот если они совпадают или время на часах больше, то выходите из дома. Прием нужен поддержка процессов или устройств значительно медленых, чем скорость процессора. Если процесс один , то можно замедлять delay(); Но если много медленных устройств ,которые должен облуживать быстрый процессор.
    ПС: для выше написаной программы я обращаюсь к тублеру и пирометру раз в 1 секунду. или точнее раз 1000 миллисекунд. И хотя там больше устройств нет, я все же сохраняю такой подход. Вдруг кому-то захочется что-то еще добавить. Так программы написаные в таком стиле спокойно вкладываются по нескольку в одину ардуину.