Method of reading from DS1825 thermometer, including the OneWire method. Specific for the use of just 1 sensor.

Dependencies:   OneWire

Dependents:   Inductive_Sensor Inductive_Sensor_Jasper Inductive_Sensor_3

Committer:
bobgiesberts
Date:
Wed Oct 05 08:14:49 2016 +0000
Revision:
2:653e20bb069d
Parent:
1:ef7e5efc8794
Waits until next conversion is finished

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bobgiesberts 0:abb33be87221 1 #include "DS1825.h"
bobgiesberts 0:abb33be87221 2
bobgiesberts 0:abb33be87221 3 //DS1825::DS1825( PinName pin ) : _onewire( pin )
bobgiesberts 0:abb33be87221 4 DS1825::DS1825( PinName pin )
bobgiesberts 0:abb33be87221 5 {
bobgiesberts 1:ef7e5efc8794 6 T = 0;
bobgiesberts 1:ef7e5efc8794 7 _onewire = new OneWire( pin );
bobgiesberts 1:ef7e5efc8794 8 wait_ms(100);
bobgiesberts 1:ef7e5efc8794 9 convertTemperature();
bobgiesberts 0:abb33be87221 10 }
bobgiesberts 0:abb33be87221 11
bobgiesberts 0:abb33be87221 12 DS1825::~DS1825( )
bobgiesberts 0:abb33be87221 13 {
bobgiesberts 1:ef7e5efc8794 14 _onewire->depower();
bobgiesberts 0:abb33be87221 15 delete _onewire;
bobgiesberts 0:abb33be87221 16 _onewire = NULL;
bobgiesberts 0:abb33be87221 17 }
bobgiesberts 0:abb33be87221 18
bobgiesberts 0:abb33be87221 19 bool DS1825::validateTemperature( uint8_t d[9] )
bobgiesberts 0:abb33be87221 20 {
bobgiesberts 0:abb33be87221 21 return (d[8] == _onewire->crc8(d, 8));
bobgiesberts 0:abb33be87221 22 }
bobgiesberts 0:abb33be87221 23
bobgiesberts 1:ef7e5efc8794 24 void DS1825::convertTemperature( void )
bobgiesberts 0:abb33be87221 25 {
bobgiesberts 1:ef7e5efc8794 26 // in 12-bit mode, this takes 750 ms
bobgiesberts 0:abb33be87221 27 _onewire->reset();
bobgiesberts 0:abb33be87221 28 _onewire->skip(); // Skip ROM --> because there is only one sensor, no need to search for the correct ID
bobgiesberts 0:abb33be87221 29 _onewire->write( 0x44, 1 ); // Convert T --> initiate temperature conversion, data is stored on scratchpad, after writing put the wire high to power the DS1825
bobgiesberts 1:ef7e5efc8794 30 lastconversion = (uint32_t) clock();
bobgiesberts 1:ef7e5efc8794 31 }
bobgiesberts 1:ef7e5efc8794 32
bobgiesberts 1:ef7e5efc8794 33 float DS1825::getTemperature( void )
bobgiesberts 2:653e20bb069d 34 {
bobgiesberts 2:653e20bb069d 35 // If the thermometer is not read (it takes 750 ms),
bobgiesberts 2:653e20bb069d 36 // just send the previous value.
bobgiesberts 2:653e20bb069d 37 // Don't interupt the conversion!
bobgiesberts 1:ef7e5efc8794 38 if ( clock() - lastconversion < 750 / 10 )
bobgiesberts 1:ef7e5efc8794 39 return T;
bobgiesberts 1:ef7e5efc8794 40
bobgiesberts 2:653e20bb069d 41 // Send command to read the data
bobgiesberts 0:abb33be87221 42 _onewire->reset();
bobgiesberts 0:abb33be87221 43 _onewire->skip(); // Skip ROM
bobgiesberts 0:abb33be87221 44 _onewire->write( 0xBE ); // Command to read scratchpad
bobgiesberts 0:abb33be87221 45
bobgiesberts 2:653e20bb069d 46 // Read the data
bobgiesberts 0:abb33be87221 47 uint8_t Tdata[9];
bobgiesberts 0:abb33be87221 48 for (int i = 0; i < 9; i++)
bobgiesberts 0:abb33be87221 49 Tdata[i] = _onewire->read(); // read scratchpad
bobgiesberts 0:abb33be87221 50 _onewire->depower();
bobgiesberts 0:abb33be87221 51
bobgiesberts 2:653e20bb069d 52 // Send the command to start calculating the new temperature
bobgiesberts 2:653e20bb069d 53 convertTemperature();
bobgiesberts 2:653e20bb069d 54
bobgiesberts 1:ef7e5efc8794 55 // validate the result
bobgiesberts 0:abb33be87221 56 if( validateTemperature( Tdata ) )
bobgiesberts 0:abb33be87221 57 {
bobgiesberts 1:ef7e5efc8794 58 int16_t T_bin = (Tdata[1] << 8) | Tdata[0];
bobgiesberts 0:abb33be87221 59 T = T_bin / 16.0;
bobgiesberts 0:abb33be87221 60 return T;
bobgiesberts 0:abb33be87221 61 }
bobgiesberts 0:abb33be87221 62 return 0;
bobgiesberts 1:ef7e5efc8794 63 }