Example code how to get temperature from the TMP102 temperature sensor

Dependencies:   mbed TMP102

Committer:
eencae
Date:
Fri Feb 05 16:23:38 2016 +0000
Revision:
0:21a200b880d7
Child:
1:dd5fb735acf1
Initial commit.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
eencae 0:21a200b880d7 1 /*
eencae 0:21a200b880d7 2
eencae 0:21a200b880d7 3 2645_I2C_TMP102
eencae 0:21a200b880d7 4
eencae 0:21a200b880d7 5 Sample code from ELEC2645 Week 17 Lab
eencae 0:21a200b880d7 6
eencae 0:21a200b880d7 7 Demonstrates how to read the temperature from an I2C sensor
eencae 0:21a200b880d7 8
eencae 0:21a200b880d7 9 (c) Craig A. Evans, University of Leeds, Feb 2016
eencae 0:21a200b880d7 10
eencae 0:21a200b880d7 11 */
eencae 0:21a200b880d7 12
eencae 0:21a200b880d7 13 #include "mbed.h"
eencae 0:21a200b880d7 14
eencae 0:21a200b880d7 15 // addresses for ADD0 connected to GND
eencae 0:21a200b880d7 16 #define TMP102_ADD 0x48
eencae 0:21a200b880d7 17 #define TMP102_R_ADD 0x91
eencae 0:21a200b880d7 18 #define TMP102_W_ADD 0x90
eencae 0:21a200b880d7 19
eencae 0:21a200b880d7 20 // register addresses
eencae 0:21a200b880d7 21 #define TEMP_REG 0x00
eencae 0:21a200b880d7 22 #define CONFIG_REG 0x01
eencae 0:21a200b880d7 23 #define THIGH_REG 0x02
eencae 0:21a200b880d7 24 #define TLOW_REG 0x03
eencae 0:21a200b880d7 25
eencae 0:21a200b880d7 26 // I2C peripheral for temperature sensor
eencae 0:21a200b880d7 27 I2C tmp102(I2C_SDA,I2C_SCL);
eencae 0:21a200b880d7 28 // UART connection for PC
eencae 0:21a200b880d7 29 Serial pc(USBTX,USBRX);
eencae 0:21a200b880d7 30
eencae 0:21a200b880d7 31 // K64F on-board LEDs
eencae 0:21a200b880d7 32 DigitalOut r_led(LED_RED);
eencae 0:21a200b880d7 33 DigitalOut g_led(LED_GREEN);
eencae 0:21a200b880d7 34 DigitalOut b_led(LED_BLUE);
eencae 0:21a200b880d7 35 // K64F on-board switches
eencae 0:21a200b880d7 36 InterruptIn sw2(SW2);
eencae 0:21a200b880d7 37 InterruptIn sw3(SW3);
eencae 0:21a200b880d7 38
eencae 0:21a200b880d7 39 // error function hangs flashing an LED
eencae 0:21a200b880d7 40 void error();
eencae 0:21a200b880d7 41 // setup serial port
eencae 0:21a200b880d7 42 void init_serial();
eencae 0:21a200b880d7 43 // set-up the on-board LEDs and switches
eencae 0:21a200b880d7 44 void init_K64F();
eencae 0:21a200b880d7 45 // initialisation function for temperature sensor
eencae 0:21a200b880d7 46 void init_TMP102();
eencae 0:21a200b880d7 47 // function to read temperature from sensor (in degrees C)
eencae 0:21a200b880d7 48 float get_temperature();
eencae 0:21a200b880d7 49
eencae 0:21a200b880d7 50 int main()
eencae 0:21a200b880d7 51 {
eencae 0:21a200b880d7 52 // initialise the board, serial port and sensor
eencae 0:21a200b880d7 53 init_K64F();
eencae 0:21a200b880d7 54 init_serial();
eencae 0:21a200b880d7 55 init_TMP102();
eencae 0:21a200b880d7 56
eencae 0:21a200b880d7 57 while (1) {
eencae 0:21a200b880d7 58
eencae 0:21a200b880d7 59 // read temperature and print over serial port
eencae 0:21a200b880d7 60 float T = get_temperature();
eencae 0:21a200b880d7 61 pc.printf("T = %f K\n",T);
eencae 0:21a200b880d7 62 // small delay - 1s to match the update rate of the sensor (1 Hz)
eencae 0:21a200b880d7 63 wait(1.0);
eencae 0:21a200b880d7 64
eencae 0:21a200b880d7 65 }
eencae 0:21a200b880d7 66
eencae 0:21a200b880d7 67 }
eencae 0:21a200b880d7 68
eencae 0:21a200b880d7 69 void init_serial() {
eencae 0:21a200b880d7 70 // set to highest baud - ensure terminal software matches
eencae 0:21a200b880d7 71 pc.baud(115200);
eencae 0:21a200b880d7 72 }
eencae 0:21a200b880d7 73
eencae 0:21a200b880d7 74 void init_K64F()
eencae 0:21a200b880d7 75 {
eencae 0:21a200b880d7 76 // on-board LEDs are active-low, so set pin high to turn them off.
eencae 0:21a200b880d7 77 r_led = 1;
eencae 0:21a200b880d7 78 g_led = 1;
eencae 0:21a200b880d7 79 b_led = 1;
eencae 0:21a200b880d7 80
eencae 0:21a200b880d7 81 // since the on-board switches have external pull-ups, we should disable the internal pull-down
eencae 0:21a200b880d7 82 // resistors that are enabled by default using InterruptIn
eencae 0:21a200b880d7 83 sw2.mode(PullNone);
eencae 0:21a200b880d7 84 sw3.mode(PullNone);
eencae 0:21a200b880d7 85
eencae 0:21a200b880d7 86 }
eencae 0:21a200b880d7 87
eencae 0:21a200b880d7 88 void error()
eencae 0:21a200b880d7 89 {
eencae 0:21a200b880d7 90 while(1) { // if error, hang while flashing error message
eencae 0:21a200b880d7 91 r_led = 0;
eencae 0:21a200b880d7 92 wait(0.2);
eencae 0:21a200b880d7 93 r_led = 1;
eencae 0:21a200b880d7 94 wait(0.2);
eencae 0:21a200b880d7 95 }
eencae 0:21a200b880d7 96 }
eencae 0:21a200b880d7 97
eencae 0:21a200b880d7 98 void init_TMP102()
eencae 0:21a200b880d7 99 {
eencae 0:21a200b880d7 100 tmp102.frequency(400000); // set bus speed to 400 kHz
eencae 0:21a200b880d7 101
eencae 0:21a200b880d7 102 int ack; // used to store acknowledgement bit
eencae 0:21a200b880d7 103 char config_data[2]; // array for data
eencae 0:21a200b880d7 104 char reg = CONFIG_REG; // register address
eencae 0:21a200b880d7 105
eencae 0:21a200b880d7 106 //////// Read current status of configuration register ///////
eencae 0:21a200b880d7 107
eencae 0:21a200b880d7 108 ack = tmp102.write(TMP102_W_ADD,&reg,1); // send the slave write address and the configuration register address
eencae 0:21a200b880d7 109 if (ack)
eencae 0:21a200b880d7 110 error(); // if we don't receive acknowledgement, flash error message
eencae 0:21a200b880d7 111
eencae 0:21a200b880d7 112 ack = tmp102.read(TMP102_R_ADD,config_data,2); // read default 2 bytes from configuration register and store in array
eencae 0:21a200b880d7 113 if (ack)
eencae 0:21a200b880d7 114 error(); // if we don't receive acknowledgement, flash error message
eencae 0:21a200b880d7 115
eencae 0:21a200b880d7 116 ///////// Configure the register //////////
eencae 0:21a200b880d7 117
eencae 0:21a200b880d7 118 // set conversion rate to 1 Hz - CR1 and CR2 are in the second data byte
eencae 0:21a200b880d7 119 config_data[1] |= (1 << 6); // set bit 6
eencae 0:21a200b880d7 120 config_data[1] &= ~(1 << 7); // clear bit 7
eencae 0:21a200b880d7 121
eencae 0:21a200b880d7 122 //////// Send the configured register value to the slave config register ////////////
eencae 0:21a200b880d7 123
eencae 0:21a200b880d7 124 // create data packet
eencae 0:21a200b880d7 125 char data_packet[3] = {reg,config_data[0],config_data[1]};
eencae 0:21a200b880d7 126
eencae 0:21a200b880d7 127 ack = tmp102.write(TMP102_W_ADD,data_packet,3); // send the data packet to the slave write address
eencae 0:21a200b880d7 128 if (ack)
eencae 0:21a200b880d7 129 error(); // if we don't receive acknowledgement, flash error message
eencae 0:21a200b880d7 130
eencae 0:21a200b880d7 131 }
eencae 0:21a200b880d7 132
eencae 0:21a200b880d7 133 float get_temperature()
eencae 0:21a200b880d7 134 {
eencae 0:21a200b880d7 135 int ack; // used to store acknowledgement bit
eencae 0:21a200b880d7 136 char data[2]; // array for data
eencae 0:21a200b880d7 137 char reg = TEMP_REG; // temperature register address
eencae 0:21a200b880d7 138
eencae 0:21a200b880d7 139 ack = tmp102.write(TMP102_W_ADD,&reg,1); // send temperature register address
eencae 0:21a200b880d7 140 if (ack)
eencae 0:21a200b880d7 141 error(); // if we don't receive acknowledgement, flash error message
eencae 0:21a200b880d7 142
eencae 0:21a200b880d7 143 ack = tmp102.read(TMP102_R_ADD,data,2); // read 2 bytes from temperature register and store in array
eencae 0:21a200b880d7 144 if (ack)
eencae 0:21a200b880d7 145 error(); // if we don't receive acknowledgement, flash error message
eencae 0:21a200b880d7 146
eencae 0:21a200b880d7 147 int temperature = (data[0] << 4) | (data[1] >> 4);
eencae 0:21a200b880d7 148
eencae 0:21a200b880d7 149 return temperature*0.0625;
eencae 0:21a200b880d7 150 }