Re: Терморегулятор MAX6675 (Arduino)
На плате энкодера должны стоять 3 подтягивающих резистора по 10к. Проверьте.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
forum.rcl-radio.ru → Тестирование скетчей → Терморегулятор MAX6675 (Arduino)
На плате энкодера должны стоять 3 подтягивающих резистора по 10к. Проверьте.
Стоят, энкодер проверенный. Кручу 1000 пишет, нажимаю 5_rc
Ардуину заменил, то же самое. на холостом температура в комнате 26 пишет
Опубликуйте Ваш скетч.
#include <max6675.h>
#include <TM1637Display.h> // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=1008&download=1
#include <Encoder.h>
#include <EEPROM.h>//#include <EEPROMex.h>
int thermoDO = 12; // SO
int thermoCS = 11; // CS
int thermoCLK = 10;// SCK
MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);
TM1637Display display(4, 5);// CLK,DIO
Encoder myEnc(2, 3);// CLK, DT
double t_c,t_sum,t_iz;
unsigned long time,time0;
int oldPosition = -999,newPosition,rom,k;
byte reg,r0,r1;
const byte gis=1;// гистерезис
uint8_t data1[]{0x6d,0x08,0x50,0x3d};
void setup(){
pinMode(9,INPUT); // SW энкодера
pinMode(13,OUTPUT);// выход для управления нагрузкой
display.setBrightness(3);// яркость TM1637 0-7
delay(500);
r0=EEPROM.read(0);r1=EEPROM.read(1);rom=r0*100+r1;//чтение EEPROM
}
void loop(){
newPosition = myEnc.read()/4+rom;// чтение состояния энкодера
if (newPosition != oldPosition) {
oldPosition = newPosition;
time=millis();
reg=1;time0=3000;
r0=newPosition/100;r1=newPosition-r0*100;
}
else if(millis()-time>time0){
reg=0;time0=0;
for(int i=0;i<5;i++){
t_c=thermocouple.readCelsius();// чтение температуры с max6675
t_sum=t_sum+t_c;
delay(200);
}
time=millis();t_iz=t_sum/5;t_sum=0;
}
if(digitalRead(9)==LOW){// запись в EEPROM
EEPROM.update(0,r0);EEPROM.update(1,r1);
display.setSegments(data1);
delay(1000);
}
if(newPosition<0){newPosition=0;}
if(newPosition>1000){newPosition=1000;}
if(newPosition >= t_iz + gis){digitalWrite(13,HIGH);}
if(newPosition <= t_iz - gis){digitalWrite(13,LOW);}
if(reg==1){k=newPosition;}
else{k = t_iz;}
Serial.println(reg);
display.showNumberDecEx(k,0x00,false);// вывод информации на индикатор
}
Откройте монитор порта, поверните ручку энкодера вперед и назад, посмотрите какие цифры выдает монитор порта
#include <max6675.h>
#include <TM1637Display.h> // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=1008&download=1
#include <Encoder.h>
#include <EEPROM.h>//#include <EEPROMex.h>
int thermoDO = 12; // SO
int thermoCS = 11; // CS
int thermoCLK = 10;// SCK
MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);
TM1637Display display(4, 5);// CLK,DIO
Encoder myEnc(2, 3);// CLK, DT
double t_c,t_sum,t_iz;
unsigned long time,time0;
int oldPosition = -999,newPosition,rom,k;
byte reg,r0,r1;
const byte gis=1;// гистерезис
uint8_t data1[]{0x6d,0x08,0x50,0x3d};
void setup(){
Serial.begin(9600);
pinMode(9,INPUT); // SW энкодера
pinMode(13,OUTPUT);// выход для управления нагрузкой
display.setBrightness(3);// яркость TM1637 0-7
delay(500);
if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении
r0=EEPROM.read(0);r1=EEPROM.read(1);rom=r0*100+r1;//чтение EEPROM
}
void loop(){
newPosition = myEnc.read()/4+rom;// чтение состояния энкодера
if (newPosition != oldPosition) {
oldPosition = newPosition;
time=millis();
reg=1;time0=3000;
r0=newPosition/100;r1=newPosition-r0*100;
Serial.println(newPosition);
}
else if(millis()-time>time0){
reg=0;time0=0;
for(int i=0;i<5;i++){
t_c=thermocouple.readCelsius();// чтение температуры с max6675
t_sum=t_sum+t_c;
delay(200);
}
time=millis();t_iz=t_sum/5;t_sum=0;
}
if(digitalRead(9)==LOW){// запись в EEPROM
EEPROM.update(0,r0);EEPROM.update(1,r1);
display.setSegments(data1);
delay(1000);
}
if(newPosition<0){newPosition=0;}
if(newPosition>1000){newPosition=1000;}
if(newPosition >= t_iz + gis){digitalWrite(13,HIGH);}
if(newPosition <= t_iz - gis){digitalWrite(13,LOW);}
if(reg==1){k=newPosition;}
else{k = t_iz;}
display.showNumberDecEx(k,0x00,false);// вывод информации на индикатор
}
Влево выдает минус 1,2,3.4 и т.д в право идет отсчет обратно
На экране все равно 1000
Сначало ничего не показывало потом перевыбрал порт по новой и пошли показания и цифры побежали на дисплее вместо 1000
Успел попробовать скетч с кнопками последний , очень понравился. И градусы показывает и гистерезис регулируется. А нельзя ли в него управление на энкодере сделать? Собираюсь в фен эту схему поставить вместо старого управление а кнопки некуда ставить
У меня сейчас нет возможности собрать и протестировать схему для нового скетча.
Сделал плату в lay, для удобной распайки, на днях буду собирать.
Ардуинка и все остальные комплектующие будут располагаться с обратной стороны, на лицевой стороне платы, будут запаяны только кнопки.
Данный контент доступен только зарегистрированным пользователям.
Re: Терморегулятор MAX6675 (Arduino)
подскажите пожалуйста, можно прописать скетч когда температура дошла но нужной чтобы включился обратный отсчет и терморегулятор поддерживал данную температуру в пределах заданного времени.
в создании скетчей полный ноль.
СПАСИБО
TM1637 + MAX6675 кнопочное управление
#include <Wire.h> #include <EEPROM.h> #include <STM32_TM1637.h> // http://rcl-radio.ru/wp-content/uploads/2021/01/STM32_TM1637.zip #include <max6675.h> // http://rcl-radio.ru/wp-content/uploads/2018/07/max6675.zip STM32_TM1637 tm(2,3);// CLK, DIO int thermoDO = 6; // SO int thermoCS = 5; // CS int thermoCLK = 4;// SCK MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO); unsigned long time; double t_c,t_sum,t_iz; int menu,w,reg,gis,reg_h,reg_l,i; void setup() { Wire.begin();Serial.begin(9600); tm.brig(7); // ЯРКОСТЬ 0...7 pinMode(13,OUTPUT); // реле pinMode(12,OUTPUT); // индикатор нагрева pinMode(7,INPUT_PULLUP); // menu (нажатие кнопки - замыкание на gnd) pinMode(8,INPUT_PULLUP); // up (нажатие кнопки - замыкание на gnd) pinMode(9,INPUT_PULLUP); // down (нажатие кнопки - замыкание на gnd) reg_h = EEPROM.read(0);reg_l = EEPROM.read(1);gis = EEPROM.read(2); reg = reg_h*100+reg_l; } void loop() { //// измерение температуры i++; t_c=thermocouple.readCelsius();t_sum=t_sum+t_c; if(i>4){i=0;t_iz=t_sum/5;t_sum=0;} ///////////////////////////////////////////// if(digitalRead(7)==LOW){menu++;if(menu>2){menu=0;}delay(1);} ///////// регулирование if(menu==1){ if(digitalRead(8)==LOW){reg++;time=millis();w=1;if(reg>999){reg=999;}delay(1);} if(digitalRead(9)==LOW){reg--;time=millis();w=1;if(reg<0){reg=0;}delay(1);} tm.print_float(reg,0, 0b01010000,0,0,0); Serial.println(reg); } ///////// гистерезис if(menu==2){ if(digitalRead(8)==LOW){gis++;time=millis();w=1;if(gis>10){gis=10;}delay(1);} if(digitalRead(9)==LOW){gis--;time=millis();w=1;if(gis<0){gis=0;}delay(1);} tm.print_float(gis,0, 0b00111101,0,0,0); Serial.println(gis); } //////////////////////////////////////////////////////// if(menu==0){ tm.print_float(t_iz,1, 0,0,0,0); } //////////////////////////////////////////////////////// if(millis()-time>5000 && w==1){ reg_h = reg/100;reg_l = reg-reg_h*100; EEPROM.update(0,reg_h);EEPROM.update(1,reg_l);EEPROM.update(2,gis); menu=0;w=0;} if(reg >= t_iz + gis){digitalWrite(13,HIGH);digitalWrite(12,LOW);} if(reg <= t_iz - gis){digitalWrite(13,LOW);digitalWrite(12,HIGH);} delay(200); Serial.println(menu); }// loop
Библиотека на STM32_ТМ1637 занимает больше места, в отличие от стандартной библиотеки ТМ1637, поэтому скетч в атмегу88 не влезает всего на 300 байт...можно как то поджать еще чуточку скетч с этой библиотекой???
Уберите все что связано serial port
Уберите все что связано serial port
Скетч использует 7044 байт (91%) памяти устройства. Всего доступно 7680 байт.
Офигеть, все так просто...спасибище!!!
Никто не пробывал вместо реле в этом регуляторе такую вот схемку опробывать?
Собрал терморегулятор, но инерционность у сие машины огромна, улетает от заданной температуры почти в 2 раза, как можно понизить инерционность ???
Вам нужен ПИД регулятор. Так же можете увеличить гистерезис.
Вам нужен ПИД регулятор. Так же можете увеличить гистерезис.
А разве то, что здесь делалось без ПИД регулятора? Гистерезис пробовал увеличивать, получается верхний предел температуры становится еще больше на значение гистерезиса, соответственно разгоняется система еще дольше, а значит и верхний предел температуры увеличивается за счет инерционности еще сильнее..) Пробовал без гистерезиса, чуть лучше, но все равно ускакивает далеко за регулируемую температуру...правда делал в регуляторе вместо реле симисторный регулятор, выше схемку рисовал..в 92 посту...может из за этого так летит?
Объект - термостолик. Мощность 300Вт, напряжение 220в
if(reg >= t_iz + gis){digitalWrite(13,HIGH);digitalWrite(12,LOW);} // разогрев
if(reg <= t_iz - gis){digitalWrite(13,LOW);digitalWrite(12,HIGH);} // остывание
попробуйте так:
if(reg >= t_iz + 12){digitalWrite(13,HIGH);digitalWrite(12,LOW);} // разогрев
if(reg <= t_iz){digitalWrite(13,LOW);digitalWrite(12,HIGH);} // остывание
12 - это насколько у Вас происходит перегрев
if(reg >= t_iz + gis){digitalWrite(13,HIGH);digitalWrite(12,LOW);} // разогрев
if(reg <= t_iz - gis){digitalWrite(13,LOW);digitalWrite(12,HIGH);} // остываниепопробуйте так:
if(reg >= t_iz + 12){digitalWrite(13,HIGH);digitalWrite(12,LOW);} // разогрев
if(reg <= t_iz){digitalWrite(13,LOW);digitalWrite(12,HIGH);} // остывание12 - это насколько у Вас происходит перегрев
Я почему то также и подумал, вообще убрать гистерезис сверху...а вот про нижний предел не подумал чтоб его увеличить.. Попробую сегодня вечерком..
if(reg >= t_iz + gis){digitalWrite(13,HIGH);digitalWrite(12,LOW);} // разогрев
if(reg <= t_iz - gis){digitalWrite(13,LOW);digitalWrite(12,HIGH);} // остываниепопробуйте так:
if(reg >= t_iz + 12){digitalWrite(13,HIGH);digitalWrite(12,LOW);} // разогрев
if(reg <= t_iz){digitalWrite(13,LOW);digitalWrite(12,HIGH);} // остывание12 - это насколько у Вас происходит перегрев
Не, все равно перелетает будь здоров!!! А вот так (ниже код) более менее сработало.... первый раз перелетело на 10 при гистерезисе 10, далее через несколько циклов где то 5 градусов...чуть чуть перелетело за границу...регулируемой температуры ...короче надо видимо опытным путем и гистерезис подбирать и верхнюю границу....
if(reg <= t_iz + gis/1.25){digitalWrite(12,LOW);digitalWrite(11,LOW);digitalWrite(10,HIGH);} // индикатор нагрева красный - 11, индикатор остыва зеленый - 10
if(reg >= t_iz + gis){digitalWrite(12,HIGH);digitalWrite(11,HIGH);digitalWrite(10,LOW);} // индикатор нагрева красный - 11, индикатор остыва зеленый - 10
В "стоковом" скетче для ТМ1637 и энкодера закралась ошибка. При выставлении температуры 1000С даже без нажатии кнопки сохранения не происходит обратное изменение установки, помогло только перепрошивка со стиранием памяти.
Есть еще вопрос об изменении кода с сокращением текста для индикатора 802 (восьмиразрядного двустрочного) ,возможно-ли?
Посмотрите пример - http://rcl-radio.ru/?p=129068
Изменить скетч под этот экран не сложно.
forum.rcl-radio.ru → Тестирование скетчей → Терморегулятор MAX6675 (Arduino)
Форум работает на PunBB, при поддержке Informer Technologies, Inc
|