onewire 1-wire ds18x20 ds2450 multi-channel

Dependents:   ibutton

Committer:
fblanc
Date:
Fri Mar 02 08:29:49 2012 +0000
Revision:
0:8c4e1841eb30
v1.1 onewire multi-channel

Who changed what in which revision?

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