Добрый день всем. Не получается связать датчики движения с реле, оно (реле)работает постоянно, вне зависимости от показания датчиков.Пробовал гуглить, но так ничего дельного не наешл, перепробовал кучу скетчей, и все бес толку. Один из скетчей который я использовал показан ниже: Код (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); }
Почему значение из функции digitalRead() записывается в int? Она булевое значение дает, а не целочисленное Без скобок не понятно что куда. Это так и задумано или табы лишние? Код (C++): else digitalWrite(PIN_rel, LOW); int val3 = digitalRead(PIN_FLAME);//ДАТЧИК ОГНЯ НА НАСОС if (val3) digitalWrite(PIN_relflame, LOW); else digitalWrite(PIN_relflame, HIGH);
Оно принимает только два значения или единица HIGH или ноль LOW.Можно сразу в цикле считывать и безо всяких интов и выполнять действие.Или не выполнять.
int так же может быть и единицей и нулем, это в данном случае ни на что не влияет. для начала надо сделать вывод этих переменных в монитор ком-порта и посмотреть какие значения они принимают в процессе работы
каким образом определялось какие действительно поступают показания от датчиков? что за реле? модуль типа такого? http://wiki.amperka.ru/продукты:troyka:relay
Да, реле похоже на ту, но отличается цвет текстолита, но это уже мелочи.датчик движения вот этот : https://images.ua.prom.st/995282001_w640_h640_datchik-dvizheniya-dlya.jpg
Вывел на ком порт первый рип датчик, с остальными не стал заморачиваться. Выводил с помощью кода ниже: Код (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); }
ну так и что показывает? датчик то правильно работает? все что относится к другим датчикам убрать, добиться чтоб один датчик управлял релешкой правильно, затем добавлять остальные по одному, так же проверяя через ком-порт (если "не заморачиваться", то оно и не заработает) чтобы оно не спамило непрерывно - лучше сделать чтобы в ком-порт отправлялось только при изменении значения переменной. как-то так например: Код (C++): if(val_old!=val){ val_old=val; Serial.print(val); }