-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathTemperature.cpp
More file actions
105 lines (79 loc) · 2.77 KB
/
Temperature.cpp
File metadata and controls
105 lines (79 loc) · 2.77 KB
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
// Copyright © 2018 Stanislav Hnatiuk. All rights reserved.
#include "Temperature.h"
Temperature::Temperature(const uint8_t seriesByte) : BaseSensor(), ds(9), series(seriesByte) {}
//! Преобразовать 8-битный адрес в 16-битную строку с HEX представлением.
void Temperature::addr2str(char* str, const uint8_t* addr) {
const char d[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
for (uint8_t i = 0; i < 8; ++i) {
str[i * 2] = d[addr[i] / 16];
str[i * 2 + 1] = d[addr[i] % 16];
}
}
//! Поиск датчиков в сети 1-wire, соответствующих указанной серии.
void Temperature::find() {
uint8_t temp[8];
// Подсчитать колличество датчиков соответствующей серии.
while (ds.search(temp) && (count < sensorsMaxNum)) {
if (temp[0] == series) {
++count;
}
}
ds.reset_search();
data = new float[count];
addr = new char* [count];
for (uint8_t i = 0; i < count; ++i) {
addr[i] = new char[8];
}
// Сохранение адресов датчиков соответствующей серии.
uint8_t i = 0;
while (ds.search(addr[i]) && i < count) {
if (addr[i][0] == series) {
++i;
#if SERIAL_ENABLED
char* str = new char[17];
addr2str(str, addr[i]);
str[16] = '\0';
Serial.println(str);
delete[] str;
#endif
}
}
}
//! Вернуть адресс указанного датчика.
char* Temperature::getAddr(const uint8_t sensor) const {
static char* buf = new char[17];
addr2str(buf, this->addr[sensor]);
buf[16] = '\0';
return buf;
}
//! Запустить конвертацию температуры в датчике.
void Temperature::conversion() {
// Возврат индекса к началу, при достижении последнего датчика.
if (index == count) {
index = 0;
}
if (OneWire::crc8(addr[index], 7) == addr[index][7]) {
// Команда преобразования.
ds.reset();
ds.select(addr[index]);
ds.write(0x44, 1);
}
}
//! Считать значение температуры и переключить на следующий датчик.
void Temperature::read() {
if (OneWire::crc8(addr[index], 7) == addr[index][7]) {
// Команда считывания.
ds.reset();
ds.select(addr[index]);
ds.write(0xBE);
// Считывание.
uint8_t byte0 = ds.read();
int16_t byte1 = ds.read();
data[index] = ((byte1 << 8) + byte0) * 0.0625; // 12 байт;
#if SERIAL_ENABLED
Serial.println(data[index]);
#endif
}
// Переключение на следующий датчик.
++index;
}