Temperature, Voltage & RTC via SMS

Dependencies:   DS1307 OLED160G1 mbed uOLED

Fork of Astromed by Renato Loureiro

Files at this revision

API Documentation at this revision

Comitter:
feabhas
Date:
Fri Jan 29 19:01:56 2010 +0000
Child:
1:b2ea1e9d90df
Commit message:

Changed in this revision

DS18B20.cpp Show annotated file Show diff for this revision Revisions of this file
DS18B20.h Show annotated file Show diff for this revision Revisions of this file
DS1Wire.cpp Show annotated file Show diff for this revision Revisions of this file
DS1Wire.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DS18B20.cpp	Fri Jan 29 19:01:56 2010 +0000
@@ -0,0 +1,86 @@
+#include "DS18B20.h"
+#include "DS1Wire.h"
+#include "mbed.h"
+#include <stdint.h>
+
+// Device byte commands over 1-wire serial
+enum COMMANDS { READ_ROM = 0x33, CONVERT = 0x44, READ_SCRATCHPAD = 0xBE,  SKIP_ROM = 0xCC };
+
+// device onboard register layout
+typedef struct {
+    uint8_t    LSB;
+    uint8_t    MSB;
+    uint8_t    Th;
+    uint8_t    Tl;
+    uint8_t    config;
+    uint8_t    reserved0xFF;
+    uint8_t    reserved0xCH;
+    uint8_t    reserved0x10;
+    uint8_t    CRC;
+} ScratchPad_t;
+
+
+DigitalOut conversionInProgress(LED4);  // conversion in progress
+DigitalOut resetFailure(LED1);          // for error reporting
+extern DigitalInOut sensor;     // sensor pin
+
+static void inError() {
+    while (1) {
+        resetFailure = !resetFailure;
+        wait(0.2);
+    }
+}
+
+void DoConversion() {
+    if (Reset(sensor) != 0) {
+        inError();
+    } else {
+        conversionInProgress = 1;       // led on
+        WriteByte(sensor, SKIP_ROM);            // Skip ROM
+        WriteByte(sensor, CONVERT);             // Convert
+        while (ReadBit(sensor) == 0) {
+            // wait for conversion to complete
+        }
+        conversionInProgress = 0;       // led off
+    }
+}
+
+uint32_t GetTemperature() {
+    uint32_t result = 0;
+    if (Reset(sensor) != 0) {
+        inError();
+    } else {
+        ScratchPad_t scratchpad;
+        WriteByte(sensor, SKIP_ROM);    // Skip ROM
+        WriteByte(sensor, READ_SCRATCHPAD);    // Read Scrachpad
+        scratchpad.LSB = ReadByte(sensor);
+        scratchpad.MSB = ReadByte(sensor);
+        Reset(sensor);    // terminate read as we only want temperature
+        result = ((scratchpad.MSB << 8) | scratchpad.LSB);
+    }
+    return result;
+}
+
+ROM_Code_t ReadROM() {
+    ROM_Code_t ROM_Code;
+    if (Reset(sensor) != 0) {
+        inError();
+    } else {
+        
+        WriteByte(sensor, READ_ROM);    // Read ROM
+        for (uint32_t i = 0; i < 8; ++i) {
+            ROM_Code.rom[i] = ReadByte(sensor);
+        }
+    }
+    return ROM_Code;
+}
+
+// temperature is store as 7.4 fixed point format (assuming 12 bit conversion)
+void displayTemperature(Serial& s) {
+    DoConversion();
+    uint32_t temp = GetTemperature();
+    float f = (temp & 0x0F) * 0.0625;    // calculate .4 part
+    f += (temp >> 4);    // add 7.0 part to it
+    s.printf("Temp is %2.1fC\n\r", f);    // display in 2.1 format
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DS18B20.h	Fri Jan 29 19:01:56 2010 +0000
@@ -0,0 +1,22 @@
+#ifndef _DS18B20_
+#define _DS18B20_
+
+#include <stdint.h>
+#include "mbed.h"
+
+// Device Faimly ID and Setial number information
+typedef union {
+    uint8_t rom[8];
+    struct {
+        uint8_t    familyCode;
+        uint8_t    serialNo[6];
+        uint8_t    CRC;
+    } BYTES;
+} ROM_Code_t;
+
+ROM_Code_t ReadROM() ;
+
+// temperature is store as 7.4 fixed point format (assuming 12 bit conversion)
+void displayTemperature(Serial& s) ;
+
+#endif
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DS1Wire.cpp	Fri Jan 29 19:01:56 2010 +0000
@@ -0,0 +1,60 @@
+#include "DS1Wire.h"
+#include "mbed.h"
+#include <stdint.h>
+
+// Timing delay for 1-wire serial standard option
+enum DELAY { A = 6, B = 64, C = 60, D = 10, E = 9, F = 55, G = 0, H = 480, I = 70, J = 410 };
+
+   
+int Reset(DigitalInOut& pin) {
+    pin.output();
+    pin = 0;    // drive bus low
+    wait_us(H);
+    pin.input(); // release bus
+    wait_us(I);
+    uint32_t result = pin;  // read bus value
+    wait_us(J);
+    return result;
+}
+
+void WriteBit(DigitalInOut& pin, uint32_t bit) {
+    pin.output();
+    if (bit) {
+        pin = 0;        // drive bus low
+        wait_us(A);        // delay A
+        pin.input();      // release bus
+        wait_us(B);        // delay B
+    } else {
+        pin = 0;    // drive bus low
+        wait_us(C);    // delay C
+        pin.input();  // release bus
+        wait_us(D);    // delay D
+    }
+}
+
+uint32_t ReadBit(DigitalInOut& pin) {
+    uint32_t bit_value;
+    pin.output();
+    pin = 0;        // drive bus low
+    wait_us(A);        // delay A
+    pin.input();      // release bus
+    wait_us(E);        // delay E
+    bit_value  = pin;    // master sample bus
+    wait_us(F);
+    return bit_value;
+}
+
+void WriteByte(DigitalInOut& pin, uint32_t byte) {
+    for (uint32_t bit = 0; bit < 8; ++bit) {
+        WriteBit(pin, byte & 0x01); // lsb to msb
+        byte >>= 1;    // right shift by 1-bit
+    }
+}
+
+uint32_t ReadByte(DigitalInOut& pin) {
+    uint32_t byte = 0;
+    for (uint32_t bit = 0; bit < 8; ++bit) {
+        byte |= (ReadBit(pin) << bit);    // Reads lsb to msb
+    }
+    return byte;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DS1Wire.h	Fri Jan 29 19:01:56 2010 +0000
@@ -0,0 +1,15 @@
+#ifndef __DS_1_WIRE__
+#define __DS_1_WIRE__
+#include <stdint.h>
+#include "mbed.h"
+
+int Reset(DigitalInOut& pin);
+
+void WriteBit(DigitalInOut& pin, uint32_t bit);
+uint32_t ReadBit(DigitalInOut& pin);
+
+void WriteByte(DigitalInOut& pin, uint32_t byte);
+uint32_t ReadByte(DigitalInOut& pin);
+
+
+#endif
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Jan 29 19:01:56 2010 +0000
@@ -0,0 +1,29 @@
+#include "mbed.h"
+#include <stdint.h>
+#include "DS18B20.h"
+
+DigitalInOut sensor(p5);     // sensor connected to pin 5
+
+Ticker timer;                // used for our microsec timing
+Serial pc(USBTX, USBRX);     // serial comms over usb back to console
+
+int main() {
+    pc.printf("\n\r=====================================================\n\r");
+    pc.printf("DS18B20 Configuration\n\r");
+    sensor.mode(PullUp);
+    
+    ROM_Code_t ROM_Code = ReadROM();
+    pc.printf("Family code: 0x%X\n\r", ROM_Code.BYTES.familyCode);
+    pc.printf("Serial Number: ");
+    for (uint32_t i = 6; i != 0; --i) {
+        pc.printf("%02X%s", ROM_Code.BYTES.serialNo[i-1], (i != 1)?":":"\r\n");
+    }
+    pc.printf("CRC: 0x%X\r\n", ROM_Code.BYTES.CRC);
+    
+    pc.printf("\n\rRunning temperature conversion...\n\r");
+    while (1) {
+        displayTemperature(pc);
+        wait(10);
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Fri Jan 29 19:01:56 2010 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/49a220cc26e0