-
Notifications
You must be signed in to change notification settings - Fork 0
/
DallasOneWireUtils.ino
173 lines (145 loc) · 5.58 KB
/
DallasOneWireUtils.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#define TEMPERATURE_PRECISION 9
#define CELCIUS true
#define FAHRENHEIT false
void setupOneWire() {
// Start up the library
oneWireSensors.begin();
// locate devices on the bus
Serial.println("Locating Dallas One-Wire devices");
numOneWireDevicesFound = oneWireSensors.getDeviceCount();
Serial.print("Found ");
Serial.print(numOneWireDevicesFound);
Serial.println(" devices.");
if (numOneWireDevicesFound < 1) { return; };
// report parasite power requirements
Serial.print("Parasite power is: ");
if (oneWireSensors.isParasitePowerMode()) {
Serial.println("ON");
} else {
Serial.println("OFF");
}
// assign address manually. the addresses below will beed to be changed
// to valid device addresses on your bus. device address can be retrieved
// by using either oneWire.search(deviceAddress) or individually via
// sensors.getAddress(deviceAddress, index)
//oneWireAddr[0] = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 };
//oneWireAddr[1] = { 0x28, 0x3F, 0x1C, 0x31, 0x2, 0x0, 0x0, 0x2 };
// blue data wire
//oneWireAddr[0] = { 0x28, 0xBA, 0xE3, 0x71, 0x04, 0x00, 0x00, 0xFB };
// yellow data wire
//oneWireAddr[0] = { 0x28, 0xA4, 0x6E, 0x5C, 0x04, 0x00, 0x00, 0x79 };
// method 2: search()
// search() looks for the next device. Returns 1 if a new address has been
// returned. A zero might mean that the bus is shorted, there are no devices,
// or you have already retrieved all of them. It might be a good idea to
// check the CRC to make sure you didn't get garbage. The order is
// deterministic. You will always get the same devices in the same order
//
// Must be called before search()
//oneWire.reset_search();
// assigns the first address found to insideThermometer
//if (!oneWire.search(insideThermometer)) Serial.println("Unable to find address for insideThermometer");
// assigns the seconds address found to outsideThermometer
//if (!oneWire.search(outsideThermometer)) Serial.println("Unable to find address for outsideThermometer");
Serial.println("finding all devices");
findAllDeviceAddresses(oneWireAddr);
Serial.println("setting all temperature resolutions");
//setAllTempResolutions(oneWireAddr, TEMPERATURE_PRECISION);
Serial.println("finding all temperatures");
findAllDeviceTemps(oneWireAddr, oneWireTemp);
Serial.println("dumping all device info");
String foo = dumpAllDeviceInfo(oneWireAddr);
Serial.println(foo);
//Serial.println("printing all device info");
//printOneWireData(oneWireAddr[0]);
//printOneWireData(oneWireAddr[1]);
}
void findAllDeviceAddresses(DeviceAddress oneWireAddr[]) {
for (int x=0; x<ONE_WIRE_MAX_NUM_DEVICES; x++) {
if (!oneWireSensors.getAddress(oneWireAddr[x], x)) {
//Serial.print("Unable to find address for Device ");
//Serial.print(x);
}
}
}
void setAllTempResolutions(DeviceAddress oneWireAddr[], int resolution) {
for (int x=0; x<ONE_WIRE_MAX_NUM_DEVICES; x++) {
oneWireSensors.setResolution(oneWireAddr[x], resolution);
}
}
int getTempResolution(DeviceAddress deviceAddress) {
return oneWireSensors.getResolution(deviceAddress);
}
void findAllDeviceTemps(DeviceAddress oneWireAddr[], float oneWireTemp[]) {
for (int x=0; x<ONE_WIRE_MAX_NUM_DEVICES; x++) {
oneWireTemp[x] = getOneWireTemperature(oneWireAddr[x], FAHRENHEIT);
Serial.print("got temp: ");
Serial.println(oneWireTemp[x]);
}
}
String dumpAllDeviceInfo(DeviceAddress oneWireAddr[]) {
String deviceInfo = "";
for (int x=0; x<ONE_WIRE_MAX_NUM_DEVICES; x++) {
deviceInfo += dumpDeviceInfo(oneWireAddr[x]) + "\n";
}
return deviceInfo;
}
String dumpDeviceInfo(DeviceAddress deviceAddr) {
String deviceInfo = "Addr: " + getOneWireAddress(deviceAddr) +
", Resolution: " + (String) getTempResolution(deviceAddr) +
", Temp(C): " + getTemperatureStr(deviceAddr);
return deviceInfo;
}
String getTemperatureStr(DeviceAddress deviceAddr) {
float tempValue = getOneWireTemperature(deviceAddr, FAHRENHEIT);
char tempStr[16];
dtostrf(tempValue, 1, 1, tempStr);
Serial.print("*** got temp ");
Serial.println(tempStr);
return (String) tempStr;
}
String oneWireFloatToString(float temp) {
char tempStr[16];
dtostrf(temp, 1, 1, tempStr);
return tempStr;
}
// function to print a device address
String getOneWireAddress(DeviceAddress deviceAddress) {
String deviceAddr = "";
for (uint8_t i = 0; i < 8; i++) {
if (deviceAddress[i] < 16) { deviceAddr += "0"; }
deviceAddr += String(deviceAddress[i], HEX);
}
return deviceAddr;
}
float getOneWireTemperature(DeviceAddress deviceAddress, boolean getCelcius) {
float temp;
if (getCelcius) {
temp = oneWireSensors.getTempC(deviceAddress);
} else {
temp = oneWireSensors.getTempF(deviceAddress);
}
return temp;
}
// function to print a device address
String printOneWireAddress(DeviceAddress deviceAddress) {
String deviceAddr = "";
for (uint8_t i = 0; i < 8; i++) {
// zero pad the address if necessary
if (deviceAddress[i] < 16) { Serial.print("0"); }
Serial.print(deviceAddress[i], HEX);
}
}
// main function to print information about a device
void printOneWireData(DeviceAddress deviceAddress) {
Serial.print("Device Address: ");
printOneWireAddress(deviceAddress);
Serial.print(", Resoultion: ");
Serial.print(oneWireSensors.getResolution(deviceAddress));
Serial.print(", Temp: ");
Serial.print(getOneWireTemperature(deviceAddress, FAHRENHEIT));
Serial.print(" (");
Serial.print(getOneWireTemperature(deviceAddress, CELCIUS));
Serial.print(")");
Serial.println();
}