The present code implements and checks the current temperature.
Fork of 2645_I2C_TMP102 by
main.cpp@0:21a200b880d7, 2016-02-05 (annotated)
- 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?
User | Revision | Line number | New 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,®,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,®,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 | } |