Помогите написать скетч

nekromant
Offline
Зарегистрирован: 07.04.2018

надо собрать устройство для охраны. Как написать цикл для проверки датчиков вроде разобрался, а вот как решить вопрос с кнопкой сброса не пойму.

//программа

int vibroPin = 2; //Вход вибродатчика
int smkPin = 3;   //Вход шлейфа на обрыв
int swPin = 4     //Вход кнопка сброса тревоги
int relePin = 13; //Выход управления реле

void setup() {
  pinMode(vibroPin, INPUT);
  pinMode(smkPin, INPUT);
  pinMode(swPin, INPUT);
  pinMode(relePin, OUTPUT);
}

void loop() {
  int val = digitalRead(smkPin); // Считваем значение с датчика SMK
  if(val==0){ 
    digitalWrite(relePin, HIGH); //Датчик сработал включаем реле

  int val = digitalRead(PIN_SENSOR); // Считваем значение с датчика vibro
  if(val==1){ 
    digitalWrite(relePin, HIGH); //Датчик сработал включаем реле
  
}

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

nekromant, программирование это не только синтаксис языка Си, а еще умение строить модели различных устройств. У вас устройство для охраны. У него как минимум 3 состояния: охрана отключена, охрана включена и тревога. 

enum {sNoActiv, sActiv, sAlarm};
byte state = sActiv;/*состояние системы*/

 Ну если датчик сработал, то режим тревоги. Кнопка сброса или отключает всю систему или же взводит в режим охраны.

nekromant
Offline
Зарегистрирован: 07.04.2018

Конкретно в этом устройстве такого не надо. Сдесь достаточно того, что бы при срабатывании любого датчика включалась тревога и возврата системы в исходное состояние по нажатию кнопки

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

nekromant пишет:

Конкретно в этом устройстве такого не надо. Сдесь достаточно того, что бы при срабатывании любого датчика включалась тревога и возврата системы в исходное состояние по нажатию кнопки

А теперь прочтем, что Вы написали и подумаем. Исходное состояние,это что? включение требоги это что? Правильно состояния.  Если бы так просто ,Вы просто замкнули датчик на тревогу и исключили Ардуину. Есть сигнал на датчике , есть тревога, нет сигнала- нет тревоги. Думаю вы догадались, что нужен триггер. А это и есть то, что я написал выше.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

nekromant пишет:

Конкретно в этом устройстве такого не надо. Сдесь достаточно того, что бы при срабатывании любого датчика включалась тревога и возврата системы в исходное состояние по нажатию кнопки

Вы противоречите и qwone, и самому себе.

Правильно спроектированная система должна иметь набор состояний. При этом внешние воздействия могут переводить систему из одного состояния в другое, а состояния (включая переход между ними) инициируют управляющее воздействие на исполнительные устройства.

Вы же пытаетесь отказаться от состояний, а внешние воздействия замкнуть непосредственно на управляющие воздействия. В некоторых простейших случаях такая стратегия срабатывает. Но решение оказывается нерасширяемым. Вот как есть - так есть, и ничего добавить нельзя. А автомат состояний достаточно легко расширяем.

Так что постарайтесь вникнуть в то, что Вам сказал qwоne и реализовать именно этот родход у себя.

Другими словами система, как она спроектирована Вами, не обладает расширяемостью. Для обеспечения этой расширяемости идеологию надо менять - делать автомат состояний.

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Попробуйте так

//программа

#define vibroPin  2 //Вход вибродатчика
#define smkPin  3   //Вход шлейфа на обрыв
#define swPin  4     //Вход кнопка сброса тревоги
#define relePin  13 //Выход управления реле
bool regim;
bool f_swPin;

void setup() {
  pinMode(vibroPin, INPUT);
  pinMode(smkPin, INPUT);
  pinMode(swPin, INPUT);
  pinMode(relePin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
 
 if (!regim)
  {
   if(!digitalRead(smkPin)|| digitalRead(vibroPin)){ // Считваем значение с 2х датчиков - Первый сработка на 0, второй на 1
    digitalWrite(relePin, HIGH); //Один из Датчиков сработал включаем реле
   }  
  }
  
if(digitalRead(swPin) && !f_swPin){  //Считываем кнопкку
  f_swPin=1;
  if (digitalRead(relePin))//Если Нажали кнопку при тревоге
   {
    digitalWrite(relePin, LOW); //Выключили реле 
    regim = 1;    
   }
   else  regim = 0;//Повторно Нажали кнопку после востановления датчиков -ВКЛЮЧАЕМ ОХРАНУ
  } 
  else if (f_swPin && !digitalRead(swPin))f_swPin=0; //ТИПА антидребезга (неполноценный)
}   

 

nekromant
Offline
Зарегистрирован: 07.04.2018

Спасибо. Только я не понял где тут задается уровень при котором датчик считается сработавшим?

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014
if(!digitalRead(smkPin)|| digitalRead(vibroPin))
Равносильно
if(digitalRead(smkPin) == 0 || digitalRead(vibroPin) == 1)
sadman41
Offline
Зарегистрирован: 19.10.2016

Вот это поворот. Уровень чего?

Genri5
Offline
Зарегистрирован: 31.05.2016

nekromant пишет:
Спасибо. Только я не понял где тут задается уровень при котором датчик считается сработавшим?

Дык, у датчиков то уровни - либо "0", либо "1".

nekromant
Offline
Зарегистрирован: 07.04.2018

Не надо тапочками в меня кидать. Это мой первый опыт с контроллерами по тому и вопросы могут быть глупыми. С ! это 0, а без 1? Вопрос не только решить задачу но и хочется разобраться что и к чему.

sadman41
Offline
Зарегистрирован: 19.10.2016

nekromant пишет:
С ! это 0, а без 1? Вопрос не только решить задачу но и хочется разобраться что и к чему.

Если хотите разобраться - разбирайтесь. А если спрашиваете, то пишите так, чтобы было понятно другим, а не только вам. Что вот это за.. муйня "С ! это 0, а без 1?"

nekromant
Offline
Зарегистрирован: 07.04.2018

! Перед digitalRead. И есть где про все нюансы написания кода почитать?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

http://cppstudio.com/post/297/  Помогу тем кого забанили в гугле. Понимаю санкции, потому что Путин Трампу нассал в тапок. Нет ,что бы, как приличный кот , ходить в отведенную миску.

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

qwone пишет:

Понимаю санкции, потому что Путин Трампу нассал в тапок. Нет ,что бы, как приличный кот , ходить в отведенную миску.

Судя по истерике, он ему под стол навалил ниаднакратно.