Skip to content

Commit 02f8b17

Browse files
committed
Non-working DS18B20 version + hex files
1 parent 0d8e163 commit 02f8b17

9 files changed

+1110
-2
lines changed

DS18B20_light.cpp

+295
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,295 @@
1+
#include "DS18B20_light.h"
2+
#include "setup.h"
3+
4+
5+
#ifdef FUNCTION_TEMPERATURE_DS18B20
6+
7+
DS18B20_light::DS18B20_light(uint8_t pin) :
8+
oneWire(OneWire(pin)),
9+
numberOfDevices(0),
10+
globalResolution(0),
11+
selectedResolution(0),
12+
selectedPowerMode(0)
13+
{
14+
resetSearch();
15+
sendCommand(SKIP_ROM, READ_POWER_SUPPLY);
16+
globalPowerMode = oneWire.read_bit();
17+
18+
while (selectNext()) {
19+
uint8_t resolution = getResolution();
20+
21+
if (resolution > globalResolution) {
22+
globalResolution = resolution;
23+
}
24+
25+
numberOfDevices++;
26+
}
27+
}
28+
29+
uint8_t DS18B20_light::select(uint8_t address[]) {
30+
if (isConnected(address)) {
31+
memcpy(selectedAddress, address, 8);
32+
33+
if (readScratchpad()) {
34+
selectedResolution = getResolution();
35+
36+
sendCommand(MATCH_ROM, READ_POWER_SUPPLY);
37+
selectedPowerMode = oneWire.read_bit();
38+
39+
return 1;
40+
}
41+
}
42+
43+
return 0;
44+
}
45+
46+
uint8_t DS18B20_light::selectNext() {
47+
if (oneWireSearch(SEARCH_ROM)) {
48+
return select(searchAddress);
49+
}
50+
51+
return 0;
52+
}
53+
54+
void DS18B20_light::resetSearch() {
55+
lastDiscrepancy = 0;
56+
lastDevice = 0;
57+
}
58+
59+
int16_t DS18B20_light::getTempC() {
60+
sendCommand(MATCH_ROM, CONVERT_T, !selectedPowerMode);
61+
delayForConversion(selectedResolution, selectedPowerMode);
62+
readScratchpad();
63+
uint8_t lsb = selectedScratchpad[TEMP_LSB];
64+
uint8_t msb = selectedScratchpad[TEMP_MSB];
65+
66+
switch (selectedResolution) {
67+
case 9:
68+
lsb &= 0xF8;
69+
break;
70+
case 10:
71+
lsb &= 0xFC;
72+
break;
73+
case 11:
74+
lsb &= 0xFE;
75+
break;
76+
}
77+
78+
uint8_t sign = msb & 0x80;
79+
int16_t temp = (msb << 8) + lsb;
80+
81+
if (sign) {
82+
temp = ((temp ^ 0xffff) + 1) * -1;
83+
}
84+
85+
return temp/16;
86+
}
87+
88+
uint8_t DS18B20_light::getResolution() {
89+
switch (selectedScratchpad[CONFIGURATION]) {
90+
case RES_9_BIT:
91+
return 9;
92+
case RES_10_BIT:
93+
return 10;
94+
case RES_11_BIT:
95+
return 11;
96+
case RES_12_BIT:
97+
return 12;
98+
}
99+
}
100+
101+
void DS18B20_light::setResolution(uint8_t resolution) {
102+
resolution = constrain(resolution, 9, 12);
103+
104+
switch (resolution) {
105+
case 9:
106+
selectedScratchpad[CONFIGURATION] = RES_9_BIT;
107+
break;
108+
case 10:
109+
selectedScratchpad[CONFIGURATION] = RES_10_BIT;
110+
break;
111+
case 11:
112+
selectedScratchpad[CONFIGURATION] = RES_11_BIT;
113+
break;
114+
case 12:
115+
selectedScratchpad[CONFIGURATION] = RES_12_BIT;
116+
break;
117+
}
118+
119+
if (resolution > globalResolution) {
120+
globalResolution = resolution;
121+
}
122+
123+
writeScratchpad();
124+
}
125+
126+
void DS18B20_light::getAddress(uint8_t address[]) {
127+
memcpy(address, selectedAddress, 8);
128+
}
129+
130+
void DS18B20_light::doConversion() {
131+
sendCommand(SKIP_ROM, CONVERT_T, !globalPowerMode);
132+
delayForConversion(globalResolution, globalPowerMode);
133+
}
134+
135+
uint8_t DS18B20_light::readScratchpad() {
136+
sendCommand(MATCH_ROM, READ_SCRATCHPAD);
137+
138+
for (uint8_t i = 0; i < SIZE_SCRATCHPAD; i++) {
139+
selectedScratchpad[i] = oneWire.read();
140+
}
141+
142+
return OneWire::crc8(selectedScratchpad, 8) == selectedScratchpad[CRC8];
143+
}
144+
145+
void DS18B20_light::writeScratchpad() {
146+
sendCommand(MATCH_ROM, WRITE_SCRATCHPAD);
147+
oneWire.write(selectedScratchpad[ALARM_HIGH]);
148+
oneWire.write(selectedScratchpad[ALARM_LOW]);
149+
oneWire.write(selectedScratchpad[CONFIGURATION]);
150+
sendCommand(MATCH_ROM, COPY_SCRATCHPAD, !selectedPowerMode);
151+
152+
if (!selectedPowerMode) {
153+
delay(10);
154+
}
155+
}
156+
157+
uint8_t DS18B20_light::thm(uint8_t romCommand) {
158+
if (!oneWire.reset()) {
159+
return 0;
160+
}
161+
162+
switch (romCommand) {
163+
case SEARCH_ROM:
164+
case SKIP_ROM:
165+
case ALARM_SEARCH:
166+
oneWire.write(romCommand);
167+
break;
168+
case MATCH_ROM:
169+
oneWire.select(selectedAddress);
170+
break;
171+
default:
172+
return 0;
173+
}
174+
175+
return 1;
176+
}
177+
178+
uint8_t DS18B20_light::sendCommand(uint8_t romCommand, uint8_t functionCommand, uint8_t power) {
179+
if (!sendCommand(romCommand)) {
180+
return 0;
181+
}
182+
183+
switch (functionCommand) {
184+
case CONVERT_T:
185+
case COPY_SCRATCHPAD:
186+
oneWire.write(functionCommand, power);
187+
break;
188+
case WRITE_SCRATCHPAD:
189+
case READ_SCRATCHPAD:
190+
case READ_POWER_SUPPLY:
191+
oneWire.write(functionCommand);
192+
break;
193+
default:
194+
return 0;
195+
}
196+
197+
return 1;
198+
}
199+
200+
uint8_t DS18B20_light::oneWireSearch(uint8_t romCommand) {
201+
if (lastDevice || !sendCommand(romCommand)) {
202+
resetSearch();
203+
return 0;
204+
}
205+
206+
uint8_t lastZero = 0;
207+
uint8_t direction, byteNumber, bitNumber, currentBit, currentBitComp;
208+
209+
for (uint8_t bitPosition = 0; bitPosition < 64; bitPosition++) {
210+
currentBit = oneWire.read_bit();
211+
currentBitComp = oneWire.read_bit();
212+
213+
if (currentBit && currentBitComp) {
214+
lastDiscrepancy = 0;
215+
return 0;
216+
}
217+
218+
byteNumber = bitPosition / 8;
219+
bitNumber = bitPosition % 8;
220+
221+
if (!currentBit && !currentBitComp) {
222+
if (bitPosition == lastDiscrepancy) {
223+
direction = 1;
224+
} else if (bitPosition > lastDiscrepancy) {
225+
direction = 0;
226+
lastZero = bitPosition;
227+
} else {
228+
direction = bitRead(searchAddress[byteNumber], bitNumber);
229+
230+
if (!direction) {
231+
lastZero = bitPosition;
232+
}
233+
}
234+
} else {
235+
direction = currentBit;
236+
}
237+
238+
bitWrite(searchAddress[byteNumber], bitNumber, direction);
239+
oneWire.write_bit(direction);
240+
}
241+
242+
lastDiscrepancy = lastZero;
243+
244+
if (!lastDiscrepancy) {
245+
lastDevice = 1;
246+
}
247+
248+
return 1;
249+
}
250+
251+
uint8_t DS18B20_light::isConnected(uint8_t address[]) {
252+
if (!sendCommand(SEARCH_ROM)) {
253+
return 0;
254+
}
255+
256+
uint8_t currentBit, currentBitComp, byteNumber, bitNumber;
257+
258+
for (uint8_t bitPosition = 0; bitPosition < 64; bitPosition++) {
259+
currentBit = oneWire.read_bit();
260+
currentBitComp = oneWire.read_bit();
261+
262+
if (currentBit && currentBitComp) {
263+
return 0;
264+
}
265+
266+
byteNumber = bitPosition / 8;
267+
bitNumber = bitPosition % 8;
268+
oneWire.write_bit(bitRead(address[byteNumber], bitNumber));
269+
}
270+
271+
return 1;
272+
}
273+
274+
void DS18B20_light::delayForConversion(uint8_t resolution, uint8_t powerMode) {
275+
if (powerMode) {
276+
while (!oneWire.read_bit());
277+
} else {
278+
switch (resolution) {
279+
case 9:
280+
delay(CONV_TIME_9_BIT);
281+
break;
282+
case 10:
283+
delay(CONV_TIME_10_BIT);
284+
break;
285+
case 11:
286+
delay(CONV_TIME_11_BIT);
287+
break;
288+
case 12:
289+
delay(CONV_TIME_12_BIT);
290+
break;
291+
}
292+
}
293+
}
294+
295+
#endif

DS18B20_light.h

+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
#ifndef DS18B20_LIGHT_H
2+
#define DS18B20_LIGHT_H
3+
4+
#include "Arduino.h"
5+
#include <OneWire.h>
6+
7+
#define SEARCH_ROM 0xF0
8+
#define READ_ROM 0x33
9+
#define MATCH_ROM 0x55
10+
#define SKIP_ROM 0xCC
11+
#define ALARM_SEARCH 0xEC
12+
#define CONVERT_T 0x44
13+
#define WRITE_SCRATCHPAD 0x4E
14+
#define READ_SCRATCHPAD 0xBE
15+
#define COPY_SCRATCHPAD 0x48
16+
#define RECALL 0xB8
17+
#define READ_POWER_SUPPLY 0xB4
18+
#define MODEL_DS1820 0x10
19+
#define MODEL_DS18S20 0x10
20+
#define MODEL_DS1822 0x22
21+
#define MODEL_DS18B20_light 0x28
22+
#define SIZE_SCRATCHPAD 9
23+
#define TEMP_LSB 0
24+
#define TEMP_MSB 1
25+
#define ALARM_HIGH 2
26+
#define ALARM_LOW 3
27+
#define CONFIGURATION 4
28+
#define CRC8 8
29+
#define RES_9_BIT 0x1F
30+
#define RES_10_BIT 0x3F
31+
#define RES_11_BIT 0x5F
32+
#define RES_12_BIT 0x7F
33+
#define CONV_TIME_9_BIT 94
34+
#define CONV_TIME_10_BIT 188
35+
#define CONV_TIME_11_BIT 375
36+
#define CONV_TIME_12_BIT 750
37+
38+
class DS18B20_light {
39+
public:
40+
DS18B20_light(uint8_t pin);
41+
uint8_t select(uint8_t address[]);
42+
uint8_t selectNext();
43+
void resetSearch();
44+
int16_t getTempC();
45+
uint8_t getResolution();
46+
void setResolution(uint8_t resolution);
47+
void getAddress(uint8_t address[]);
48+
void doConversion();
49+
private:
50+
OneWire oneWire;
51+
uint8_t globalResolution;
52+
uint8_t globalPowerMode;
53+
uint8_t numberOfDevices;
54+
uint8_t selectedAddress[8];
55+
uint8_t selectedScratchpad[SIZE_SCRATCHPAD];
56+
uint8_t selectedResolution;
57+
uint8_t selectedPowerMode;
58+
uint8_t searchAddress[8];
59+
uint8_t lastDiscrepancy;
60+
uint8_t lastDevice;
61+
uint8_t readScratchpad();
62+
void writeScratchpad();
63+
uint8_t sendCommand(uint8_t romCommand);
64+
uint8_t sendCommand(uint8_t romCommand, uint8_t functionCommand, uint8_t power = 0);
65+
uint8_t oneWireSearch(uint8_t romCommand);
66+
uint8_t isConnected(uint8_t address[]);
67+
void delayForConversion(uint8_t resolution, uint8_t powerMode);
68+
};
69+
70+
#endif

LevelAVR.ino

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "setup.h"
22
#include "function_voltage.h"
33
#include "function_temperature.h"
4+
#include "function_tds18b20.h"
45
#include "function_pressure.h"
56

67
uint8_t timeCount = 0;
@@ -47,7 +48,6 @@ void setup() {
4748
for (int i=0;i!=LEDs_count;i++)
4849
{
4950
pinMode(LEDs[i],OUTPUT);
50-
5151
}
5252
#endif
5353

@@ -106,7 +106,7 @@ void loop()
106106

107107

108108
//Temperature sensor
109-
#ifdef FUNCTION_TEMPERATURE
109+
#if defined (FUNCTION_TEMPERATURE) || defined(FUNCTION_TEMPERATURE_DS18B20)
110110
processOilTemperature();
111111
leds_lit = countLedsLitTemperature();
112112
#endif

0 commit comments

Comments
 (0)