yet another 18B20 Temperature sensor. variable number of sensors working in parasite mode, serial 16x2 display with diagnostic output and post to a rest web service

Dependencies:   EthernetInterface HTTPClient NTPClient mbed-rtos mbed

Committer:
wkinkeldei
Date:
Thu Jan 03 18:50:43 2013 +0000
Revision:
1:9e88b2508768
Parent:
0:53f05303850a
added switch sensor

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wkinkeldei 0:53f05303850a 1 #include "one_wire.h"
wkinkeldei 0:53f05303850a 2
wkinkeldei 0:53f05303850a 3 /* "borrowed" from snatch59: OneWireCRC and simplified for my needs */
wkinkeldei 0:53f05303850a 4
wkinkeldei 0:53f05303850a 5 const int timing[] = {6, 64, 60, 10, 9, 55, 0, 480, 70, 410};
wkinkeldei 0:53f05303850a 6
wkinkeldei 0:53f05303850a 7 OneWire::OneWire(PinName pin) : port(pin) {
wkinkeldei 0:53f05303850a 8 }
wkinkeldei 0:53f05303850a 9
wkinkeldei 0:53f05303850a 10 int OneWire::reset() {
wkinkeldei 0:53f05303850a 11 int result = 0; // sample presence pulse result
wkinkeldei 0:53f05303850a 12
wkinkeldei 0:53f05303850a 13 wait_us(timing[6]);
wkinkeldei 0:53f05303850a 14 port.output();
wkinkeldei 0:53f05303850a 15 port = 0;
wkinkeldei 0:53f05303850a 16 wait_us(timing[7]);
wkinkeldei 0:53f05303850a 17 port.input();
wkinkeldei 0:53f05303850a 18 wait_us(timing[8]);
wkinkeldei 0:53f05303850a 19 result = !(port & 0x01);
wkinkeldei 0:53f05303850a 20 wait_us(timing[9]);
wkinkeldei 0:53f05303850a 21
wkinkeldei 0:53f05303850a 22 return result;
wkinkeldei 0:53f05303850a 23 }
wkinkeldei 0:53f05303850a 24
wkinkeldei 0:53f05303850a 25 void OneWire::write_bit(int bit) {
wkinkeldei 0:53f05303850a 26 bit = bit & 0x01;
wkinkeldei 0:53f05303850a 27
wkinkeldei 0:53f05303850a 28 if (bit) {
wkinkeldei 0:53f05303850a 29 // Write '1' bit
wkinkeldei 0:53f05303850a 30 port.output();
wkinkeldei 0:53f05303850a 31 port = 0;
wkinkeldei 0:53f05303850a 32 wait_us(timing[0]);
wkinkeldei 0:53f05303850a 33 port.input();
wkinkeldei 0:53f05303850a 34 wait_us(timing[1]);
wkinkeldei 0:53f05303850a 35 } else {
wkinkeldei 0:53f05303850a 36 // Write '0' bit
wkinkeldei 0:53f05303850a 37 port.output();
wkinkeldei 0:53f05303850a 38 port = 0;
wkinkeldei 0:53f05303850a 39 wait_us(timing[2]);
wkinkeldei 0:53f05303850a 40 port.input();
wkinkeldei 0:53f05303850a 41 wait_us(timing[3]);
wkinkeldei 0:53f05303850a 42 }
wkinkeldei 0:53f05303850a 43 }
wkinkeldei 0:53f05303850a 44
wkinkeldei 0:53f05303850a 45 int OneWire::read_bit() {
wkinkeldei 0:53f05303850a 46 int result;
wkinkeldei 0:53f05303850a 47
wkinkeldei 0:53f05303850a 48 port.output();
wkinkeldei 0:53f05303850a 49 port = 0;
wkinkeldei 0:53f05303850a 50 wait_us(timing[0]);
wkinkeldei 0:53f05303850a 51 port.input();
wkinkeldei 0:53f05303850a 52 wait_us(timing[4]);
wkinkeldei 0:53f05303850a 53 result = port & 0x01;
wkinkeldei 0:53f05303850a 54 wait_us(timing[5]);
wkinkeldei 0:53f05303850a 55
wkinkeldei 0:53f05303850a 56 return result;
wkinkeldei 0:53f05303850a 57 }
wkinkeldei 0:53f05303850a 58
wkinkeldei 0:53f05303850a 59 void OneWire::write_byte(int data) {
wkinkeldei 0:53f05303850a 60 // Loop to write each bit in the byte, LS-bit first
wkinkeldei 0:53f05303850a 61 for (int loop = 0; loop < 8; loop++) {
wkinkeldei 0:53f05303850a 62 write_bit(data & 0x01);
wkinkeldei 0:53f05303850a 63
wkinkeldei 0:53f05303850a 64 // shift the data byte for the next bit
wkinkeldei 0:53f05303850a 65 data >>= 1;
wkinkeldei 0:53f05303850a 66 }
wkinkeldei 0:53f05303850a 67 }
wkinkeldei 0:53f05303850a 68
wkinkeldei 0:53f05303850a 69 int OneWire::read_byte() {
wkinkeldei 0:53f05303850a 70 int result = 0;
wkinkeldei 0:53f05303850a 71
wkinkeldei 0:53f05303850a 72 for (int loop = 0; loop < 8; loop++) {
wkinkeldei 0:53f05303850a 73 // shift the result to get it ready for the next bit
wkinkeldei 0:53f05303850a 74 result >>= 1;
wkinkeldei 0:53f05303850a 75
wkinkeldei 0:53f05303850a 76 // if result is one, then set MS bit
wkinkeldei 0:53f05303850a 77 if (read_bit()) result |= 0x80;
wkinkeldei 0:53f05303850a 78 }
wkinkeldei 0:53f05303850a 79
wkinkeldei 0:53f05303850a 80 return result;
wkinkeldei 0:53f05303850a 81 }
wkinkeldei 0:53f05303850a 82
wkinkeldei 0:53f05303850a 83 void OneWire::block(char* data, int data_len) {
wkinkeldei 0:53f05303850a 84 for (int loop = 0; loop < data_len; loop++) {
wkinkeldei 0:53f05303850a 85 data[loop] = read_byte(); // original: touchByte(data[loop]);
wkinkeldei 0:53f05303850a 86 }
wkinkeldei 0:53f05303850a 87 }
wkinkeldei 0:53f05303850a 88
wkinkeldei 0:53f05303850a 89 void OneWire::prepare_read() {
wkinkeldei 0:53f05303850a 90 reset();
wkinkeldei 0:53f05303850a 91 write_byte(SKIP_ROM);
wkinkeldei 0:53f05303850a 92 write_byte(CONVERT);
wkinkeldei 0:53f05303850a 93
wkinkeldei 0:53f05303850a 94 // switch on parasite power while waiting.
wkinkeldei 0:53f05303850a 95 port.output();
wkinkeldei 0:53f05303850a 96 port = 1;
wkinkeldei 0:53f05303850a 97 }
wkinkeldei 0:53f05303850a 98
wkinkeldei 0:53f05303850a 99 int OneWire::read_temperature() {
wkinkeldei 0:53f05303850a 100 char data[9];
wkinkeldei 0:53f05303850a 101 short *raw_temp = (short *) data;
wkinkeldei 0:53f05303850a 102 int temperature = -99;
wkinkeldei 0:53f05303850a 103
wkinkeldei 0:53f05303850a 104 reset();
wkinkeldei 0:53f05303850a 105 write_byte(SKIP_ROM);
wkinkeldei 0:53f05303850a 106 write_byte(READSCRATCH);
wkinkeldei 0:53f05303850a 107 block(data, 9);
wkinkeldei 0:53f05303850a 108
wkinkeldei 0:53f05303850a 109 if (data[5] == 255 && data[7] == 16) {
wkinkeldei 0:53f05303850a 110 temperature = *raw_temp >> 4;
wkinkeldei 0:53f05303850a 111 }
wkinkeldei 0:53f05303850a 112
wkinkeldei 0:53f05303850a 113 return temperature;
wkinkeldei 0:53f05303850a 114 }