Ingo Electronics

PIC Termometras-termoreguliatorius DS18S20

Termometras - termoreguliatorius matuoja temperatūrą  nuo -55°C iki +127°C, 0.5° tikslumu.
Temperatūros matavimui naudojamas skaitmeninis sensorius DS18S20.
Relė RL1 įjungia arba išjungia kaitinimo elementą prie nustatytų reikšmių.
Kadangi relės RL1 kontaktai yra silpni tiesiogiai jungti galingesnį šildymo elementą, reikalingas papildomas magnetinis paleidėjas.
Tempertūra kurią norima palaikyti nustatoma mygtukų JP2,JP3 pagalba.
Nustatyta temperatūra automatiškai įrašoma į mikrokontrolerio EEPROM atmintį, todėl reguliatoriui išjungus maitinimą, ir po to vėl įjungus, nustatymai išliks nepakitę.
Palaikoma temperatūra nustatoma 1° tikslumu.
Indikacijai naudojamas 16x2 LCD displėjus.
Šiame variante naudojamas mikrokontroleris PIC16F84A.
 

PROTEUS v7.2 SP2 testavimo failas:           

 

PROTEUS v7.2 SP2 projektas:

 

Hex failas PIC16F84A programavimui:

 

Žemiau pateikiamas C kodas mikroC v6.2.1.0 kompiliatoriui:

//mikroC v7.2.1.0 compiler
//Termometras - Termoreguliatorius su PIC16F84A 4Mhz
//Naudojamas DS18S20 sensorius, kuris pajungatas prie RA0 pino.
//Reguliavimas vykdomas tik teigiamai temperaturai
//Rezultatas isvedamas i 16x2 LCD1602B displeju
//Sioje programoje mikroC bibliotekos funkcija OneWire nenaudojama.

unsigned short Tempset,n,i;
int i_byte;
unsigned char buff[9];
unsigned char Temp;
unsigned char bufflcd[4];

void _1w_pin_hi();
void _1w_pin_low();
void _1w_strong_pull_up();
void _1w_init();
void _1w_out_byte(char d);
void setdec();
//******************************************************************************
void main(){
LCD_Init(&PORTB);
LCD_Cmd(LCD_CURSOR_OFF);
TRISA.F1=0;                            //RA1 pinas panaudotas kaip isejimas reles valdymui
TRISA.F2=1;TRISA.F3=1;        //RA1 RA2 pinai panaudoti nustatymui
TRISA.F4=0;                           //napanaudotas RA4 pinas

do{
setdec();
Tempset = Eeprom_Read(0x32);

ByteToStr(Tempset,bufflcd);
LCD_Out(2,1,"Temp set +");
LCD_Out(2,11,bufflcd);

LCD_Chr_CP(223);                // Print degree character
LCD_Chr_CP('C');

 delay_ms(10);
      _1w_init();
      _1w_out_byte(0xcc);    // siunciama komanda skip ROM
      _1w_out_byte(0x44);   // siunciama komanda perform temperature conversion
      _1w_strong_pull_up();
      _1w_init();
      _1w_out_byte(0xcc);    // skip ROM
      _1w_out_byte(0xbe);   // read the result

for (n=0; n<9; n++)                        //sudedame i buferi buff[] devynis BEh komandos baitus
{buff[n]=Ow_Read(&PORTA,0);;}    //buff[1] - zenklo baitas,buff[8] - CRC baitas

if (buff[1]==255) {LCD_Chr(1,1,45); }  //rodom -

if (buff[1]== 0 ) {LCD_Chr(1,1,43); }  //rodom +
if (buff[1] == 255){
Temp = (~buff[0]+1)/2;                     //invertuojam ir pridedam 1,buff[0] yra pirmasis(temperaturinis) baitas
ByteToStr(Temp,bufflcd);
LCD_Out(1,2,bufflcd); }
else { Temp = (buff[0])/2;
ByteToStr(Temp,bufflcd);
LCD_Out(1,2,bufflcd); }

LCD_Chr_CP('.');                                                                                //taskas arba kablelis
if (buff[0].F0 == 1) {LCD_Chr_CP('5');} else {LCD_Chr_CP('0');}       //rodom po kablelio
LCD_Chr_CP(223);                                                                            // Print degree character
LCD_Chr_CP('C');                                                                               // Print 'C'

if (Temp < Eeprom_Read(0x32) )
{PORTA.F1=1;} else {PORTA.F1=0;}                                                 //reles valdymo salyga
if (buff[1]==255) {PORTA.F1=1;}                                                    // rele pastoviai ijungta kai temperatura yra neigiama
}

while (1);
}
//******************************************************************************
void setdec(){
if (PORTA.F2==0) {Tempset = Tempset-1;if (Tempset >126 ) {Tempset=0 ;}}
if (PORTA.F3==0) {Tempset = Tempset+1;if (Tempset >126 ) {Tempset=0 ;}}
EEprom_Write(0x32,Tempset);
Delay_ms(500);                        //butinas laikas irasymui i EEprom atminti
}
//******************************************************************************
void _1w_out_byte(char d){
for(n=0; n<8; n++)
   {     if (d&1)
      {
         PORTA.F0=0;
         TRISA.F0=0;
         TRISA.F0=1;
         delay_us(60);
      }    else   {
          PORTA.F0=0;
          TRISA.F0=0;
         delay_us(60);
          TRISA.F0=1;
      }
      d=d>>1;
   }
}
//******************************************************************************
void _1w_init()
{
_1w_pin_hi();
_1w_pin_low();
delay_us(500);
_1w_pin_hi();
delay_us(500);
}
//******************************************************************************
void _1w_pin_hi()          //paduodamas aukstas lygis
{TRISA.F0 = 1;}
//******************************************************************************
void _1w_pin_low()         //paduodamas zemas lygis
{PORTA.F0 = 0; TRISA.F0 = 0;}
//******************************************************************************
void _1w_strong_pull_up()  // bring DQ to strong +5VDC
{
   PORTA.F0 = 1;
   TRISA.F0 = 0;
   delay_ms(250);
   TRISA.F0 = 1;
}
//******************************************************************************