Manuel Caballero / DS1624
Committer:
mcm
Date:
Wed Jan 31 17:07:02 2018 +0000
Revision:
2:a035362e82c0
Parent:
1:fc952e73a23e
Child:
4:61eb7429c086
The library is ready to be tested.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mcm 0:53a09ccc5f8e 1 /**
mcm 0:53a09ccc5f8e 2 * @brief DS1624.h
mcm 0:53a09ccc5f8e 3 * @details Digital Thermometer and Memory.
mcm 0:53a09ccc5f8e 4 * Header file.
mcm 0:53a09ccc5f8e 5 *
mcm 0:53a09ccc5f8e 6 *
mcm 0:53a09ccc5f8e 7 * @return NA
mcm 0:53a09ccc5f8e 8 *
mcm 0:53a09ccc5f8e 9 * @author Manuel Caballero
mcm 0:53a09ccc5f8e 10 * @date 31/January/2018
mcm 0:53a09ccc5f8e 11 * @version 31/January/2018 The ORIGIN
mcm 0:53a09ccc5f8e 12 * @pre NaN.
mcm 0:53a09ccc5f8e 13 * @warning NaN
mcm 0:53a09ccc5f8e 14 * @pre This code belongs to AqueronteBlog ( http://unbarquero.blogspot.com ).
mcm 0:53a09ccc5f8e 15 */
mcm 0:53a09ccc5f8e 16 #ifndef DS1624_H
mcm 0:53a09ccc5f8e 17 #define DS1624_H
mcm 0:53a09ccc5f8e 18
mcm 0:53a09ccc5f8e 19 #include "mbed.h"
mcm 0:53a09ccc5f8e 20
mcm 0:53a09ccc5f8e 21
mcm 0:53a09ccc5f8e 22 /**
mcm 0:53a09ccc5f8e 23 Example:
mcm 0:53a09ccc5f8e 24
mcm 2:a035362e82c0 25 #include "mbed.h"
mcm 2:a035362e82c0 26 #include "DS1624.h"
mcm 2:a035362e82c0 27
mcm 2:a035362e82c0 28 DS1624 myDS1624 ( I2C_SDA, I2C_SCL, DS1624::DS1624_ADDRESS_0, 400000 );
mcm 2:a035362e82c0 29 Serial pc ( USBTX, USBRX );
mcm 2:a035362e82c0 30
mcm 2:a035362e82c0 31 Ticker newReading;
mcm 2:a035362e82c0 32 DigitalOut myled(LED1);
mcm 2:a035362e82c0 33
mcm 2:a035362e82c0 34 DS1624::DS1624_status_t aux;
mcm 2:a035362e82c0 35 DS1624::DS1624_vector_data_t myDS1624Data;
mcm 2:a035362e82c0 36 DS1624::DS1624_access_config_done_t myDS1624_TempConversionStatus;
mcm 2:a035362e82c0 37 uint32_t myState = 0;
mcm 2:a035362e82c0 38
mcm 2:a035362e82c0 39
mcm 2:a035362e82c0 40 void changeDATA ( void )
mcm 2:a035362e82c0 41 {
mcm 2:a035362e82c0 42 myState = 1;
mcm 2:a035362e82c0 43 }
mcm 2:a035362e82c0 44
mcm 2:a035362e82c0 45
mcm 2:a035362e82c0 46 int main()
mcm 2:a035362e82c0 47 {
mcm 2:a035362e82c0 48 uint32_t myTimeoOut = 0;
mcm 2:a035362e82c0 49
mcm 2:a035362e82c0 50 pc.baud ( 115200 );
mcm 2:a035362e82c0 51
mcm 2:a035362e82c0 52 // Configure 1SHOT mode
mcm 2:a035362e82c0 53 aux = myDS1624.DS1624_SetConversionMode ( DS1624::ACCESS_CONFIG_1SHOT_ONE_TEMPERATURE_CONVERSION );
mcm 2:a035362e82c0 54
mcm 2:a035362e82c0 55 newReading.attach( &changeDATA, 1 ); // the address of the function to be attached ( changeDATA ) and the interval ( 1s )
mcm 2:a035362e82c0 56
mcm 2:a035362e82c0 57 // Let the callbacks take care of everything
mcm 2:a035362e82c0 58 while(1) {
mcm 2:a035362e82c0 59 sleep();
mcm 2:a035362e82c0 60
mcm 2:a035362e82c0 61 myled = 1;
mcm 2:a035362e82c0 62
mcm 2:a035362e82c0 63 if ( myState == 1 ) {
mcm 2:a035362e82c0 64 // Trigger a new temperature conversion
mcm 2:a035362e82c0 65 aux = myDS1624.DS1624_StartConvertTemperature ();
mcm 2:a035362e82c0 66
mcm 2:a035362e82c0 67 // Wait until the temperature conversion is completed or timeout
mcm 2:a035362e82c0 68 myTimeoOut = 232323;
mcm 2:a035362e82c0 69 do {
mcm 2:a035362e82c0 70 aux = myDS1624.DS1624_IsTemperatureConversionDone ( &myDS1624_TempConversionStatus );
mcm 2:a035362e82c0 71 myTimeoOut--;
mcm 2:a035362e82c0 72 } while ( ( ( myDS1624_TempConversionStatus & DS1624::ACCESS_CONFIG_DONE_MASK ) != DS1624::ACCESS_CONFIG_DONE_CONVERSION_COMPLETE ) && ( myTimeoOut > 0 ) );
mcm 2:a035362e82c0 73
mcm 2:a035362e82c0 74
mcm 2:a035362e82c0 75 // Check if TimeOut, if so, there was an error ( send: Error! ), send the data otherwise
mcm 2:a035362e82c0 76 if ( myTimeoOut <= 0 ) {
mcm 2:a035362e82c0 77 pc.printf( "Error!\r\n" );
mcm 2:a035362e82c0 78 } else {
mcm 2:a035362e82c0 79 aux = myDS1624.DS1624_ReadTemperature ( &myDS1624Data );
mcm 2:a035362e82c0 80 pc.printf( "Temperature: %0.4fC\r\n", myDS1624Data.Temperature );
mcm 2:a035362e82c0 81 }
mcm 2:a035362e82c0 82
mcm 2:a035362e82c0 83 myState = 0; // Reset the variable
mcm 2:a035362e82c0 84 }
mcm 2:a035362e82c0 85
mcm 2:a035362e82c0 86 myled = 0;
mcm 2:a035362e82c0 87 }
mcm 2:a035362e82c0 88 }
mcm 0:53a09ccc5f8e 89 */
mcm 0:53a09ccc5f8e 90
mcm 0:53a09ccc5f8e 91
mcm 0:53a09ccc5f8e 92 /*!
mcm 0:53a09ccc5f8e 93 Library for the DS1624 Digital Thermometer and Memory.
mcm 0:53a09ccc5f8e 94 */
mcm 0:53a09ccc5f8e 95 class DS1624
mcm 0:53a09ccc5f8e 96 {
mcm 0:53a09ccc5f8e 97 public:
mcm 0:53a09ccc5f8e 98 /**
mcm 0:53a09ccc5f8e 99 * @brief DEFAULT ADDRESSES. [ 0 : GND | 1 : VDD ]
mcm 0:53a09ccc5f8e 100 */
mcm 0:53a09ccc5f8e 101 typedef enum {
mcm 0:53a09ccc5f8e 102 DS1624_ADDRESS_0 = ( ( ( 0b1001 << 3 ) | 0b000 ) << 1 ), /*!< Address A2 A1 A0: 000 */
mcm 0:53a09ccc5f8e 103 DS1624_ADDRESS_1 = ( ( ( 0b1001 << 3 ) | 0b001 ) << 1 ), /*!< Address A2 A1 A0: 001 */
mcm 0:53a09ccc5f8e 104 DS1624_ADDRESS_2 = ( ( ( 0b1001 << 3 ) | 0b010 ) << 1 ), /*!< Address A2 A1 A0: 010 */
mcm 0:53a09ccc5f8e 105 DS1624_ADDRESS_3 = ( ( ( 0b1001 << 3 ) | 0b011 ) << 1 ), /*!< Address A2 A1 A0: 011 */
mcm 0:53a09ccc5f8e 106 DS1624_ADDRESS_4 = ( ( ( 0b1001 << 3 ) | 0b100 ) << 1 ), /*!< Address A2 A1 A0: 100 */
mcm 0:53a09ccc5f8e 107 DS1624_ADDRESS_5 = ( ( ( 0b1001 << 3 ) | 0b101 ) << 1 ), /*!< Address A2 A1 A0: 101 */
mcm 0:53a09ccc5f8e 108 DS1624_ADDRESS_6 = ( ( ( 0b1001 << 3 ) | 0b110 ) << 1 ), /*!< Address A2 A1 A0: 110 */
mcm 0:53a09ccc5f8e 109 DS1624_ADDRESS_7 = ( ( ( 0b1001 << 3 ) | 0b111 ) << 1 ) /*!< Address A2 A1 A0: 111 */
mcm 0:53a09ccc5f8e 110 } DS1624_address_t;
mcm 0:53a09ccc5f8e 111
mcm 0:53a09ccc5f8e 112
mcm 0:53a09ccc5f8e 113 // DS1624 Command Set
mcm 0:53a09ccc5f8e 114 /**
mcm 0:53a09ccc5f8e 115 * @brief TEMPERATURE CONVERSION COMMANDS
mcm 0:53a09ccc5f8e 116 */
mcm 0:53a09ccc5f8e 117 typedef enum {
mcm 0:53a09ccc5f8e 118 DS1624_READ_TEMPERATURE = 0xAA, /*!< Reads last converted temperature value from temperature register */
mcm 0:53a09ccc5f8e 119 DS1624_START_CONVERT_T = 0xEE, /*!< Initiates temperature conversion */
mcm 0:53a09ccc5f8e 120 DS1624_STOP_CONVERT_T = 0x22 /*!< Halts temperature conversion */
mcm 0:53a09ccc5f8e 121 } DS1624_temperature_conversion_commands_t;
mcm 0:53a09ccc5f8e 122
mcm 0:53a09ccc5f8e 123
mcm 0:53a09ccc5f8e 124 /**
mcm 0:53a09ccc5f8e 125 * @brief THERMOSTAT COMMANDS. NOTE: Writing to the EEPROM typically requires 10ms at room temperature. After issuing a write
mcm 0:53a09ccc5f8e 126 * command, no further reads or writes should be requested for at least 10ms.
mcm 0:53a09ccc5f8e 127 */
mcm 0:53a09ccc5f8e 128 typedef enum {
mcm 0:53a09ccc5f8e 129 DS1624_ACCESS_MEMORY = 0x17, /*!< Reads or writes to 256-byte EEPROM memory */
mcm 0:53a09ccc5f8e 130 DS1624_ACCESS_CONFIG = 0xAC /*!< Reads or writes configuration data to configuration register */
mcm 0:53a09ccc5f8e 131 } DS1624_thermostat_commands_t;
mcm 0:53a09ccc5f8e 132
mcm 0:53a09ccc5f8e 133
mcm 0:53a09ccc5f8e 134
mcm 0:53a09ccc5f8e 135 // ACCESS CONFIG ( CONFIGURATION/STATUS REGISTER )
mcm 0:53a09ccc5f8e 136 /**
mcm 0:53a09ccc5f8e 137 * @brief BIT7: DONE
mcm 0:53a09ccc5f8e 138 */
mcm 0:53a09ccc5f8e 139 typedef enum {
mcm 0:53a09ccc5f8e 140 ACCESS_CONFIG_DONE_MASK = ( 1 << 7 ), /*!< DONE Mask */
mcm 0:53a09ccc5f8e 141 ACCESS_CONFIG_DONE_CONVERSION_COMPLETE = ( 1 << 7 ), /*!< Conversion complete */
mcm 0:53a09ccc5f8e 142 ACCESS_CONFIG_DONE_CONVERSION_IN_PROGRESS = ( 0 << 7 ) /*!< Conversion in progress */
mcm 0:53a09ccc5f8e 143 } DS1624_access_config_done_t;
mcm 0:53a09ccc5f8e 144
mcm 0:53a09ccc5f8e 145
mcm 0:53a09ccc5f8e 146 /**
mcm 0:53a09ccc5f8e 147 * @brief BIT0: 1SHOT
mcm 0:53a09ccc5f8e 148 */
mcm 0:53a09ccc5f8e 149 typedef enum {
mcm 0:53a09ccc5f8e 150 ACCESS_CONFIG_1SHOT_MASK = ( 1 << 0 ), /*!< 1SHOT Mask */
mcm 0:53a09ccc5f8e 151 ACCESS_CONFIG_1SHOT_ONE_TEMPERATURE_CONVERSION = ( 1 << 0 ), /*!< Perform one temperature conversion upon receipt of the Start Convert T protocol */
mcm 0:53a09ccc5f8e 152 ACCESS_CONFIG_1SHOT_CONTINUOUSLY_TEMPERATURE_CONVERSION = ( 0 << 0 ) /*!< Perform continuously temperature conversions */
mcm 0:53a09ccc5f8e 153 } DS1624_access_config_1shot_t;
mcm 0:53a09ccc5f8e 154
mcm 0:53a09ccc5f8e 155
mcm 0:53a09ccc5f8e 156
mcm 0:53a09ccc5f8e 157 // TEMPERATURE REGISTER
mcm 0:53a09ccc5f8e 158 /**
mcm 0:53a09ccc5f8e 159 * @brief MSB BIT15: SIGN
mcm 0:53a09ccc5f8e 160 */
mcm 0:53a09ccc5f8e 161 typedef enum {
mcm 0:53a09ccc5f8e 162 MSB_TEMPERATURE_SIGN_BIT_MASK = ( 1 << 7 ), /*!< Temperature sign Mask */
mcm 0:53a09ccc5f8e 163 MSB_TEMPERATURE_SIGN_BIT_POSITIVE = ( 0 << 7 ), /*!< Temperature is POSITIVE */
mcm 0:53a09ccc5f8e 164 MSB_TEMPERATURE_SIGN_BIT_NEGATIVE = ( 1 << 7 ) /*!< Temperature is NEGATIVE */
mcm 0:53a09ccc5f8e 165 } DS1624_msb_temperature_sign_bit_t;
mcm 0:53a09ccc5f8e 166
mcm 0:53a09ccc5f8e 167
mcm 0:53a09ccc5f8e 168
mcm 0:53a09ccc5f8e 169
mcm 0:53a09ccc5f8e 170 #ifndef DS1624_VECTOR_STRUCT_H
mcm 0:53a09ccc5f8e 171 #define DS1624_VECTOR_STRUCT_H
mcm 0:53a09ccc5f8e 172 typedef struct {
mcm 0:53a09ccc5f8e 173 uint8_t MSBTemperature;
mcm 0:53a09ccc5f8e 174 uint8_t LSBTemperature;
mcm 1:fc952e73a23e 175 char Control_Status_Register;
mcm 0:53a09ccc5f8e 176
mcm 0:53a09ccc5f8e 177 float Temperature;
mcm 0:53a09ccc5f8e 178 } DS1624_vector_data_t;
mcm 0:53a09ccc5f8e 179 #endif
mcm 0:53a09ccc5f8e 180
mcm 0:53a09ccc5f8e 181
mcm 0:53a09ccc5f8e 182
mcm 0:53a09ccc5f8e 183 /**
mcm 0:53a09ccc5f8e 184 * @brief INTERNAL CONSTANTS
mcm 0:53a09ccc5f8e 185 */
mcm 0:53a09ccc5f8e 186 #define DS1624_TEMPERATURE_RESOLUTION 0.0625
mcm 0:53a09ccc5f8e 187
mcm 0:53a09ccc5f8e 188 typedef enum {
mcm 0:53a09ccc5f8e 189 DS1624_SUCCESS = 0,
mcm 0:53a09ccc5f8e 190 DS1624_FAILURE = 1,
mcm 0:53a09ccc5f8e 191
mcm 0:53a09ccc5f8e 192 I2C_SUCCESS = 0, /*!< I2C communication was fine */
mcm 0:53a09ccc5f8e 193 I2C_FAILURE = 1
mcm 0:53a09ccc5f8e 194 } DS1624_status_t;
mcm 0:53a09ccc5f8e 195
mcm 0:53a09ccc5f8e 196
mcm 0:53a09ccc5f8e 197
mcm 0:53a09ccc5f8e 198
mcm 0:53a09ccc5f8e 199 /** Create an DS1624 object connected to the specified I2C pins.
mcm 0:53a09ccc5f8e 200 *
mcm 0:53a09ccc5f8e 201 * @param sda I2C data pin
mcm 0:53a09ccc5f8e 202 * @param scl I2C clock pin
mcm 0:53a09ccc5f8e 203 * @param addr I2C slave address
mcm 0:53a09ccc5f8e 204 * @param freq I2C frequency in Hz.
mcm 0:53a09ccc5f8e 205 */
mcm 0:53a09ccc5f8e 206 DS1624 ( PinName sda, PinName scl, uint32_t addr, uint32_t freq );
mcm 0:53a09ccc5f8e 207
mcm 0:53a09ccc5f8e 208 /** Delete DS1624 object.
mcm 0:53a09ccc5f8e 209 */
mcm 0:53a09ccc5f8e 210 ~DS1624();
mcm 0:53a09ccc5f8e 211
mcm 0:53a09ccc5f8e 212 /** It triggers a new temperature measurement.
mcm 0:53a09ccc5f8e 213 */
mcm 0:53a09ccc5f8e 214 DS1624_status_t DS1624_StartConvertTemperature ( void );
mcm 0:53a09ccc5f8e 215
mcm 0:53a09ccc5f8e 216 /** It stops the current temperature conversion.
mcm 0:53a09ccc5f8e 217 */
mcm 0:53a09ccc5f8e 218 DS1624_status_t DS1624_StopConvertTemperature ( void );
mcm 0:53a09ccc5f8e 219
mcm 0:53a09ccc5f8e 220 /** It reads the last raw temperature conversion result.
mcm 0:53a09ccc5f8e 221 */
mcm 0:53a09ccc5f8e 222 DS1624_status_t DS1624_ReadRawTemperature ( DS1624_vector_data_t* myRawTemperature );
mcm 0:53a09ccc5f8e 223
mcm 0:53a09ccc5f8e 224 /** It reads the last temperature conversion result.
mcm 0:53a09ccc5f8e 225 */
mcm 0:53a09ccc5f8e 226 DS1624_status_t DS1624_ReadTemperature ( DS1624_vector_data_t* myTemperature );
mcm 0:53a09ccc5f8e 227
mcm 0:53a09ccc5f8e 228 /** It reads the CONFIGURATION/STATUS register.
mcm 0:53a09ccc5f8e 229 */
mcm 0:53a09ccc5f8e 230 DS1624_status_t DS1624_GetStatusRegister ( DS1624_vector_data_t* myStatusRegister );
mcm 0:53a09ccc5f8e 231
mcm 0:53a09ccc5f8e 232 /** It sets 1SHOT/Continuous temperature conversion mode.
mcm 0:53a09ccc5f8e 233 */
mcm 0:53a09ccc5f8e 234 DS1624_status_t DS1624_SetConversionMode ( DS1624_access_config_1shot_t myConversionMode );
mcm 0:53a09ccc5f8e 235
mcm 0:53a09ccc5f8e 236 /** It checks if a temperature conversion is done.
mcm 0:53a09ccc5f8e 237 */
mcm 0:53a09ccc5f8e 238 DS1624_status_t DS1624_IsTemperatureConversionDone ( DS1624_access_config_done_t* myTemperatureConversionStatus );
mcm 0:53a09ccc5f8e 239
mcm 0:53a09ccc5f8e 240 /** It reads a certain number of bytes from EEPROM memory.
mcm 0:53a09ccc5f8e 241 */
mcm 1:fc952e73a23e 242 DS1624_status_t DS1624_ReadBytesEEPROM ( char myStartingAddress, char* myReadBytesEEPROM, uint8_t myLength );
mcm 0:53a09ccc5f8e 243
mcm 0:53a09ccc5f8e 244 /** It writes a certain number of bytes to EEPROM memory.
mcm 0:53a09ccc5f8e 245 */
mcm 1:fc952e73a23e 246 DS1624_status_t DS1624_WriteBytesEEPROM ( char myStartingAddress, char myWriteBytesEEPROM[], uint8_t myLength );
mcm 0:53a09ccc5f8e 247
mcm 0:53a09ccc5f8e 248
mcm 0:53a09ccc5f8e 249
mcm 0:53a09ccc5f8e 250
mcm 0:53a09ccc5f8e 251 private:
mcm 0:53a09ccc5f8e 252 I2C _i2c;
mcm 0:53a09ccc5f8e 253 uint32_t _DS1624_Addr;
mcm 0:53a09ccc5f8e 254 };
mcm 0:53a09ccc5f8e 255
mcm 0:53a09ccc5f8e 256 #endif