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
one_wire.cpp@1:9e88b2508768, 2013-01-03 (annotated)
- 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?
User | Revision | Line number | New 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 | } |