Перезагрузка системы при зависании, контроль зависании сигнализирует светодиод...

Ильяс
Offline
Зарегистрирован: 26.01.2017

Идея такая... нужно реализовать систему под контролем ардуино, которая следила бы состояния оборудования о наличи зависании...



Алгоритм следующий, у оборудования мигает светодиод сигнал с нее берется транзисторным оптроном PC817 и дает сигнал ардуинеардуино следит, если нет имений в течении 3 мин то включает реле на 3 сек, реле перезагружает оборудование



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

nezza_profi
Offline
Зарегистрирован: 26.08.2016

Ильяс пишет:

Идея такая... нужно реализовать систему под контролем ардуино, которая следила бы состояния оборудования о наличи зависании...



Алгоритм следующий, у оборудования мигает светодиод сигнал с нее берется транзисторным оптроном PC817 и дает сигнал ардуинеардуино следит, если нет имений в течении 3 мин то включает реле на 3 сек, реле перезагружает оборудование



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


Вечером домой как прийду скину вам код как я решил такую проблему. Может быть не совсем правильно но задача была примерно как у вас.

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Выход оптрона цепляете на прерывание и при каждом срабатывании обнуляете таймер
При прекращении поступления импульсов, таймер перестанет обнуляться и отсчитает свои 3 минуты.

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

Ильяс
Offline
Зарегистрирован: 26.01.2017

С нетерпением буду ждать.....

nezza_profi
Offline
Зарегистрирован: 26.08.2016

Ильяс пишет:

С нетерпением буду ждать.....

Если будут вопросы могу объяснить что и как тут работает. но вроде я все описал. ошибок возможно тут много и можно реализовать лучше. но мою поставленую задачу я решил этим кодом.

 boolean f_verh=0;       //Флаг верхнего уровня
 boolean f_niz=0;       //Флаг нижнего уровня
 boolean motor_v=0;	//Двигатель (1-включен,0-выключен)
 boolean signal_a=0;	//Сигнализация (1-включен,0-выключен)
 boolean f_poln=0;	//Флаг полной ёмкости
 boolean f_pust=0;	//Флаг пустой ёмкости
#define verh 2		//верхний уровень
#define niz 3		//Нижний уровень
#define time 3000

unsigned long previousMillis = 0;        // храним время последнего переключения 
void setup()
 { // put your setup code here, to run once:
 Serial.begin(9600);
 pinMode (10,OUTPUT); //канал двигателя.
 pinMode (11,OUTPUT); //канал двигателя.

 }
void loop()
 { // put your main code here, to run repeatedly:
  digitalWrite(10, motor_v);//зависит от уровня 
  digitalWrite(11, signal_a);//зависит от уровня 
  f_verh=digitalRead(verh);//опрос верхнего уровня
f_niz=digitalRead(niz);//опрос нижнего уровня
 if(f_verh==0 && f_niz==0 && signal_a==0){//если уровень ниже нижнего электрода включить двигатель.
 motor_v=1;
 f_pust=1;
 f_poln=0;
 previousMillis = millis(); //Сброс таймера.
    }
    Serial.print("znachenie  previousMillis "); 
  Serial.println(previousMillis);
     if(f_niz==1 && f_verh==1){//Если уровень достиг верхнего электрода выключить двигатель.
 motor_v=0;
 f_poln=1;
  f_pust=0;
 signal_a=0;
   previousMillis = millis(); //Сброс таймера.
      }
    if (f_niz==1 && f_pust==1 && f_verh==0 && millis() -  previousMillis > time ) //Если от достижения уровеня воды нижнего электрода прошло 3 секунды выключить двигатель и включить сигнализацию.
    { motor_v=0;
    signal_a=1;}
 }

 

Ильяс
Offline
Зарегистрирован: 26.01.2017

Спасибо! Щя попробую разобраться...

А у вас какая задача стояла системы? Можите разказать подробее....

nezza_profi
Offline
Зарегистрирован: 26.08.2016

Ильяс пишет:

Спасибо! Щя попробую разобраться...

А у вас какая задача стояла системы? Можите разказать подробее....

задача была набирать емкость водой. 

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

nezza_profi
Offline
Зарегистрирован: 26.08.2016

Ильяс пишет:

Спасибо! Щя попробую разобраться...

А у вас какая задача стояла системы? Можите разказать подробее....

сейчас я попробую сделать вам образец а вы уже там для себя подберете как вам нужно

Ильяс
Offline
Зарегистрирован: 26.01.2017

Огpомное Вам спасибо, выручаете! столько всего полезного 

 

nezza_profi
Offline
Зарегистрирован: 26.08.2016

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


 boolean f_817=0;       //Флаг оптопары
 boolean signal_a=0;	//Сигнализация (1-включен,0-выключен)
#define opto 2		//контакт
#define time 1000

unsigned long previousMillis = 0;        // храним время последнего переключения 
void setup()
 { // put your setup code here, to run once:
 Serial.begin(9600);
 pinMode (11,OUTPUT);
 }
void loop()
 { // put your main code here, to run repeatedly:
   digitalWrite(11, signal_a);
f_817=digitalRead(opto);//опрос оптопарф
 if(f_817==0 && signal_a==0 && previousMillis==0){
 previousMillis = millis(); //Сброс таймера.
    }
    Serial.print("znachenie  previousMillis "); 
  Serial.println(previousMillis);
         if (f_817==1 && millis() -  previousMillis > time )
    { 
    signal_a=1;

    }
     if(f_817==0 && millis() -  previousMillis > time ){
 signal_a=1;
    }
       }

 

bwn
Offline
Зарегистрирован: 25.08.2014

Ильяс, если требуется только отслеживать мигания светодиода, то МК это пушка для воробьев. КР1006ВИ1, 555 таймер это делают проще и дешевле.

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

OlegK пишет:

Выход оптрона цепляете на прерывание и при каждом срабатывании обнуляете таймер
При прекращении поступления импульсов, таймер перестанет обнуляться и отсчитает свои 3 минуты.

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

Таймер - это лишняя сущность.

Прерывание должно запоминать момент, а который оно произошло, а основной цикл - проверять, что с последнего прерывания прошло времени меньше таймаута.

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

andriano пишет:
Таймер - это лишняя сущность.

Согласен. Так даже проще.

Ильяс
Offline
Зарегистрирован: 26.01.2017

Постановку задачи другими словами.....

 

Если не нажималось кнопка в течении 3 мин то включилось реле на 10 сек и этот цикл повторялся 3 раза....

с виду задача фигня но как столкнулся то в ступор встал.... я не программист 

Может у кого есть наброски кода))) помогите пожалуйста..... 

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

Посмотрите так

//Если не нажималось кнопка в течении 3 мин то включилось реле на 10 сек и этот цикл повторялся 3 раза....
#define kn 2
#define rele 13
byte kol;
bool value;

unsigned long time1;
unsigned long time2;

void setup() {
  pinMode(kn, INPUT);
  pinMode(rele, OUTPUT);
}

void loop() {
  if (digitalRead(kn) == HIGH) {
    time1 = millis();
    digitalWrite(rele, LOW);
    kol = 0;
    value = 0;
  }

  else if (value == 0 && millis() - time1 >= 180000) {
    if (kol <= 3) {
      digitalWrite(rele, HIGH);
      time1 = millis();
      time2 = millis();
      kol++;
      value = 1;
    }
  }

  if (value && millis() - time1 >= 10000) {
    digitalWrite(rele, LOW);
    value = 0;
  }
}




 

Ильяс
Offline
Зарегистрирован: 26.01.2017

vosara спасибо БОЛЬШОЕ!!!

У меня вопрос. что мне сделать с кодом  так чтобы работала наоборот т.е. сейчас система работает таким образом....

если кнопка нажата 3 минуты то включает реле на 10 сек а надо 

если кнопка не нажималось 3 минуты то включалось реле на 10 сек...

Заранее спасибо..) 

 

 

//Если не нажималось кнопка в течении 3 мин то включилось реле на 10 сек и этот цикл повторялся 3 раза....

#define kn 2
#define rele 13
byte kol;
bool value;
 
unsigned long time1;
unsigned long time2;
 
void setup() {
  pinMode(kn, INPUT);
  pinMode(rele, OUTPUT);
}
 
void loop() {
  if (digitalRead(kn) == HIGH) {
    time1 = millis();
    digitalWrite(rele, LOW);
    kol = 0;
    value = 0;
  }
 
  else if (value == 0 && millis() - time1 >= 180000) {
    if (kol <= 3) {
      digitalWrite(rele, HIGH);
      time1 = millis();
      time2 = millis();
      kol++;
      value = 1;
    }
  }
 
  if (value && millis() - time1 >= 10000) {
    digitalWrite(rele, LOW);
    value = 0;
  }
}
 
 
 
 
vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Если у Вас кнопка при замыкании соединяется с минусом тогда так

//Если не нажималось кнопка в течении 3 мин то включилось реле на 10 сек и этот цикл повторялся 3 раза....
#define kn 2
#define rele 13
byte kol;
bool value;

unsigned long time1;
unsigned long time2;

void setup() {
  pinMode(kn, INPUT_PULLUP);
  pinMode(rele, OUTPUT);
}

void loop() {
  if (digitalRead(kn) == LOW) {
    time1 = millis();
    digitalWrite(rele, LOW);
    kol = 0;
    value = 0;
  }

  else if (value == 0 && millis() - time1 >= 180000) {
    if (kol <= 3) {
      digitalWrite(rele, HIGH);
      time1 = millis();
      time2 = millis();
      kol++;
      value = 1;
    }
  }

  if (value && millis() - time1 >= 10000) {
    digitalWrite(rele, LOW);
    value = 0;
  }
}




 

Ильяс
Offline
Зарегистрирован: 26.01.2017

vosara Спасибо, ВЫ МОЗГ!!!)

Остался один минус при нажатии кнопки количество перезагрузок обнуляется т.е если осталось 2 попытки перезагрузки при нажатии становиться опять 3 попытки...

Круто было бы если максимальное количество попыток перезагрузки (3) выполнялось  раз в сутки,   т.е 3 раза включалось реле на 10 сек, следующее тройное включения выполнялось через 24 часа....

Заранее спасибо)

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

Если я правильно понял задачу тогда так

//Если не нажималось кнопка в течении 3 мин то включилось реле на 10 сек и этот цикл повторялся 3 раза....
#define kn 2
#define rele 13
byte kol;
bool value;
bool f_sutki;

unsigned long time1;
unsigned long time2;

void setup() {
  pinMode(kn, INPUT_PULLUP);
  pinMode(rele, OUTPUT);
}

void loop() {
  if (digitalRead(kn) == LOW) {
    time1 = millis();
    digitalWrite(rele, LOW);
    kol = 0;
    value = 0;
  }

  else if (!value && millis() - time1 >= 180000) {
    if (!f_sutki && kol <= 3) {
      digitalWrite(rele, HIGH);
      time1 = millis();
      time2 = millis();
      kol++;
      if (kol == 4)f_sutki = 1;
      value = 1;
    }
  }

  if (value && millis() - time1 >= 10000) {
    digitalWrite(rele, LOW);
    value = 0;
  }

  if (millis() - time2 >= 86400000) { //Вместо 86400000 ставте любой период
    f_sutki = 0;
    kol = 0;
    value = 0;
  }
}




 

Ильяс
Offline
Зарегистрирован: 26.01.2017

vosara 

 Вы новерно меня не совсем поняли)) Да теперь выполняется 3 попытки* ,если в этих попытках не нажималось кнопка то включается цикл  (millis() - time2 >= 86400000), но если нажималось кнопка  количество перезагрузок обнуляется т.е если осталось 2 попытки перезагрузки при нажатии становиться опять 3 попытки...

 

Если не понятно то могу снять видео)))

 

 

попытка*- включения реле на 10сек.

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014
//Если не нажималось кнопка в течении 3 мин то включилось реле на 10 сек и этот цикл повторялся 3 раза....
#define kn 2
#define rele 13
byte kol;
bool value;
bool f_sutki;

unsigned long time1;
unsigned long time2;

void setup() {
  pinMode(kn, INPUT_PULLUP);
  pinMode(rele, OUTPUT);
}

void loop() {
  if (!kol && digitalRead(kn) == LOW) {
    time1 = millis();
    digitalWrite(rele, LOW);
    kol = 0;
    value = 0;
  }

  else if (!value && millis() - time1 >= 180000) {
    if (!f_sutki && kol <= 2) {
      digitalWrite(rele, HIGH);
      time1 = millis();
      time2 = millis();
      kol++;
      if (kol == 3)f_sutki = 1;
      value = 1;
    }
  }

  if (value && millis() - time1 >= 10000) {
    digitalWrite(rele, LOW);
    value = 0;
  }

  if (f_sutki && millis() - time2 >= 86400000) { //Вместо 86400000 ставте любой период
    f_sutki = 0;
    kol = 0;
    value = 0;
  }
}

 

 

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

Поправил!!!

//Если не нажималось кнопка в течении 3 мин то включилось реле на 10 сек и этот цикл повторялся 3 раза....
#define kn 2
#define rele 13
byte kol;
bool value;
bool f_sutki;

unsigned long time1;
unsigned long time2;

void setup() {
  pinMode(kn, INPUT_PULLUP);
  pinMode(rele, OUTPUT);
}

void loop() {
  if (!kol && digitalRead(kn) == LOW) {
    time1 = millis();
    digitalWrite(rele, LOW);
    kol = 0;
    value = 0;
  }

  else if (!value && millis() - time1 >= 180000) {
    if (!f_sutki && kol <= 2) {
      digitalWrite(rele, HIGH);
      time1 = millis();
      time2 = millis();
      kol++;
      if (kol == 3)f_sutki = 1;
      value = 1;
    }
  }

  if (value && millis() - time1 >= 10000) {
    digitalWrite(rele, LOW);
    value = 0;
  }

  if (f_sutki && millis() - time2 >= 86400000) { //Вместо 86400000 ставте любой период
    f_sutki = 0;
    kol = 0;
    value = 0;
    time1 = millis();
    time2 = millis();
  }
}

 

Ильяс
Offline
Зарегистрирован: 26.01.2017

vosara СПАСИБО!!!!!

ВЫ мене очень сильно помогли!!!!

Как я могу вас отблагодарить?  

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

Я рад что все нормально! Форум для того и существует.