Очень простой термостат для отопления
Очень простой термостат для отопления
Доброго времени суток! Собрал данное устройство погонял в железе и Протеусеhttp://radiokot.ru/circuit/digital/home/29/01.gif. Решил использовать его в гараже для отопления! Только неустраивает некоторые моменты:
-котелок у меня простой ,100 труба внутри тены на 220 В 3 штуки , хотелось бы включать тены не все сразу, а по одному через ну скажем 10-15 сек.
Языком С я не обучен! Пытаюсь в Баскоме разобратся . Пока ноль. Если можно поправте прошивку! Пожалуйста!
http://radiokot.ru/circuit/digital/home/29/01.rar
-котелок у меня простой ,100 труба внутри тены на 220 В 3 штуки , хотелось бы включать тены не все сразу, а по одному через ну скажем 10-15 сек.
Языком С я не обучен! Пытаюсь в Баскоме разобратся . Пока ноль. Если можно поправте прошивку! Пожалуйста!
http://radiokot.ru/circuit/digital/home/29/01.rar
- Реклама
- zhu4er
- Вымогатель припоя
- Сообщения: 544
- Зарегистрирован: Пт июн 04, 2010 17:40:13
- Откуда: Непокорный город-герой Севастополь
Re: Очень простой термостат для отопления
Мда...для того чтобы включать тены с разницей по времени - это не только прошивку менять надо, но и схему дополнять ещё двумя выходами на исполнительные устройства! Вопросы: а тэны у вас по сколько киловатт? А исполнительные устройства у вас какие будут? И почему надо включать тэны по отдельности?
Даже у стен есть уши...
Re: Очень простой термостат для отопления
Ну можно использовать свободные выхода контроллера, подключить реле например, семистор, и т.д.Тэны по 1,5 кВт каждый на 220В , насос с 3 ступенями скорости переключаются в ручную.Можно поменять выход управлением насоса на включение скажем второй ступени мощности котла! Исходя из практики ,управление насосом циркуляции отопления в данной конструкции не корректно, лучше когда насос крутит теплоноситель постоянно! А вот "пошаговое 1-2-3" включение тэнов даже очень гуд! В этом плюсов больше: например просадка напряжения и т.д, методом тумблера можно уменьшить эл.мощность котла.
- Coviraylhik
- Мучитель микросхем
- Сообщения: 420
- Зарегистрирован: Чт июн 03, 2010 23:06:12
Re: Очень простой термостат для отопления
Вариант можно сделать просто , на каждый тен нужно задействовать порт микроконтроллера, и работать будет по условию:
например
при < = 23.9°C - тен № 1
при < = 23.7°C - тен № 2
при < = 23.5°C - тен № 3
при < = 23.3°C - тен № 4
и так далее зависит сколько вы желаете использовать тенов и какую температуру поддержать , есть и практически готовая для этого схема только она на тини2313, http://hardlock.org.ua/viewtopic.php я как раз ее использовал для подобного применения
например
при < = 23.9°C - тен № 1
при < = 23.7°C - тен № 2
при < = 23.5°C - тен № 3
при < = 23.3°C - тен № 4
и так далее зависит сколько вы желаете использовать тенов и какую температуру поддержать , есть и практически готовая для этого схема только она на тини2313, http://hardlock.org.ua/viewtopic.php я как раз ее использовал для подобного применения
Некакого перимирия, Некаких мирных шагов навстречу и периговоров.
Re: Очень простой термостат для отопления
забегая вперёдCoviraylhik писал(а):....например
при < = 23.9°C - тен № 1
при < = 23.7°C - тен № 2
при < = 23.5°C - тен № 3
при < = 23.3°C - тен № 4...
и тэн даёт дельту в 70 градусов.
вопрос, что будет если температура 20 градусов?
ответ:
вышибет пробки
(круглый)
- Реклама
Re: Очень простой термостат для отопления
Да всё намного проще !!! Не надо делать темпиратурную зависимость включения тэнов! Нужно просто включать тэны не все сразу , а по очереди, при команде на включение . А как это сделать программно я никак не допетрю!!!
- Coviraylhik
- Мучитель микросхем
- Сообщения: 420
- Зарегистрирован: Чт июн 03, 2010 23:06:12
Re: Очень простой термостат для отопления
Раз все так просто, сделать тогда на трех таймерах 555, у каждого настроив время включения после пуска.
Некакого перимирия, Некаких мирных шагов навстречу и периговоров.
Re: Очень простой термостат для отопления
Я про это уже думал ! Хотелось бы реализовать програмно! Без лишних деталей!
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Очень простой термостат для отопления
Монстры WinAVR'a! Сделайте уже человеку!
Походу можно сюда:
Делов-то куча.
Походу можно сюда:
Код: Выделить всё
if (--t_1sek==0){
t_1sek=100;
if (--time_view_zadanie==0) view_zadanie=0;
regim_count();
//
//temp= PORTDRIVE;
//temp<<= 2;
//PORTDRIVE|= temp;
//
}
Docendo discimus
Re: Очень простой термостат для отопления
А можно по подробней!
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Очень простой термостат для отопления
Судя по названию переменной, то, что в {}, выполняется раз в секунду. Раз в секунду считываем состояние порта(именно порта, а не пинов) и сдвигаем вправо(облажался, в предыдущем посте указано влево) на два разряда. Накладываем по ИЛИ опять же состояние порта и выплевываем обратно в порт. Т.о. в третьем разряде инфа будет появлятся через одну секунду после ее появления в пятом разряде, а в первом разряде через две секунды. То же самое с разрядами 4 и 2. Подключаете ТЭНы к соответствующим разрядам и получаете профит - последовательно включаются, последовательно выключаются.
И порт Д надо настроить на вывод.
И порт Д надо настроить на вывод.
Docendo discimus
Re: Очень простой термостат для отопления
А как выразить такой алгоритм :
-при команде на вкл. тэнов включается 1 тэн ,через 5-10 сек. включается 2 тэн ,через 5-10 сек. включается 3 тэн .
-после набора заданной температуры, выключаются все тены
-при команде на вкл. тэнов включается 1 тэн ,через 5-10 сек. включается 2 тэн ,через 5-10 сек. включается 3 тэн .
-после набора заданной температуры, выключаются все тены
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Очень простой термостат для отопления
Например так:
если команда = 0, то выключаем все ТЭНы и останавливаем таймер.
если команда = 1, то запускаем таймер с нуля.
Если таймер отсчитал N секунд, то включаем второй ТЭН.
Если таймер отсчитал М секунд, то включаем третий ТЭН.
Все это можно прописать в том же самом месте. Добавить переменную только. Одну.
если команда = 0, то выключаем все ТЭНы и останавливаем таймер.
если команда = 1, то запускаем таймер с нуля.
Если таймер отсчитал N секунд, то включаем второй ТЭН.
Если таймер отсчитал М секунд, то включаем третий ТЭН.
Все это можно прописать в том же самом месте. Добавить переменную только. Одну.
Docendo discimus
Re: Очень простой термостат для отопления
И теперь вопрос ,как это прописать!?
Re: Очень простой термостат для отопления
Почему каша из топора!? Я серьезно!!!
Re: Очень простой термостат для отопления
Код: Выделить всё
//#define katod// если объявлена то инд. с общим катодом
/*
setup.t_stat[X]
0-tr.oFF //Если температура ниже 2 (верхнего) порога вывод (PD5) установлен, иначе сброшен до снижения температуры до 1 (нижнего) порога.
1-tr.On
2-P. On // разница между обраткой и подачей воды с котла станет например 20гр. то насос включить,
3-P.OFF // а если уменьшится например до 5гр. то насос выключить.
4-П Время // отображается температура подачи воды
5-о Время // отображается температура обратки
6-Р Время // отображается реальная разница между подачей и обраткой
7 END
*/
#define BIT _BV
#define PINLED PINB
#define PORTLED PORTB
#define DDRLED DDRB
#define PORTZN PORTC
#define DDRZN DDRC
#define ZN0 BIT(0)
#define ZN1 BIT(1)
#define ZN2 BIT(2)
#define ZN3 BIT(3)
#define BITZN (ZN0|ZN1|ZN2|ZN3)
#define PORTDRIVE PORTD
#define DDRDRIVE DDRD
#define DRIVE_TEN_1 BIT(PD5)
#define DRIVE_TEN_2 BIT(PD6)
#define PINDRIVE PIND
#define swt_t2 BIT(3)
#define btn_plus BIT(2)
#define btn_minus BIT(3)
#define btn_set BIT(4)
#define PORT_1wire PORTC
#define DDR_1wire DDRC
#define PIN_1wire PINC
#define pwire0 BIT(PB4) //бит DQ DS18B20
#define pwire1 BIT(PB5)
#define ds0 4
#define ds1 5
const unsigned char font[]={0x3F,0x6,0x5B,0x4F,0x66,0x6D,0x7D,0x7,0x7F,0x6F,0x79,0x78,0x5E,0x77,0x40,0x80,0x73,0x54, 0x5C, 0x37};
#define f_e 10
#define f_t 11
#define f_d 12
#define f_a 13
#define f_seg_g 14
#define tochka 15
#define f_P 16
#define f_n 17
#define f_o 18
#define f_Prus 19
const uint8_t str_setup[7][4]=
{
{0x78, 0xD0, 0x3F, 0x71},
{0x78, 0xD0, 0x3F, 0x54},
{0xF3, 0x00, 0x3F, 0x54},
{0xF3, 0x3F, 0x71, 0x71},
{0x37,0x0,0x7F, 0xF3 },
{0x5C,0x0,0x7F, 0xF3 },
{0x73,0x0,0x7F, 0xF3 }
},
str_setup_1digit[]={0x06, 0x5B, 0xF3, 0xF3, 0x37, 0x5C, 0x73};
unsigned char lcd_buffer[4], znmesto,state_wire,
view_zadanie, view_regim, eep_eer,
anti_dr, key, btn_speed, n_btn_sp,
out_1wire, temper[4], time_wire,
bcd_num1,bcd_num2,bcd_num3,bcd_num4;
int8_t time_regim, time_view_zadanie;
struct{
int8_t temper[2];
int8_t t_stat[4];
uint8_t time[3];
} setup;
volatile unsigned char time_flag, time[3];//={1,1,1};
//--------time_flag-----------
#define _01sek 0
#define _led 1
#define _viewp 2
//-------------EEPROM-----------------
#define EEP_crc sizeof(setup)+5
//------------------------------------
Re: Очень простой термостат для отопления
Код: Выделить всё
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h> /*F_CPU = 4000000; _delay_ms max = 65,535ms; _delay_us max = 192us */
#include "term41.h"
/*
4000000 meg внутр
*/
ISR(TIMER2_OVF_vect){
if ( --time[_led] == 0 ) time_flag|= BIT(_led);
if ( --time[_01sek] == 0 ) time_flag|= BIT(_01sek);
}
void avr_init(void)
{
TCCR2=BIT(CS20);
TIMSK=BIT(TOIE2);//BIT(TOIE0)|
DDRDRIVE|=DRIVE_TEN_1|DRIVE_TEN_2;
PORTDRIVE|=swt_t2;
DDRZN|=BITZN;
DDRLED=0xFF;
sei();
return;
}
//-------------------EEPROM-------------------------
unsigned char EEPROM_read(unsigned int uiAddress)
{
while(EECR & (1<<EEWE));
EEAR = uiAddress;
EECR |= (1<<EERE);
return EEDR;
}
void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
if ( EEPROM_read(uiAddress)!=ucData){
while(EECR & (1<<EEWE));
cli();
EEAR = uiAddress;
EEDR = ucData;
EECR |= (1<<EEMWE);
EECR |= (1<<EEWE);
sei();
}
}
//-------------END------EEPROM----------------------
//**********1wire************
void pullup_off(void){
DDR_1wire&=~pwire0;
DDR_1wire&=~pwire1;
PORT_1wire&=~pwire0;
PORT_1wire&=~pwire1;
}
unsigned char readbit(void){
unsigned char i;
cli();
DDR_1wire|=out_1wire;//line down
asm("nop");
asm("nop");//1.25us
DDR_1wire&=~out_1wire;//line up through 1.25us
_delay_us(11);
i=PIN_1wire;
sei();
_delay_us(47);
return i;
}
void readbyte(unsigned char *pw0, unsigned char *pw1) {
unsigned char i,r,p;
pullup_off();
*pw0=0;
*pw1=0;
for(i=0, r=1; i<8; i++){
p=readbit();
if ( p & pwire0 ) *pw0|=r;
if ( p & pwire1 ) *pw1|=r;
r<<=1;
}
PORT_1wire|=out_1wire;
DDR_1wire|=out_1wire;
}
void writebit0(void){
cli();
DDR_1wire|=out_1wire;
_delay_us(60);
DDR_1wire&=~out_1wire;
sei();
}
void writebit1(void){
cli();
DDR_1wire|=out_1wire;
_delay_us(3);
DDR_1wire&=~out_1wire;
sei();
_delay_us(58);
}
void writebyte(unsigned char byte){
unsigned char i;
pullup_off();
for(i=0; i<8; i++){
if (byte&BIT(0))
writebit1();
else
writebit0();
byte>>=1;
}
PORT_1wire|=out_1wire;
DDR_1wire |=out_1wire;
}
void detectPresence(void){
unsigned char i;
pullup_off();
out_1wire=pwire0|pwire1;
DDR_1wire|=pwire0;
DDR_1wire|=pwire1;
_delay_ms(0.48);
DDR_1wire&=~pwire0;
DDR_1wire&=~pwire1;
cli();
_delay_us(60);
i=PIN_1wire;
sei();
if ( i & pwire0 ) out_1wire&=~pwire0;
if ( i & pwire1 ) out_1wire&=~pwire1;
if ( out_1wire ){
_delay_ms(0.42);
i=PIN_1wire;
if (!( i & pwire0 )) out_1wire&=~pwire0;
if (!( i & pwire1 )) out_1wire&=~pwire1;
}
if (out_1wire==0) state_wire=0;
else{
PORT_1wire|=out_1wire;
DDR_1wire|=out_1wire;
}
}
//***************************
void scratchpad_save(void){
detectPresence();
if (out_1wire){
writebyte(0xCC);//SKIP ROM [CCh]
writebyte(0x4E);//WRITE SCRATCHPAD [4Eh]
writebyte(0);// TH
writebyte(0);// TL
writebyte(0x7F);// 20 Statys 10bit //writebyte(0x60);// Statys 12bit byte 4 Configuration Register* 0x7F - 12 bit 750mSek; 1F-9bit 94msek
detectPresence();
if (out_1wire){// EEPROM
writebyte(0xCC);//SKIP ROM [CCh]
writebyte(0x48);//COPY SCRATCHPAD [48h]
PORT_1wire|=out_1wire;
DDR_1wire|=out_1wire;
}
}
}
//*******end***1wire************
//**************************************
void result_in_bcd(int result)
{//0000 0000 0000 (1)0000 // (2)0000 (3)0000 (4)0000 (5)0000 hi2 hi3 low4 low5
unsigned char dig_out=0;
bcd_num1=0;
bcd_num2=0;
bcd_num3=0;
bcd_num4=0;
while (result >= 1000) {
result -= 1000;
dig_out ++;
}
bcd_num1=dig_out;
dig_out = 0;
while (result >= 100) {
result -= 100;
dig_out ++;
}
bcd_num2=dig_out;
dig_out = 0;
while (result >= 10) {
result -= 10;
dig_out ++;
}
bcd_num3=dig_out;
bcd_num4=result;
}
//**************************************************
//void format_t(unsigned char p){
//int t_point;
// t_point=(unsigned int)(temper[p*2+1]<<8);//msb
// t_point|=temper[p*2];//lsb;
// result_in_bcd( (t_point&0x0F)*625 );
// t_stat[p+4]=(t_point>>4)*10+bcd_num1;
//}
void receive_t(void){
if ( state_wire==0 )
{
state_wire=1;
detectPresence();
return;
}
if ( state_wire==1 )
{
state_wire=2;
writebyte(0xCC);//SKIP ROM [CCh]
writebyte(0x44);//CONVERT T [44h]
time_wire=100;//87; // time= time_wire/100
return;
}
if ( state_wire==2 )
{
if (!time_wire) state_wire=3;
return;
}
if ( state_wire==3 )
{
state_wire=4;
detectPresence();
return;
}
if ( state_wire==4 )
{
state_wire=5;
writebyte(0xCC);//SKIP ROM [CCh]
writebyte(0xBE);//READ SCRATCHPAD [BEh]
return;
}
if ( state_wire==5 )
{
state_wire=0;
readbyte( &temper[0], &temper[2]);
readbyte( &temper[1], &temper[3]);
setup.temper[0]=(temper[0]>>4)|(temper[1]<<4);//ds18b20
setup.temper[1]=(temper[2]>>4)|(temper[3]<<4);//ds18b20
if ( setup.temper[0] <= setup.t_stat[0] ) PORTDRIVE |= DRIVE_TEN_1;
else
if ( setup.temper[0] >= setup.t_stat[1] ) PORTDRIVE &= ~DRIVE_TEN_1;
if ( (setup.temper[0] - setup.temper[1]) >= setup.t_stat[2] ) PORTDRIVE |= DRIVE_TEN_2;
else
if ( (setup.temper[0] - setup.temper[1]) <= setup.t_stat[3] ) PORTDRIVE &= ~DRIVE_TEN_2;
return;
}
}
//**************************************
void t_in_bcd(int8_t t, uint8_t pin_wire){
unsigned char znak=0;
if ( !(pin_wire & out_1wire) ){
lcd_buffer[0] =font[f_seg_g];
lcd_buffer[1] =font[f_seg_g];
lcd_buffer[2] =font[f_seg_g];
lcd_buffer[3] =font[f_seg_g];
}
else
{
if ( t<0 ){
znak=1;
result_in_bcd( t * -1 );
}
else
result_in_bcd( t );
if ( bcd_num2 ){
lcd_buffer[1]=font[bcd_num2];
lcd_buffer[2]=font[bcd_num3];
}
else
{
if ( bcd_num3 ) {
lcd_buffer[2]=font[bcd_num3];
if ( znak ) lcd_buffer[1]=font[f_seg_g];
}
else if ( znak ) lcd_buffer[2]=font[f_seg_g];
}
lcd_buffer[3]=font[bcd_num4];
}
}
//-------------------------------------
void skan_key(void)
{
unsigned char pin=0;
key=0;
//PORTZN &= ~BITZN;
#ifdef katod
PORTZN |= BITZN;
#else
PORTZN &= ~BITZN;
#endif
DDRLED=BIT(7);
PORTLED=(unsigned char)~BIT(7);
_delay_us(40);
pin=PINLED|BIT(7);
if ( pin!= 0xFF ){
time_view_zadanie=7;//00;//0.05
if (++anti_dr==10)
{
key= ~pin;
}
if (anti_dr==btn_speed){
anti_dr=0;
if (++n_btn_sp==4) btn_speed=15;
}
}
else{
btn_speed=200;
n_btn_sp=0;
anti_dr=0;
}
DDRLED=0xFF;
}
//-------------------------------------
void display(void)
{
#ifdef katod
PORTZN |= BITZN;
if ( znmesto==0 ) PORTZN &= ~ZN0;//PORTZN &= ~ZN0;//
else
if ( znmesto==1 ) PORTZN &= ~ZN1;//PORTZN &= ~ZN1;//
else
if ( znmesto==2 ) PORTZN &= ~ZN2;
else
if ( znmesto==3 ) PORTZN &= ~ZN3;
PORTLED=lcd_buffer[znmesto];
#else
PORTZN &= ~BITZN;
if ( znmesto==0 ) PORTZN |= ZN0;//PORTZN &= ~ZN0;//
else
if ( znmesto==1 ) PORTZN |= ZN1;//PORTZN &= ~ZN1;//
else
if ( znmesto==2 ) PORTZN |= ZN2;
else
if ( znmesto==3 ) PORTZN |= ZN3;
PORTLED=~lcd_buffer[znmesto];
#endif
}
//-------------------------------------
void key_action(void)
{
int8_t *adr;
int8_t limit_plus, limit_minus;
if (key){
adr=(int8_t *) &setup.t_stat[0];
//if (view_zadanie<3){
// limit_plus=124;
// limit_minus=-54;
//}
//else{
limit_plus=100;
limit_minus=0;
//}
if (view_zadanie)
{
if ( key & btn_plus ){
if ( adr[view_zadanie-1]<limit_plus) adr[view_zadanie-1]++; else setup.t_stat[view_zadanie-1]=limit_minus;
time[_viewp]=5;
}
if ( key & btn_minus ){
if ( adr[view_zadanie-1] > limit_minus) adr[view_zadanie-1]--; else setup.t_stat[view_zadanie-1]=limit_plus;
time[_viewp]=5;
}
}
if ( key & btn_set )
{
if ( view_zadanie){
EEPROM_write(view_zadanie-1, adr[view_zadanie-1] );
adr=(uint8_t *) &setup.t_stat[0];
for(limit_plus=limit_minus=0; limit_plus<sizeof(setup)-sizeof(setup.temper); limit_plus++, adr++)
limit_minus+=*adr;
EEPROM_write(EEP_crc, limit_minus );
eep_eer=0;
}
if (++view_zadanie>sizeof(setup)-sizeof(setup.temper)) view_zadanie=0;
time_flag |= BIT(_viewp);
time[_viewp]=100;
}
}
}
void regim_count(void){
uint8_t i;
if (--time_regim<=0)
{
i=view_regim;
if (++i>sizeof(setup.time)-1) i=0;
while(setup.time[i]==0){
if (i==view_regim) {time_regim=1; return;}
if (++i>sizeof(setup.time)-1) i=0;
}
view_regim=i;
time_regim=setup.time[i];
}
}
//-------------------------------------
void data_led(void)
{
unsigned char i;
for(i=0;i<4;i++)
lcd_buffer[i]=0x0;
if (view_zadanie)
{
if ( time_flag & BIT(_viewp) )
{
for(i=0; i<4; i++)
lcd_buffer[i]=str_setup[view_zadanie-1][i];
}
else {
lcd_buffer[0]=str_setup_1digit[view_zadanie-1];
t_in_bcd(setup.t_stat[view_zadanie-1],pwire0);
}
}
else
{
if (eep_eer) i=0xFF;
else i=view_regim;
if ( time_flag & BIT(_viewp) ) i=3;
switch (i){
case 0: //t_П - отображается температура подачи воды
t_in_bcd(setup.temper[0],pwire0);
lcd_buffer[0]=font[f_Prus];
break;
case 1: //t_о - отображается температура обратки
t_in_bcd(setup.temper[1],pwire1);
lcd_buffer[0]=font[f_o];
break;
case 2: //t_Р - отображается реальная разница между подачей и обраткой
t_in_bcd(setup.temper[0]-setup.temper[1],pwire1);
lcd_buffer[0]=font[f_P];
break;
case 3: //показывает конец настроек
lcd_buffer[1]=font[f_e];
lcd_buffer[2]=font[f_n];
lcd_buffer[3]=font[f_d];
break;
case 0xFF:
lcd_buffer[1]=font[f_e];
lcd_buffer[2]=font[f_e];
lcd_buffer[3]=font[f_P];
break;
default: t_in_bcd(setup.temper[0],pwire0);
}
//if ( PINDRIVE & swt_t2 )
//t_in_bcd(t_stat[ds0],pwire0);
// t_in_bcd(setup.temper[0],pwire0);
// else
// t_in_bcd(t_stat[ds1],pwire1);
}
}
//-------------------------------------
void data_eeprom_read(void){
unsigned char i,a, *adr;
adr=(uint8_t *) &setup.t_stat[0];
for (a=i=0; i<sizeof(setup)-sizeof(setup.temper) ; i++, adr++)
{
*adr= EEPROM_read(i);
a+=(*adr);
}
if (a!=EEPROM_read(EEP_crc)) eep_eer=1;
}
int main(void)
{
uint8_t t_1sek=0;
cli();
avr_init();
data_eeprom_read();
PORTDRIVE &= ~(DRIVE_TEN_1|DRIVE_TEN_2);
detectPresence();
if (out_1wire){
writebyte(0xCC);//SKIP ROM [CCh]
writebyte(0xBE);//READ SCRATCHPAD [BEh]
readbyte(&temper[0],&temper[0]);//LSB
readbyte(&temper[0],&temper[0]);//MSB
readbyte(&temper[0],&temper[0]);
readbyte(&temper[0],&temper[0]);
readbyte(&temper[0],&temper[1]);
//byte 4 Configuration Register* 0x1F-9bit 94msek; 3F-10bit 188msek; 0x5F-11bit 375msek; 0x7F - 12 bit 750mSek;
if ( ((temper[0]!=0x7F)&&(pwire0 & out_1wire))
|| ((temper[1]!=0x7F)&&(pwire1 & out_1wire)) ){
scratchpad_save();//10ms
time[0]=255;
while(time[0]);
time[0]=255;
while(time[0]);
}
temper[0]=0;
}
while(1)
{
if ( time_flag & BIT(_led) )//
{
time_flag &= ~BIT(_led);
time[_led]=70;//~0.00
data_led();
skan_key();
key_action();
display();
if ( ++znmesto==4 )
{
znmesto=0;
}
receive_t();
}
if ( time_flag & BIT(_01sek) )
{
time_flag &= ~BIT(_01sek);
time[_01sek]=156;//~0,01
time_wire--;
//if (--time_view_zadanie==0) view_zadanie=0;
if (--time[_viewp]==0) time_flag &= ~BIT(_viewp);
if ( !(pwire0 & out_1wire) ) PORTDRIVE &= ~(DRIVE_TEN_1|DRIVE_TEN_2);//PORTDRIVE &= ~DRIVE_TEN_1;//
if (--t_1sek==0){
t_1sek=100;
if (--time_view_zadanie==0) view_zadanie=0;
regim_count();
}
}
}
}
Re: Очень простой термостат для отопления
Coviraylhik писал(а):Раз все так просто, сделать тогда на трех таймерах 555, у каждого настроив время включения после пуска.
улыбнуло...
вопрос на засыпку...
Вам регулировать температуру или просто включать с фиксированными задержками?
удачи вам
(круглый)
ЗЫ
Есть факторы влияющие на регулировку:
влажность
скорость воздушного потока
температура окружающей среды
разная временная дельта регулируемых элементов(от текущей температуры до той, что требуется)
всё равно 5 секунд?
Re: Очень простой термостат для отопления
Меня наверно не правильно поняли ! Мне хотелось добавить в существуюшею прошивку термостата пошаговое включение("пошаговое 1-2-3")тэнов с интервалом 5-10сек, а выклчение по достижении заданной температуры всех тэнов . Я просто не знаю как это написать и куда в код добавить поэтому я показал исходники для лучшего ознакомления!


