
Using mbed for sous vide
Dependencies: 4DGL-uLCD-SE DS1820 PinDetect Speaker mbed
Fork of DS18B20 by
Revision 0:03ec282c2908, committed 2010-01-29
- Comitter:
- feabhas
- Date:
- Fri Jan 29 19:01:56 2010 +0000
- Child:
- 1:2d86c674a78b
- Commit message:
Changed in this revision
--- /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