Скетч для нескольких датчиков

ВН
Offline
Зарегистрирован: 25.02.2016

угу, или как схемы с ОК выходом объединяются в монтажное ИЛИ без ардуин

kaktus770
Offline
Зарегистрирован: 04.05.2018

ВН пишет:

угу, или как схемы с ОК выходом объединяются в монтажное ИЛИ без ардуин

А можно поподробней? Если я правильно понимаю, есть возможность сделать то же самое без ардуино? Гугл с яндексом не в теме:)

Вот что в итоге получилось, может кому пригодится:)

/*
   Скетч для управления реле ардуино с помощью датчиков дыма и огня
   relay_pin и zrelay_pin содержит номер пина, к которому подключено реле, которым мы будем управлять
   smoke_pin и flame_pin содержит номер пина с подключенным датчиком дыма/огня
   В теле функции loop проверяем наличия низкого уровня сигнала от датчика с помощью функции digitalRead
 
*/
 
 
int relay_pin = 8; // Определяем пин, используемый для подключения реле1
int zrelay_pin = 9; // Определяем пин, используемый для подключения реле2
int smoke_pin = 2; // Определяем пин, используемый для подключения smoke-датчика1
int ssmoke_pin = 3; // Определяем пин, используемый для подключения smoke-датчика2
int flame_pin = 4; // Определяем пин, используемый для подключения flame-датчика1
int fflame_pin = 5; // Определяем пин, используемый для подключения flame-датчика2

 
// В этой функции определяем первоначальные установки
void setup()
{
  Serial.begin(9600);
  pinMode(relay_pin, OUTPUT); // Объявляем пин реле1 как выход
  pinMode(zrelay_pin, OUTPUT); // Объявляем пин реле2 как выход
  pinMode(smoke_pin, INPUT); // Объявляем пин датчика дыма как вход
  pinMode(ssmoke_pin, INPUT); // Объявляем пин датчика дыма как вход
  pinMode(flame_pin, INPUT); // Объявляем пин датчика огня как вход
  pinMode(fflame_pin, INPUT); // Объявляем пин датчика огня как вход
}
void loop()
{
 
  int smokeVal = digitalRead(smoke_pin);
  int ssmokeVal = digitalRead(ssmoke_pin);
  int flameVal = digitalRead(flame_pin);
  int fflameVal = digitalRead(fflame_pin);
  if (smokeVal == LOW ||  ssmokeVal == LOW || flameVal == LOW ||  fflameVal == LOW)
  {
    digitalWrite(relay_pin, LOW); 
    digitalWrite(zrelay_pin, LOW); // Включаем реле - посылаем высокий??? уровень сигнала
    Serial.println("реле включено");
  } else {
    digitalWrite(relay_pin, HIGH); 
    digitalWrite(zrelay_pin, HIGH); // Отключаем реле - посылаем низкий??? уровень сигнала
    Serial.println("реле выключено");
  }
 
  delay(1000); // Проверяем значения один раз в секунду.
}

Правда не пойму, отчего при команде  digitalWrite(relay_pin, LOW); на выходе ардуины логическая единица, а при HIGH ноль. Но все работает:)

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Можно и без ардуино. Берешь модуль на 4 реле, ко входу каждого реле подключаешь датчик. А нормально замкнутые контакты реле об единяешь паралельно и пускаешь на ревун.

leks
Offline
Зарегистрирован: 22.10.2017

kaktus770 пишет:

 

Правда не пойму, отчего при команде  digitalWrite(relay_pin, LOW); на выходе ардуины логическая единица, а при HIGH ноль. Но все работает:)

Это врядли, если только вольтметр такое показывает :)

leks
Offline
Зарегистрирован: 22.10.2017

kaktus770 пишет:

 

Правда не пойму, отчего при команде  digitalWrite(relay_pin, LOW); на выходе ардуины логическая единица, а при HIGH ноль. Но все работает:)

Это врядли, если только вольтметр такое показывает :)

leks
Offline
Зарегистрирован: 22.10.2017

kaktus770 пишет:

 

Правда не пойму, отчего при команде  digitalWrite(relay_pin, LOW); на выходе ардуины логическая единица, а при HIGH ноль. Но все работает:)

Это врядли, если только вольтметр такое показывает :)

leks
Offline
Зарегистрирован: 22.10.2017

kaktus770 пишет:

 

Правда не пойму, отчего при команде  digitalWrite(relay_pin, LOW); на выходе ардуины логическая единица, а при HIGH ноль. Но все работает:)

Это врядли, если только вольтметр такое показывает :)

leks
Offline
Зарегистрирован: 22.10.2017

Глюк? На 1 сообщение - 4 копии.

nik182
Offline
Зарегистрирован: 04.05.2015

Такое может быть если мерить не относительно земли а относительно плюса питания.

kaktus770
Offline
Зарегистрирован: 04.05.2018

nik182 пишет:
Такое может быть если мерить не относительно земли а относительно плюса питания.

Да нет, относительно земли тестером мерил... Да и ладно - лучшее главный враг хорошего:)

AlexanderNO
Offline
Зарегистрирован: 08.11.2018

kaktus770 пишет:

Правда не пойму, отчего при команде  digitalWrite(relay_pin, LOW); на выходе ардуины логическая единица, а при HIGH ноль. Но все работает:)

У Вас реле с инвертированным управлением: питание на обмотку реле попадает, когда на контакты управления (IN1 или IN2) подается низкий уровень (0). 

kaktus770
Offline
Зарегистрирован: 04.05.2018

nik182 пишет:
Такое может быть если мерить не относительно земли а относительно плюса питания.

Да нет, относительно земли тестером мерил... Да и ладно - лучшее главный враг хорошего:)

kaktus770
Offline
Зарегистрирован: 04.05.2018

AlexanderNO пишет:

kaktus770 пишет:

Правда не пойму, отчего при команде  digitalWrite(relay_pin, LOW); на выходе ардуины логическая единица, а при HIGH ноль. Но все работает:)

У Вас реле с инвертированным управлением: питание на обмотку реле попадает, когда на контакты управления (IN1 или IN2) подается низкий уровень (0). 

Нет, специально померил - реле срабатывает при 1 на входе... 

AlexanderNO
Offline
Зарегистрирован: 08.11.2018

kaktus770 пишет:

AlexanderNO пишет:

kaktus770 пишет:

Правда не пойму, отчего при команде  digitalWrite(relay_pin, LOW); на выходе ардуины логическая единица, а при HIGH ноль. Но все работает:)

У Вас реле с инвертированным управлением: питание на обмотку реле попадает, когда на контакты управления (IN1 или IN2) подается низкий уровень (0). 

Нет, специально померил - реле срабатывает при 1 на входе... 

Что значит НЕТ? Вы дали ссылку в #2, а это именно реле с инвертированным управлением. Вы описание к этому реле читали? 

leks
Offline
Зарегистрирован: 22.10.2017

Да что ж вы в чудеса новогодние не верите?!, а?

gfx125
Offline
Зарегистрирован: 27.05.2017

asam пишет:

Можно и без ардуино. Берешь модуль на 4 реле, ко входу каждого реле подключаешь датчик. А нормально замкнутые контакты реле об единяешь паралельно и пускаешь на ревун.

достаточно 4 диода и одно реле

 

gfx125
Offline
Зарегистрирован: 27.05.2017

kaktus770 пишет:

Правда не пойму, отчего при команде  digitalWrite(relay_pin, LOW); на выходе ардуины логическая единица, а при HIGH ноль.

Вы это смотрите с подключенным реле или без?

kaktus770
Offline
Зарегистрирован: 04.05.2018

AlexanderNO пишет:

kaktus770 пишет:

AlexanderNO пишет:

kaktus770 пишет:

Правда не пойму, отчего при команде  digitalWrite(relay_pin, LOW); на выходе ардуины логическая единица, а при HIGH ноль. Но все работает:)

У Вас реле с инвертированным управлением: питание на обмотку реле попадает, когда на контакты управления (IN1 или IN2) подается низкий уровень (0). 

Нет, специально померил - реле срабатывает при 1 на входе... 

Что значит НЕТ? Вы дали ссылку в #2, а это именно реле с инвертированным управлением. Вы описание к этому реле читали? 

Да ладно, проехали - стопудов я где то туплю:) Работает, да и ладно:)

kaktus770
Offline
Зарегистрирован: 04.05.2018

gfx125 пишет:

asam пишет:

Можно и без ардуино. Берешь модуль на 4 реле, ко входу каждого реле подключаешь датчик. А нормально замкнутые контакты реле об единяешь паралельно и пускаешь на ревун.

достаточно 4 диода и одно реле

 

А зачем тогда я всю эту конструкцию накрутил? Для расширения сознания видимо:) А если два реле? Просто параллельно включить второе?

AlexanderNO
Offline
Зарегистрирован: 08.11.2018

kaktus770 пишет:

А зачем тогда я всю эту конструкцию накрутил? Для расширения сознания видимо:) А если два реле? Просто параллельно включить второе?

А зачем два реле? Опять для расширения сознания?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Я для расширения сознания не реле, а кедровку использую. Рекомендую, очень спасопствует. 

kaktus770
Offline
Зарегистрирован: 04.05.2018

AlexanderNO пишет:

kaktus770 пишет:

А зачем тогда я всю эту конструкцию накрутил? Для расширения сознания видимо:) А если два реле? Просто параллельно включить второе?

А зачем два реле? Опять для расширения сознания?

Ну я собирался ревун на второе прицепить:)

 Но по ходу дела камера Сяоми на обычный рев не реагирует, даже на писк обычных пожарных извещателей тоже. Ей подавай писк фирменного датчика: https://ru.aliexpress.com/item/Xiaomi-Mijia-Honeywell/32890006304.html? Всвязи с чем без ардуинки не обойтись. Дописал скетч, чтобы пьезопищалка пищала фирменный алярм. Заодно доработал программу: теперь после срабатывания одного из датчиков реле отключается до перезагрузки, а пищалка пищит минимальное для срабатывания оповещения время, или пока сигнал с датчика приходит. Неказисто, но работает:)

kaktus770
Offline
Зарегистрирован: 04.05.2018

DetSimen пишет:

Я для расширения сознания не реле, а кедровку использую. Рекомендую, очень спасопствует. 

Кедровку я уже проходил, уж лучше реле. Да и Вам не советую:)

kaktus770
Offline
Зарегистрирован: 04.05.2018

Скетч такой получается:

/*
   Скетч для управления реле ардуино с помощью датчиков дыма и огня
   relay_pin и zrelay_pin содержит номер пина, к которому подключено реле, которым мы будем управлять
   smoke_pin и flame_pin содержит номер пина с подключенным датчиком дыма/огня
   В теле функции loop проверяем наличия низкого уровня сигнала от датчика с помощью функции digitalRead
 
*/
 
 
int relay_pin = 8; // Определяем пин, используемый для подключения реле1
int smoke_pin = 2; // Определяем пин, используемый для подключения smoke-датчика1
int ssmoke_pin = 3; // Определяем пин, используемый для подключения smoke-датчика2
int flame_pin = 4; // Определяем пин, используемый для подключения flame-датчика1
int fflame_pin = 5; // Определяем пин, используемый для подключения flame-датчика2
int buzzer = A3; //объявляем переменную с номером пина пьезоэлемента

 
// В этой функции определяем первоначальные установки
void setup()
{
  Serial.begin(9600);
  pinMode(relay_pin, OUTPUT); // Объявляем пин реле1 как выход
  pinMode(smoke_pin, INPUT); // Объявляем пин датчика дыма как вход
  pinMode(ssmoke_pin, INPUT); // Объявляем пин датчика дыма как вход
  pinMode(flame_pin, INPUT); // Объявляем пин датчика огня как вход
  pinMode(fflame_pin, INPUT); // Объявляем пин датчика огня как вход
  pinMode(buzzer, OUTPUT); //объявляем пин как выход
}
void loop()
{
 
  int smokeVal = digitalRead(smoke_pin);
  int ssmokeVal = digitalRead(ssmoke_pin);
  int flameVal = digitalRead(flame_pin);
  int fflameVal = digitalRead(fflame_pin);
  int var = 0;
  if (smokeVal == LOW ||  ssmokeVal == LOW || flameVal == LOW ||  fflameVal == LOW)
  {
    digitalWrite(relay_pin, HIGH);  // Выключаем реле - посылаем высокий уровень сигнала
   while(var < 15){
   tone (buzzer, 3000); //включаем пищалку на 3КГц
   delay(500); //ждем 500 Мс

   noTone(buzzer); //пауза 500 Мс
   delay(500);

   tone (buzzer, 3000); //включаем пищалку на 3КГц
   delay(500); //ждем 500 Мс

   noTone(buzzer); //пауза 500 Мс
   delay(500);

   tone (buzzer, 3000); //включаем пищалку на 3КГц
   delay(500); //ждем 500 Мс

   noTone(buzzer); //пауза 1500 Мс
   delay(1500);

   var++;
}

  } else {
    noTone(buzzer); //отключаем пищалку
  }
 
  delay(1000); // Проверяем значения один раз в секунду.
}

 

Bender
Bender аватар
Offline
Зарегистрирован: 05.04.2011

Я извиняюсь, но MQ-5 это датчик Метана и Природного газа (в котором метан от 70 до 98 %). Или у вас принтер метаном стол нагревает?

kaktus770
Offline
Зарегистрирован: 04.05.2018

Очепятка. MQ-2 пользую. Но MQ-2 тоже довольно широкого спектра. На дым реагирует, но так же прекрасно реагирует на 3Д клей и аэрозоли всяческие. Поэтому приспособил сенсорную кнопочку, от которой запускается пауза скетча на пять минут - если надо что сделать, жму ее, и ковыряюсь. Чтобы не пищала система почем зря. А так все работает.