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