Вт дек 25, 2012 12:36:13
Вт дек 25, 2012 12:48:03
Antik писал(а):в программировании я дуб-дубом, но руки из правильного места растут, паяльник умею держать.
Вт дек 25, 2012 12:51:43
Вт дек 25, 2012 13:03:57
Вт дек 25, 2012 13:12:23
Вт дек 25, 2012 15:44:02
/*
* Project name:
TermRele (Termometr andTimer)
* Copyright:
(c) MikroElektronika, 2005.
* Description:
* Test configuration:
MCU: PIC12F629
Oscillator: Internal, 04.000 MHz
Ext. Modules: -
SW: mikroC v7.0
* NOTES:
None.
*/
#define Data GPIO.GP2
#define Clk GPIO.GP0
#define Strob GPIO.GP1
#define DS &GPIO,GP4
#define Button GPIO.GP3
#define BeepPin GPIO.GP5
unsigned char counter,Des,Edn,FirstByte,SecondByte,Seg1,Seg2,Seg3,Minuts;
unsigned char DesSec,EdnSec,tmp0,tmpH,Seg10,Seg20,Flags;
const unsigned int FTMR0 = 0,FOnTen = 1,TimeDispTemp=8,TenOnTerm = 38,\
FStop = 2,FBeep = 3,TenOffTerm = 40;//,FTMR1 = 1;
const unsigned int Time05SH = 0xB;
const unsigned int Time05SL = 0xDB;
const unsigned char CharArrey[12] = {0b00000011, 0b10011111, 0b00100101,\
0b00001101, 0b10011001, 0b01001001,\
0b01000001, 0b00011111, 0b00000001,\
0b00001001, 0b00111001, 0b11111111};
void LedOut(){
unsigned char i;
for (i = 0; i <=7u; i++){
FirstByte = FirstByte >>1;
if (STATUS.C == 1)
Data = 1;
else
Data = 0;
Clk = 1;
Clk = 0;
}
for (i = 0; i <=7u; i++){
SecondByte = SecondByte >> 1;
if (STATUS.C == 1)
Data = 1;
else
Data = 0;
Clk = 1;
Clk = 0;
}
Strob = 1;
Strob = 0;
}//~
void interrupt(){
static unsigned char i,j;
if (INTCON.T0IF == 1){
TMR0 = 96;
INTCON.T0IF = 0;
Flags.FTMR0=1;
if ((counter & 0b00010000) != 0)
counter = 0b10000000;
switch(counter){
case 0b10000000:{
if (i != 0)
SecondByte = (CharArrey[Seg1] & 0b11111110); //Гасим точку если показываем температуру
else
SecondByte = CharArrey[Seg1];
break;}
case 0b01000000:SecondByte = CharArrey[Seg2]; break;
case 0b00100000:SecondByte = CharArrey[Seg3]; break;
}
FirstByte = counter;
if (Flags.FOnTen == 1)
FirstByte = (FirstByte | 0b00000001);
counter = counter >> 1;
LedOut();}
else{
TMR1H = Time05SH;
TMR1L = Time05SL;
PIR1.TMR1IF = 0;
if (Button == 0){ //Переустанавливаем таймер если кнопка нажата
// Flags.FStop = 1;
Flags.FBeep = 0;
Minuts = 9;
DesSec = 5;
EdnSec = 10;
}
if (j==1){
j = 0;
if (((EdnSec || DesSec) || Minuts) != 0){ //Проверяем досчитал ли до нуля таймер
if (EdnSec == 0){
EdnSec = 9;
if (DesSec == 0){
DesSec = 5;
if (Minuts == 0)
Minuts = 9;
else
Minuts--;}
else
DesSec--;}
else
EdnSec--;
}
Seg1 = Minuts;
Seg2 = DesSec;
Seg3 = EdnSec;
i++;
if (i == TimeDispTemp){
i=0;
Seg1 = Seg10;
Seg2 = Seg20;
Seg3 = 0x0A;
}
}
else
j++;
}
}
void Beep(){
unsigned int k;
for (k=0;k<8000;k++){
BeepPin = ~BeepPin;
Delay_us(125);
}
}
void main() {
unsigned char i; //tmp0,tmpH;
OPTION_REG = 0b10000100; // assign prescaler to TMR0
TRISIO = 0b00010000; // designate gpio as output
GPIO = 0b00000000; // initialize gpio
// counter = 0; // initialize counter
TMR0 = 96;
counter = 0b10000000;
Data = 0;
Clk = 0;
Strob = 0;
BeepPin = 0;
TMR1H = Time05SH;
TMR1L = Time05SL;
T1CON = 0b00110001;
PIE1.TMR1IE = 1;
INTCON = 0b11100000; // enable TMRO interrupt
Minuts = 9;
DesSec = 5;
EdnSec = 10;
Beep();
do{
Flags.FTMR0 = 0;
do{}
while (Flags.FTMR0 != 1); //((Flags.FTMR0 != 1) && (Flags.FTMR1 != 1));
OW_Reset(DS);
OW_Write(DS,0xCC); // Issue command SKIP_ROM
OW_Write(DS,0x44); // Issue command CONVERT_T
Delay_us(1000);
Flags.FTMR0 = 0;
do{}
while (Flags.FTMR0 != 1); //((Flags.FTMR0 != 1) && (Flags.FTMR1 != 1));
OW_Reset(DS);
OW_Write(DS,0xCC); // Issue command SKIP_ROM
OW_Write(DS,0xBE); // Issue command READ_SCRATCHPAD
Flags.FTMR0 = 0;
do{}
while (Flags.FTMR0 != 1); //((Flags.FTMR0 != 1) && (Flags.FTMR1 != 1));
tmp0 = OW_Read(DS); // Get temperature LSB
tmpH = OW_Read(DS); // Get temperature MSB
tmpH = 0;
tmp0 = tmp0 / 2;
if (tmp0 >= TenOffTerm)
Flags.FOnTen = 0;
if (tmp0 < TenOnTerm)
Flags.FOnTen = 1;
while(tmp0 >= 10){
tmp0 = tmp0 - 10;
tmpH++;}
if (tmpH == 0)
Seg10 = 0x0B;
else
Seg10 = tmpH;
Seg20 = tmp0;
Delay_ms(1000);
if (((EdnSec || DesSec) || Minuts) == 0){
if (Flags.FBeep == 0){
Beep();
Flags.FBeep = 1;
}
}
} while(1);
}//~
Вт дек 25, 2012 17:47:26
Antik писал(а):Можно например установить один датчик в салоне автомобиля в подходящем месте, а второй непосредственно в сиденье вмонтировать, или же обойтись только одним датчиком в сидении. Можно так же добавить регулировку (погрешность датчика) температуры кнопками. или изобразить нечто со светодиодными сегментами для наглядности работы устройства (например уровень мощности на данный момент времени подогрева)
Ср дек 26, 2012 00:53:05
Ср дек 26, 2012 01:22:27
korsaj писал(а):Есть подобный проект (удерживает температтуру на 38-40 градусах)
Ср дек 26, 2012 03:56:16
Antik писал(а):Да не к спеху, главное сам подогрев есть, но вот только ручками все время приходится его то включать то выключать.
Ср дек 26, 2012 08:12:16
Ср дек 26, 2012 11:30:58
Antik писал(а):Спасибо, посмотрю тему.
Чт дек 27, 2012 12:39:51
Чт дек 27, 2012 12:56:31
Antik писал(а):...а возможно ли сделать так, как во вложении? Накидал схемку управления двумя сиденьями.
Antik писал(а):Регулировку температуры достаточно упростить до целых градусов, десятые доли не столь заметны.
Antik писал(а):И еще возможно ли добавить полное отключение первого и\или второго нагревателя полностью? Например жмем mode -> загорается t1 -> жмем на mode еще раз и удерживаем на 1-2 секунды, и нагреватель отключается полностью, а при повторной процедуре включался на ранее выставленную температуру? (в общем реализовать on\off)
Чт дек 27, 2012 13:05:25
Soir писал(а):В этом варианте есть ручное включение/отключение и регулирование. Правда только один канал.
Чт дек 27, 2012 13:50:41
Antik писал(а):Давайте сделаем на 2 датчика, без ШИМ, на 2 подогрева.
Чт дек 27, 2012 15:25:39
Чт дек 27, 2012 17:38:53
Antik писал(а):Soir, не оно случаем?
Чт дек 27, 2012 20:45:07
Чт дек 27, 2012 21:41:31
Antik писал(а):Возможность вкл\выкл была бы не лишней хотелось бы полностью избавиться от моих (сейчас установленных) громоздких выключателей обогрева.