Andrew Boyson
/
iot
Backing up an unused program in case of future need
ds18b20.cpp@7:024ace6d943c, 2016-06-02 (annotated)
- Committer:
- andrewboyson
- Date:
- Thu Jun 02 09:26:28 2016 +0000
- Revision:
- 7:024ace6d943c
- Parent:
- 6:be97d38e0b01
Added a routine to break time_t into a struct tm without using gmtime as that did not seem to work.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
andrewboyson | 6:be97d38e0b01 | 1 | #include "mbed.h" |
andrewboyson | 6:be97d38e0b01 | 2 | #include "1-wire.h" |
andrewboyson | 6:be97d38e0b01 | 3 | #include "log.h" |
andrewboyson | 6:be97d38e0b01 | 4 | #include "io.h" |
andrewboyson | 6:be97d38e0b01 | 5 | #include "wifi.h" |
andrewboyson | 6:be97d38e0b01 | 6 | #include "ds18b20.h" |
andrewboyson | 6:be97d38e0b01 | 7 | |
andrewboyson | 7:024ace6d943c | 8 | #define DEBUG false //Set this to true to add debug messages to the log |
andrewboyson | 7:024ace6d943c | 9 | |
andrewboyson | 6:be97d38e0b01 | 10 | #define DEVICE_MAX 4 |
andrewboyson | 4:e076884ef8bd | 11 | |
andrewboyson | 6:be97d38e0b01 | 12 | #define SEND_BUFFER_LENGTH 10 |
andrewboyson | 4:e076884ef8bd | 13 | #define RECV_BUFFER_LENGTH 10 |
andrewboyson | 4:e076884ef8bd | 14 | static char send[SEND_BUFFER_LENGTH]; |
andrewboyson | 4:e076884ef8bd | 15 | static char recv[RECV_BUFFER_LENGTH]; |
andrewboyson | 4:e076884ef8bd | 16 | static int sendlen = 0; |
andrewboyson | 4:e076884ef8bd | 17 | static int recvlen = 0; |
andrewboyson | 4:e076884ef8bd | 18 | |
andrewboyson | 6:be97d38e0b01 | 19 | int DS18B20DeviceCount = 0; |
andrewboyson | 6:be97d38e0b01 | 20 | char DS18B20DeviceList[DEVICE_MAX * 8]; |
andrewboyson | 6:be97d38e0b01 | 21 | int16_t DS18B20Value[DEVICE_MAX]; |
andrewboyson | 5:6226f3c566ef | 22 | |
andrewboyson | 6:be97d38e0b01 | 23 | int16_t DS18B20ValueFromRom(char* rom) |
andrewboyson | 6:be97d38e0b01 | 24 | { |
andrewboyson | 6:be97d38e0b01 | 25 | for (int device = 0; device < DS18B20DeviceCount; device++) if (memcmp(DS18B20DeviceList + 8 * device, rom, 8) == 0) return DS18B20Value[device]; |
andrewboyson | 6:be97d38e0b01 | 26 | return DS18B20_ERROR_NOT_FOUND; |
andrewboyson | 6:be97d38e0b01 | 27 | } |
andrewboyson | 6:be97d38e0b01 | 28 | char rom[8]; |
andrewboyson | 6:be97d38e0b01 | 29 | int allRomsFound = false; |
andrewboyson | 6:be97d38e0b01 | 30 | static void searchRom(int first) |
andrewboyson | 4:e076884ef8bd | 31 | { |
andrewboyson | 4:e076884ef8bd | 32 | sendlen = 1; |
andrewboyson | 6:be97d38e0b01 | 33 | send[0] = 0xF0; //Search Rom |
andrewboyson | 6:be97d38e0b01 | 34 | recvlen = 0; |
andrewboyson | 6:be97d38e0b01 | 35 | for (int i = 0; i < recvlen; i++) recv[i] = 0; |
andrewboyson | 6:be97d38e0b01 | 36 | if (first) OneWireSearch(send[0], rom, &allRomsFound); |
andrewboyson | 6:be97d38e0b01 | 37 | else OneWireSearch(send[0], NULL, NULL); |
andrewboyson | 4:e076884ef8bd | 38 | } |
andrewboyson | 6:be97d38e0b01 | 39 | static void readScratchpad(int device) |
andrewboyson | 5:6226f3c566ef | 40 | { |
andrewboyson | 6:be97d38e0b01 | 41 | sendlen = 10; |
andrewboyson | 6:be97d38e0b01 | 42 | send[0] = 0x55; //Match Rom |
andrewboyson | 6:be97d38e0b01 | 43 | for (int i = 0; i < 8; i++) send[i+1] = DS18B20DeviceList[device * 8 + i]; |
andrewboyson | 6:be97d38e0b01 | 44 | send[9] = 0xBE; //Read Scratchpad |
andrewboyson | 4:e076884ef8bd | 45 | recvlen = 9; |
andrewboyson | 5:6226f3c566ef | 46 | for (int i = 0; i < recvlen; i++) recv[i] = 0; |
andrewboyson | 4:e076884ef8bd | 47 | OneWireExchange(sendlen, recvlen, send, recv, 0); |
andrewboyson | 4:e076884ef8bd | 48 | } |
andrewboyson | 6:be97d38e0b01 | 49 | static void convertT() |
andrewboyson | 4:e076884ef8bd | 50 | { |
andrewboyson | 4:e076884ef8bd | 51 | sendlen = 2; |
andrewboyson | 6:be97d38e0b01 | 52 | send[0] = 0xCC; //Skip Rom |
andrewboyson | 6:be97d38e0b01 | 53 | send[1] = 0x44; //Convert T |
andrewboyson | 4:e076884ef8bd | 54 | recvlen = 0; |
andrewboyson | 5:6226f3c566ef | 55 | for (int i = 0; i < recvlen; i++) recv[i] = 0; |
andrewboyson | 4:e076884ef8bd | 56 | OneWireExchange(sendlen, recvlen, send, recv, 750); |
andrewboyson | 4:e076884ef8bd | 57 | } |
andrewboyson | 5:6226f3c566ef | 58 | #define IDLE 0 |
andrewboyson | 6:be97d38e0b01 | 59 | #define LIST_FIRST_DEVICE 1 |
andrewboyson | 6:be97d38e0b01 | 60 | #define LIST_NEXT_DEVICE 2 |
andrewboyson | 6:be97d38e0b01 | 61 | #define CONVERT_T 3 |
andrewboyson | 6:be97d38e0b01 | 62 | #define READ_SCRATCH_PAD 4 |
andrewboyson | 6:be97d38e0b01 | 63 | #define EXTRACT_TEMPERATURE 5 |
andrewboyson | 6:be97d38e0b01 | 64 | static volatile int state = IDLE; |
andrewboyson | 6:be97d38e0b01 | 65 | int DS18B20Busy() { return state; } |
andrewboyson | 5:6226f3c566ef | 66 | static int handlestate() |
andrewboyson | 4:e076884ef8bd | 67 | { |
andrewboyson | 5:6226f3c566ef | 68 | if (OneWireBusy()) return 0; |
andrewboyson | 6:be97d38e0b01 | 69 | static int device; |
andrewboyson | 5:6226f3c566ef | 70 | switch (state) |
andrewboyson | 5:6226f3c566ef | 71 | { |
andrewboyson | 5:6226f3c566ef | 72 | case IDLE: |
andrewboyson | 7:024ace6d943c | 73 | state = LIST_FIRST_DEVICE; |
andrewboyson | 5:6226f3c566ef | 74 | break; |
andrewboyson | 6:be97d38e0b01 | 75 | case LIST_FIRST_DEVICE: |
andrewboyson | 6:be97d38e0b01 | 76 | device = 0; |
andrewboyson | 6:be97d38e0b01 | 77 | searchRom(true); |
andrewboyson | 6:be97d38e0b01 | 78 | state = LIST_NEXT_DEVICE; |
andrewboyson | 5:6226f3c566ef | 79 | break; |
andrewboyson | 6:be97d38e0b01 | 80 | case LIST_NEXT_DEVICE: |
andrewboyson | 6:be97d38e0b01 | 81 | if (OneWireResult()) |
andrewboyson | 6:be97d38e0b01 | 82 | { |
andrewboyson | 6:be97d38e0b01 | 83 | state = IDLE; |
andrewboyson | 6:be97d38e0b01 | 84 | } |
andrewboyson | 6:be97d38e0b01 | 85 | else |
andrewboyson | 5:6226f3c566ef | 86 | { |
andrewboyson | 6:be97d38e0b01 | 87 | for (int i = 0; i < 8; i++) DS18B20DeviceList[8 * device + i] = rom[i]; |
andrewboyson | 6:be97d38e0b01 | 88 | device++; |
andrewboyson | 6:be97d38e0b01 | 89 | if (allRomsFound || device >= DEVICE_MAX) |
andrewboyson | 6:be97d38e0b01 | 90 | { |
andrewboyson | 6:be97d38e0b01 | 91 | DS18B20DeviceCount = device; |
andrewboyson | 6:be97d38e0b01 | 92 | state = CONVERT_T; |
andrewboyson | 6:be97d38e0b01 | 93 | } |
andrewboyson | 6:be97d38e0b01 | 94 | else |
andrewboyson | 6:be97d38e0b01 | 95 | { |
andrewboyson | 6:be97d38e0b01 | 96 | searchRom(false); |
andrewboyson | 6:be97d38e0b01 | 97 | } |
andrewboyson | 6:be97d38e0b01 | 98 | } |
andrewboyson | 6:be97d38e0b01 | 99 | break; |
andrewboyson | 6:be97d38e0b01 | 100 | case CONVERT_T: |
andrewboyson | 6:be97d38e0b01 | 101 | if (OneWireResult()) |
andrewboyson | 6:be97d38e0b01 | 102 | { |
andrewboyson | 6:be97d38e0b01 | 103 | state = IDLE; |
andrewboyson | 5:6226f3c566ef | 104 | } |
andrewboyson | 5:6226f3c566ef | 105 | else |
andrewboyson | 5:6226f3c566ef | 106 | { |
andrewboyson | 6:be97d38e0b01 | 107 | convertT(); |
andrewboyson | 6:be97d38e0b01 | 108 | device = 0; |
andrewboyson | 6:be97d38e0b01 | 109 | state = READ_SCRATCH_PAD; |
andrewboyson | 6:be97d38e0b01 | 110 | } |
andrewboyson | 6:be97d38e0b01 | 111 | break; |
andrewboyson | 6:be97d38e0b01 | 112 | case READ_SCRATCH_PAD: |
andrewboyson | 6:be97d38e0b01 | 113 | if (OneWireResult()) |
andrewboyson | 6:be97d38e0b01 | 114 | { |
andrewboyson | 6:be97d38e0b01 | 115 | state = IDLE; |
andrewboyson | 6:be97d38e0b01 | 116 | } |
andrewboyson | 6:be97d38e0b01 | 117 | else |
andrewboyson | 6:be97d38e0b01 | 118 | { |
andrewboyson | 6:be97d38e0b01 | 119 | readScratchpad(device); |
andrewboyson | 6:be97d38e0b01 | 120 | state = EXTRACT_TEMPERATURE; |
andrewboyson | 5:6226f3c566ef | 121 | } |
andrewboyson | 6:be97d38e0b01 | 122 | break; |
andrewboyson | 6:be97d38e0b01 | 123 | case EXTRACT_TEMPERATURE: |
andrewboyson | 6:be97d38e0b01 | 124 | switch (OneWireResult()) |
andrewboyson | 6:be97d38e0b01 | 125 | { |
andrewboyson | 6:be97d38e0b01 | 126 | case ONE_WIRE_RESULT_OK: |
andrewboyson | 6:be97d38e0b01 | 127 | DS18B20Value[device] = recv[1]; |
andrewboyson | 6:be97d38e0b01 | 128 | DS18B20Value[device] <<= 8; |
andrewboyson | 6:be97d38e0b01 | 129 | DS18B20Value[device] |= recv[0]; |
andrewboyson | 6:be97d38e0b01 | 130 | break; |
andrewboyson | 6:be97d38e0b01 | 131 | case ONE_WIRE_RESULT_CRC_ERROR: DS18B20Value[device] = DS18B20_ERROR_CRC; break; |
andrewboyson | 6:be97d38e0b01 | 132 | case ONE_WIRE_RESULT_NO_DEVICE_PRESENT: DS18B20Value[device] = DS18B20_ERROR_NO_DEVICE_PRESENT; break; |
andrewboyson | 6:be97d38e0b01 | 133 | case ONE_WIRE_RESULT_TIMED_OUT: DS18B20Value[device] = DS18B20_ERROR_TIMED_OUT; break; |
andrewboyson | 6:be97d38e0b01 | 134 | case ONE_WIRE_RESULT_NO_DEVICE_PARTICIPATING: DS18B20Value[device] = DS18B20_ERROR_NO_DEVICE_PARTICIPATING; break; |
andrewboyson | 6:be97d38e0b01 | 135 | default: |
andrewboyson | 6:be97d38e0b01 | 136 | LogF("Unknown OneWireResult %d\r\n", OneWireResult()); |
andrewboyson | 6:be97d38e0b01 | 137 | break; |
andrewboyson | 6:be97d38e0b01 | 138 | } |
andrewboyson | 6:be97d38e0b01 | 139 | device++; |
andrewboyson | 6:be97d38e0b01 | 140 | if (device < DS18B20DeviceCount) state = READ_SCRATCH_PAD; |
andrewboyson | 6:be97d38e0b01 | 141 | else state = IDLE; |
andrewboyson | 5:6226f3c566ef | 142 | break; |
andrewboyson | 5:6226f3c566ef | 143 | default: |
andrewboyson | 5:6226f3c566ef | 144 | LogF("Unknown DS18B20 state %d\r\n", state); |
andrewboyson | 5:6226f3c566ef | 145 | return -1; |
andrewboyson | 5:6226f3c566ef | 146 | } |
andrewboyson | 4:e076884ef8bd | 147 | return 0; |
andrewboyson | 4:e076884ef8bd | 148 | } |
andrewboyson | 5:6226f3c566ef | 149 | static void logcomms() |
andrewboyson | 4:e076884ef8bd | 150 | { |
andrewboyson | 4:e076884ef8bd | 151 | static int wasbusy = false; |
andrewboyson | 4:e076884ef8bd | 152 | if (!OneWireBusy() && wasbusy) |
andrewboyson | 4:e076884ef8bd | 153 | { |
andrewboyson | 4:e076884ef8bd | 154 | LogF("1-wire | send:"); |
andrewboyson | 4:e076884ef8bd | 155 | for (int i = 0; i < sendlen; i++) LogF(" %02x", send[i]); |
andrewboyson | 4:e076884ef8bd | 156 | LogF(" | recv:"); |
andrewboyson | 4:e076884ef8bd | 157 | for (int i = 0; i < recvlen; i++) LogF(" %02x", recv[i]); |
andrewboyson | 4:e076884ef8bd | 158 | LogF("\r\n"); |
andrewboyson | 4:e076884ef8bd | 159 | } |
andrewboyson | 4:e076884ef8bd | 160 | wasbusy = OneWireBusy(); |
andrewboyson | 5:6226f3c566ef | 161 | } |
andrewboyson | 5:6226f3c566ef | 162 | int DS18B20Init() |
andrewboyson | 5:6226f3c566ef | 163 | { |
andrewboyson | 5:6226f3c566ef | 164 | return 0; |
andrewboyson | 5:6226f3c566ef | 165 | } |
andrewboyson | 5:6226f3c566ef | 166 | int DS18B20Main() |
andrewboyson | 5:6226f3c566ef | 167 | { |
andrewboyson | 5:6226f3c566ef | 168 | |
andrewboyson | 7:024ace6d943c | 169 | if (DEBUG) logcomms(); |
andrewboyson | 5:6226f3c566ef | 170 | |
andrewboyson | 7:024ace6d943c | 171 | int r = handlestate(); if (r) return -1; |
andrewboyson | 5:6226f3c566ef | 172 | |
andrewboyson | 4:e076884ef8bd | 173 | return 0; |
andrewboyson | 4:e076884ef8bd | 174 | } |