Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@2:e3e801b31933, 2016-02-18 (annotated)
- 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?
| User | Revision | Line number | New 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,®,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,®,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 | } |