Динамический термостат (по графику)

konsys
konsys аватар
Offline
Зарегистрирован: 04.07.2016

Добрый день.

Задача: ========

построить печь.

температура: от 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;
}

 

Но в этом коде понимаю частично, так как програмированием не владею - художники мы.

Собрал код интуитивно из сторонних примеров.

 

Подскажите как более грамотно реализовать поставленную задачу?

 

 

 

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

konsys пишет:

Подскажите как более грамотно реализовать поставленную задачу?

Заказать специалисту!

Так, как Вы пытаетесь делать, она в принципе не будет работать. У нагревателя есть инерция, его будет раскачивать градусов на десять туда-сюда (т.е. Вы своё реле выключили, а печь продолжает нагреваться некоторое время). Если нужна тонкая и точная регулировка, это делается не с реле (которое может нагреватель только включить и выключить), а с плавным регулирование мощности нагревателся.

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

ВН
Offline
Зарегистрирован: 25.02.2016

ЕвгенийП пишет:
Заказать специалисту!

оно конечно пральна, ...

 тогда еще можно задать верхнюю планку цены, глядя на цену готового девайса 

http://www.varta-spb.ru/catalogue/37/103.html 

зы. бум считать, что исключительно из любви к прекрасному выдал эту ссылку =)

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

ВН пишет:

 тогда еще можно задать верхнюю планку цены, глядя на цену готового девайса 

http://www.varta-spb.ru/catalogue/37/103.html 

зы. бум считать, что исключительно из любви к прекрасному выдал эту ссылку =)

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

Только Вы сравниваете... как бы Вам попонятнее объяснить... типографскую репродукцию Шишкина с авторской работой пусть даже менее известного художника.

konsys
konsys аватар
Offline
Зарегистрирован: 04.07.2016

ЕвгенийП пишет:

Заказать специалисту!

Специалитами не рождаются.

И Если я решил сам как-то выкручиваться и обратился на форуме за помощью - значит в априоре вопрос о заказать идет мимо.

ЕвгенийП пишет:

Так, как Вы пытаетесь делать, она в принципе не будет работать. У нагревателя есть инерция, его будет раскачивать градусов на десять туда-сюда (т.е. Вы своё реле выключили, а печь продолжает нагреваться некоторое время). Если нужна тонкая и точная регулировка, это делается не с реле (которое может нагреватель только включить и выключить), а с плавным регулирование мощности нагревателся.

Во т принцим я и хочу уловить, может уже делали подобное?

Тэны можно заменить на лампы,

и  еще может чего, вобщем я сюда за советами пришел.

 

ЕвгенийП пишет:

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

В сторону ПИД регулятора тоже смотрю, но думаю потянет ли?

Ведь в среднем нужен подъем температуры 2 градуса в минуту, то есть инерции нагревателя должно хватить с лихвой и очень многое зависит от точности термометра и полосы допустимых отклонений - это я как инженер говорю.

 

konsys
konsys аватар
Offline
Зарегистрирован: 04.07.2016

ВН пишет:

оно конечно пральна, ...

 тогда еще можно задать верхнюю планку цены, глядя на цену готового девайса 

http://www.varta-spb.ru/catalogue/37/103.html 

зы. бум считать, что исключительно из любви к прекрасному выдал эту ссылку =)

и ни чего не правильно.

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

Выша ссылка немного не в тему.

 

точ то мне примерно надо - это вот http://www.termodat.ru/catalog/16e/termodat-16e5/

и цена там не демократичная, даи покупать желания нет.

Есть желание сделать.

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

konsys пишет:

может уже делали подобное?

Да, нет, что Вы! Температуру никто и никогда не регулировал, Вы первопроходец :))))

konsys пишет:

В сторону ПИД регулятора тоже смотрю, но думаю потянет ли?

Если нужно точная регулировка, то только сюда и надо смотреть. Насчёт "потянет" - не понял вопроса. Кто потянет, чего потянет? Если вопрос "потянет ли данный микроконтроллер управление ПИД-ругулятором темепературы", то ответ - потянет штук двадцать одновременно.

konsys пишет:

полосы допустимых отклонений 

А вот с этого надо было начинать. В постановке задачи уж больно точно всё было. Мне, например, для травления плат нужна температура раствора 50 плюс/минус 10 градусов. Используется киловатная печка. Так там я вообще не парьюсь Тупо от отключаю реле на 48, а на 47 включаю снова. Она и гуляет у меня между 45 и 57, что меня вполне устраивает. А вот если типа "2 градуса в час", то про реле забудьте.

 

 

konsys
konsys аватар
Offline
Зарегистрирован: 04.07.2016

ЕвгенийП пишет:

А вот если типа "2 градуса в час", то про реле забудьте.

2 градуса в минуту

konsys
konsys аватар
Offline
Зарегистрирован: 04.07.2016

ЕвгенийП пишет:

потянет ли данный микроконтроллер управление ПИД-ругулятором темепературы", то ответ - потянет.....

Спасибо что посоветовали PID

Похоже это действительно то, что мне нужно.

 

думаю что-то типа такого

https://jowood4.wordpress.com/2015/01/04/arduino-pid-temperature-control...

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

Это у меня что-то не открывается. 

В природе есть готовая библиотека для ПИД регулирования (может она есть и по той ссылке, но, повторяю, она у меня не открывается). Сам я её (библиотеку) не проверял, т.к. обчычно пишу сам что мне нужно - быстрее получается. Но принцип-то простой, не думаю, чтобы там что-то напортачили. Ссылка на библиотеку мелькала на этом форуме. Поищите.

konsys
konsys аватар
Offline
Зарегистрирован: 04.07.2016

ЕвгенийП пишет:

Это у меня что-то не открывается. 

В природе есть готовая библиотека для ПИД регулирования (может она есть и по той ссылке, но, повторяю, она у меня не открывается). Сам я её (библиотеку) не проверял, т.к. обчычно пишу сам что мне нужно - быстрее получается. Но принцип-то простой, не думаю, чтобы там что-то напортачили. Ссылка на библиотеку мелькала на этом форуме. Поищите.

ссылка кодом

https://jowood4.wordpress.com/2015/01/04/arduino-pid-temperature-controller/

 

 

 

 

там полная статья по изготовлению термостата -- с библиотеками

 

 

 

 

konsys
konsys аватар
Offline
Зарегистрирован: 04.07.2016

Подскажите.

код

#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

результаты такие

28.20
27.36
28.34
28.06
27.36
27.08
27.08
27.08
28.06
27.36
28.06
27.92
27.22
28.06
27.36
28.06
28.20
26.66

в такой схеме подключения

Arduino UNO + термостат NTC 3950 (100k/(t)100K) на А0 + LCD Keypad Shield

результаты такие

165.45
160.81
163.89
163.89
163.89
163.89
163.89
163.89
162.39
162.39
163.89
163.89
162.39
162.39
163.89
163.89

 

в такой схеме подключения

Arduino UNO + термостат NTC 3950 (100k/(t)100K) на А1

В коде А0 на А1 заменил

результаты такие

27.64
27.08
27.36
25.96
27.50
27.78
27.08
28.63
27.50
27.08
25.82
29.47
28.06



 

в такой схеме подключения

Arduino UNO + термостат NTC 3950 (100k/(t)100K) на А1 + LCD Keypad Shield

В коде А0 на А1 заменил

результаты такие

25.82
25.26
26.52
24.57
26.24
25.54
25.26
26.38
24.01
28.77
29.05
24.98
28.06
26.24
28.20

 

Почему такая разница?

 

 

 

 

 

 

a5021
Offline
Зарегистрирован: 07.07.2013
konsys
konsys аватар
Offline
Зарегистрирован: 04.07.2016

К чему эта ссылка?

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

 

Статья НЕ ОТВЕЧАЕТ на вопрос - почему

разница в показаниях зависит от Номера аналогово входа

или Пjдключенного LCD

 

a5021
Offline
Зарегистрирован: 07.07.2013

konsys пишет:
Статья НЕ ОТВЕЧАЕТ на вопрос - почему

еще как отвечает:

Цитата:
Для снижения измеряемых шумов, рекомендую термистор также подключать к фильтрованному напряжению параллельно AVCC, и настроить на использование этого напряжения в качестве референтного.

Дополнительно, для подавления шумов возникающих на линиях, можно установить конденсатор C3 в диапазоне 1-100нФ.

Следует учесть, что помимо модуля АЦП, вход AVCC запитывает также некоторые из портов ввода/вывода (как правило, на тех же выводах, что используются для АЦП). Использование этих портов на вывод и подключение к ним нагрузки может создать дополнительные шумы в работе АЦП.

Чтобы нивелировать шумы, возникающие на АЦП, рекомендую провести замеры несколько раз подряд и просуммировать полученные значения. В микроконтроллерах ATmega АЦП – 10-разрядный. Просуммировав результаты 64 подряд идущих измерений, результат остаётся в пределах 16-битного беззнакового целого, что не потребует дополнительной памяти для сохранения таблицы значений. При большем числе измерений также можно оставаться в пределах 16 бит, соответствующим образом сдвигая или деля результат.

konsys
konsys аватар
Offline
Зарегистрирован: 04.07.2016

a5021 пишет:

еще как отвечает:

Может я не так читаю, но там про шумы, наводки, точность и прочее прочее.

но вот при подключении LCD показания изменились 700% - это нельзя объяснить шумами

 

Arduino UNO + термостат NTC 3950 (100k/(t)100K) на А0

результаты такие

01 28.20
02 27.36
03 28.34
04 28.06
05 27.36
06 27.08
07 27.08
08 27.08
09 28.06
10 27.36
11 28.06
12 27.92
13 27.22
14 28.06
15 27.36
16 28.06
17 28.20
18 26.66

в такой схеме подключения

Arduino UNO + термостат NTC 3950 (100k/(t)100K) на А0 + LCD Keypad Shield

результаты такие

01 165.45
02 160.81
03 163.89
04 163.89
05 163.89
06 163.89
07 163.89
08 163.89
09 162.39
10 162.39
11 163.89
12 163.89
13 162.39
14 162.39
15 163.89
16 163.89

 

 

ВН
Offline
Зарегистрирован: 25.02.2016

LCD Keypad Shield использует А0 как вход кнопок в аналоговом режиме

 

konsys
konsys аватар
Offline
Зарегистрирован: 04.07.2016

ВН пишет:

LCD Keypad Shield использует А0 как вход кнопок в аналоговом режи

Спасибо за грамотный ответ.

Я уже думал, что подпалил что-то, когда паял контакты.

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Я вот под терморезистор библиотеку делал, но он на 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...
А для того чтобы плавно поднимать температуру нужно перепад температуры от текущей до целевой разделить на время требуемого перехода (в минутах допустим) и каждую минуту изменять уставку на получившийся шаг до достижения целевой температуры.

konsys
konsys аватар
Offline
Зарегистрирован: 04.07.2016

yul-i-an пишет:
Я вот под терморезистор библиотеку делал, но он на 10кОм, можете в нё свою таблицу забить

Внимательно читал Ваши посты и темы.

в принципе при разработке своего девайса на них и опираюсь, только объясните, почему Вы отказываетесь от PID библиотеки?

http://arduino.ru/forum/programmirovanie/pid-regulyator-nuzhna-kritika-i-konstruktivnye-predlozheniya-po-algoritmu-bib

и вообще. сколько я не перебирал инфы - люди пишут свой ПИД

ведь есть готовая библиотека, свой зачем?

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Для себя решил что ПИ меня вполне устраивает. Ну и академический интерес. Когда вникниш в теорию и создаш свой велосипед, тогда будеш в нем разбиратся.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

konsys пишет:

.....

В наличии: ========

1) Arduino Uno

2) термистор NTC3950 100K

3) твердотельное реле 25А

4) lcd keypad shield 1602

5) печь с тенами

.....

Привет.

Исходя из опыта решения подобных задач и из того что у вас есть, советую докупить еще 2 термистора.

Чтоб каждый из трех термисторов отвечал за свой участок температуры.

В систему стоит добавить еще небольшой лючок чтоб система могла гасить инерцию тенов и не допускать  задиров в графике нагрева.

И с учетом всего вышеперечисленного и грамотного кода в результате точность получится не лучше чем +/-5градусов.

konsys
konsys аватар
Offline
Зарегистрирован: 04.07.2016

bodriy2014 пишет:

Исходя из опыта решения подобных задач и из того что у вас есть, советую докупить еще 2 термистора.

Чтоб каждый из трех термисторов отвечал за свой участок температуры.

В систему стоит добавить еще небольшой лючок чтоб система могла гасить инерцию тенов и не допускать  задиров в графике нагрева.

И с учетом всего вышеперечисленного и грамотного кода в результате точность получится не лучше чем +/-5градусов.

Добрый день.

это я для пробы и тестов использую термисторы NTC3950 100K .

Сейчас заказал с али MAX31855

 

датчик к нему

 

и еще датчик со щупом...

 вот с ними и думаю работать

 

и рабочий диапазон будет от 20 С до 350 С

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

konsys пишет:

Добрый день.

это я для пробы и тестов использую термисторы NTC3950 100K .

Сейчас заказал с али MAX31855

....

С датчиком ясно.

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

 

konsys
konsys аватар
Offline
Зарегистрирован: 04.07.2016

bodriy2014 пишет:

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

 

вот для решения этой проблемы и изучаю ПИД - регулятор

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Вам скорее всего ПИД тоже не нужен, у Вас же нет резких возмущений, температура в Вашем случае должна изменяться медленно на протяжении длительного времени.

В ПИД регуляторе

П составляющая тем больше влияет на объект регулирования, чем больше рассогласование.

И составляющаяя накапливаясь с течением времени (сумма рассогласований) и устраняет статическую ошибку регулирования.

Д составляющая это как тормоз и ускоритель одновременно чем больше разница текущей ошибки регулирования и прошлой, тем сильнее её влияние.

Вот вчера с ПИД эксперементировал.

//расчет мощности по ПИД закону регулирования
#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;
}

Функцию расчета ПИД вызываю раз в секунду.

Но меня и ПИ устраевает, а ПИД для какихнибудь коптеров и ещё каких устройств требующих быструю и точную реакцию.

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

konsys
konsys аватар
Offline
Зарегистрирован: 04.07.2016

yul-i-an пишет:

Вам скорее всего ПИД тоже не нужен, у Вас же нет резких возмущений, температура в Вашем случае должна изменяться медленно на протяжении длительного времени.

................

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

Да.

у меня будут очень медленные процессы.

Но вот начальный процесс достаточно сложен.

Так как нагревательный элемент будет работать на  (металлический, керамический, кромпозитный брус (300мм*500мм*100мм)) и задача нагреть этот брус, и температура будет измеряться в нем.

само собой будет камера, в которой будет данный брус, то есть будет греться внутренний объем камеры.

Ну и камера будет терять температуру.

Так что в самом начале процесса ожидаю сильную болтанку температуры.

И болтанка будет, пока процесс не стабилизируется.

ПИ удовлетворяет такому запросу?

 

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Удовлетворяет, только коэффициенты подобрать нужно.

Вот мои графики выхода на уставку, съём показаний около 7 минут, за это время устаканилось. Коэффициенты тчательно не подбирал, если повозится то можно лучше графики получить. И П составляющая влияет только при сильных отклонениях, а после выхода на уставку в основном И составляющая работает, так что при медленном изменении температуры только она и будет оказывать воздействие.