DS18B20 это сказочный датчик температуры, который имеет цифровой интерфейс, а значит его не нужно калибровать и их можно подключить сразу много к одному пину ардуины, так как каждый DS18B20 имеет свой уникальный адрес, зашитый на заводе.
Выглядит эта мегасложная схема так:
Ну то есть надо резистор и все))) И вообще нет никаких калибровок температуры и ошибок монтажа, питание втыкать можно от 3 до 5 вольт. Просто сказка. А получение температуры — 3 строчки)) Внизу пример, ну очень подробно все расписано.
Качаем эту библиотеку: https://github.com/milesburton/Arduino-Temperature-Control-Library (зеркало Arduino-Temperature-Control-Library-master). Вот скетч (в примерах называется Single.pde):
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 |
#include <OneWire.h> #include <DallasTemperature.h> // Пин Arduino куда подключен датчик #define ONE_WIRE_BUS 10 // Объявляем переменные OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); // тут будет хранится адрес нашего датчика. Каждый DS18B20 имеет свой уникальный адрес, зашитый на заводе DeviceAddress insideThermometer; void setup(void) { Serial.begin(9600); Serial.println("Dallas Temperature IC Control Library Demo"); // Поиск устройств на выбранном пине Serial.print("Поиск устройств..."); sensors.begin(); Serial.print("Found "); Serial.print(sensors.getDeviceCount(), DEC); Serial.println(" штук."); // определяемся с режимом питания датчиков. Они кстати могут питаться по тому же проводу, по которому отправляют данные Serial.print("Parasite power is: "); if (sensors.isParasitePowerMode()) Serial.println("ON"); else Serial.println("OFF"); // тут можно прописать адрес вручную // Есть 2 варианта: // 1) oneWire.search(deviceAddress) – сразу если известен адрес датчика // 2) sensors.getAddress(deviceAddress, index) – по номеру подключения, начиная с 0 //insideThermometer = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 }; // Мы будем использовать 2 вариант – поищем первый датчик (номер=0): if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Не найден адрес датчика 0"); // Показываем адрес, который нашли Serial.print("Адрес датчика 0: "); printAddress(insideThermometer); Serial.println(); // устанавливаем разрешение датчика на 9 бит. Можно попробовать 10 поставить. Эта штука отвечает за точность показаний. Чем выше точность тем меньше скорость получения температуры. sensors.setResolution(insideThermometer, 9); Serial.print("Разрешение датчика 0: "); Serial.print(sensors.getResolution(insideThermometer), DEC); Serial.println(); } // Эта волшебная функция пишет температуру в Serial void printTemperature(DeviceAddress deviceAddress) { // вариант 1 - медленнее //Serial.print("Temp C: "); //Serial.print(sensors.getTempC(deviceAddress)); // в цельсиях //Serial.print(" Temp F: "); //Serial.print(sensors.getTempF(deviceAddress)); // в фаренгейтах. причем чтобы получить температуру в фаренгейтах мы делаем второй запрос к датчику. // вариант 2 - быстрее float tempC = sensors.getTempC(deviceAddress); Serial.print("Temp C: "); Serial.print(tempC); Serial.print(" Temp F: "); Serial.println(DallasTemperature::toFahrenheit(tempC)); // чтобы получить фаренгейты в этот раз мы не делаем второй запрос к DS18B20, а просто конвертим температуру по формуле. } void loop(void) { Serial.print("Получаем температуру..."); sensors.requestTemperatures(); // Отправка команды на получение температуры Serial.println("готово"); // ну и теперь вывод данных printTemperature(insideThermometer); } // А эта функция выводит адрес в Serial void printAddress(DeviceAddress deviceAddress) { for (uint8_t i = 0; i < 8; i++) { if (deviceAddress[i] < 16) Serial.print("0"); Serial.print(deviceAddress[i], HEX); } } |
Подключение нескольких DS18B20
Если надо подключить много DS18B20 – то включать нужно параллельно (1 резистор на всех):
Здесь все то же самое, код в примере Multiple.pde. Различие в том, что используется несколько переменных с адресами термометров — и соответственно на 3 датчика 3 переменные с адресами и такой код для поиска:
1 2 3 |
if (!sensors.getAddress(Thermometer1, 0)) Serial.println("Не найден адрес датчика 0"); if (!sensors.getAddress(Thermometer2, 1)) Serial.println("Не найден адрес датчика 1"); if (!sensors.getAddress(Thermometer3, 2)) Serial.println("Не найден адрес датчика 2"); |
Ну и вывода температур тоже по 3 раза.
Добавить комментарий