-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathds18b20.c
127 lines (105 loc) · 3.05 KB
/
ds18b20.c
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
#include "ds18b20.h"
u8 precission = 3;
one_wire_device *one_wire_list_of_devices;
u8 one_wire_devices_list_size = 2;
void ds18b20_init(GPIO_TypeDef *gpio, u16 port, TIM_TypeDef *timer) {
one_wire_init(gpio, port, timer);
one_wire_list_of_devices = one_wire_search_rom(&one_wire_devices_list_size);
}
u8 ds18b20_get_precission(void) {
return precission;
}
ds18b20_devices ds18b20_get_devices(bool scan) {
if (scan) {
one_wire_devices_list_size = 0;
one_wire_list_of_devices = one_wire_search_rom(&one_wire_devices_list_size);
}
ds18b20_devices ret;
ret.size = one_wire_devices_list_size;
ret.devices = one_wire_list_of_devices;
return ret;
}
void ds18b20_set_precission(u8 p) {
precission = p;
one_wire_reset_pulse();
one_wire_write_byte(0xCC); // Skip ROM
one_wire_write_byte(0x4E); // Write scratchpad
one_wire_write_byte(0x4B);
one_wire_write_byte(0x46);
// set precission
one_wire_write_byte(0x1F | (precission << 5));
}
void ds18b20_convert_temperature_simple(void) {
one_wire_reset_pulse();
one_wire_write_byte(0xCC); // Skip ROM
one_wire_write_byte(0x44); // Convert temperature
}
void ds18b20_convert_temperature(one_wire_device device) {
one_wire_reset_pulse();
one_wire_match_rom(device); // Match ROM
one_wire_write_byte(0x44); // Convert temperature
}
void ds18b20_convert_temperature_all(void) {
u8 i = 0;
for (i = 0; i < one_wire_devices_list_size; ++i) {
ds18b20_convert_temperature(one_wire_list_of_devices[i]);
}
}
simple_float ds18b20_read_temperature_simple(void) {
one_wire_reset_pulse();
one_wire_write_byte(0xCC); // Skip ROM
one_wire_write_byte(0xBE); // Read scratchpad
return ds18b20_decode_temperature();
}
simple_float ds18b20_read_temperature(one_wire_device device) {
one_wire_reset_pulse();
one_wire_match_rom(device); // Match ROM
one_wire_write_byte(0xBE); // Read scratchpad
return ds18b20_decode_temperature();
}
simple_float* ds18b20_read_temperature_all(void) {
u8 i = 0;
simple_float *temperatures;
temperatures = malloc(one_wire_devices_list_size * sizeof(simple_float));
for (i = 0; i < one_wire_devices_list_size; ++i) {
temperatures[i] = ds18b20_read_temperature(one_wire_list_of_devices[i]);
}
return temperatures;
}
simple_float ds18b20_decode_temperature(void) {
int i;
u8 crc;
u8 data[9];
simple_float f;
f.is_valid = false;
one_wire_reset_crc();
for (i = 0; i < 9; ++i) {
data[i] = one_wire_read_byte();
crc = one_wire_crc(data[i]);
}
if (crc != 0) {
return f;
}
u8 temp_msb = data[1]; // Sign byte + lsbit
u8 temp_lsb = data[0]; // Temp data plus lsb
float temp = (temp_msb << 8 | temp_lsb) / powf(2, 4);
int rest = (temp - (int)temp) * 1000.0;
f.integer = (u8)temp;
f.fractional = rest;
f.is_valid = true;
char buffer[10];
sprintf(buffer, "%d.%d\r", (int)temp, rest);
usart2_print(buffer);
return f;
}
void ds18b20_wait_for_conversion(void) {
if (precission == 0) {
delay(95);
} else if (precission == 1) {
delay(190);
} else if (precission == 2) {
delay(380);
} else if (precission == 3) {
delay(750);
}
}