OneWire DS18B20,DS2450,MAX31850

Dependents:   MAX31850_HelloWorld

Committer:
fblanc
Date:
Thu Feb 12 14:03:55 2015 +0000
Revision:
0:9acbbb021a43
MAX31850 ok

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fblanc 0:9acbbb021a43 1 /**
fblanc 0:9acbbb021a43 2 * @file DS18x20.c
fblanc 0:9acbbb021a43 3 * @brief library of DS18X20 1-Wire digital thermometer (http://www.maxim-ic.com/datasheet/index.mvp/id/2812)
fblanc 0:9acbbb021a43 4 * @author Maciej Rajtar (Published 10 May 2010 www.mbed.org)
fblanc 0:9acbbb021a43 5 * @author Frederic BLANC (Published 01/03/2012 www.mbed.org)
fblanc 0:9acbbb021a43 6 */
fblanc 0:9acbbb021a43 7 #include "mbed.h"
fblanc 0:9acbbb021a43 8 #include "onewire.h"
fblanc 0:9acbbb021a43 9 #include "DS18X20.h"
fblanc 0:9acbbb021a43 10 #include "crc8.h"
fblanc 0:9acbbb021a43 11 #include "utils.h"
fblanc 0:9acbbb021a43 12 //**********************************************************************************************************
fblanc 0:9acbbb021a43 13 //* DS18X20_show_temp
fblanc 0:9acbbb021a43 14 //**********************************************************************************************************
fblanc 0:9acbbb021a43 15
fblanc 0:9acbbb021a43 16 /**
fblanc 0:9acbbb021a43 17 * @brief DS18X20_show_temp
fblanc 0:9acbbb021a43 18 * @param [in] id[] = rom_code
fblanc 0:9acbbb021a43 19 * @param [in] n number of id[n]
fblanc 0:9acbbb021a43 20 * @param [out] text temp in degre celsius
fblanc 0:9acbbb021a43 21
fblanc 0:9acbbb021a43 22 * @date 20/06/2011
fblanc 0:9acbbb021a43 23 */
fblanc 0:9acbbb021a43 24 void DS18X20_show_temp(uint8_t subzero, uint8_t cel, uint8_t cel_frac_bits,char *text) {
fblanc 0:9acbbb021a43 25 uint16_t decicelsius;
fblanc 0:9acbbb021a43 26 char s[10];
fblanc 0:9acbbb021a43 27 float temperature;
fblanc 0:9acbbb021a43 28 sprintf(text,"");
fblanc 0:9acbbb021a43 29 sprintf(s,"%s", (subzero)?"-":"");
fblanc 0:9acbbb021a43 30 strcat(text,s);
fblanc 0:9acbbb021a43 31 decicelsius = DS18X20_temp_to_decicel(subzero, cel, cel_frac_bits);
fblanc 0:9acbbb021a43 32 temperature = decicelsius;
fblanc 0:9acbbb021a43 33 temperature = temperature/10;
fblanc 0:9acbbb021a43 34 sprintf(s,"%4.1f", temperature);
fblanc 0:9acbbb021a43 35 strcat(text,s);
fblanc 0:9acbbb021a43 36
fblanc 0:9acbbb021a43 37 }
fblanc 0:9acbbb021a43 38 /**
fblanc 0:9acbbb021a43 39 * @brief DS18X20_show_temp
fblanc 0:9acbbb021a43 40 * @param [in] id[] = rom_code
fblanc 0:9acbbb021a43 41 * @param [in] n number of id[n]
fblanc 0:9acbbb021a43 42 * @return temp in degre celsius
fblanc 0:9acbbb021a43 43
fblanc 0:9acbbb021a43 44 * @date 21/10/2011
fblanc 0:9acbbb021a43 45 */
fblanc 0:9acbbb021a43 46 float DS18X20_temp(uint8_t subzero, uint8_t cel, uint8_t cel_frac_bits) {
fblanc 0:9acbbb021a43 47 return ((subzero)?-1:1)*DS18X20_temp_to_decicel(subzero, cel, cel_frac_bits)/10;
fblanc 0:9acbbb021a43 48 }
fblanc 0:9acbbb021a43 49 //**********************************************************************************************************
fblanc 0:9acbbb021a43 50 //* DS18X20_get_power_status
fblanc 0:9acbbb021a43 51 //**********************************************************************************************************
fblanc 0:9acbbb021a43 52
fblanc 0:9acbbb021a43 53 /**
fblanc 0:9acbbb021a43 54 * @brief get power status of DS18x20
fblanc 0:9acbbb021a43 55 * @param [in] id[] = rom_code
fblanc 0:9acbbb021a43 56 * @return DS18X20_POWER_EXTERN or DS18X20_POWER_PARASITE
fblanc 0:9acbbb021a43 57 * @date 20/06/2011
fblanc 0:9acbbb021a43 58 */
fblanc 0:9acbbb021a43 59 uint8_t DS18X20_get_power_status(uint8_t id[]) {
fblanc 0:9acbbb021a43 60 uint8_t pstat;
fblanc 0:9acbbb021a43 61 ow_reset();
fblanc 0:9acbbb021a43 62 ow_command(DS18X20_READ_POWER_SUPPLY, id);
fblanc 0:9acbbb021a43 63 pstat=ow_bit_io(1); // pstat 0=is parasite/ !=0 ext. powered
fblanc 0:9acbbb021a43 64 ow_reset();
fblanc 0:9acbbb021a43 65 return (pstat) ? DS18X20_POWER_EXTERN:DS18X20_POWER_PARASITE;
fblanc 0:9acbbb021a43 66 }
fblanc 0:9acbbb021a43 67
fblanc 0:9acbbb021a43 68 /**
fblanc 0:9acbbb021a43 69 * @brief get power status of DS18x20
fblanc 0:9acbbb021a43 70 * @param [in] n num bus onewire
fblanc 0:9acbbb021a43 71 * @param [in] id[] = rom_code
fblanc 0:9acbbb021a43 72 * @return DS18X20_POWER_EXTERN or DS18X20_POWER_PARASITE
fblanc 0:9acbbb021a43 73 * @date 6/09/2011
fblanc 0:9acbbb021a43 74 */
fblanc 0:9acbbb021a43 75 uint8_t DS18X20_get_power_status(uint8_t n,uint8_t id[]) {
fblanc 0:9acbbb021a43 76 uint8_t pstat;
fblanc 0:9acbbb021a43 77 ow_reset(n);
fblanc 0:9acbbb021a43 78 ow_command(n,DS18X20_READ_POWER_SUPPLY, id);
fblanc 0:9acbbb021a43 79 pstat=ow_bit_io(n,1); // pstat 0=is parasite/ !=0 ext. powered
fblanc 0:9acbbb021a43 80 ow_reset(n);
fblanc 0:9acbbb021a43 81 return (pstat) ? DS18X20_POWER_EXTERN:DS18X20_POWER_PARASITE;
fblanc 0:9acbbb021a43 82 }
fblanc 0:9acbbb021a43 83 //**********************************************************************************************************
fblanc 0:9acbbb021a43 84 //* DS18X20_start_meas
fblanc 0:9acbbb021a43 85 //**********************************************************************************************************
fblanc 0:9acbbb021a43 86 /**
fblanc 0:9acbbb021a43 87 * @brief reads temperature (scratchpad) of sensor with rom-code id
fblanc 0:9acbbb021a43 88 output: subzero==1 if temp.<0, cel: full celsius, mcel: frac
fblanc 0:9acbbb021a43 89 in millicelsius*0.1
fblanc 0:9acbbb021a43 90 i.e.: subzero=1, cel=18, millicel=5000 = -18,5000&#65533;C
fblanc 0:9acbbb021a43 91 * @param [in] n num bus onewire
fblanc 0:9acbbb021a43 92 * @param [in] id[] = rom_code
fblanc 0:9acbbb021a43 93 * @param [out] temperature
fblanc 0:9acbbb021a43 94 * @return DS18X20_OK or DS18X20_ERROR_CRC
fblanc 0:9acbbb021a43 95 * @date 07/12/2012
fblanc 0:9acbbb021a43 96 */
fblanc 0:9acbbb021a43 97 uint8_t DS18X20_read_meas(uint8_t n,uint8_t id[], float* temperature) {
fblanc 0:9acbbb021a43 98 uint8_t i;
fblanc 0:9acbbb021a43 99 uint8_t sp[DS18X20_SP_SIZE];
fblanc 0:9acbbb021a43 100 uint8_t subzero;
fblanc 0:9acbbb021a43 101 uint8_t cel;
fblanc 0:9acbbb021a43 102 uint8_t cel_frac_bits;
fblanc 0:9acbbb021a43 103
fblanc 0:9acbbb021a43 104 ow_reset(n);
fblanc 0:9acbbb021a43 105 ow_command(n,DS18X20_READ, id);
fblanc 0:9acbbb021a43 106 for ( i=0 ; i< DS18X20_SP_SIZE; i++ )
fblanc 0:9acbbb021a43 107 sp[i]=ow_byte_rd(n);
fblanc 0:9acbbb021a43 108 if ( crc8( &sp[0], DS18X20_SP_SIZE ) ){
fblanc 0:9acbbb021a43 109 if ((sp[DS18X20_SP_SIZE-1]==0xFF) && (sp[DS18X20_SP_SIZE-2]==0xFF))
fblanc 0:9acbbb021a43 110 return OW_ERROR; // bus error
fblanc 0:9acbbb021a43 111 return DS18X20_ERROR_CRC; // data error
fblanc 0:9acbbb021a43 112 }
fblanc 0:9acbbb021a43 113
fblanc 0:9acbbb021a43 114 DS18X20_meas_to_cel(id[0], sp, &subzero, &cel, &cel_frac_bits);
fblanc 0:9acbbb021a43 115 *temperature = cel_frac_bits*.0625;
fblanc 0:9acbbb021a43 116 *temperature += cel;
fblanc 0:9acbbb021a43 117 if (subzero)
fblanc 0:9acbbb021a43 118 *temperature *= -1;
fblanc 0:9acbbb021a43 119 return DS18X20_OK;
fblanc 0:9acbbb021a43 120 }
fblanc 0:9acbbb021a43 121 /**
fblanc 0:9acbbb021a43 122 * @brief start measurement (CONVERT_T) for all sensors if input id==NULL
fblanc 0:9acbbb021a43 123 or for single sensor. then id is the rom-code
fblanc 0:9acbbb021a43 124 * @param [in] with_power_extern
fblanc 0:9acbbb021a43 125 * @param [in] rom_code
fblanc 0:9acbbb021a43 126 * @return DS18X20_OK or DS18X20_START_FAIL
fblanc 0:9acbbb021a43 127 * @date 20/06/2011
fblanc 0:9acbbb021a43 128 */
fblanc 0:9acbbb021a43 129 uint8_t DS18X20_start_meas( uint8_t with_power_extern, uint8_t id[]) {
fblanc 0:9acbbb021a43 130 ow_reset(); //**
fblanc 0:9acbbb021a43 131 if ( ow_test_pin() ) { // only send if bus is "idle" = high
fblanc 0:9acbbb021a43 132 ow_command( DS18X20_CONVERT_T, id );
fblanc 0:9acbbb021a43 133 if (with_power_extern != DS18X20_POWER_EXTERN)
fblanc 0:9acbbb021a43 134 ow_parasite_enable();
fblanc 0:9acbbb021a43 135 return DS18X20_OK;
fblanc 0:9acbbb021a43 136 }
fblanc 0:9acbbb021a43 137 return DS18X20_START_FAIL;
fblanc 0:9acbbb021a43 138
fblanc 0:9acbbb021a43 139 }
fblanc 0:9acbbb021a43 140 /**
fblanc 0:9acbbb021a43 141 * @brief start measurement (CONVERT_T) for all sensors if input id==NULL
fblanc 0:9acbbb021a43 142 or for single sensor. then id is the rom-code
fblanc 0:9acbbb021a43 143 * @param [in] n num bus onewire
fblanc 0:9acbbb021a43 144 * @param [in] with_power_extern
fblanc 0:9acbbb021a43 145 * @param [in] rom_code
fblanc 0:9acbbb021a43 146 * @return DS18X20_OK or DS18X20_START_FAIL
fblanc 0:9acbbb021a43 147 * @date 06/09/2011
fblanc 0:9acbbb021a43 148 */
fblanc 0:9acbbb021a43 149 uint8_t DS18X20_start_meas(uint8_t n, uint8_t with_power_extern, uint8_t id[]) {
fblanc 0:9acbbb021a43 150 ow_reset(n); //**
fblanc 0:9acbbb021a43 151 if ( ow_test_pin(n) ) { // only send if bus is "idle" = high
fblanc 0:9acbbb021a43 152 ow_command(n, DS18X20_CONVERT_T, id );
fblanc 0:9acbbb021a43 153 if (with_power_extern != DS18X20_POWER_EXTERN)
fblanc 0:9acbbb021a43 154 ow_parasite_enable(n);
fblanc 0:9acbbb021a43 155 return DS18X20_OK;
fblanc 0:9acbbb021a43 156 }
fblanc 0:9acbbb021a43 157 return DS18X20_START_FAIL;
fblanc 0:9acbbb021a43 158
fblanc 0:9acbbb021a43 159 }
fblanc 0:9acbbb021a43 160 //**********************************************************************************************************
fblanc 0:9acbbb021a43 161 //* DS18X20_read_meas
fblanc 0:9acbbb021a43 162 //**********************************************************************************************************
fblanc 0:9acbbb021a43 163
fblanc 0:9acbbb021a43 164 /**
fblanc 0:9acbbb021a43 165 * @brief reads temperature (scratchpad) of sensor with rom-code id
fblanc 0:9acbbb021a43 166 output: subzero==1 if temp.<0, cel: full celsius, mcel: frac
fblanc 0:9acbbb021a43 167 in millicelsius*0.1
fblanc 0:9acbbb021a43 168 i.e.: subzero=1, cel=18, millicel=5000 = -18,5000&#65533;C
fblanc 0:9acbbb021a43 169 * @param [in] id[] = rom_code
fblanc 0:9acbbb021a43 170 * @param [out] subzero
fblanc 0:9acbbb021a43 171 * @param [out] cel
fblanc 0:9acbbb021a43 172 * @param [out] cel_frac_bits
fblanc 0:9acbbb021a43 173 * @return DS18X20_OK or DS18X20_ERROR_CRC
fblanc 0:9acbbb021a43 174 * @date 20/06/2011
fblanc 0:9acbbb021a43 175 */
fblanc 0:9acbbb021a43 176 uint8_t DS18X20_read_meas(uint8_t id[], uint8_t *subzero,
fblanc 0:9acbbb021a43 177 uint8_t *cel, uint8_t *cel_frac_bits) {
fblanc 0:9acbbb021a43 178 uint8_t i;
fblanc 0:9acbbb021a43 179 uint8_t sp[DS18X20_SP_SIZE];
fblanc 0:9acbbb021a43 180
fblanc 0:9acbbb021a43 181 ow_reset();
fblanc 0:9acbbb021a43 182 ow_command(DS18X20_READ, id);
fblanc 0:9acbbb021a43 183 for ( i=0 ; i< DS18X20_SP_SIZE; i++ )
fblanc 0:9acbbb021a43 184 sp[i]=ow_byte_rd();
fblanc 0:9acbbb021a43 185 if ( crc8( &sp[0], DS18X20_SP_SIZE ) ){
fblanc 0:9acbbb021a43 186 if ((sp[DS18X20_SP_SIZE-1]==0xFF) && (sp[DS18X20_SP_SIZE-2]==0xFF))
fblanc 0:9acbbb021a43 187 return OW_ERROR; // bus error
fblanc 0:9acbbb021a43 188 return DS18X20_ERROR_CRC; // data error
fblanc 0:9acbbb021a43 189 }
fblanc 0:9acbbb021a43 190
fblanc 0:9acbbb021a43 191 DS18X20_meas_to_cel(id[0], sp, subzero, cel, cel_frac_bits);
fblanc 0:9acbbb021a43 192 return DS18X20_OK;
fblanc 0:9acbbb021a43 193 }
fblanc 0:9acbbb021a43 194 /**
fblanc 0:9acbbb021a43 195 * @brief reads temperature (scratchpad) of sensor with rom-code id
fblanc 0:9acbbb021a43 196 output: subzero==1 if temp.<0, cel: full celsius, mcel: frac
fblanc 0:9acbbb021a43 197 in millicelsius*0.1
fblanc 0:9acbbb021a43 198 i.e.: subzero=1, cel=18, millicel=5000 = -18,5000&#65533;C
fblanc 0:9acbbb021a43 199 * @param [in] n num bus onewire
fblanc 0:9acbbb021a43 200 * @param [in] id[] = rom_code
fblanc 0:9acbbb021a43 201 * @param [out] subzero
fblanc 0:9acbbb021a43 202 * @param [out] cel
fblanc 0:9acbbb021a43 203 * @param [out] cel_frac_bits
fblanc 0:9acbbb021a43 204 * @return DS18X20_OK or DS18X20_ERROR_CRC
fblanc 0:9acbbb021a43 205 * @date 06/09/2011
fblanc 0:9acbbb021a43 206 */
fblanc 0:9acbbb021a43 207 uint8_t DS18X20_read_meas(uint8_t n,uint8_t id[], uint8_t *subzero,
fblanc 0:9acbbb021a43 208 uint8_t *cel, uint8_t *cel_frac_bits) {
fblanc 0:9acbbb021a43 209 uint8_t i;
fblanc 0:9acbbb021a43 210 uint8_t sp[DS18X20_SP_SIZE];
fblanc 0:9acbbb021a43 211
fblanc 0:9acbbb021a43 212 ow_reset(n);
fblanc 0:9acbbb021a43 213 ow_command(n,DS18X20_READ, id);
fblanc 0:9acbbb021a43 214 for ( i=0 ; i< DS18X20_SP_SIZE; i++ )
fblanc 0:9acbbb021a43 215 sp[i]=ow_byte_rd(n);
fblanc 0:9acbbb021a43 216 if ( crc8( &sp[0], DS18X20_SP_SIZE ) ){
fblanc 0:9acbbb021a43 217 if ((sp[DS18X20_SP_SIZE-1]==0xFF) && (sp[DS18X20_SP_SIZE-2]==0xFF))
fblanc 0:9acbbb021a43 218 return OW_ERROR; // bus error
fblanc 0:9acbbb021a43 219 return DS18X20_ERROR_CRC; // data error
fblanc 0:9acbbb021a43 220 }
fblanc 0:9acbbb021a43 221
fblanc 0:9acbbb021a43 222 DS18X20_meas_to_cel(id[0], sp, subzero, cel, cel_frac_bits);
fblanc 0:9acbbb021a43 223 return DS18X20_OK;
fblanc 0:9acbbb021a43 224 }
fblanc 0:9acbbb021a43 225 /**
fblanc 0:9acbbb021a43 226 * @brief convert raw value from DS18x20 to Celsius
fblanc 0:9acbbb021a43 227 input is:
fblanc 0:9acbbb021a43 228 - familycode fc (0x10/0x28 see header)
fblanc 0:9acbbb021a43 229 - scratchpad-buffer
fblanc 0:9acbbb021a43 230 output is:
fblanc 0:9acbbb021a43 231 - cel full celsius
fblanc 0:9acbbb021a43 232 - fractions of celsius in millicelsius*(10^-1)/625 (the 4 LS-Bits)
fblanc 0:9acbbb021a43 233 - subzero =0 positiv / 1 negativ
fblanc 0:9acbbb021a43 234 always returns DS18X20_OK
fblanc 0:9acbbb021a43 235 TODO invalid-values detection (but should be covered by CRC)
fblanc 0:9acbbb021a43 236 * @param [in] fc
fblanc 0:9acbbb021a43 237 * @param [in] sp
fblanc 0:9acbbb021a43 238 * @param [out] subzero
fblanc 0:9acbbb021a43 239 * @param [out] cel
fblanc 0:9acbbb021a43 240 * @param [out] cel_frac_bits
fblanc 0:9acbbb021a43 241 * @return DS18X20_OK
fblanc 0:9acbbb021a43 242 * @date 20/06/2011
fblanc 0:9acbbb021a43 243 */
fblanc 0:9acbbb021a43 244 uint8_t DS18X20_meas_to_cel( uint8_t fc, uint8_t *sp,
fblanc 0:9acbbb021a43 245 uint8_t* subzero, uint8_t* cel, uint8_t* cel_frac_bits) {
fblanc 0:9acbbb021a43 246 uint16_t meas;
fblanc 0:9acbbb021a43 247 uint8_t i;
fblanc 0:9acbbb021a43 248
fblanc 0:9acbbb021a43 249 meas = sp[0]; // LSB
fblanc 0:9acbbb021a43 250 meas |= ((uint16_t)sp[1])<<8; // MSB
fblanc 0:9acbbb021a43 251 //meas = 0xff5e; meas = 0xfe6f;
fblanc 0:9acbbb021a43 252
fblanc 0:9acbbb021a43 253 // only work on 12bit-base
fblanc 0:9acbbb021a43 254 if ( fc == DS18S20_ID ) { // 9 -> 12 bit if 18S20
fblanc 0:9acbbb021a43 255 /* Extended measurements for DS18S20 contributed by Carsten Foss */
fblanc 0:9acbbb021a43 256 meas &= (uint16_t) 0xfffe; // Discard LSB , needed for later extended precicion calc
fblanc 0:9acbbb021a43 257 meas <<= 3; // Convert to 12-bit , now degrees are in 1/16 degrees units
fblanc 0:9acbbb021a43 258 meas += (16 - sp[6]) - 4; // Add the compensation , and remember to subtract 0.25 degree (4/16)
fblanc 0:9acbbb021a43 259 }
fblanc 0:9acbbb021a43 260
fblanc 0:9acbbb021a43 261 // check for negative
fblanc 0:9acbbb021a43 262 if ( meas & 0x8000 ) {
fblanc 0:9acbbb021a43 263 *subzero=1; // mark negative
fblanc 0:9acbbb021a43 264 meas ^= 0xffff; // convert to positive => (twos complement)++
fblanc 0:9acbbb021a43 265 meas++;
fblanc 0:9acbbb021a43 266 } else *subzero=0;
fblanc 0:9acbbb021a43 267
fblanc 0:9acbbb021a43 268 // clear undefined bits for B != 12bit
fblanc 0:9acbbb021a43 269 if ( fc == DS18B20_ID ) { // check resolution 18B20
fblanc 0:9acbbb021a43 270 i = sp[DS18B20_CONF_REG];
fblanc 0:9acbbb021a43 271 if ( (i & DS18B20_12_BIT) == DS18B20_12_BIT ) ;
fblanc 0:9acbbb021a43 272 else if ( (i & DS18B20_11_BIT) == DS18B20_11_BIT )
fblanc 0:9acbbb021a43 273 meas &= ~(DS18B20_11_BIT_UNDF);
fblanc 0:9acbbb021a43 274 else if ( (i & DS18B20_10_BIT) == DS18B20_10_BIT )
fblanc 0:9acbbb021a43 275 meas &= ~(DS18B20_10_BIT_UNDF);
fblanc 0:9acbbb021a43 276 else { // if ( (i & DS18B20_9_BIT) == DS18B20_9_BIT ) {
fblanc 0:9acbbb021a43 277 meas &= ~(DS18B20_9_BIT_UNDF);
fblanc 0:9acbbb021a43 278 }
fblanc 0:9acbbb021a43 279 }
fblanc 0:9acbbb021a43 280
fblanc 0:9acbbb021a43 281 *cel = (uint8_t)(meas >> 4);
fblanc 0:9acbbb021a43 282 *cel_frac_bits = (uint8_t)(meas & 0x000F);
fblanc 0:9acbbb021a43 283
fblanc 0:9acbbb021a43 284 return DS18X20_OK;
fblanc 0:9acbbb021a43 285 }
fblanc 0:9acbbb021a43 286
fblanc 0:9acbbb021a43 287 /**
fblanc 0:9acbbb021a43 288 * @brief converts to decicelsius
fblanc 0:9acbbb021a43 289 input is ouput from meas_to_cel
fblanc 0:9acbbb021a43 290 i.e.: sz=0, c=28, frac=15 returns 289 (=28.9&#65533;C)
fblanc 0:9acbbb021a43 291 0 0 0
fblanc 0:9acbbb021a43 292 1 625 625 1
fblanc 0:9acbbb021a43 293 2 1250 250
fblanc 0:9acbbb021a43 294 3 1875 875 3
fblanc 0:9acbbb021a43 295 4 2500 500 4
fblanc 0:9acbbb021a43 296 5 3125 125
fblanc 0:9acbbb021a43 297 6 3750 750 6
fblanc 0:9acbbb021a43 298 7 4375 375
fblanc 0:9acbbb021a43 299 8 5000 0
fblanc 0:9acbbb021a43 300 9 5625 625 9
fblanc 0:9acbbb021a43 301 10 6250 250
fblanc 0:9acbbb021a43 302 11 6875 875 11
fblanc 0:9acbbb021a43 303 12 7500 500 12
fblanc 0:9acbbb021a43 304 13 8125 125
fblanc 0:9acbbb021a43 305 14 8750 750 14
fblanc 0:9acbbb021a43 306 15 9375 375
fblanc 0:9acbbb021a43 307 * @param [in] subzero
fblanc 0:9acbbb021a43 308 * @param [in] cel
fblanc 0:9acbbb021a43 309 * @param [in] cel_frac_bits
fblanc 0:9acbbb021a43 310 * @return absolute value of temperatur in decicelsius
fblanc 0:9acbbb021a43 311 * @date 20/06/2011
fblanc 0:9acbbb021a43 312 */
fblanc 0:9acbbb021a43 313 uint16_t DS18X20_temp_to_decicel(uint8_t subzero, uint8_t cel,
fblanc 0:9acbbb021a43 314 uint8_t cel_frac_bits) {
fblanc 0:9acbbb021a43 315 uint16_t h;
fblanc 0:9acbbb021a43 316 uint8_t i;
fblanc 0:9acbbb021a43 317 uint8_t need_rounding[] = { 1, 3, 4, 6, 9, 11, 12, 14 };
fblanc 0:9acbbb021a43 318
fblanc 0:9acbbb021a43 319 h = cel_frac_bits*DS18X20_FRACCONV/1000;
fblanc 0:9acbbb021a43 320 h += cel*10;
fblanc 0:9acbbb021a43 321 if (!subzero) {
fblanc 0:9acbbb021a43 322 for (i=0; i<sizeof(need_rounding); i++) {
fblanc 0:9acbbb021a43 323 if ( cel_frac_bits == need_rounding[i] ) {
fblanc 0:9acbbb021a43 324 h++;
fblanc 0:9acbbb021a43 325 break;
fblanc 0:9acbbb021a43 326 }
fblanc 0:9acbbb021a43 327 }
fblanc 0:9acbbb021a43 328 }
fblanc 0:9acbbb021a43 329 return h;
fblanc 0:9acbbb021a43 330 }
fblanc 0:9acbbb021a43 331 /**
fblanc 0:9acbbb021a43 332 * @brief compare temperature values (full celsius only)
fblanc 0:9acbbb021a43 333 * @param [in] subzero1
fblanc 0:9acbbb021a43 334 * @param [in] cel1
fblanc 0:9acbbb021a43 335 * @param [in] subzero2
fblanc 0:9acbbb021a43 336 * @param [in] cel2
fblanc 0:9acbbb021a43 337 * @return -1 if param-pair1 < param-pair2
fblanc 0:9acbbb021a43 338 0 if ==
fblanc 0:9acbbb021a43 339 1 if >
fblanc 0:9acbbb021a43 340 * @date 20/06/2011
fblanc 0:9acbbb021a43 341 */
fblanc 0:9acbbb021a43 342 int8_t DS18X20_temp_cmp(uint8_t subzero1, uint16_t cel1,
fblanc 0:9acbbb021a43 343 uint8_t subzero2, uint16_t cel2) {
fblanc 0:9acbbb021a43 344 int16_t t1 = (subzero1) ? (cel1*(-1)) : (cel1);
fblanc 0:9acbbb021a43 345 int16_t t2 = (subzero2) ? (cel2*(-1)) : (cel2);
fblanc 0:9acbbb021a43 346
fblanc 0:9acbbb021a43 347 if (t1<t2) return -1;
fblanc 0:9acbbb021a43 348 if (t1>t2) return 1;
fblanc 0:9acbbb021a43 349 return 0;
fblanc 0:9acbbb021a43 350 }