2 реле + 2 пир датчика

Тема в разделе "Arduino & Shields", создана пользователем Аббадон разоритель миров, 9 мар 2020.

  1. Добрый день всем.
    Не получается связать датчики движения с реле, оно (реле)работает постоянно, вне зависимости от показания датчиков.Пробовал гуглить, но так ничего дельного не наешл, перепробовал кучу скетчей, и все бес толку.
    Один из скетчей который я использовал показан ниже:

    Код (C++):
    #define PIN_FLAME 5
    #define PIN_PIR1 2
    #define PIN_PIR2 3
    #define PIN_rel 4
    #define PIN_relflame 6
    void setup () {
         Serial.begin(9600);
         pinMode(PIN_PIR1, INPUT);
         pinMode(PIN_PIR2, INPUT);
         pinMode(PIN_rel, OUTPUT);
         pinMode(PIN_FLAME,INPUT);
    }
    void loop(){
         int val = digitalRead(PIN_PIR1);//датчик движения 1
         if (val)    
            digitalWrite(PIN_rel, HIGH);
         else
            digitalWrite(PIN_rel, LOW);
         int val1 = digitalRead(PIN_PIR2);//датчик движения 2
         if (val1)
            digitalWrite(PIN_rel, HIGH);
         else
            digitalWrite(PIN_rel, LOW);
          int val2 = digitalRead(PIN_FLAME);//датчик огня 1(сирены)
         if (val2)
            digitalWrite(PIN_rel, HIGH);
         else
            digitalWrite(PIN_rel, LOW);
           int val3 = digitalRead(PIN_FLAME);//ДАТЧИК ОГНЯ НА НАСОС
           if (val3)
            digitalWrite(PIN_relflame, LOW);
           else
            digitalWrite(PIN_relflame, HIGH);
    }

     
     
  2. NikitOS

    NikitOS Король шутов Администратор

    Почему значение из функции digitalRead() записывается в int? Она булевое значение дает, а не целочисленное

    Без скобок не понятно что куда. Это так и задумано или табы лишние?
    Код (C++):

        else
            digitalWrite(PIN_rel, LOW);
           int val3 = digitalRead(PIN_FLAME);//ДАТЧИК ОГНЯ НА НАСОС
           if (val3)
            digitalWrite(PIN_relflame, LOW);
           else
            digitalWrite(PIN_relflame, HIGH);
     
     
  3. То есть значение переменной у меня меняется в зависимости от показаний датчика?
     
  4. Airbus

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

    Оно принимает только два значения или единица HIGH или ноль LOW.Можно сразу в цикле считывать и безо всяких интов и выполнять действие.Или не выполнять.
     
  5. Хотел бы дополнить, что в программировании новичок, поэтому некоторые термины не знаю.
     
  6. akl

    akl Гуру

    int так же может быть и единицей и нулем, это в данном случае ни на что не влияет.

    для начала надо сделать вывод этих переменных в монитор ком-порта и посмотреть какие значения они принимают в процессе работы
     
  7. akl

    akl Гуру

    каким образом определялось какие действительно поступают показания от датчиков?
    что за реле? модуль типа такого? http://wiki.amperka.ru/продукты:troyka:relay
     
  8. Да, реле похоже на ту, но отличается цвет текстолита, но это уже мелочи.датчик движения вот этот : https://images.ua.prom.st/995282001_w640_h640_datchik-dvizheniya-dlya.jpg
     
  9. Вывел на ком порт первый рип датчик, с остальными не стал заморачиваться. Выводил с помощью кода ниже:

    Код (C++):
     #define PIN_FLAME 5
    #define PIN_PIR1 2
    #define PIN_PIR2 3
    #define PIN_rel 4
    #define PIN_relflame 6
    int val = 0;
    int val1 = 0;
    int val2 = 0;
    int val3 = 0;
    void setup () {
         Serial.begin(9600);
         pinMode(PIN_PIR1, INPUT);
         pinMode(PIN_PIR2, INPUT);
         pinMode(PIN_rel, OUTPUT);
         pinMode(PIN_FLAME,INPUT);
    }
    void loop(){
         val = digitalRead(PIN_PIR1);//датчик движения 1
         if (val)
           
         if (val < HIGH)
             Serial.print("motion");
         else
             Serial.print("no motion");
         if (val)    
            digitalWrite(PIN_rel, HIGH);
         else
            digitalWrite(PIN_rel, LOW);
         val1 = digitalRead(PIN_PIR2);//датчик движения 2
         if (val1)
            digitalWrite(PIN_rel, HIGH);
         else
            digitalWrite(PIN_rel, LOW);
         val2 = digitalRead(PIN_FLAME);//датчик огня 1(сирены)
         if (val2)
            digitalWrite(PIN_rel, HIGH);
         else
            digitalWrite(PIN_rel, LOW);
          val3 = digitalRead(PIN_FLAME);//ДАТЧИК ОГНЯ НА НАСОС
           if (val3)
            digitalWrite(PIN_relflame, LOW);
           else
            digitalWrite(PIN_relflame, HIGH);
    }

     
     
    Последнее редактирование: 9 мар 2020
  10. akl

    akl Гуру

    ну так и что показывает? датчик то правильно работает? все что относится к другим датчикам убрать, добиться чтоб один датчик управлял релешкой правильно, затем добавлять остальные по одному, так же проверяя через ком-порт (если "не заморачиваться", то оно и не заработает)

    чтобы оно не спамило непрерывно - лучше сделать чтобы в ком-порт отправлялось только при изменении значения переменной.
    как-то так например:
    Код (C++):
    if(val_old!=val){
        val_old=val;
        Serial.print(val);
    }
     
    Последнее редактирование: 9 мар 2020
  11. код рабочий, но реле оказалось нерабочим. Тема закрыта