Craig Evans / Mbed 2 deprecated 2645_TMP102

Dependencies:   mbed

Committer:
eencae
Date:
Thu Feb 18 16:09:50 2016 +0000
Revision:
2:e3e801b31933
Parent:
1:63221e5c0606
Changed Kelvin to Celsius in print statement

Who changed what in which revision?

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