Ovládání teplotního čidla Dallas DS18B20 pro uC AVR

Teplotní čidlo Dallas umožňuje jednovodičové ( GND, Data) nebo vícevodičové (GND, Ucc, Data) připojení. Jedná se o čidlo s digitálním výstupem. Dowland datasheet: datasheets.maxim-ic.com/en/ds/DS18B20.pdf

 

Hlavičkový a zdrojový soubor pro komunikaci s čidlem:   DS18B20.h (1,6 kB)   DS18B20.c (2,5 kB)

 

Nově v prodejičidla Dallas v kovovém pouzdře s kabelem: www.vselektro.eu/1-wire-sbernice.html
 

Příklad použití:

(zobrazení teploty na LCD, ATmega 32, vývojový kit EvB 4.3, třívodičové připojení)

/*
** ===================================================================
** Describe:       : Source file for basic measure and view temperature
**                       : with Dallas DS18B20 and evaluation kit EvB 4.3 (ATmega)
**                       :
** Author:          : Unknown,
**                       : remade Vít Svadbík, 2012
** ===================================================================
*/
#define F_CPU 16000000UL
#include
#include "lcd_h.h"
#include "DS18B20.h"

char buffer[16];
void read_temperature(char *buffer);

int main( void ){
lcd_init();
lcd_clrscr();
  for (;;) {
  read_temperature(buffer);
  _delay_ms(5000);            //updating ever 5 second
  }

}

void read_temperature(char *buffer){
uint8_t temperature[2];
//**Reset, skip ROM and start temperature conversion
therm_reset();
therm_write_byte(SKIP_ROM);
therm_write_byte(CONVERT_T);


//**Wait until conversion is complete
while(!therm_read_bit()); //DS18B20 send 1 for conversion is done

//**Reset, skip ROM and send command to read Scratchpad
therm_reset();
therm_write_byte(SKIP_ROM);
therm_write_byte(READ_SCRAT);

//**Read Scratchpad (only 2 first bytes)
temperature[0]=therm_read_byte();        //low byte
temperature[1]=therm_read_byte();        //high byte
therm_reset();

//**conversion 2 byte to digit and decimal
uint8_t digit;
uint16_t decimal;

digit = (temperature[1]<<4)&0xf0;        //form 2 bytes to byte for conversion
digit |= (temperature[0]&0xf0)>>4;

decimal = (temperature[0]&0xf)*625;        //625 create whole number (over 8b therefore uint16_t)
decimal/=100;    //only 2 decimal place (1000 - one decimal place)

//**display
lcd_clrscr();
lcd_gotoxy(0,0);
lcd_puts("Teplota:");

 if (digit>=127){
  lcd_gotoxy(0,1);
  lcd_putc('-');
 }
lcd_gotoxy(1,1);
sprintf(buffer, "%2d.", digit);
lcd_puts(buffer);
sprintf(buffer, "%d", decimal);
lcd_puts(buffer);
}

source_file.c (1,8 kB)

projekt AVR studio 4 :DS18B20.zip (54,2 kB)