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 Feb 18, 2022
1 parent 4e33ab5 commit 2dcdb3c
Show file tree
Hide file tree
Showing 6 changed files with 183 additions and 43 deletions.
54 changes: 45 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
[![Foo](https://img.shields.io/badge/Version-3.8-brightgreen.svg?style=flat-square)](#versions)
[![Foo](https://img.shields.io/badge/Version-3.9-brightgreen.svg?style=flat-square)](#versions)
[![Foo](https://img.shields.io/badge/Website-AlexGyver.ru-blue.svg?style=flat-square)](https://alexgyver.ru/)
[![Foo](https://img.shields.io/badge/%E2%82%BD$%E2%82%AC%20%D0%9D%D0%B0%20%D0%BF%D0%B8%D0%B2%D0%BE-%D1%81%20%D1%80%D1%8B%D0%B1%D0%BA%D0%BE%D0%B9-orange.svg?style=flat-square)](https://alexgyver.ru/support_alex/)

# microDS18B20
Легкая и простая библиотека для работы с 1-Wire (OneWire) термометрами Dallas DS18B20
Легкая библиотека для работы с 1-Wire (OneWire) термометрами Dallas DS18B20
- Работа с несколькими датчиками на одном пине (режим адресации)
- Хранение массива адресов в PROGMEM памяти
- Работа с одним датчиком на пине (без использования адресации)
- Расчет температуры в целых числах и с плавающей точкой
- Чтение сырых данных для случаев сильной экономии памяти
- Проверка корректности полученной температуры
- Настраиваемое разрешение преобразования
- Чтение сырых данных для случаев сильной экономии памяти
- Проверка подлинности данных "на лету", с использованием CRC8 от Dallas
- Расчет CRC8 (~6 мкс) или чтение из таблицы (<1 мкс + 256 байт flash)
- Проверка подлинности данных
- Проверка корректности работы датчика

### Совместимость
Совместима со всеми Arduino платформами (используются Arduino-функции)
Expand Down Expand Up @@ -42,9 +43,22 @@
<a id="init"></a>
## Инициализация
```cpp
MicroDS18B20<uint8_t pin> ds; // один датчик на одном пине без адресации
MicroDS18B20<uint8_t pin, uint8_t *address> ds; // несколько датчиков на одном пине с адресацией
MicroDS18B20<uint8_t pin, DS_ADDR_MODE>; // говорим, что датчик с адресацией, но не указываем адрес
// один датчик на пине без адресации
MicroDS18B20<uint8_t pin> ds;

// несколько датчиков на пине с адресацией, указываем адрес (адрес - массив uint8_t)
MicroDS18B20<uint8_t pin, uint8_t *address> ds;

// указываем, что будем работать с адресацией. Сам адрес передадим позже (в setAddress())
MicroDS18B20<uint8_t pin, DS_ADDR_MODE>;

// указываем, что будем работать с адресацией, и на линии будет несколько (amount) датчиков
// см. пример async_read_many_bus
MicroDS18B20<uint8_t pin, DS_ADDR_MODE, uint8_t amount>;

// указываем, что будем работать с адресацией, на линии будет несколько (amount) датчиков, а адреса будем хранить в PROGMEM
// см. пример async_read_many_bus_pgm
MicroDS18B20<uint8_t pin, DS_ADDR_MODE, uint8_t amount, DS_PROGMEM>;
```

<a id="usage"></a>
Expand All @@ -53,7 +67,7 @@ MicroDS18B20<uint8_t pin, DS_ADDR_MODE>; // говорим, что дат
// ============= МЕТОДЫ КЛАССА =============
bool readAddress(uint8_t *addressArray); // Прочитать уникальный адрес термометра в массив. [true, если успешно]
void setAddress(uint8_t *addr); // установить (сменить) адрес
void setResolution(uint8_t resolution); // Установить разрешение термометра 9-12 бит
void setResolution(uint8_t resolution); // Установить разрешение 9-12 бит
bool online(); // проверить связь с датчиком (true - датчик онлайн). Шина должна быть подтянута

void requestTemp(); // Запросить новое преобразование температуры
Expand All @@ -63,6 +77,20 @@ float getTemp(); // получить значение
int16_t getTempInt(); // получить значение температуры в int
int16_t getRaw(); // получить "сырое" значение температуры (в 16 раз больше, чем реальная температура)

// ======= МЕТОДЫ ДЛЯ ШИНЫ ДАТЧИКОВ =======
// см. примеры async_read_many_bus и async_read_many_bus_pgm
void setResolutionAll(uint8_t res); // Установить разрешение 9-12 бит у всех датчиков на линии
void setResolution(uint8_t resolution, uint8_t idx); // Установить разрешение 9-12 бит (датчик под номером idx)
bool online(uint8_t idx); // проверить связь (датчик под номером idx)

void requestTempAll(); // запрос температуры у всех датчиков на линии
void requestTemp(uint8_t idx); // Запросить новое преобразование температуры (датчик под номером idx)
bool readTemp(uint8_t idx); // прочитать температуру с датчика (датчик под номером idx)

float getTemp(uint8_t idx); // получить значение температуры в float (датчик под номером idx)
int16_t getTempInt(uint8_t idx); // получить значение температуры в int (датчик под номером idx)
int16_t getRaw(uint8_t idx); // получить "сырое" значение температуры (датчик под номером idx)

// =========== ФУНКЦИИ ВНЕ КЛАССА ===========
int DS_rawToInt(int data); // преобразовать raw данные в температуру int
float DS_rawToFloat(int data); // преобразовать raw данные в температуру float
Expand Down Expand Up @@ -124,6 +152,13 @@ if (sensor.readTemp()) value = sensor.getTemp();
где `readTemp()` запрашивает данные с датчика и возвращает `true`, если они прочитаны корректно. После этого можно забрать текущую температуру из `getTemp()`,
которая уже не запрашивает температуру с датчика, а отдаёт прочитанный в `readTemp()` результат.

#### Подключаем много датчиков на один объект
В версии библиотеки 3.9 появилась возможность подключить сколько угодно датчиков на один объект MicroDS18B20, не создавая массива объектов (как в старых версиях).
Нужно создать двумерный массив адресов и передать его в библиотеку, также указав количество датчиков на линии (можно максимальное, если оно будет меняться в процессе работы программы).
Это позволяет сэкономить немного памяти, но можно пойти дальше - засунуть массив адресов датчиков в PROGMEM, чтобы они не висели в оперативной памяти.
Инициализация в этом случае выглядит так: `MicroDS18B20<пин, DS_ADDR_MODE, колич-во>;` или `MicroDS18B20<пин, DS_ADDR_MODE, колич-во, DS_PROGMEM>;` для PROGMEM режима.
Адреса передаются в `setAddress()`, а для опроса просто передаём индекс датчика в те же функции что и раньше. Смотри примеры *async_read_many_bus*, *async_read_many_bus_pgm* и раздел документации *МЕТОДЫ ДЛЯ ШИНЫ ДАТЧИКОВ*.

<a id="wiring"></a>
## Подключение
![scheme](/doc/scheme.png)
Expand Down Expand Up @@ -316,6 +351,7 @@ void loop() {
- v3.6 - исправлена ошибка компиляции, добавлена поддержка GyverCore (спасибо ArtemiyKolobov)
- v3.7 - исправлена ошибка readTemp() при 0 градусов
- v3.8 - небольшая оптимизация. Совместимость с ESP32
- v3.9 - добавил расширенный режим адресации и хранение адресов в PROGMEM

<a id="feedback"></a>
## Баги и обратная связь
Expand Down
42 changes: 42 additions & 0 deletions examples/async_read_many_bus/async_read_many_bus.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
// работа в режиме шины - несколько датчиков на линии, один объект
// количество датчиков для удобства
#define SENS_AMOUNT 5

// создаём двухмерный массив с адресами
uint8_t addr[][8] = {
{0x28, 0xFF, 0x78, 0x5B, 0x50, 0x17, 0x4, 0xCF},
{0x28, 0xFF, 0x99, 0x80, 0x50, 0x17, 0x4, 0x4D},
{0x28, 0xFF, 0x53, 0xE5, 0x50, 0x17, 0x4, 0xC3},
{0x28, 0xFF, 0x42, 0x5A, 0x51, 0x17, 0x4, 0xD2},
{0x28, 0xFF, 0xCD, 0x59, 0x51, 0x17, 0x4, 0xFE},
};

#include <microDS18B20.h>
MicroDS18B20<D2, DS_ADDR_MODE, SENS_AMOUNT> sensors;

void setup() {
Serial.begin(9600);
// устанавливаем адреса
sensors.setAddress((uint8_t*)addr);

// Установить разрешение 9-12 бит у всех датчиков на линии
//sensors.setResolutionAll(10);
}

void loop() {
// конструкция программного таймера на 1c
static uint32_t tmr;
if (millis() - tmr >= 1000) {
tmr = millis();

// выводим показания в порт
for (int i = 0; i < SENS_AMOUNT; i++) {
Serial.print(sensors.getTemp(i));
Serial.print(',');
}
Serial.println();

// запрашиваем новые
sensors.requestTempAll();
}
}
42 changes: 42 additions & 0 deletions examples/async_read_many_bus_pgm/async_read_many_bus_pgm.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
// работа в режиме шины - несколько датчиков на линии, один объект
// количество датчиков для удобства
#define SENS_AMOUNT 5

// создаём двухмерный массив с адресами
const uint8_t addr[][8] PROGMEM = {
{0x28, 0xFF, 0x78, 0x5B, 0x50, 0x17, 0x4, 0xCF},
{0x28, 0xFF, 0x99, 0x80, 0x50, 0x17, 0x4, 0x4D},
{0x28, 0xFF, 0x53, 0xE5, 0x50, 0x17, 0x4, 0xC3},
{0x28, 0xFF, 0x42, 0x5A, 0x51, 0x17, 0x4, 0xD2},
{0x28, 0xFF, 0xCD, 0x59, 0x51, 0x17, 0x4, 0xFE},
};

#include <microDS18B20.h>
MicroDS18B20<D2, DS_ADDR_MODE, SENS_AMOUNT, DS_PROGMEM> sensors;

void setup() {
Serial.begin(9600);
// устанавливаем адреса
sensors.setAddress((uint8_t*)addr);

// Установить разрешение 9-12 бит у всех датчиков на линии
//sensors.setResolutionAll(10);
}

void loop() {
// конструкция программного таймера на 1c
static uint32_t tmr;
if (millis() - tmr >= 1000) {
tmr = millis();

// выводим показания в порт
for (int i = 0; i < SENS_AMOUNT; i++) {
Serial.print(sensors.getTemp(i));
Serial.print(',');
}
Serial.println();

// запрашиваем новые
sensors.requestTempAll();
}
}
5 changes: 4 additions & 1 deletion keywords.txt
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ getTemp KEYWORD2
getTempInt KEYWORD2
getRaw KEYWORD2
online KEYWORD2
requestTempAll KEYWORD2
setResolutionAll KEYWORD2

DS_rawToInt KEYWORD2
DS_rawToFloat KEYWORD2
Expand All @@ -29,4 +31,5 @@ DS_rawToFloat KEYWORD2
#######################################
DS_CHECK_CRC LITERAL1
DS_CRC_USE_TABLE LITERAL1
DS_ADDR_MODE LITERAL1
DS_ADDR_MODE LITERAL1
DS_PROGMEM LITERAL1
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.8
version=3.9
author=AlexGyver <[email protected]>
maintainer=AlexGyver <[email protected]>
sentence=Light library for DS18b20 sensor
Expand Down
Loading

0 comments on commit 2dcdb3c

Please sign in to comment.