Перезагрузка системы при зависании, контроль зависании сигнализирует светодиод...
- Войдите на сайт для отправки комментариев
Чт, 26/01/2017 - 15:19
Идея такая... нужно реализовать систему под контролем ардуино, которая следила бы состояния оборудования о наличи зависании...
Алгоритм следующий, у оборудования мигает светодиод сигнал с нее берется транзисторным оптроном PC817 и дает сигнал ардуине, ардуино следит, если нет имений в течении 3 мин то включает реле на 3 сек, реле перезагружает оборудование
Помогите с чего капать...
Идея такая... нужно реализовать систему под контролем ардуино, которая следила бы состояния оборудования о наличи зависании...
Алгоритм следующий, у оборудования мигает светодиод сигнал с нее берется транзисторным оптроном PC817 и дает сигнал ардуине, ардуино следит, если нет имений в течении 3 мин то включает реле на 3 сек, реле перезагружает оборудование
Помогите с чего капать...
Вечером домой как прийду скину вам код как я решил такую проблему. Может быть не совсем правильно но задача была примерно как у вас.
Выход оптрона цепляете на прерывание и при каждом срабатывании обнуляете таймер
При прекращении поступления импульсов, таймер перестанет обнуляться и отсчитает свои 3 минуты.
Таймер можно реализовать "через millis()" или использовать аппаратный.
Также, можно реализовать ограничение перезапусков оборудования - если оно неисправно, какой смысл его перезапускать бесконечно?
С нетерпением буду ждать.....
С нетерпением буду ждать.....
Если будут вопросы могу объяснить что и как тут работает. но вроде я все описал. ошибок возможно тут много и можно реализовать лучше. но мою поставленую задачу я решил этим кодом.
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;} }Спасибо! Щя попробую разобраться...
А у вас какая задача стояла системы? Можите разказать подробее....
Спасибо! Щя попробую разобраться...
А у вас какая задача стояла системы? Можите разказать подробее....
задача была набирать емкость водой.
при пустом баке включается насос емкость начинает набираться достигает нижнего уровня а потом верхнего. как достигает верхнего отключается насос. в качестве защиты от перелива в случае неполадки верхнего электрода (например обрыва провода) и использовал такой таймер.
Спасибо! Щя попробую разобраться...
А у вас какая задача стояла системы? Можите разказать подробее....
сейчас я попробую сделать вам образец а вы уже там для себя подберете как вам нужно
Огpомное Вам спасибо, выручаете! столько всего полезного
сейчас код отработывает только один раз. я сам только учусь поэтому я еще посмотрю что можно сделать. Ну а пока посмотрите этот может что свое придумаете
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; } }Ильяс, если требуется только отслеживать мигания светодиода, то МК это пушка для воробьев. КР1006ВИ1, 555 таймер это делают проще и дешевле.
Выход оптрона цепляете на прерывание и при каждом срабатывании обнуляете таймер
При прекращении поступления импульсов, таймер перестанет обнуляться и отсчитает свои 3 минуты.
Таймер можно реализовать "через millis()" или использовать аппаратный.
Также, можно реализовать ограничение перезапусков оборудования - если оно неисправно, какой смысл его перезапускать бесконечно?
Таймер - это лишняя сущность.
Прерывание должно запоминать момент, а который оно произошло, а основной цикл - проверять, что с последнего прерывания прошло времени меньше таймаута.
Согласен. Так даже проще.
Постановку задачи другими словами.....
Если не нажималось кнопка в течении 3 мин то включилось реле на 10 сек и этот цикл повторялся 3 раза....
с виду задача фигня но как столкнулся то в ступор встал.... я не программист
Может у кого есть наброски кода))) помогите пожалуйста.....
Посмотрите так
//Если не нажималось кнопка в течении 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 спасибо БОЛЬШОЕ!!!
У меня вопрос. что мне сделать с кодом так чтобы работала наоборот т.е. сейчас система работает таким образом....
если кнопка нажата 3 минуты то включает реле на 10 сек а надо
если кнопка не нажималось 3 минуты то включалось реле на 10 сек...
Заранее спасибо..)
//Если не нажималось кнопка в течении 3 мин то включилось реле на 10 сек и этот цикл повторялся 3 раза....
Если у Вас кнопка при замыкании соединяется с минусом тогда так
//Если не нажималось кнопка в течении 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; } }vosara Спасибо, ВЫ МОЗГ!!!)
Остался один минус при нажатии кнопки количество перезагрузок обнуляется т.е если осталось 2 попытки перезагрузки при нажатии становиться опять 3 попытки...
Круто было бы если максимальное количество попыток перезагрузки (3) выполнялось раз в сутки, т.е 3 раза включалось реле на 10 сек, следующее тройное включения выполнялось через 24 часа....
Заранее спасибо)
Если я правильно понял задачу тогда так
//Если не нажималось кнопка в течении 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; } }vosara
Вы новерно меня не совсем поняли)) Да теперь выполняется 3 попытки* ,если в этих попытках не нажималось кнопка то включается цикл (millis() - time2 >= 86400000), но если нажималось кнопка количество перезагрузок обнуляется т.е если осталось 2 попытки перезагрузки при нажатии становиться опять 3 попытки...
Если не понятно то могу снять видео)))
попытка*- включения реле на 10сек.
//Если не нажималось кнопка в течении 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; } }Поправил!!!
//Если не нажималось кнопка в течении 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(); } }vosara СПАСИБО!!!!!
ВЫ мене очень сильно помогли!!!!
Как я могу вас отблагодарить?
Я рад что все нормально! Форум для того и существует.