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