Watchdog мне в помощь

Juised90
Offline
Зарегистрирован: 12.03.2016

Очень нужна помощь с функцией перезагрузки в arduino. Начну сначала. Мне собрали автоматику в инкубатор на базе ардуино уно, но что то пошло не так и платформа начала зависать, не отключился нагрев и яйца в инкубаторе нагрелись до 50 градусов, яйца пришлось выкинуть. Так вот, в нете нарыл информацию про watchdog и думаю что он должен мне помочь, т.к. эти зависания продолжаются. В программировании я не бум бум и не знаю куда вставить код от watchdog, очень нужна помощь, исходный код свой попробую сюда выложить.

Juised90
Offline
Зарегистрирован: 12.03.2016
//Скетч инкубатора с индикацией на LCD дисплее 16х2

#include <LiquidCrystal.h>
#include <DHT.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2 // порт приема данных датчика DS - pin 2

int motor = 10;// мотор переворота
int nagrev = 11;// нагреватель
int tuman = 12;// туманогенератор

//******************************************************************
//                                                                 *
int Date = 19; //задание дней работы мотора переворота инкубатора  *
float Tzad = 37.8; //заданная температура регулирования в град.С   *
float tvrash = 7.65;  //задание времени вращения мотора в секундах  *
int himidr = 60;  //задание влажности в инкубаторе в %             *
int fvrash = 2;  //задание количества переворотов в час            *
//                                                                 *
//******************************************************************

int tzad = 9179; //задержка при опросе датчиков в миллисекундах
//long time = 0; //счетчик времени работы программы
long P = 0; //переменная времени цикла программы, сек.
//long Ftime = 0; //переменная периода вращения мотора
int Np = 0; //счетчик числа переворотов

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DHT dht;


void setup() {
  Serial.begin(9600);
  //while (!Serial) ; // ожидание ответа порта
  sensors.begin();
  Serial.println("Inkubator");

  lcd.begin(16, 2);   // задание вывода на LCD количества символов и строк 
  lcd.setCursor(0,0); 
  lcd.print("Inkubator");   // Вывод заголовка на дисплей 
  dht.setup(3); // порт приема данных датчика DHT - pin 3

  pinMode(motor, OUTPUT);// управление мотора
  pinMode(nagrev, OUTPUT);// управление нагрева
  pinMode(tuman, OUTPUT);// управление туманогенератора
  digitalWrite(motor,HIGH);  //выключить мотор  
  digitalWrite(nagrev,HIGH);  //выключить нагрев
  digitalWrite(tuman,HIGH);  //выключить туманогенератор

  tvrash = tvrash*1000;    // перевод времени переворота в миллисекунды
  fvrash = 3600/fvrash; //период переворота яиц в секундах
  
  Serial.print("Status\tEND_Day\t\tHumidity (%)\tTemperature (C)");
  Serial.println("\tTuman_Status \tNagrev_Status \tMotor_Status");
}

void loop() {
  
  sensors.requestTemperatures();
  float temperature = sensors.getTempCByIndex(0);

  float humidity = dht.getHumidity();  //считать влажность
  if (isnan(humidity))     { 
    //Serial.println("Failed to read from DHT/DS");
    return;
  }
  Serial.print(dht.getStatusString());
  Serial.print("\t");
  Serial.print(Date - P/86400); //вывод оставшихся дней
  Serial.print("\t\t");
  Serial.print(humidity, 0);
  Serial.print("\t\t");
  Serial.print(temperature, 1);

  lcd.setCursor(0,0); 
  lcd.print("                "); //стирание экрана
  lcd.setCursor(0,0); 
  lcd.print(dht.getStatusString());
  lcd.print(" H% TrmC H N M");
  lcd.setCursor(0,1); 
  lcd.print(Date-P/86400); //вывод оставшихся дней
  lcd.setCursor(3,1); 
  lcd.print(humidity, 0);
  lcd.setCursor(6,1); 
  lcd.print(temperature, 1);
  
  if (humidity<himidr) {//если влажность меньше заданной
    digitalWrite(tuman,LOW);  //включить туманогенератор
    Serial.print("\t\tYES");//вывод инфо состояния
    lcd.setCursor(11,1); 
    lcd.print("Y");
  }
  else  { 
    digitalWrite(tuman,HIGH);
    Serial.print("\t\tNO");//вывод инфо состояния
    lcd.setCursor(11,1); 
    lcd.print("N");
   }
   
  if (temperature<Tzad)  {  //если температура меньше заданной
    digitalWrite(nagrev,LOW);  //включить нагрев
    Serial.print("\t\tYES");  //вывод инфо состояния
    lcd.setCursor(13,1); 
    lcd.print("Y");
  }   
  else {  //иначе температура больше заданной
    digitalWrite(nagrev,HIGH);  //выключить нагрев
    Serial.print("\t\tNO");//вывод инфо состояния
    lcd.setCursor(13,1); 
    lcd.print("N");
  }
  
  if ((Date - P/86400 > 0) && (P > (Np * fvrash))) {  //если подошло время переворота яиц
    Np = Np ++; //увеличение счетчика на 1
    digitalWrite(motor,LOW);  //включить мотор переворота
    Serial.print("\t\tYES");  //вывод инфо состояния
    lcd.setCursor(15,1); 
    lcd.print("Y"); //вывести сообщение о включении мотора
    delay (tvrash);  //выполнить задержку на время вращения
    digitalWrite(motor,HIGH);  //выключить мотор переворота
    lcd.setCursor(15,1); 
    lcd.print("N"); //вывести сообщение о выключении мотора
  delay(tzad - tvrash); //выполнить дополнительную задержку
  }
  else {  //иначе
    digitalWrite(motor,HIGH);  //выключить мотор переворота
    Serial.print("\t\tNO");//вывод инфо состояния
    lcd.setCursor(15,1); 
    lcd.print("N"); //вывести сообщение о выключении мотора
  delay(tzad); //выполнить задержку на время опроса датчиков
  }   
  /*Serial.println();
  
  time = millis(); //подсчет времени работы программы в миллисекундах
  Serial.print(P);
  Serial.print("\t");
  Serial.print(Np);
  Serial.print("\t\t");
  Serial.println(time); //вывод времени работы программы*/
  P = P + 10; //подсчет времени работы программы в сек.

}

 

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

забей, пожалуйста, [watchdog] в форму поиска форума - верхний правый угол.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, если Вам нужен кода для WatchDog, то в разделе "Ищу исполнителя" кто-нибудь сделает, обратитесть.

Только очень не советую. Вы хотите спрятать проблему, а не решить её (голову в песок запихать). Ни с того ни с сего ничего не зависает, так что я бы на Вашем емсте попытался испраить код программы, а не маскировать её зависания WatchDog'ом.

std
Offline
Зарегистрирован: 05.01.2012

Juised90 пишет:
В программировании я не бум бум и не знаю куда вставить код от watchdog, очень нужна помощь

В начале вставить:

#include <avr\wdt.h>

после строки 035 (внутри setup):

 wdt_enable(WDTO_2S);

после строки 060 (внутри loop):

 wdt_reset();

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

Juised90
Offline
Зарегистрирован: 12.03.2016

Спасибо за подсказку, вообщем все сделал как написано, но теперь перезагрузка происходит каждые 2 сек, а не во время зависания.

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Цитата:
теперь перезагрузка происходит каждые 2 сек
Потому что delay() 9 сек.

Juised90
Offline
Зарегистрирован: 12.03.2016

Т.е. как я понял у меня не хватает строки delay(9000)?

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

delay() у тебя стоит в строках 126 и 133, а собака настроена на 2 сек. Пока delay() 9 сек. ничего не делает, собака-то продолжает считать...

axill
Offline
Зарегистрирован: 05.09.2011

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

внимание уделить нужно первым двум

а watchdog делается проще простого. Сначала скорее всего стоит заменить загрузчик, прошить optiboot. 90 на 10, что ваш текущий загрузчик не заработает с watchdog

Дальше:

#include <avr/wd.h>

В setup запускаем watchdog, а в loop делаем wd_reset так часто, чтобы в штатной ситуации собака не перезапускала ардуину

std
Offline
Зарегистрирован: 05.01.2012

axill прав, тащемта

Но хрен знает чего там ловить без приборов. Так то скетч достаточно чист. Конечно, неясно зачем 9179 (10 сек минус длительность цикла, чтобы опрашивать точно раз в 10 с?), алсо мне дико не нравится if(isnan(humidity)) return; - куда return, не в наружу ли цикла? Тогда дуина ничего не делает, потом проверяет влажность - там isnan и снова ничего не делать в цикле. Вот и повесились (на самом деле в этом месте не повиснет, а будет читать из dht и больше ничего не делать). Словом, перебрать придётся весь алгоритм.

 

Juised90
Offline
Зарегистрирован: 12.03.2016

У меня Arduino Uno, на поддержку собаки проверил по этой ссылке https://geektimes.ru/post/255800/ 

В контактах проблемы быть не должно, но вот в нашем частном секторе частые скачки напряжения, может ли это приводить к зависанию?

И еще дисплей 16х2 после непродолжительного времени работы меняет все надписи на иероглифы, причем может почти сразу поменять или через час. Это не качественный дисплей или что то другое?

axill
Offline
Зарегистрирован: 05.09.2011

Если контакты не вызывают сомнений, то следующим я бы проверял питание.

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

Расскажите чем питаете, может что то порекомендую

иероглифы могут быть и из за помех по питанию и из за брака самого дисплея, но скорее первое чем второе

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

Juised90
Offline
Зарегистрирован: 12.03.2016

Нагреватель лампочка на 40 ватт, питаю от адаптера на 9 вольт, выглядит как зарядка от телефона. К сожалению у меня ни где нет напряжения лучше, стабилизировать напряжение нечем. Из скетча я убрал регулировку влажности, оставил только измерение, дисплей стал работать дольше, не знаю почему.

std
Offline
Зарегистрирован: 05.01.2012

Параллельно питанию в непосредственной близости от экрана 100 мкФ электролит и 0.022-0.1 мкФ керамику, мб поможет.

axill
Offline
Зарегистрирован: 05.09.2011

Адаптер испульсный? Можно понять если разобрать

импульсные очень часто отвратительного качества и если в хорошей сети еще худо бедно могут работать, то при плохом питании без замеров можно лишь гадать что там на выходе

в вашем случае я бы рекомендовал классическую схему питания с обычным трансформатором, диодным мостом, снлаживающими конденсаторами и линейным регулятором типа 7805

Если трансформатора нет и найти не возможно то найти зарядку на 12-24в, после нее поставить хороший LC фильтр и опять же конденсаторы и линейный стабилизатор на 5в, встроенный регулятор ардуины не использовать

кроме того может помочь заземление минуса питания (GND). Если есть нормальное заземление, заведите его на GND ардуины

Juised90
Offline
Зарегистрирован: 12.03.2016

А если зарядку от ноута?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Juised90 пишет:

стабилизировать напряжение нечем. 

Да, возьмите подобную штуковину, наверняка у Вас или у знакомых валяются в старых запылённых корпусах  (или купите, на худой конец).

Будет Вам вполне достойное стабилизированное питаине.

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

axill
Offline
Зарегистрирован: 05.09.2011

Можно зарядку от ноута. Посмотрите какое напряжение на выходе, обычно 19в

опять же внутренний стабилизатор ардуино не использовать, он плохо тепло отводит. Поставить внешний 7805 с радиатором. Предварительно посчитать потребление всей схемой и проверить по расчетам, что 7805 потянет

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

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

Juised90
Offline
Зарегистрирован: 12.03.2016

Да на БП от ноута 19В, не сгорит ли моя плата?:-) УПС тоже есть, но сдох акум. Сейчас ардуина начала выключается сама, работает около часа двух, потом отключается и минуту через 5-10 включается, может это перегрев?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Juised90 пишет:

Да на БП от ноута 19В, не сгорит ли моя плата?:-) УПС тоже есть, но сдох акум. Сейчас ардуина начала выключается сама, работает около часа двух, потом отключается и минуту через 5-10 включается, может это перегрев?

Может и перегрев. Трогали? Там предельное напряжение завлено 20, так что может и поплохеть ей, если долго держать.

Я же Вам говорю, возьмите компьютерный БП - там и и 5В, и 12, и 3,3. Все стабилизированно. Нагрузки выдерживает большие. В чём проблема? Не верю, что у Вас или у Ваших знакомых нет. А если даже и нет - цена впроса меньше тысячи рублей. Только обязательно при выборе смотрите, чтобы была защита от КЗ (у того, что я давал ссылку - есть).

Juised90
Offline
Зарегистрирован: 12.03.2016

Нашел БП от Сеги:-) 9В 200 мА рабочий, можно его?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не знаю, кто такая Сега. А 200мА Вам на всё хватает? Вы считали?

axill
Offline
Зарегистрирован: 05.09.2011

Juised90 пишет:

Да на БП от ноута 19В, не сгорит ли моя плата?:-) УПС тоже есть, но сдох акум. Сейчас ардуина начала выключается сама, работает около часа двух, потом отключается и минуту через 5-10 включается, может это перегрев?

стабилизатор на плате ардуино по напряжению расчитан на 35в, но напряжение здесь вторично, более важна рассеиваемая мощность, она считается  как (19-5) умноженное на ток потребления. Максимальная мощность для стабилизатора ардуины не велика, поэтому я писал про внешний 7805 с радиатором

paf
Offline
Зарегистрирован: 25.01.2013

DHT... Вы это серьезно? Ну э-это же не серьезно!

Вышеприведенное при "наиудачнейшем расположении звезд" даст процентов 30 - 40 вывода.  Суммируя все затраты... однозначно покупать двухнедельных цыплят в количестве 100 шт.  - дешевле.

Есть ключевая фраза: "Автоматика для простого умного инкубатора".

 

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

Прикольненько так то получается:) :

013
	//******************************************************************
014
	//                                                                 *
015
	int Date = 19; //задание дней работы мотора переворота инкубатора  *
016
	float Tzad = 37.8; //заданная температура регулирования в град.С   *
017
	float tvrash = 7.65;  //задание времени вращения мотора в секундах  *
018
	int himidr = 60;  //задание влажности в инкубаторе в %             *
019
	int fvrash = 2;  //задание количества переворотов в час            *
020
	//                                                                 *
021
	//******************************************************************

.
.
.
126
	  delay(tzad - tvrash); //выполнить дополнительную задержку

Может и еще где чего есть, особо не вглядывался, так только, на вскидку. Проверяйте код весь.

James
Offline
Зарегистрирован: 26.02.2016
int tzad = 9179; //задержка при опросе датчиков в миллисекундах

конкретно этот кусок норм, там разница в tzad и  Tzad, другой вопрос что считается тут моветоном переменные с большой буквы:)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

James пишет:
конкретно этот кусок норм

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

Хотя, недавно тут один один орёл доказывал, что герцы можно с секундами складывать, правда так и пояснил в каких попугаях результат получается :)

James
Offline
Зарегистрирован: 26.02.2016


10 float tvrash = 7.65; //задание времени вращения мотора в секундах * 
023 int tzad = 9179; //задержка при опросе датчиков в миллисекундах 

где тут кол-во оборотов?

только от миллисекунд к секундам не перешел, а так вроде одинаковые единицы 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Виноват, с прямым углом (со строкой 19 оригинального кода) перепутал. Названия переменных почти идентичны :) тоже тот ещё стиль.

James
Offline
Зарегистрирован: 26.02.2016

тоже так называю для быстроты:)  а что бы читабельнее было "ctr+h":)

 

Juised90
Offline
Зарегистрирован: 12.03.2016

По поводу выводка, автоматика на стадии доработки, режим и инкубации подглядел на одном сайте, это не значит что они такими и останутся, буду подбирать опытным путем. Тему про умный инкубатор читал, но так как не имею познаний в электронике и программировании воспроизвести что то похожее для меня проблематично. Схему мне собирал отец и программу писал. Все что мы задумали работает, лоток поворачивает, температуру и влажность держит. Но проблема с зависанием ни куда не уходит, я думал что бы не останавливать инкубатор смогу вписать воч дога сам, но не получилось. Изображение на экране через некоторое время сменяется на непонятные символы. Вообщем инкубатор отключил, яйца выкинул(. Андуринку отдал отцу на доработку. Буду осваивать тоже, программирование затягивает). Может у кого есть мысли по поводу зависания и изображения на экране? Сразу оговорюсь, схема собрана качественно, ни к контактам, ни к питанию притензий быть не может. Буду рад любой помощи.

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

Juised90 пишет:

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

Чудес не бывает - 99% помеха по цепям питания.
Один раз поймал такой глюк через китайский безотмывочный флюс. При определенной температуре становился электропроводным и вешал I2C шину вместе с контроллером. Правда ресет там не помогал, пока не остынет.
Смотрите разводку силовых цепей, последовательно вводите их в эксплуатацию, пока четко не локализуете глючную линию. Дальше уже решать, как ее развязать-развести с контроллером.
Для исключения ошибок связанных с сельским электропитанием, временно запустить питание слаботочной части от старого а/м аккумулятора, через внешний стабилизатор.
Датчик DHT выкинул бы сразу. Посмотрите на этот. Есть ли они там сейчас не знаю. Но это было самое дешевое, что нашел в РФ.

James
Offline
Зарегистрирован: 26.02.2016

да мне тоже так кажется, что проблема в помехах

http://easyelectronics.ru/razvedenie-pitaniya.html

http://caxapa.ru/lib/emc_immunity.html

вот ссылки, я тоже начинающий и они мне многое объяснили:) 

paf
Offline
Зарегистрирован: 25.01.2013

Juised90 пишет:
Схему мне собирал отец и программу писал. Все что мы задумали работает, лоток поворачивает, температуру и влажность держит.

Это лишь кажется... На DHT11 надеяться нельзя. Это цыган. Максимум чему можно верить, это повышение или понижение влажности. Нужен Сенсирион. Он дорого стоит у нас. Но у китайцев сносно. Но без трат получить результат невозможно! Мы же хотим повторить природный процесс! Наседка использует то же ПИД регулятор. Переворачивая, перекладывая яйца. К концу срока насиживания уменьшая нагрев, и увеличивая влажность. Почитай на фермер ру про потерю влажности при инкубации.

Далее. Всю электронику вы с отцом сделали, так что и воспроизводить то вам там нечего. Поизучай код Романа. Там все понятно. И как экран и вачдог работает. Кстати, он работает из коробки только на УНО. Остальным ардуинам  перешивать загрузчик. Ключевое слово Оптибут. Регулятор влажности, вентиляция. Ты думаешь, что это навороты?! Э-ээ, не-ет! Он, Роман, практик. Я использовал его код. 100% результат. А там еще воздухообмен очень важен! Нужен приток свежего воздуха. Значит нужно увеличивать объем инкубатора. А если попытаться в малом объеме, то значительные скачки температуры на коде без ПИД регулятора неизбежны. А в конце срока инкубации нужно резко и очень высоко поднять влажность, до 80-85 !!! %. А это не так просто. Там температура скакать начинает как... А это решающий момент! В конце концов, то что вы с отцом делаете должно превзойти эти пенопластовые упаковочные коробочки из магазина, и получилось у вас или нет покажет результат. Выводимость пенопласта максимум 60%. А там нет ничего! Все тупо как детская игрушка на проводах!

А по поводу 1602... Китайские иероглифы... У меня эта лабуда включается в октябре и выключается в апреле. Питается от компового БП. Длина проводов питания - 50см. Но есть длинные линии на DS18b20... Глюки от иероглифов до полного стирания экрана.  И по ссылкам выше похоже на истину, что кажущиеся простому электрику :) правильные соединения на деле грубые ошибки!

nikolaki
nikolaki аватар
Offline
Зарегистрирован: 14.02.2013

axill пишет:

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

внимание уделить нужно первым двум

а watchdog делается проще простого. Сначала скорее всего стоит заменить загрузчик, прошить optiboot. 90 на 10, что ваш текущий загрузчик не заработает с watchdog

Дальше:

#include <avr/wd.h>

В setup запускаем watchdog, а в loop делаем wd_reset так часто, чтобы в штатной ситуации собака не перезапускала ардуину

До сих пор не использовал ВАТЧДОГ.Но в одном устройстве за год работы раза 3-4  проявились зависания.Скорее всего из-за помехи по питанию. Вопрос: ВАТЧДОГ - панацея от ошибок прграмных ? Или может сбросить мк и при зависании при помехе по питанию?  Или и вачдог в ступоре от помех по питанию?

axill
Offline
Зарегистрирован: 05.09.2011

Вотчдог не панацея, это один из хороших инструментов в дополнение к качественному питанию и хорошо отлаженной программе, а не вместо

в определенных рамках защитит и от программных ошибок и от сбоев по питанию

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

nikolaki пишет:

Или и вачдог в ступоре от помех по питанию?

сам задумайся, если ядро контроллера превратилось в кирпич, то что?