Method of reading from DS1825 thermometer, including the OneWire method. Specific for the use of just 1 sensor.
Dependents: Inductive_Sensor Inductive_Sensor_Jasper Inductive_Sensor_3
DS1825.cpp@2:653e20bb069d, 2016-10-05 (annotated)
- 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?
User | Revision | Line number | New 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 | } |