Read external LM75 temperature sensor using I2C master.

Dependencies:   mbed

Committer:
arostm
Date:
Wed Jun 07 12:57:39 2017 +0000
Revision:
1:23ab78ca12bd
Parent:
0:41f53df528da
Adding new mbed library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bcostm 0:41f53df528da 1 #include "mbed.h"
bcostm 0:41f53df528da 2
bcostm 0:41f53df528da 3 #define LM75_REG_TEMP (0x00) // Temperature Register
bcostm 0:41f53df528da 4 #define LM75_REG_CONF (0x01) // Configuration Register
bcostm 0:41f53df528da 5 #define LM75_ADDR (0x90) // LM75 address
bcostm 0:41f53df528da 6
bcostm 0:41f53df528da 7 I2C i2c(I2C_SDA, I2C_SCL);
bcostm 0:41f53df528da 8
bcostm 0:41f53df528da 9 DigitalOut myled(LED1);
bcostm 0:41f53df528da 10
bcostm 0:41f53df528da 11 Serial pc(SERIAL_TX, SERIAL_RX);
bcostm 0:41f53df528da 12
bcostm 0:41f53df528da 13 volatile char TempCelsiusDisplay[] = "+abc.d C";
bcostm 0:41f53df528da 14
bcostm 0:41f53df528da 15 int main()
bcostm 0:41f53df528da 16 {
bcostm 0:41f53df528da 17
bcostm 0:41f53df528da 18 char data_write[2];
bcostm 0:41f53df528da 19 char data_read[2];
bcostm 0:41f53df528da 20
bcostm 0:41f53df528da 21 /* Configure the Temperature sensor device STLM75:
bcostm 0:41f53df528da 22 - Thermostat mode Interrupt
bcostm 0:41f53df528da 23 - Fault tolerance: 0
bcostm 0:41f53df528da 24 */
bcostm 0:41f53df528da 25 data_write[0] = LM75_REG_CONF;
bcostm 0:41f53df528da 26 data_write[1] = 0x02;
bcostm 0:41f53df528da 27 int status = i2c.write(LM75_ADDR, data_write, 2, 0);
bcostm 0:41f53df528da 28 if (status != 0) { // Error
bcostm 0:41f53df528da 29 while (1) {
bcostm 0:41f53df528da 30 myled = !myled;
bcostm 0:41f53df528da 31 wait(0.2);
bcostm 0:41f53df528da 32 }
bcostm 0:41f53df528da 33 }
bcostm 0:41f53df528da 34
bcostm 0:41f53df528da 35 while (1) {
bcostm 0:41f53df528da 36 // Read temperature register
bcostm 0:41f53df528da 37 data_write[0] = LM75_REG_TEMP;
bcostm 0:41f53df528da 38 i2c.write(LM75_ADDR, data_write, 1, 1); // no stop
bcostm 0:41f53df528da 39 i2c.read(LM75_ADDR, data_read, 2, 0);
bcostm 0:41f53df528da 40
bcostm 0:41f53df528da 41 // Calculate temperature value in Celcius
bcostm 0:41f53df528da 42 int tempval = (int)((int)data_read[0] << 8) | data_read[1];
bcostm 0:41f53df528da 43 tempval >>= 7;
bcostm 0:41f53df528da 44 if (tempval <= 256) {
bcostm 0:41f53df528da 45 TempCelsiusDisplay[0] = '+';
bcostm 0:41f53df528da 46 } else {
bcostm 0:41f53df528da 47 TempCelsiusDisplay[0] = '-';
bcostm 0:41f53df528da 48 tempval = 512 - tempval;
bcostm 0:41f53df528da 49 }
bcostm 0:41f53df528da 50
bcostm 0:41f53df528da 51 // Decimal part (0.5°C precision)
bcostm 0:41f53df528da 52 if (tempval & 0x01) {
bcostm 0:41f53df528da 53 TempCelsiusDisplay[5] = 0x05 + 0x30;
bcostm 0:41f53df528da 54 } else {
bcostm 0:41f53df528da 55 TempCelsiusDisplay[5] = 0x00 + 0x30;
bcostm 0:41f53df528da 56 }
bcostm 0:41f53df528da 57
bcostm 0:41f53df528da 58 // Integer part
bcostm 0:41f53df528da 59 tempval >>= 1;
bcostm 0:41f53df528da 60 TempCelsiusDisplay[1] = (tempval / 100) + 0x30;
bcostm 0:41f53df528da 61 TempCelsiusDisplay[2] = ((tempval % 100) / 10) + 0x30;
bcostm 0:41f53df528da 62 TempCelsiusDisplay[3] = ((tempval % 100) % 10) + 0x30;
bcostm 0:41f53df528da 63
bcostm 0:41f53df528da 64 // Display result
bcostm 0:41f53df528da 65 pc.printf("temp = %s\n", TempCelsiusDisplay);
bcostm 0:41f53df528da 66 myled = !myled;
bcostm 0:41f53df528da 67 wait(1.0);
bcostm 0:41f53df528da 68 }
bcostm 0:41f53df528da 69
bcostm 0:41f53df528da 70 }
bcostm 0:41f53df528da 71