Version of Richard Lane's library, with #define CABLE_EXT_DELAYS to extend reset() settling delays for extension cable

Fork of DS18B20_1wire by Richard Lane

Committer:
Michael_embed1
Date:
Tue Mar 25 19:01:36 2014 +0000
Revision:
2:b07b40825282
Parent:
1:00972ed59ba3
Child:
3:a2306865901f
add #define CABLE_EXT_DELAYS option to extend reset() settling delays for extension cable

Who changed what in which revision?

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