Очень простой термостат для отопления

Обсуждаем цифровые устройства...
Виктор74
Родился
Сообщения: 12
Зарегистрирован: Сб окт 29, 2011 11:39:01

Очень простой термостат для отопления

Сообщение Виктор74 »

Доброго времени суток! Собрал данное устройство погонял в железе и Протеусеhttp://radiokot.ru/circuit/digital/home/29/01.gif. Решил использовать его в гараже для отопления! Только неустраивает некоторые моменты:
-котелок у меня простой ,100 труба внутри тены на 220 В 3 штуки , хотелось бы включать тены не все сразу, а по одному через ну скажем 10-15 сек.
Языком С я не обучен! Пытаюсь в Баскоме разобратся . Пока ноль. Если можно поправте прошивку! Пожалуйста!
http://radiokot.ru/circuit/digital/home/29/01.rar
Реклама
Аватара пользователя
zhu4er
Вымогатель припоя
Сообщения: 544
Зарегистрирован: Пт июн 04, 2010 17:40:13
Откуда: Непокорный город-герой Севастополь

Re: Очень простой термостат для отопления

Сообщение zhu4er »

Мда...для того чтобы включать тены с разницей по времени - это не только прошивку менять надо, но и схему дополнять ещё двумя выходами на исполнительные устройства! Вопросы: а тэны у вас по сколько киловатт? А исполнительные устройства у вас какие будут? И почему надо включать тэны по отдельности?
Даже у стен есть уши...
Реклама
Виктор74
Родился
Сообщения: 12
Зарегистрирован: Сб окт 29, 2011 11:39:01

Re: Очень простой термостат для отопления

Сообщение Виктор74 »

Ну можно использовать свободные выхода контроллера, подключить реле например, семистор, и т.д.Тэны по 1,5 кВт каждый на 220В , насос с 3 ступенями скорости переключаются в ручную.Можно поменять выход управлением насоса на включение скажем второй ступени мощности котла! Исходя из практики ,управление насосом циркуляции отопления в данной конструкции не корректно, лучше когда насос крутит теплоноситель постоянно! А вот "пошаговое 1-2-3" включение тэнов даже очень гуд! В этом плюсов больше: например просадка напряжения и т.д, методом тумблера можно уменьшить эл.мощность котла.
Аватара пользователя
Coviraylhik
Мучитель микросхем
Сообщения: 420
Зарегистрирован: Чт июн 03, 2010 23:06:12

Re: Очень простой термостат для отопления

Сообщение Coviraylhik »

Вариант можно сделать просто , на каждый тен нужно задействовать порт микроконтроллера, и работать будет по условию:

например

при < = 23.9°C - тен № 1
при < = 23.7°C - тен № 2
при < = 23.5°C - тен № 3
при < = 23.3°C - тен № 4

и так далее зависит сколько вы желаете использовать тенов и какую температуру поддержать , есть и практически готовая для этого схема только она на тини2313, http://hardlock.org.ua/viewtopic.php я как раз ее использовал для подобного применения
Некакого перимирия, Некаких мирных шагов навстречу и периговоров.
Реклама
Эиком - электронные компоненты и радиодетали
kolobok0
Грызет канифоль
Сообщения: 296
Зарегистрирован: Ср дек 30, 2009 09:55:39

Re: Очень простой термостат для отопления

Сообщение kolobok0 »

Coviraylhik писал(а):....например
при < = 23.9°C - тен № 1
при < = 23.7°C - тен № 2
при < = 23.5°C - тен № 3
при < = 23.3°C - тен № 4...
забегая вперёд :) типичная ошибка...
и тэн даёт дельту в 70 градусов.
вопрос, что будет если температура 20 градусов? :))))

ответ:
вышибет пробки

(круглый)
Реклама
Виктор74
Родился
Сообщения: 12
Зарегистрирован: Сб окт 29, 2011 11:39:01

Re: Очень простой термостат для отопления

Сообщение Виктор74 »

Да всё намного проще !!! Не надо делать темпиратурную зависимость включения тэнов! Нужно просто включать тэны не все сразу , а по очереди, при команде на включение . А как это сделать программно я никак не допетрю!!!
Реклама
Аватара пользователя
Coviraylhik
Мучитель микросхем
Сообщения: 420
Зарегистрирован: Чт июн 03, 2010 23:06:12

Re: Очень простой термостат для отопления

Сообщение Coviraylhik »

Раз все так просто, сделать тогда на трех таймерах 555, у каждого настроив время включения после пуска.
Некакого перимирия, Некаких мирных шагов навстречу и периговоров.
Виктор74
Родился
Сообщения: 12
Зарегистрирован: Сб окт 29, 2011 11:39:01

Re: Очень простой термостат для отопления

Сообщение Виктор74 »

Я про это уже думал ! Хотелось бы реализовать програмно! Без лишних деталей!
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Очень простой термостат для отопления

Сообщение pyzhman »

Монстры 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
Виктор74
Родился
Сообщения: 12
Зарегистрирован: Сб окт 29, 2011 11:39:01

Re: Очень простой термостат для отопления

Сообщение Виктор74 »

А можно по подробней!
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Очень простой термостат для отопления

Сообщение pyzhman »

Судя по названию переменной, то, что в {}, выполняется раз в секунду. Раз в секунду считываем состояние порта(именно порта, а не пинов) и сдвигаем вправо(облажался, в предыдущем посте указано влево) на два разряда. Накладываем по ИЛИ опять же состояние порта и выплевываем обратно в порт. Т.о. в третьем разряде инфа будет появлятся через одну секунду после ее появления в пятом разряде, а в первом разряде через две секунды. То же самое с разрядами 4 и 2. Подключаете ТЭНы к соответствующим разрядам и получаете профит - последовательно включаются, последовательно выключаются.
И порт Д надо настроить на вывод.
Docendo discimus
Виктор74
Родился
Сообщения: 12
Зарегистрирован: Сб окт 29, 2011 11:39:01

Re: Очень простой термостат для отопления

Сообщение Виктор74 »

А как выразить такой алгоритм :
-при команде на вкл. тэнов включается 1 тэн ,через 5-10 сек. включается 2 тэн ,через 5-10 сек. включается 3 тэн .
-после набора заданной температуры, выключаются все тены
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Очень простой термостат для отопления

Сообщение pyzhman »

Например так:
если команда = 0, то выключаем все ТЭНы и останавливаем таймер.
если команда = 1, то запускаем таймер с нуля.
Если таймер отсчитал N секунд, то включаем второй ТЭН.
Если таймер отсчитал М секунд, то включаем третий ТЭН.

Все это можно прописать в том же самом месте. Добавить переменную только. Одну.
Docendo discimus
Виктор74
Родился
Сообщения: 12
Зарегистрирован: Сб окт 29, 2011 11:39:01

Re: Очень простой термостат для отопления

Сообщение Виктор74 »

И теперь вопрос ,как это прописать!?
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Очень простой термостат для отопления

Сообщение pyzhman »

Каша из топора?
Docendo discimus
Виктор74
Родился
Сообщения: 12
Зарегистрирован: Сб окт 29, 2011 11:39:01

Re: Очень простой термостат для отопления

Сообщение Виктор74 »

Почему каша из топора!? Я серьезно!!!
Виктор74
Родился
Сообщения: 12
Зарегистрирован: Сб окт 29, 2011 11:39:01

Re: Очень простой термостат для отопления

Сообщение Виктор74 »

Код: Выделить всё

//#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
//------------------------------------

Виктор74
Родился
Сообщения: 12
Зарегистрирован: Сб окт 29, 2011 11:39:01

Re: Очень простой термостат для отопления

Сообщение Виктор74 »

Код: Выделить всё

#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();
			}
		}
	}

}

kolobok0
Грызет канифоль
Сообщения: 296
Зарегистрирован: Ср дек 30, 2009 09:55:39

Re: Очень простой термостат для отопления

Сообщение kolobok0 »

Coviraylhik писал(а):Раз все так просто, сделать тогда на трех таймерах 555, у каждого настроив время включения после пуска.
:)
улыбнуло...

вопрос на засыпку...
Вам регулировать температуру или просто включать с фиксированными задержками?

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

всё равно 5 секунд? :)
Виктор74
Родился
Сообщения: 12
Зарегистрирован: Сб окт 29, 2011 11:39:01

Re: Очень простой термостат для отопления

Сообщение Виктор74 »

Меня наверно не правильно поняли ! Мне хотелось добавить в существуюшею прошивку термостата пошаговое включение("пошаговое 1-2-3")тэнов с интервалом 5-10сек, а выклчение по достижении заданной температуры всех тэнов . Я просто не знаю как это написать и куда в код добавить поэтому я показал исходники для лучшего ознакомления!
Ответить

Вернуться в «Цифровая техника»