An example program that shows how to read a Maxim DS1624 temperature sensor via the I2C bus and print the results to a LCD.
main.cpp@0:5ca9b9abcaf3, 2010-12-22 (annotated)
- Committer:
- StijnS
- Date:
- Wed Dec 22 19:41:46 2010 +0000
- Revision:
- 0:5ca9b9abcaf3
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
StijnS | 0:5ca9b9abcaf3 | 1 | /********************************* |
StijnS | 0:5ca9b9abcaf3 | 2 | **Read DS1624 Temperature Sensor** |
StijnS | 0:5ca9b9abcaf3 | 3 | ******Made by Stijn Sontrop******* |
StijnS | 0:5ca9b9abcaf3 | 4 | **********22 Dec 2010************* |
StijnS | 0:5ca9b9abcaf3 | 5 | **********************************/ |
StijnS | 0:5ca9b9abcaf3 | 6 | |
StijnS | 0:5ca9b9abcaf3 | 7 | #include "mbed.h" |
StijnS | 0:5ca9b9abcaf3 | 8 | #include <TextLCD.h> //Include the TextLCD lib (add this one to your project) |
StijnS | 0:5ca9b9abcaf3 | 9 | |
StijnS | 0:5ca9b9abcaf3 | 10 | |
StijnS | 0:5ca9b9abcaf3 | 11 | //Address of DS1642: 1001 A2 A1 A0 R/W' |
StijnS | 0:5ca9b9abcaf3 | 12 | //Example: 0x92 = Sensor with address 1 |
StijnS | 0:5ca9b9abcaf3 | 13 | //Make R/W' 0 |
StijnS | 0:5ca9b9abcaf3 | 14 | #define DS1642WRITEADDR 0x92 |
StijnS | 0:5ca9b9abcaf3 | 15 | //Make R/W' 1 |
StijnS | 0:5ca9b9abcaf3 | 16 | #define DS1642READADDR 0x93 |
StijnS | 0:5ca9b9abcaf3 | 17 | |
StijnS | 0:5ca9b9abcaf3 | 18 | TextLCD lcd(p15, p16, p17, p18, p19, p20); //LCD Config rs, e, d4-d7 |
StijnS | 0:5ca9b9abcaf3 | 19 | |
StijnS | 0:5ca9b9abcaf3 | 20 | I2C i2c(p9, p10); //SDA & SCL from I2C |
StijnS | 0:5ca9b9abcaf3 | 21 | typedef struct { //Struct that contains the MSB en LSB value |
StijnS | 0:5ca9b9abcaf3 | 22 | char msb; |
StijnS | 0:5ca9b9abcaf3 | 23 | char lsb; |
StijnS | 0:5ca9b9abcaf3 | 24 | } temperature; |
StijnS | 0:5ca9b9abcaf3 | 25 | |
StijnS | 0:5ca9b9abcaf3 | 26 | //Function that reads the temperature |
StijnS | 0:5ca9b9abcaf3 | 27 | temperature readDS1624(void) { |
StijnS | 0:5ca9b9abcaf3 | 28 | temperature readval; |
StijnS | 0:5ca9b9abcaf3 | 29 | i2c.start(); |
StijnS | 0:5ca9b9abcaf3 | 30 | i2c.write(DS1642WRITEADDR); //address |
StijnS | 0:5ca9b9abcaf3 | 31 | i2c.write(0xEE); //start conv T |
StijnS | 0:5ca9b9abcaf3 | 32 | i2c.stop(); |
StijnS | 0:5ca9b9abcaf3 | 33 | wait_ms(2); |
StijnS | 0:5ca9b9abcaf3 | 34 | |
StijnS | 0:5ca9b9abcaf3 | 35 | i2c.start(); |
StijnS | 0:5ca9b9abcaf3 | 36 | i2c.write(DS1642WRITEADDR); //Address |
StijnS | 0:5ca9b9abcaf3 | 37 | i2c.write(0xAA); //read temp command |
StijnS | 0:5ca9b9abcaf3 | 38 | i2c.stop(); |
StijnS | 0:5ca9b9abcaf3 | 39 | wait_ms(1); |
StijnS | 0:5ca9b9abcaf3 | 40 | |
StijnS | 0:5ca9b9abcaf3 | 41 | i2c.start(); |
StijnS | 0:5ca9b9abcaf3 | 42 | i2c.write(DS1642READADDR); //Write Address |
StijnS | 0:5ca9b9abcaf3 | 43 | readval.msb = i2c.read(1); //Read MSB + ACK |
StijnS | 0:5ca9b9abcaf3 | 44 | readval.lsb = i2c.read(0); //Read LSB + No ACK |
StijnS | 0:5ca9b9abcaf3 | 45 | i2c.stop(); |
StijnS | 0:5ca9b9abcaf3 | 46 | readval.msb = readval.msb - 2; //Apparently you need to do -2 to get the right value |
StijnS | 0:5ca9b9abcaf3 | 47 | return readval; //Return value |
StijnS | 0:5ca9b9abcaf3 | 48 | } |
StijnS | 0:5ca9b9abcaf3 | 49 | |
StijnS | 0:5ca9b9abcaf3 | 50 | int main() { |
StijnS | 0:5ca9b9abcaf3 | 51 | temperature readval; |
StijnS | 0:5ca9b9abcaf3 | 52 | i2c.start(); |
StijnS | 0:5ca9b9abcaf3 | 53 | i2c.write(DS1642WRITEADDR); //b1001 A2 A1 A0 R/W' |
StijnS | 0:5ca9b9abcaf3 | 54 | i2c.write(0xAC); //access config |
StijnS | 0:5ca9b9abcaf3 | 55 | i2c.write(0x00); //continuous conversion |
StijnS | 0:5ca9b9abcaf3 | 56 | i2c.stop(); |
StijnS | 0:5ca9b9abcaf3 | 57 | |
StijnS | 0:5ca9b9abcaf3 | 58 | while (1) { |
StijnS | 0:5ca9b9abcaf3 | 59 | readval = readDS1624(); //Call the readDS162 function |
StijnS | 0:5ca9b9abcaf3 | 60 | lcd.cls(); //Clear LCD |
StijnS | 0:5ca9b9abcaf3 | 61 | lcd.printf("Temp: %d\n%d", readval.msb, readval.lsb); //Print values to LCD |
StijnS | 0:5ca9b9abcaf3 | 62 | wait(0.3); |
StijnS | 0:5ca9b9abcaf3 | 63 | } |
StijnS | 0:5ca9b9abcaf3 | 64 | } |