Ребята, прошу о помощи, подскажите что не так. Я сделал термостат из уно, датчика температуры, лсд экрана, и подогрева. История следующая, я заглядывал пару дней и на лсд было одно и тоже значение, я сразу на это не обратил внимания, а как оказалось он не отключал обогрев все это время, как итог перегрев, а при перезагрузке все решилось, он вновь стал нормально работать. Прошу, кто знает, объясните мне в чем причина этого явления и как мне написать код так что бы эта ситуация была исключена.
Ну ЕМНИП обычно делается так-в цикле вначале ищем датчик. Если нашли измеряем температуру и включаем ТЭН( или выключаем?) Если датчик не найден то однозначно отключаем все! Ибо можно спалить нах! Или в аквариуме уха получиться.И по возможности сигнализируем. Писком ,мигалкой, СМС или пушем. Часто бомбить датчик ненадо можно раз в минуту. А в чем затык? Код есть в примерах ds18b20 В чем присина именно у Вас? Хз. В радиотехнике три вида неисправностей. Видимо отвалился датчик в процессе нагрева а Дуня это не увидела и продолжала греть до усеру. Обычно так бывает. Дружите с Паяльником!
Конечно, есть. В МК для промышленности есть контроллеры работы осцилляторов, вачдоги, контроль памяти. Все это позволяет строить отказоустойчивые приборы. Например, банальный бытовой электросчётчик выполнен, как правило, на МК от TI (MSP430). В МК, на котором построена дурина, есть только вачдог. Я в таких приборах делаю принудительную инициализацию (перезагрузку) каждые, например, 5 секунд.
Мы как-то делали подогрев радиомодуля для его стабильной работы на улице в зимнее время. Поставили обычный промышленный термостат за 500 рублей типа такого https://m.vseinstrumenti.ru/rashodn...egulyatory/iek/nc-ot-0-do-60-c-yce-tnc-00-60/ Примерно такой же будет стоять в любом промышленном шкафу, в котором требуется обогрев или охлаждение. К чему там экраны и прочая требуха - не понятно. Ещё раз: ардуино - это Детский конструктор для творчества и обучения программированию. Этот проект не преследовал цель своей работоспособности дальше учебного стола.
Вот проект от нашего форумчанина Пушного Звера—код в описании. Качай и смотри. Учись Студент!Там есть страховка от отвалившегося датчика
Код Код (Text): // Термостат, до пяти датчиков DS18B20. // Автоматическое определение количества датчиков на // шине, установка температуры и хранение в энергонезависимой // памяти на каждый выход. // подробнее // v 0.2 beta #include <EEPROM.h> #include <OneWire.h> #include <DallasTemperature.h> #include <LiquidCrystal.h> const byte OUT[5] = {13, 12, 11, 3, 2}; // номера выходов byte pos; byte tempOUTon[5]; // массив с температурой включения выхода float tempSensor[5]; // массив куда читается температура byte qty; // количество градусников на шине OneWire oneWire(15); // A1 вход датчиков 18b20 DallasTemperature ds(&oneWire); LiquidCrystal lcd(8, 9, 4, 5, 6, 7); byte gradus[8] = { 0b00110, 0b01001, 0b01001, 0b00110, 0b00000, 0b00000, 0b00000, 0b00000 }; byte on[8] = { 0b00110, 0b01111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11110, 0b01100 }; void readSet(){ for (byte i = 0; i < qty; i++) tempOUTon[i] = EEPROM.read(i); } void outOff(){ // выключает выходы for (byte i = 0; i < qty; i++) digitalWrite(OUT[i], LOW); } void erorr(){ // останавливает работу программы и сигнализирует ошибку outOff(); // выключаем выходы while(1){ // крутим бесконечный цикл analogWrite(10, 100); delay(500); analogWrite(10, 255); delay(500); } } //// byte key(){ //// для кнопок ЛСДшилда int val = analogRead(0); if (val < 50) return 5; else if (val < 150) return 3; else if (val < 350) return 4; else if (val < 500) return 2; else if (val < 800) return 1; else return 0; } //// void setMenu(byte pos){ // установка температуры outOff(); lcd.clear(); while(1){ // крутим бесконечный цикл byte KEY = key(); // читаем состояние кнопок lcd.setCursor(2, 0); // выводим на экран lcd.print("Out:"); lcd.print(pos+1); lcd.setCursor(9, 0); lcd.print("Pin:"); lcd.print(OUT[pos]); lcd.print(" "); lcd.setCursor(0, 1); lcd.print(" PinON: "); lcd.print(tempOUTon[pos]); lcd.write(1); lcd.print("C <>"); if (KEY == 2) { // если нажата кнопка tempOUTon[pos]--; // изменяем значение if (tempOUTon[pos] > 125) tempOUTon[pos] = 0; EEPROM.write(pos, tempOUTon[pos]); // сохраняем в еепром } else if (KEY == 5){ tempOUTon[pos]++; if (tempOUTon[pos] > 125) tempOUTon[pos] = 0; EEPROM.write(pos, tempOUTon[pos]); } delay(200); }///// }// void getTemp(){ // читаем температуру и заполняем массив ds.requestTemperatures(); for (int i = 0; i < qty; i++) tempSensor[i] = ds.getTempCByIndex(i); } void setup() { Serial.begin(9600); ds.begin(); qty = ds.getDeviceCount(); // количество датчиков на шине if (qty > 5) qty = 5; // if (qty < 5) erorr(); // проверка количества датчиков for (int i = 0; i < qty; i++) pinMode(OUT[i], OUTPUT); for (int i = 0; i < qty; i++) digitalWrite(OUT[i], LOW); lcd.createChar(1, gradus); lcd.createChar(2, on); lcd.begin(16, 2); lcd.clear(); readSet(); // читаем настройки из еепром } void loop() { ///// обработка кнопок if (key() == 1) setMenu(pos); // если нажата селект, уходим в настройки else if (key() == 4 && pos < qty-1) pos++; // крутим позицию else if (key() == 3 && pos != 0) pos--; getTemp(); // читаем температуру с датчиков //// сверяем температуру и управляем выходами for (int i = 0; i < qty; i++) { if (tempSensor[i] < tempOUTon[i]) digitalWrite(OUT[i], HIGH); else digitalWrite(OUT[i], LOW); } /////// вывод инфы на экран lcd.setCursor(0, 0); lcd.print(pos+1); lcd.print(". "); lcd.print(tempSensor[pos], 1); // показываем температуру с датчика lcd.write(1); lcd.print("C "); lcd.setCursor(2, 1); lcd.print(tempOUTon[pos]); // показываем установленную температуру lcd.write(1); lcd.print("C "); lcd.setCursor(11, 0); // рисуем статус выхода for (int i = 0; i < qty; i++){ if (digitalRead(OUT[i])) lcd.write(2); else lcd.print(" "); } lcd.setCursor(11, 1); // рисуем номера выходов for (int i = 0; i < qty; i++) lcd.print(i+1); }
и почему же он будет щёлкать? если не умеешь пользоваться инструментом, то инструмент никогда не поможет.
как твой код отслеживает сбой программного счётчика от импульса, который порождён коммутацией высоковольтной цепи?
Код не мой он Пушного Звера из видео. Все нюансы в жизни не просчитаешь. Он конечно никак не защищен от падения самолетов на голову или ЭМИ вследствии ядерного взрыва но насколько велика вероятность таких событий? Видимо перезагружать снова и снова? Для чего ж он тогда нужен?
Ну перезагружаем МК. Почему реле должно щёлкнуть? У тебя МК сколько грузится? В нормальных МК, например, в TI, выходные драйверы можно защёлкнуть и тогда их выходное значение вообще никогда не изменится, пока подано питание. В авр такой роскоши нет, но тем не менее.
Ардуино не виснет, проверено на практике. Ставил аппаратный вотчдог для Leonardo ETH с Ethernet на чипе Wiznet W5500, которая работает на даче, так он не разу не сработал за примерно 5 лет. С большой вероятностью, все проблемы в коде. У @parovoZZ похоже психологическая травма связанная с Ардуино, Поэтому он в каждом посте об этом пытается говорить.
Воо, спасибо большое, я подумал она зависла, хотя я тоже подумал что там как минимум виснуть нечему, да и не должно такого быть. Просто как я заметил пару дней подряд лсд показывал на датчике температура была одна и та же и не менялась, а при перезагрузке он стал ее нормально обновлять, а была она ниже порога срабатывания и как ты и сказал выше у меня получилась уха... Я вот не знаю на что тут думать, может датчик так отвалился, я думаю дописать код который меня перестрахует от этой ситуации не сложно, но блин думаю для начала надобно понять в чем собственно была проблема. у меня стоит в коде isnan() поэтому грешить на отсутствие показаний не приходится, как это можно понять не подскажите?
Прошил контроллер с настроенным ватчдогом, взвел его на 5 секунд, что должно произойти чтобы его сбросить, и что должно произойти чтобы микроконтроллер перезагрузился? Как ватчдог применим в данном конкретном случае? Каковы условия? Ты же про это ничего не сказал - поэтому пришлось самому додумывать как же это должно работать. П.С А ну если только прерывание по фронту и там уже сбрасывать ватчдог...