Version of Richard Lane's library, with #define CABLE_EXT_DELAYS to extend reset() settling delays for extension cable
Fork of DS18B20_1wire by
DS18B20.h@3:a2306865901f, 2014-03-27 (annotated)
- Committer:
- Michael_embed1
- Date:
- Thu Mar 27 22:50:08 2014 +0000
- Revision:
- 3:a2306865901f
- Parent:
- 2:b07b40825282
Updated 1-wire bit delays to accommodate higher parasitic cable capacitance. No #ifdef option required
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
richardlane | 0:769f9b2b30d5 | 1 | #ifndef DS18B20_H |
richardlane | 0:769f9b2b30d5 | 2 | #define DS18B20_H |
richardlane | 0:769f9b2b30d5 | 3 | |
richardlane | 0:769f9b2b30d5 | 4 | #include "mbed.h" |
richardlane | 0:769f9b2b30d5 | 5 | #include <stdint.h> |
richardlane | 0:769f9b2b30d5 | 6 | |
Michael_embed1 | 3:a2306865901f | 7 | // 25 March,2014 add #define option for larger delay values |
Michael_embed1 | 2:b07b40825282 | 8 | // to allow extra 1-bit bus settling time accommodating 3ft extension |
Michael_embed1 | 2:b07b40825282 | 9 | // cable with higher parasitic capacitance |
Michael_embed1 | 2:b07b40825282 | 10 | |
richardlane | 0:769f9b2b30d5 | 11 | /** A DS18B20 Dallas 1-wire digital thermometer interface. |
richardlane | 0:769f9b2b30d5 | 12 | * |
Michael_embed1 | 3:a2306865901f | 13 | * 25 March,2014 added larger DELAY values to allow |
Michael_embed1 | 3:a2306865901f | 14 | * extra 1-bit bus settling time accommodating 3ft extension |
Michael_embed1 | 3:a2306865901f | 15 | * cable with higher parasitic capacitance. |
Michael_embed1 | 3:a2306865901f | 16 | * |
richardlane | 0:769f9b2b30d5 | 17 | * Currently supports 9, 10, 11 or 12-bit conversions. Fewer bits |
richardlane | 0:769f9b2b30d5 | 18 | * require less conversion time from 93.75ms to 750ms. Also supports |
richardlane | 0:769f9b2b30d5 | 19 | * reading back the 8-byte internal ROM. Orignal code copied from |
richardlane | 0:769f9b2b30d5 | 20 | * DS18B20 C program by Niall Cooling (thanks!) and wrapped in C++ |
richardlane | 0:769f9b2b30d5 | 21 | * class by this library. |
Michael_embed1 | 2:b07b40825282 | 22 | |
Michael_embed1 | 3:a2306865901f | 23 | * modified delay values to allow extra 1-bit bus |
Michael_embed1 | 2:b07b40825282 | 24 | * settling time accommodating 3ft extension cable |
Michael_embed1 | 2:b07b40825282 | 25 | * (with higher parasitic capacitance) |
Michael_embed1 | 2:b07b40825282 | 26 | * #define CABLE_EXT_DELAYS // extend reset() settling delays for extension cable |
richardlane | 0:769f9b2b30d5 | 27 | * |
richardlane | 0:769f9b2b30d5 | 28 | * @code |
richardlane | 0:769f9b2b30d5 | 29 | * #include "mbed.h" |
richardlane | 0:769f9b2b30d5 | 30 | * #include <stdint.h> |
richardlane | 0:769f9b2b30d5 | 31 | * #include "DS18B20.h" |
Michael_embed1 | 2:b07b40825282 | 32 | * #define CABLE_EXT_DELAYS //longer reset() settling delays if extension cable |
richardlane | 0:769f9b2b30d5 | 33 | * |
richardlane | 0:769f9b2b30d5 | 34 | * Serial pc(USBTX, USBRX); // serial comms over usb back to console |
richardlane | 0:769f9b2b30d5 | 35 | * DS18B20 thermom(p16, DS18B20::RES_12_BIT); // Dallas 1-wire |
richardlane | 0:769f9b2b30d5 | 36 | * |
richardlane | 0:769f9b2b30d5 | 37 | * int main() { |
richardlane | 0:769f9b2b30d5 | 38 | * pc.printf("DS18B20 Configuration\n\r"); |
richardlane | 0:769f9b2b30d5 | 39 | * |
richardlane | 0:769f9b2b30d5 | 40 | * DS18B20::ROM_Code_t ROM_Code; |
richardlane | 0:769f9b2b30d5 | 41 | * thermom.ReadROM(&ROM_Code); |
richardlane | 0:769f9b2b30d5 | 42 | * pc.printf("Family code: 0x%X\n\r", ROM_Code.BYTES.familyCode); |
richardlane | 0:769f9b2b30d5 | 43 | * pc.printf("Serial Number: "); |
richardlane | 0:769f9b2b30d5 | 44 | * for (unsigned i = 6; i != 0; --i) { |
richardlane | 0:769f9b2b30d5 | 45 | * pc.printf("%02X%s", ROM_Code.BYTES.serialNo[i-1], (i != 1)?":":"\r\n"); |
richardlane | 0:769f9b2b30d5 | 46 | * } |
richardlane | 0:769f9b2b30d5 | 47 | * pc.printf("CRC: 0x%X\r\n", ROM_Code.BYTES.CRC); |
richardlane | 0:769f9b2b30d5 | 48 | * |
richardlane | 0:769f9b2b30d5 | 49 | * pc.printf("\n\rRunning temperature conversion...\n\r"); |
richardlane | 0:769f9b2b30d5 | 50 | * while (1) { |
richardlane | 0:769f9b2b30d5 | 51 | * pc.printf("Temperature is: %.4fC\n\r", thermom.GetTemperature()); |
richardlane | 0:769f9b2b30d5 | 52 | * wait(10); |
richardlane | 0:769f9b2b30d5 | 53 | * } |
richardlane | 0:769f9b2b30d5 | 54 | * } |
richardlane | 0:769f9b2b30d5 | 55 | * @endcode |
richardlane | 0:769f9b2b30d5 | 56 | */ |
richardlane | 0:769f9b2b30d5 | 57 | |
richardlane | 0:769f9b2b30d5 | 58 | class DS18B20 |
richardlane | 0:769f9b2b30d5 | 59 | { |
richardlane | 0:769f9b2b30d5 | 60 | public: |
richardlane | 0:769f9b2b30d5 | 61 | /** Value to return when Reset() fails */ |
richardlane | 0:769f9b2b30d5 | 62 | enum {INVALID_TEMPERATURE = -10000}; |
richardlane | 0:769f9b2b30d5 | 63 | |
richardlane | 0:769f9b2b30d5 | 64 | /** Temperature conversion dit width resolutions */ |
richardlane | 0:769f9b2b30d5 | 65 | enum RESOLUTION { RES_9_BIT=0x1f, /**< 93.75ms */ |
richardlane | 0:769f9b2b30d5 | 66 | RES_10_BIT=0x3f, /**< 187.5ms */ |
richardlane | 0:769f9b2b30d5 | 67 | RES_11_BIT=0x5f, /**< 375ms */ |
richardlane | 1:00972ed59ba3 | 68 | RES_12_BIT=0x7f /**< 750ms */ |
richardlane | 1:00972ed59ba3 | 69 | }; |
richardlane | 0:769f9b2b30d5 | 70 | |
richardlane | 0:769f9b2b30d5 | 71 | /** Holds 8-byte internal ROM */ |
richardlane | 0:769f9b2b30d5 | 72 | typedef union { |
richardlane | 0:769f9b2b30d5 | 73 | uint8_t rom[8]; |
richardlane | 0:769f9b2b30d5 | 74 | struct { |
richardlane | 0:769f9b2b30d5 | 75 | uint8_t familyCode; /**< Family Code */ |
richardlane | 0:769f9b2b30d5 | 76 | uint8_t serialNo[6]; /**< Serial Number */ |
richardlane | 0:769f9b2b30d5 | 77 | uint8_t CRC; /**< CRC check byte */ |
richardlane | 0:769f9b2b30d5 | 78 | } BYTES; |
richardlane | 0:769f9b2b30d5 | 79 | } ROM_Code_t; |
richardlane | 0:769f9b2b30d5 | 80 | |
richardlane | 0:769f9b2b30d5 | 81 | /** Device onboard register layout (for reference only, not currently used) */ |
richardlane | 0:769f9b2b30d5 | 82 | typedef struct { |
richardlane | 0:769f9b2b30d5 | 83 | uint8_t LSB; /**< LSB of converted temperature */ |
richardlane | 0:769f9b2b30d5 | 84 | uint8_t MSB; /**< MSB of converted temperature */ |
richardlane | 0:769f9b2b30d5 | 85 | uint8_t Th; /**< Threshold for high alarm */ |
richardlane | 0:769f9b2b30d5 | 86 | uint8_t Tl; /**< Threshold for low alarm */ |
richardlane | 0:769f9b2b30d5 | 87 | uint8_t config; /**< Conversion resultion */ |
richardlane | 0:769f9b2b30d5 | 88 | uint8_t reserved0xFF; |
richardlane | 0:769f9b2b30d5 | 89 | uint8_t reserved0xCH; |
richardlane | 0:769f9b2b30d5 | 90 | uint8_t reserved0x10; |
richardlane | 0:769f9b2b30d5 | 91 | uint8_t CRC; /**< CRC check byte */ |
richardlane | 0:769f9b2b30d5 | 92 | } ScratchPad_t; |
richardlane | 0:769f9b2b30d5 | 93 | |
richardlane | 0:769f9b2b30d5 | 94 | /** Create a Dallas DS18B20 1-wire interface |
richardlane | 0:769f9b2b30d5 | 95 | * |
richardlane | 0:769f9b2b30d5 | 96 | * @param pin Pin to use for 1-wire interface (bidirectional I/O) |
richardlane | 0:769f9b2b30d5 | 97 | * @param resolution Sets the conversion bit width (using RESOLUTION enum) |
richardlane | 0:769f9b2b30d5 | 98 | */ |
richardlane | 0:769f9b2b30d5 | 99 | DS18B20(PinName pin, unsigned resolution); |
richardlane | 0:769f9b2b30d5 | 100 | |
richardlane | 0:769f9b2b30d5 | 101 | /** Destructor */ |
richardlane | 0:769f9b2b30d5 | 102 | ~DS18B20(); |
richardlane | 0:769f9b2b30d5 | 103 | |
richardlane | 0:769f9b2b30d5 | 104 | /** Performs conversion in DS18B20 and then reads and converts returned temperature |
richardlane | 0:769f9b2b30d5 | 105 | * to floating point. For many applications this is the only required method that |
richardlane | 0:769f9b2b30d5 | 106 | * needs to be used. |
richardlane | 0:769f9b2b30d5 | 107 | */ |
richardlane | 0:769f9b2b30d5 | 108 | float GetTemperature(); |
richardlane | 0:769f9b2b30d5 | 109 | |
richardlane | 0:769f9b2b30d5 | 110 | /** Performs conversion but does not read back temperature. Not needed if |
richardlane | 0:769f9b2b30d5 | 111 | * GetTemperature() is used as this calls DoConversion() itself. */ |
richardlane | 0:769f9b2b30d5 | 112 | unsigned DoConversion(); |
richardlane | 0:769f9b2b30d5 | 113 | |
richardlane | 0:769f9b2b30d5 | 114 | /** The method that GetTemperature() calls to do all the conversion and reading |
richardlane | 0:769f9b2b30d5 | 115 | * but this method returns a 32-bit signed integer. The integer contains 4 |
richardlane | 0:769f9b2b30d5 | 116 | * fractional LSBs. Sometimes referred to as s28.4 format. */ |
richardlane | 0:769f9b2b30d5 | 117 | int RawTemperature(); |
richardlane | 0:769f9b2b30d5 | 118 | |
richardlane | 0:769f9b2b30d5 | 119 | /** Reads and returns the 8-byte internal ROM */ |
richardlane | 0:769f9b2b30d5 | 120 | int ReadROM(ROM_Code_t *ROM_Code); |
richardlane | 0:769f9b2b30d5 | 121 | |
richardlane | 0:769f9b2b30d5 | 122 | /** Sets the conversion resolution with RESOLUTION enum (9-12 bits signed) */ |
richardlane | 0:769f9b2b30d5 | 123 | unsigned SetResolution(unsigned resolution); |
richardlane | 0:769f9b2b30d5 | 124 | |
richardlane | 0:769f9b2b30d5 | 125 | protected: |
Michael_embed1 | 3:a2306865901f | 126 | // enum DELAY { A = 6, B = 64, C = 60, D = 10, E = 9, F = 55, G = 0, H = 480, I = 70, J = 410 }; |
Michael_embed1 | 2:b07b40825282 | 127 | |
Michael_embed1 | 3:a2306865901f | 128 | // Use the following delays when additional cable parasitic capacitance is present: |
Michael_embed1 | 3:a2306865901f | 129 | enum DELAY { A = 8, B = 74, C = 70, D = 20, E = 10, F = 65, G = 0, H = 580, I = 90, J = 510 }; |
richardlane | 0:769f9b2b30d5 | 130 | |
richardlane | 0:769f9b2b30d5 | 131 | // Device byte commands over 1-wire serial |
richardlane | 0:769f9b2b30d5 | 132 | enum COMMANDS { READ_ROM = 0x33, CONVERT = 0x44, READ_SCRATCHPAD = 0xBE, WRITE_SCRATCHPAD = 0x4E, SKIP_ROM = 0xCC }; |
richardlane | 0:769f9b2b30d5 | 133 | |
richardlane | 0:769f9b2b30d5 | 134 | // Methods from DS1Wire.h |
richardlane | 0:769f9b2b30d5 | 135 | unsigned Reset(); |
richardlane | 0:769f9b2b30d5 | 136 | void WriteBit(unsigned bit); |
richardlane | 0:769f9b2b30d5 | 137 | unsigned ReadBit(); |
richardlane | 0:769f9b2b30d5 | 138 | void WriteByte(unsigned byte); |
richardlane | 0:769f9b2b30d5 | 139 | unsigned ReadByte(); |
richardlane | 0:769f9b2b30d5 | 140 | |
richardlane | 0:769f9b2b30d5 | 141 | // The pin used for the Dallas 1-wire interface |
richardlane | 0:769f9b2b30d5 | 142 | DigitalInOut _pin; |
richardlane | 0:769f9b2b30d5 | 143 | }; |
richardlane | 0:769f9b2b30d5 | 144 | |
richardlane | 0:769f9b2b30d5 | 145 | #endif |