Skip to content
This repository has been archived by the owner on Apr 13, 2024. It is now read-only.

Commit

Permalink
upd
Browse files Browse the repository at this point in the history
  • Loading branch information
GyverLibs committed Oct 30, 2021
1 parent 4a17b68 commit 79d53c3
Show file tree
Hide file tree
Showing 9 changed files with 105 additions and 75 deletions.
47 changes: 29 additions & 18 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,11 +49,12 @@ MicroDS18B20<uint8_t pin, DS_ADDR_MODE>; // говорим, что дат
```cpp
// ============= МЕТОДЫ КЛАССА =============
void setAddress(uint8_t *addr); // установить (сменить) адрес
void setResolution(uint8_t resolution); // Установить разрешение термометра 9-12 бит
void readAddress(uint8_t *addressArray); // Прочитать уникальный адрес термометра в массив
void requestTemp(void); // Запросить новое преобразование температуры
int getRaw(void) // Прочитать "сырое" значение температуры
[int/float] getTemp(void); // Прочитать значение температуры
bool setResolution(uint8_t resolution); // Установить разрешение термометра 9-12 бит. Вернёт true, если успешно (датчик онлайн)
bool readAddress(uint8_t *addressArray); // Прочитать уникальный адрес термометра в массив. Вернёт true, если успешно (датчик онлайн)
bool requestTemp(); // Запросить новое преобразование температуры. Вернёт true, если успешно (датчик онлайн)
int getRaw(); // Прочитать "сырое" значение температуры
bool online(); // проверить связь с датчиком (true - датчик онлайн)
[int/float] getTemp(); // Прочитать значение температуры. Если ровно 0 - возможно датчик отключен. Проверь через online()!
[int/float] calcRaw(int data); // Преобразовать "сырое" значение в температуру

// =========== ФУНКЦИИ ВНЕ КЛАССА ===========
Expand All @@ -63,7 +64,7 @@ float DS_rawToFloat(int data); // преобразовать raw д
// ============ ДЕФАЙНЫ НАСТРОЕК ============
// прописывать перед подключением библиотеки
#define DS_TEMP_TYPE [float / int] // Тип данных для температуры (точность / экономия flash) (По умолч. float)
#define DS_CHECK_CRC [true / false] // Проверка подлинности принятых данных (По умолч. true)
#define DS_CHECK_CRC [true / false] // Проверка подлинности принятых данных. При отключении будет выдавать некорректное значение при сбое передачи данных (По умолч. true)
#define DS_CRC_USE_TABLE [true / false] // Использовать таблицу для CRC. Быстрее, но +256 байт flash (<1мкс VS ~6мкс) (По умолч. false)

// ================== ИНФО ==================
Expand Down Expand Up @@ -127,8 +128,14 @@ void loop() {
// вывод
Serial.print("t: ");
Serial.print(sensor1.getTemp());
Serial.print(", ");
Serial.println(sensor2.getTemp());

// можно проверить наличие датчика на линии
if (sensor2.online()) {
Serial.print(", ");
Serial.println(sensor2.getTemp());
} else {
Serial.println(", Sensor 2 offline");
}
}
```

Expand Down Expand Up @@ -179,17 +186,20 @@ void setup() {
}

void loop() {
sensor.readAddress(addressBuf);

// выводим в порт
Serial.print("Address: {");
for (uint8_t i = 0; i < 8; i++) {
Serial.print("0x");
Serial.print(addressBuf[i], HEX);
if (i < 7) Serial.print(", ");
// Читаем адрес термометра в массив
if (sensor.readAddress(address)) { // если успешно
// выводим в порт
Serial.print("Address: {");
for (uint8_t i = 0; i < 8; i++) {
Serial.print("0x");
Serial.print(address[i], HEX); // Выводим адрес для копирования
if (i < 7) Serial.print(", ");
}
Serial.println("};");

} else { // датчик не подключен
Serial.println("Not connected");
}
Serial.println("};");

delay(1000);
}
```
Expand Down Expand Up @@ -255,6 +265,7 @@ void loop() {
- v3.1.1 - microOneWire разбит на .h и .cpp
- v3.2 - исправлены отрицательные температуры
- v3.3 - разбил на файлы
- v3.4 - добавлена проверка онлайна датчика и буфер, при ошибке чтения возвращается последнее прочитанное значение

<a id="feedback"></a>
## Баги и обратная связь
Expand Down
28 changes: 15 additions & 13 deletions examples/address_read/address_read.ino
Original file line number Diff line number Diff line change
@@ -1,28 +1,30 @@
#include <microDS18B20.h>
/*
Чтение уникального адреса термометра для последующего использования
ВНИМАНИЕ! Устанавливать не более одного датчика на линию (пин) во избежание конфликта
*/
#include <microDS18B20.h>

MicroDS18B20 <2> sensor; // Создаем термометр без адреса на пине D2
uint8_t addressBuf[8]; // Создаем массив для адреса
uint8_t address[8]; // Создаем массив для адреса

void setup() {
Serial.begin(9600);
}

void loop() {
// Читаем адрес термометра в наш массив
sensor.readAddress(addressBuf);

// выводим в порт
Serial.print("Address: {");
for (uint8_t i = 0; i < 8; i++) {
Serial.print("0x");
Serial.print(addressBuf[i], HEX); // Выводим адрес для копирования
if (i < 7) Serial.print(", ");
// Читаем адрес термометра в массив
if (sensor.readAddress(address)) { // если успешно
// выводим в порт
Serial.print("Address: {");
for (uint8_t i = 0; i < 8; i++) {
Serial.print("0x");
Serial.print(address[i], HEX); // Выводим адрес для копирования
if (i < 7) Serial.print(", ");
}
Serial.println("};");

} else { // датчик не подключен
Serial.println("Not connected");
}
Serial.println("};");

delay(1000);
}
3 changes: 2 additions & 1 deletion examples/async_read/async_read.ino
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ void loop() {
tmr = millis();

// читаем прошлое значение
Serial.println(sensor.getTemp());
if (sensor.online()) Serial.println(sensor.getTemp());
else Serial.println("Not connected");

// запрашиваем новое измерение
sensor.requestTemp();
Expand Down
2 changes: 0 additions & 2 deletions examples/async_read_many/async_read_many.ino
Original file line number Diff line number Diff line change
Expand Up @@ -36,14 +36,12 @@ void loop() {
for (int i = 0; i < DS_SENSOR_AMOUNT; i++) {
Serial.print(sensor[i].getTemp());
Serial.print(',');
//delay(5); // возможно понадобится дилей, у меня работает без него
}
Serial.println();

// запрашиваем новые
for (int i = 0; i < DS_SENSOR_AMOUNT; i++) {
sensor[i].requestTemp();
//delay(5); // возможно понадобится дилей, у меня работает без него
}
}
}
2 changes: 1 addition & 1 deletion examples/flash_reduction/flash_reduction.ino
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
*/

#define DS_TEMP_TYPE int // целочисленный тип данных для температуры
#define DS_CHECK_CRC false // отключить проверку подлинности принятых данных
#define DS_CHECK_CRC false // отключить проверку подлинности принятых данных (может привести к выдаче некорректных измерений)

#include <microDS18B20.h>

Expand Down
26 changes: 16 additions & 10 deletions examples/one_pin_one_sensor/one_pin_one_sensor.ino
Original file line number Diff line number Diff line change
Expand Up @@ -2,39 +2,45 @@
// один датчик - один пин

#include <microDS18B20.h>
// Датчики на D2 и D3
// Датчики на D2 и D3
MicroDS18B20<2> sensor1;
MicroDS18B20<3> sensor2;

void setup() {
Serial.begin(9600);
//sensor1.setResolution(12); // разрешение [9-12] бит. По умолч. 12
//sensor1.setResolution(12); // разрешение [9-12] бит. По умолч. 12
}

void loop() {
// запрос температуры
// запрос температуры
sensor1.requestTemp();
sensor2.requestTemp();

// вместо delay используй таймер на millis()
delay(1000);
delay(1000);

// вывод
Serial.print("t: ");
Serial.print(sensor1.getTemp());
Serial.print(", ");
Serial.println(sensor2.getTemp());

// можно проверить наличие датчика на линии
if (sensor2.online()) {
Serial.print(", ");
Serial.println(sensor2.getTemp());
} else {
Serial.println(", Sensor 2 offline");
}
}

/*
Опрос датчиков асинхронный, т.е. не блокирует выполнение кода, но
между requestTemp и getTemp должно пройти не менее
точность | время
12 бит | 750 мс
11 бит | 375 мс
10 бит | 187 мс
9 бит | 93 мс
Иначе датчик вернёт предыдущее значение
*/
1 change: 1 addition & 0 deletions keywords.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ requestTemp KEYWORD2
getTemp KEYWORD2
getRaw KEYWORD2
calcRaw KEYWORD2
online KEYWORD2
DS_rawToInt KEYWORD2
DS_rawToFloat KEYWORD2

Expand Down
2 changes: 1 addition & 1 deletion library.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name=microDS18B20
version=3.3
version=3.4
author=AlexGyver <[email protected]>
maintainer=AlexGyver <[email protected]>
sentence=Light library for DS18b20 sensor
Expand Down
69 changes: 40 additions & 29 deletions src/microDS18B20.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
v3.1.1 - microOneWire разбит на .h и .cpp
v3.2 - исправлены отрицательные температуры
v3.3 - разбил на файлы
v3.4 - добавлена проверка онлайна датчика и буфер, при ошибке чтения возвращается последнее прочитанное значение
*/

#ifndef _microDS18B20_h
Expand All @@ -44,7 +45,7 @@

/*
Время исполнения функций для работы с датчиком (частота ядра - 16 МГц):
_________________________________________________________________________________
_________________________________________________________________________________
| Датчик без адресации (один на линии) | Датчик с адресацией (несколько на линии) |
|______________________________________|__________________________________________|
| .setResolution(...) ~ 3591.125 мкс | .setResolution(...) ~ 8276.0625 мкс |
Expand Down Expand Up @@ -100,13 +101,14 @@ class MicroDS18B20 {
}

// Установить разрешение термометра 9-12 бит
void setResolution(uint8_t resolution) {
if (oneWire_reset(DS_PIN)) return; // Сброс и проверка присутствия
addressRoutine(); // Процедура адресации
oneWire_write(0x4E, DS_PIN); // Запись RAM
oneWire_write(0xFF, DS_PIN); // Максимум в верхний регистр тревоги
oneWire_write(0x00, DS_PIN); // Минимум в верхний регистр тревоги
oneWire_write(((constrain(resolution, 9, 12) - 9) << 5) | 0x1F, DS_PIN); // Запись конфигурации разрешения
bool setResolution(uint8_t res) {
if (oneWire_reset(DS_PIN)) return 0; // Проверка присутствия
addressRoutine(); // Процедура адресации
oneWire_write(0x4E, DS_PIN); // Запись RAM
oneWire_write(0xFF, DS_PIN); // Максимум в верхний регистр тревоги
oneWire_write(0x00, DS_PIN); // Минимум в верхний регистр тревоги
oneWire_write(((constrain(res, 9, 12) - 9) << 5) | 0x1F, DS_PIN); // Запись конфигурации разрешения
return 1;
}

// установить адрес
Expand All @@ -115,51 +117,54 @@ class MicroDS18B20 {
}

// Прочитать уникальный адрес термометра в массив
void readAddress(uint8_t *addressArray) {
if (DS_ADDR or oneWire_reset(DS_PIN)) return; // Проверка присутствия
oneWire_write(0x33, DS_PIN); // Запрос адреса
#if (DS_CHECK_CRC == true) // Если требуется проверка подлинности
uint8_t _calculated_crc = 0; // Переменная для CRC8
uint8_t _temp_address[8]; // Временный массив для адреса
for (uint8_t i = 0; i < 8; i++) { // Прочитать 8 байт адреса
_temp_address[i] = oneWire_read(DS_PIN); // Записать байты во временный массив
_ds_crc8_upd(_calculated_crc, _temp_address[i]); // Обновить значение CRC8
bool readAddress(uint8_t *addr) {
if (oneWire_reset(DS_PIN)) return 0; // Проверка присутствия
oneWire_write(0x33, DS_PIN); // Запрос адреса
#if (DS_CHECK_CRC == true) // Если требуется проверка подлинности
uint8_t crc = 0; // Переменная для CRC8
uint8_t temp[8]; // Временный массив для адреса
for (uint8_t i = 0; i < 8; i++) { // Прочитать 8 байт адреса
temp[i] = oneWire_read(DS_PIN); // Записать байты во временный массив
_ds_crc8_upd(crc, temp[i]); // Обновить значение CRC8
}
if (_calculated_crc) return; // Если CRC не сошелся - данные в помойку
memcpy(addressArray, _temp_address, 8); // Если сошелся - переписать массив в основной
#else // Если пропуск проверки CRC
for (uint8_t i = 0; i < 8; i++) { // Прочитать 8 байт
addressArray[i] = oneWire_read(DS_PIN); // Поместить в пользовательский массив
if (crc) return 0; // CRC не сошелся - ошибка
memcpy(addr, temp, 8); // Если сошелся - переписать массив в основной
#else // Если пропуск проверки CRC
for (uint8_t i = 0; i < 8; i++) { // Прочитать 8 байт
addr[i] = oneWire_read(DS_PIN); // Поместить в пользовательский массив
}
#endif
return 1;
}

// Запрос температуры
void requestTemp() {
if (oneWire_reset(DS_PIN)) return; // Проверка присутствия
bool requestTemp() {
if (oneWire_reset(DS_PIN)) return 0; // Проверка присутствия
addressRoutine(); // Процедура адресации
oneWire_write(0x44, DS_PIN); // Запросить преобразование
return 1;
}

// Прочитать "сырое" значение температуры
int16_t getRaw() {
uint8_t _calculated_crc = 0; // Переменная для хранения CRC
if (oneWire_reset(DS_PIN)) return 0; // Проверка присутствия
if (oneWire_reset(DS_PIN)) return buf; // если датчик оффлайн
addressRoutine(); // Процедура адресации
oneWire_write(0xBE, DS_PIN); // Запросить температуру
#if (DS_CHECK_CRC == true) // Если требуется проверка подлинности
uint8_t crc = 0; // Переменная для хранения CRC
uint8_t data[9]; // Временный массив для данных (9 байт)
for (uint8_t i = 0; i < 9; i++) { // Считать RAM
data[i] = oneWire_read(DS_PIN); // Прочитать данные
_ds_crc8_upd(_calculated_crc, data[i]); // Обновить значение CRC8
_ds_crc8_upd(crc, data[i]); // Обновить значение CRC8
}
if (_calculated_crc) return 0; // Если CRC не сошелся - данные в помойку
if (!crc) buf = (int16_t)(data[1] << 8) | data[0]; // crc сошёлся - обновляем
#else // Если пропуск проверки CRC
uint8_t data[2]; // Временный массив для данных (2 байта)
data[0] = oneWire_read(DS_PIN); // Прочитать младший байт температуры
data[1] = oneWire_read(DS_PIN); // Прочитать старший байт температуры
buf = (int16_t)(data[1] << 8) | data[0];
#endif
return (int16_t)(data[1] << 8) | data[0]; // Вернуть "сырое" значение
return buf;
}

// Преобразовать "сырое" значение в температуру
Expand All @@ -171,9 +176,15 @@ class MicroDS18B20 {
DS_TEMP_TYPE getTemp() {
return calcRaw((DS_TEMP_TYPE)getRaw());
}

// проверить связь с датчиком (true - датчик на линии)
bool online() {
return !oneWire_reset(DS_PIN);
}

private:
uint8_t *_addr = DS_ADDR;
int16_t buf = 0;

void addressRoutine() { // Процедура адресации
if (DS_ADDR) { // Адрес определен?
Expand Down

0 comments on commit 79d53c3

Please sign in to comment.