DS1820-EM

Fork of DS1820 by HM Yoong

Committer:
liviur2
Date:
Mon Dec 03 22:58:27 2012 +0000
Revision:
1:78f2fa466c55
Child:
2:8e118d297c83
Added DS1820

Who changed what in which revision?

UserRevisionLine numberNew contents of line
liviur2 1:78f2fa466c55 1 #include "DS18B20.h"
liviur2 1:78f2fa466c55 2 #include "DS1Wire.h"
liviur2 1:78f2fa466c55 3 #include "mbed.h"
liviur2 1:78f2fa466c55 4 #include <stdint.h>
liviur2 1:78f2fa466c55 5
liviur2 1:78f2fa466c55 6 // Device byte commands over 1-wire serial
liviur2 1:78f2fa466c55 7 enum COMMANDS { READ_ROM = 0x33, CONVERT = 0x44, READ_SCRATCHPAD = 0xBE, SKIP_ROM = 0xCC };
liviur2 1:78f2fa466c55 8
liviur2 1:78f2fa466c55 9 // device onboard register layout
liviur2 1:78f2fa466c55 10 typedef struct {
liviur2 1:78f2fa466c55 11 uint8_t LSB;
liviur2 1:78f2fa466c55 12 uint8_t MSB;
liviur2 1:78f2fa466c55 13 uint8_t Th;
liviur2 1:78f2fa466c55 14 uint8_t Tl;
liviur2 1:78f2fa466c55 15 uint8_t config;
liviur2 1:78f2fa466c55 16 uint8_t reserved0xFF;
liviur2 1:78f2fa466c55 17 uint8_t reserved0xCH;
liviur2 1:78f2fa466c55 18 uint8_t reserved0x10;
liviur2 1:78f2fa466c55 19 uint8_t CRC;
liviur2 1:78f2fa466c55 20 } ScratchPad_t;
liviur2 1:78f2fa466c55 21
liviur2 1:78f2fa466c55 22
liviur2 1:78f2fa466c55 23 DigitalOut conversionInProgress(LED4); // conversion in progress
liviur2 1:78f2fa466c55 24 DigitalOut resetFailure(LED1); // for error reporting
liviur2 1:78f2fa466c55 25 extern DigitalInOut sensor; // sensor pin
liviur2 1:78f2fa466c55 26
liviur2 1:78f2fa466c55 27 static void inError() {
liviur2 1:78f2fa466c55 28 while (1) {
liviur2 1:78f2fa466c55 29 resetFailure = !resetFailure;
liviur2 1:78f2fa466c55 30 wait(0.2);
liviur2 1:78f2fa466c55 31 }
liviur2 1:78f2fa466c55 32 }
liviur2 1:78f2fa466c55 33
liviur2 1:78f2fa466c55 34 void DoConversion() {
liviur2 1:78f2fa466c55 35 if (Reset(sensor) != 0) {
liviur2 1:78f2fa466c55 36 inError();
liviur2 1:78f2fa466c55 37 } else {
liviur2 1:78f2fa466c55 38 conversionInProgress = 1; // led on
liviur2 1:78f2fa466c55 39 WriteByte(sensor, SKIP_ROM); // Skip ROM
liviur2 1:78f2fa466c55 40 WriteByte(sensor, CONVERT); // Convert
liviur2 1:78f2fa466c55 41 while (ReadBit(sensor) == 0) {
liviur2 1:78f2fa466c55 42 // wait for conversion to complete
liviur2 1:78f2fa466c55 43 }
liviur2 1:78f2fa466c55 44 conversionInProgress = 0; // led off
liviur2 1:78f2fa466c55 45 }
liviur2 1:78f2fa466c55 46 }
liviur2 1:78f2fa466c55 47
liviur2 1:78f2fa466c55 48 uint32_t GetTemperature() {
liviur2 1:78f2fa466c55 49 uint32_t result = 0;
liviur2 1:78f2fa466c55 50 if (Reset(sensor) != 0) {
liviur2 1:78f2fa466c55 51 inError();
liviur2 1:78f2fa466c55 52 } else {
liviur2 1:78f2fa466c55 53 ScratchPad_t scratchpad;
liviur2 1:78f2fa466c55 54 WriteByte(sensor, SKIP_ROM); // Skip ROM
liviur2 1:78f2fa466c55 55 WriteByte(sensor, READ_SCRATCHPAD); // Read Scrachpad
liviur2 1:78f2fa466c55 56 scratchpad.LSB = ReadByte(sensor);
liviur2 1:78f2fa466c55 57 scratchpad.MSB = ReadByte(sensor);
liviur2 1:78f2fa466c55 58 Reset(sensor); // terminate read as we only want temperature
liviur2 1:78f2fa466c55 59 result = ((scratchpad.MSB << 8) | scratchpad.LSB);
liviur2 1:78f2fa466c55 60 }
liviur2 1:78f2fa466c55 61 return result;
liviur2 1:78f2fa466c55 62 }
liviur2 1:78f2fa466c55 63
liviur2 1:78f2fa466c55 64 ROM_Code_t ReadROM() {
liviur2 1:78f2fa466c55 65 ROM_Code_t ROM_Code;
liviur2 1:78f2fa466c55 66 if (Reset(sensor) != 0) {
liviur2 1:78f2fa466c55 67 inError();
liviur2 1:78f2fa466c55 68 } else {
liviur2 1:78f2fa466c55 69
liviur2 1:78f2fa466c55 70 WriteByte(sensor, READ_ROM); // Read ROM
liviur2 1:78f2fa466c55 71 for (uint32_t i = 0; i < 8; ++i) {
liviur2 1:78f2fa466c55 72 ROM_Code.rom[i] = ReadByte(sensor);
liviur2 1:78f2fa466c55 73 }
liviur2 1:78f2fa466c55 74 }
liviur2 1:78f2fa466c55 75 return ROM_Code;
liviur2 1:78f2fa466c55 76 }
liviur2 1:78f2fa466c55 77
liviur2 1:78f2fa466c55 78 // temperature is store as 7.4 fixed point format (assuming 12 bit conversion)
liviur2 1:78f2fa466c55 79 void displayTemperature(Serial& s) {
liviur2 1:78f2fa466c55 80 DoConversion();
liviur2 1:78f2fa466c55 81 uint32_t temp = GetTemperature();
liviur2 1:78f2fa466c55 82 float f = (temp & 0x0F) * 0.0625; // calculate .4 part
liviur2 1:78f2fa466c55 83 f += (temp >> 4); // add 7.0 part to it
liviur2 1:78f2fa466c55 84 s.printf("Temp is %2.1fC\n\r", f); // display in 2.1 format
liviur2 1:78f2fa466c55 85 }
liviur2 1:78f2fa466c55 86
liviur2 1:78f2fa466c55 87 float getTemp(){
liviur2 1:78f2fa466c55 88 DoConversion();
liviur2 1:78f2fa466c55 89 uint32_t temp = GetTemperature();
liviur2 1:78f2fa466c55 90 float f = (temp & 0x0F) * 0.0625; // calculate .4 part
liviur2 1:78f2fa466c55 91 f += (temp >> 4); // add 7.0 part to it
liviur2 1:78f2fa466c55 92 return f;
liviur2 1:78f2fa466c55 93 }