Динамический термостат (по графику)
- Войдите на сайт для отправки комментариев
Добрый день.
Задача: ========
построить печь.
температура: от 30 С до 300 С
изменение температуры идет по графику
графики будут разные
пример графика:
нагрев от 30 с до 85 С за 2 часа
далее на 85 С печь стоит еще 1 час,
далее подъем температуры от 85 С до 170 С за 3 часа
и на 170 печь стоит еще 2 часа,
далее подъем от 170 С до 220 С за час,
на 220 С печь стоит 1 час и
далее медленно и контролируемо остывает до 30 С за 3 часа
В наличии: ========
1) Arduino Uno
2) термистор NTC3950 100K
3) твердотельное реле 25А
4) lcd keypad shield 1602
5) печь с тенами
что уже сделал: ========
нашел как на LCD вывести комнатную температуру с большими погрешностями
// include the library code:
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
byte gradus[8] = {
0b00110,
0b01001,
0b01001,
0b00110,
0b00000,
0b00000,
0b00000,
0b00000
};
void setup(){
pinMode(A1, INPUT);
Serial.begin(9600);
Serial.println("Start");
lcd.createChar(1, gradus);
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.setCursor(0,0);
lcd.print("LCD Key Shield");
}
void loop(){
float v = analogRead(A1);
Serial.print(v);
Serial.print("t");
Serial.print(analog2tempBed(v));
Serial.println();
delay(1000);
v/=20;
lcd.setCursor(0,1);
lcd.print(v);
lcd.write(1); //выводим символ градуса
lcd.print("C");
}
const short temptable_11[][2] PROGMEM = {
{1, 841},
{54, 255},
{107, 209},
{160, 184},
{213, 166},
{266, 153},
{319, 142},
{372, 132},
{425, 124},
{478, 116},
{531, 108},
{584, 101},
{637, 93},
{690, 86},
{743, 78},
{796, 70},
{849, 61},
{902, 50},
{955, 34},
{1008, 3}
};
# define BEDTEMPTABLE_LEN (sizeof(temptable_11)/sizeof(*temptable_11))
#define PGM_RD_W(x) (short)pgm_read_word(&x)
static float analog2tempBed(int raw) {
float celsius = 0;
byte i;
for (i = 1; i < BEDTEMPTABLE_LEN; i++)
{
if (PGM_RD_W(temptable_11[i][0]) > raw)
{
celsius = PGM_RD_W(temptable_11[i - 1][1]) +
(raw - PGM_RD_W(temptable_11[i - 1][0])) *
(float)(PGM_RD_W(temptable_11[i][1]) - PGM_RD_W(temptable_11[i - 1][1])) /
(float)(PGM_RD_W(temptable_11[i][0]) - PGM_RD_W(temptable_11[i - 1][0]));
break;
}
}
// Overflow: Set to last value in the table
if (i == BEDTEMPTABLE_LEN) celsius = PGM_RD_W(temptable_11[i - 1][1]);
return celsius;
}
Но в этом коде понимаю частично, так как програмированием не владею - художники мы.
Собрал код интуитивно из сторонних примеров.
Подскажите как более грамотно реализовать поставленную задачу?
Подскажите как более грамотно реализовать поставленную задачу?
Заказать специалисту!
Так, как Вы пытаетесь делать, она в принципе не будет работать. У нагревателя есть инерция, его будет раскачивать градусов на десять туда-сюда (т.е. Вы своё реле выключили, а печь продолжает нагреваться некоторое время). Если нужна тонкая и точная регулировка, это делается не с реле (которое может нагреватель только включить и выключить), а с плавным регулирование мощности нагревателся.
Если не лень, погуглите, конечно, вот пот таким словам, но, если нужен реальный результат, то лучше обратитесь не к художнику, а к инженеру.
оно конечно пральна, ...
тогда еще можно задать верхнюю планку цены, глядя на цену готового девайса
http://www.varta-spb.ru/catalogue/37/103.html
зы. бум считать, что исключительно из любви к прекрасному выдал эту ссылку =)
тогда еще можно задать верхнюю планку цены, глядя на цену готового девайса
http://www.varta-spb.ru/catalogue/37/103.html
зы. бум считать, что исключительно из любви к прекрасному выдал эту ссылку =)
Ну, будем считать, у художников с любовью к прекрасному всек в порядке.
Только Вы сравниваете... как бы Вам попонятнее объяснить... типографскую репродукцию Шишкина с авторской работой пусть даже менее известного художника.
Заказать специалисту!
Специалитами не рождаются.
И Если я решил сам как-то выкручиваться и обратился на форуме за помощью - значит в априоре вопрос о заказать идет мимо.
Так, как Вы пытаетесь делать, она в принципе не будет работать. У нагревателя есть инерция, его будет раскачивать градусов на десять туда-сюда (т.е. Вы своё реле выключили, а печь продолжает нагреваться некоторое время). Если нужна тонкая и точная регулировка, это делается не с реле (которое может нагреватель только включить и выключить), а с плавным регулирование мощности нагревателся.
Во т принцим я и хочу уловить, может уже делали подобное?
Тэны можно заменить на лампы,
и еще может чего, вобщем я сюда за советами пришел.
Если не лень, погуглите, конечно, вот пот таким словам, но, если нужен реальный результат, то лучше обратитесь не к художнику, а к инженеру.
В сторону ПИД регулятора тоже смотрю, но думаю потянет ли?
Ведь в среднем нужен подъем температуры 2 градуса в минуту, то есть инерции нагревателя должно хватить с лихвой и очень многое зависит от точности термометра и полосы допустимых отклонений - это я как инженер говорю.
оно конечно пральна, ...
тогда еще можно задать верхнюю планку цены, глядя на цену готового девайса
http://www.varta-spb.ru/catalogue/37/103.html
зы. бум считать, что исключительно из любви к прекрасному выдал эту ссылку =)
и ни чего не правильно.
ибо считаю правилом хорошего тона разбираться в устройствах с которыми буду работать.
Выша ссылка немного не в тему.
точ то мне примерно надо - это вот http://www.termodat.ru/catalog/16e/termodat-16e5/
и цена там не демократичная, даи покупать желания нет.
Есть желание сделать.
может уже делали подобное?
Да, нет, что Вы! Температуру никто и никогда не регулировал, Вы первопроходец :))))
В сторону ПИД регулятора тоже смотрю, но думаю потянет ли?
Если нужно точная регулировка, то только сюда и надо смотреть. Насчёт "потянет" - не понял вопроса. Кто потянет, чего потянет? Если вопрос "потянет ли данный микроконтроллер управление ПИД-ругулятором темепературы", то ответ - потянет штук двадцать одновременно.
полосы допустимых отклонений
А вот с этого надо было начинать. В постановке задачи уж больно точно всё было. Мне, например, для травления плат нужна температура раствора 50 плюс/минус 10 градусов. Используется киловатная печка. Так там я вообще не парьюсь Тупо от отключаю реле на 48, а на 47 включаю снова. Она и гуляет у меня между 45 и 57, что меня вполне устраивает. А вот если типа "2 градуса в час", то про реле забудьте.
А вот если типа "2 градуса в час", то про реле забудьте.
2 градуса в минуту
потянет ли данный микроконтроллер управление ПИД-ругулятором темепературы", то ответ - потянет.....
Спасибо что посоветовали PID
Похоже это действительно то, что мне нужно.
думаю что-то типа такого
https://jowood4.wordpress.com/2015/01/04/arduino-pid-temperature-control...
Это у меня что-то не открывается.
В природе есть готовая библиотека для ПИД регулирования (может она есть и по той ссылке, но, повторяю, она у меня не открывается). Сам я её (библиотеку) не проверял, т.к. обчычно пишу сам что мне нужно - быстрее получается. Но принцип-то простой, не думаю, чтобы там что-то напортачили. Ссылка на библиотеку мелькала на этом форуме. Поищите.
Это у меня что-то не открывается.
В природе есть готовая библиотека для ПИД регулирования (может она есть и по той ссылке, но, повторяю, она у меня не открывается). Сам я её (библиотеку) не проверял, т.к. обчычно пишу сам что мне нужно - быстрее получается. Но принцип-то простой, не думаю, чтобы там что-то напортачили. Ссылка на библиотеку мелькала на этом форуме. Поищите.
ссылка кодом
там полная статья по изготовлению термостата -- с библиотеками
Подскажите.
код
#include <math.h> //подключаем свою библиотеку с блэкджэком и логарифмами double Steinhart(int value) { double Temp; //в итоге эта переменная станет температурой Temp = log((10240000/value-10000)); //считаем логарифм //считаем температуру из уравнения Стейнхарта-Харта Temp = 1/(0.001768+0.00005719*Temp+0.000001354*Temp*Temp*Temp); Temp = Temp-273.15;//переводим температуру в градусы Цельсия return Temp; //передаем температуру обратно в loop } void setup() { Serial.begin(115200); //стартуем последовательное соединение } void loop() { //передаем в функцию Steinhart измеренное значение и выводим температуру, которую она вернет Serial.println(float(Steinhart(analogRead(0)))); delay(1000); //ничего не делаем 2 секунды }Почему в такой схеме подключения
Arduino UNO + термостат NTC 3950 (100k/(t)100K) на А0
результаты такие
в такой схеме подключения
Arduino UNO + термостат NTC 3950 (100k/(t)100K) на А0 + LCD Keypad Shield
результаты такие
в такой схеме подключения
Arduino UNO + термостат NTC 3950 (100k/(t)100K) на А1
В коде А0 на А1 заменил
результаты такие
в такой схеме подключения
Arduino UNO + термостат NTC 3950 (100k/(t)100K) на А1 + LCD Keypad Shield
В коде А0 на А1 заменил
результаты такие
Почему такая разница?
http://aterlux.ru/index.php?page=article&art=ntcresistor
http://aterlux.ru/index.php?page=article&art=ntcresistor
К чему эта ссылка?
я знаю о ней и она у меня в закладках, как только будет написана программа воспользуюсь инфой для корректной настройки.
Статья НЕ ОТВЕЧАЕТ на вопрос - почему
разница в показаниях зависит от Номера аналогово входа
или Пjдключенного LCD
еще как отвечает:
Дополнительно, для подавления шумов возникающих на линиях, можно установить конденсатор C3 в диапазоне 1-100нФ.
Следует учесть, что помимо модуля АЦП, вход AVCC запитывает также некоторые из портов ввода/вывода (как правило, на тех же выводах, что используются для АЦП). Использование этих портов на вывод и подключение к ним нагрузки может создать дополнительные шумы в работе АЦП.
Чтобы нивелировать шумы, возникающие на АЦП, рекомендую провести замеры несколько раз подряд и просуммировать полученные значения. В микроконтроллерах ATmega АЦП – 10-разрядный. Просуммировав результаты 64 подряд идущих измерений, результат остаётся в пределах 16-битного беззнакового целого, что не потребует дополнительной памяти для сохранения таблицы значений. При большем числе измерений также можно оставаться в пределах 16 бит, соответствующим образом сдвигая или деля результат.
еще как отвечает:
Может я не так читаю, но там про шумы, наводки, точность и прочее прочее.
но вот при подключении LCD показания изменились 700% - это нельзя объяснить шумами
Arduino UNO + термостат NTC 3950 (100k/(t)100K) на А0
результаты такие
0128.200227.360328.340428.060527.360627.080727.080827.080928.061027.361128.061227.921327.221428.061527.361628.061728.201826.66в такой схеме подключения
Arduino UNO + термостат NTC 3950 (100k/(t)100K) на А0 + LCD Keypad Shield
результаты такие
01165.4502160.8103163.8904163.8905163.8906163.8907163.8908163.8909162.3910162.3911163.8912163.8913162.3914162.3915163.8916163.89LCD Keypad Shield использует А0 как вход кнопок в аналоговом режиме
LCD Keypad Shield использует А0 как вход кнопок в аналоговом режи
Спасибо за грамотный ответ.
Я уже думал, что подпалил что-то, когда паял контакты.
Я вот под терморезистор библиотеку делал, но он на 10кОм, можете в нё свою таблицу забить - http://arduino.ru/forum/programmirovanie/biblioteka-dlya-termorezistora
Делал ПИ регулятор для электроконвектора с медленным шим http://arduino.ru/forum/proekty/pi-regulyator-otopleniya
Тут вот тоже товарищ строит ёмкости с подогревом http://arduino.ru/forum/programmirovanie/upravlenie-tenami-propuskom-per...
А для того чтобы плавно поднимать температуру нужно перепад температуры от текущей до целевой разделить на время требуемого перехода (в минутах допустим) и каждую минуту изменять уставку на получившийся шаг до достижения целевой температуры.
Внимательно читал Ваши посты и темы.
в принципе при разработке своего девайса на них и опираюсь, только объясните, почему Вы отказываетесь от PID библиотеки?
http://arduino.ru/forum/programmirovanie/pid-regulyator-nuzhna-kritika-i-konstruktivnye-predlozheniya-po-algoritmu-bib
и вообще. сколько я не перебирал инфы - люди пишут свой ПИД
ведь есть готовая библиотека, свой зачем?
Для себя решил что ПИ меня вполне устраивает. Ну и академический интерес. Когда вникниш в теорию и создаш свой велосипед, тогда будеш в нем разбиратся.
.....
В наличии: ========
1) Arduino Uno
2) термистор NTC3950 100K
3) твердотельное реле 25А
4) lcd keypad shield 1602
5) печь с тенами
.....
Привет.
Исходя из опыта решения подобных задач и из того что у вас есть, советую докупить еще 2 термистора.
Чтоб каждый из трех термисторов отвечал за свой участок температуры.
В систему стоит добавить еще небольшой лючок чтоб система могла гасить инерцию тенов и не допускать задиров в графике нагрева.
И с учетом всего вышеперечисленного и грамотного кода в результате точность получится не лучше чем +/-5градусов.
Исходя из опыта решения подобных задач и из того что у вас есть, советую докупить еще 2 термистора.
Чтоб каждый из трех термисторов отвечал за свой участок температуры.
В систему стоит добавить еще небольшой лючок чтоб система могла гасить инерцию тенов и не допускать задиров в графике нагрева.
И с учетом всего вышеперечисленного и грамотного кода в результате точность получится не лучше чем +/-5градусов.
Добрый день.
это я для пробы и тестов использую термисторы NTC3950 100K .
Сейчас заказал с али MAX31855
датчик к нему
и еще датчик со щупом...
вот с ними и думаю работать
и рабочий диапазон будет от 20 С до 350 С
Добрый день.
это я для пробы и тестов использую термисторы NTC3950 100K .
Сейчас заказал с али MAX31855
....
С датчиком ясно.
Тены и сама печь имеют огромную инерцию по нагреву и остыванию. Нужно или на подходе к церевой температуре замедлять скорость нагрева и плавно к ней подходить или иметь люк чтоб сбрасывать тепло.
Тены и сама печь имеют огромную инерцию по нагреву и остыванию. Нужно или на подходе к церевой температуре замедлять скорость нагрева и плавно к ней подходить или иметь люк чтоб сбрасывать тепло.
вот для решения этой проблемы и изучаю ПИД - регулятор
Вам скорее всего ПИД тоже не нужен, у Вас же нет резких возмущений, температура в Вашем случае должна изменяться медленно на протяжении длительного времени.
В ПИД регуляторе
П составляющая тем больше влияет на объект регулирования, чем больше рассогласование.
И составляющаяя накапливаясь с течением времени (сумма рассогласований) и устраняет статическую ошибку регулирования.
Д составляющая это как тормоз и ускоритель одновременно чем больше разница текущей ошибки регулирования и прошлой, тем сильнее её влияние.
Вот вчера с ПИД эксперементировал.
//расчет мощности по ПИД закону регулирования #define kP 10//коэффициент пропорциональности12 #define p_min 0.0//минимум П составляющей - не < 0 #define p_max 100.0//максимум П составляющей - не > 100 #define kI 0.035//коэффициент интегрирования18 #define i_min 0.0//минимум И составляющей #define i_max 30.0//максимум И составляющей #define kd 16/// #define d_ctl 4.0//зона пропорциональности ust-d_ctl #define out_min 0//минимальный выходной % #define out_max 100//максимальный выходной % uint8_t PIctl(float temp, uint8_t ust)//возвращает необходимую мощность { uint8_t out=0;//uint8_t static float i=0; static float ed=0;/// float e, p; float d;/// e=(ust-temp);//ошибка регулирования p=(temp<ust-d_ctl)?p_max:(temp>ust)?p_min:(kP*e);//П составляющая i=(i<i_min)?i_min:(i>i_max)?i_max:i+(kI*e);//И составляющая d=kd*(e-ed);/// ed=e;/// //if(temp>ust+1){i=0;} Serial.print(p); Serial.print(";");//-p Serial.print(i); Serial.print(";");//-i Serial.print(d); Serial.println("");//-d out=(p+i+d<out_min)?out_min:(p+i+d>out_max)?out_max:p+i+d; return out; }Функцию расчета ПИД вызываю раз в секунду.
Но меня и ПИ устраевает, а ПИД для какихнибудь коптеров и ещё каких устройств требующих быструю и точную реакцию.
Вообщем нужно сначала стенд собрать и посмотреть что лучше, потому что все эти регуляторы требуют подбора коэффициенов усиления (процесс не очень простой) и чем их меньше тем проще.
Вам скорее всего ПИД тоже не нужен, у Вас же нет резких возмущений, температура в Вашем случае должна изменяться медленно на протяжении длительного времени.
................
Вообщем нужно сначала стенд собрать и посмотреть что лучше, потому что все эти регуляторы требуют подбора коэффициенов усиления (процесс не очень простой) и чем их меньше тем проще.
Да.
у меня будут очень медленные процессы.
Но вот начальный процесс достаточно сложен.
Так как нагревательный элемент будет работать на (металлический, керамический, кромпозитный брус (300мм*500мм*100мм)) и задача нагреть этот брус, и температура будет измеряться в нем.
само собой будет камера, в которой будет данный брус, то есть будет греться внутренний объем камеры.
Ну и камера будет терять температуру.
Так что в самом начале процесса ожидаю сильную болтанку температуры.
И болтанка будет, пока процесс не стабилизируется.
ПИ удовлетворяет такому запросу?
Удовлетворяет, только коэффициенты подобрать нужно.
Вот мои графики выхода на уставку, съём показаний около 7 минут, за это время устаканилось. Коэффициенты тчательно не подбирал, если повозится то можно лучше графики получить. И П составляющая влияет только при сильных отклонениях, а после выхода на уставку в основном И составляющая работает, так что при медленном изменении температуры только она и будет оказывать воздействие.