Наши контакты: +380958663605

inhelp@i.ua

Подключение датчика температуры DS18B20 к Arduino

dallas ds18b20

Сегодня мы будем подключать датчик температуры DS18B20 к arduino.

Основные характеристики датчика DS18B20 :

  1. Уникальный интерфейс 1-Wire Требуется только один контакт для связи
  2. Каждое устройство имеет уникальный 64-битный серийный адрес устройства который хранится в ROM
  3. Питание датчика в диапазоне температур  от 3 вольт до 5,5 вольт
  4. Диапазон измеряемых температур от -55 ° C до +125 ° C  (-67 ° F до +257 ° F)
  5. Программное обеспечение совместимо с DS1822
  6. Доступен в трех вариантах корпусов 8-Pin SO (150 mils), 8-Pin µSOP, и 3-Pin TO-92

Блок схема датчика DS18B20

схема датчика ds18b20

Фотография датчика DS18B20 в корпусе  TO-92

DS18B20

Датчик температуры DS18B20 работает с arduino по протоколу передачи данных 1-Wire® и позволяет подключить несколько датчиков на одну шину.

Датчики подключаются к arduino двумя вариантами:

  • Внешнее подключение ( по трем проводам )
  • Паразитное подключение ( по двум проводам )

Мы рассмотрим внешнее подключение. в котором обмен данными осуществляется по средней ноге датчика DQ . Между ногой DQ и VDD требуется подключить резистор номиналом 4,7 кОм. Питание подключается к ногам VDD и GND, а именно VDD подключаем к + питания 5 вольт, а GND к минусу питания ( земля).  DQ подключаем к цифровому пину 10 на Arduino UNO.

ds18b20

Если требуется подключить больше датчиков , то добавляем дополнительные датчики по схеме

ds18b20

Каждый датчик  температуры имеет уникальный 64-битный адрес устройства, по которому у нас есть возможность опросить определенный датчик и взять с него значения температуры.

В основном для работы с датчиком в интернете есть много библиотек, но я рекомендую библиотеку DallasTemperature , она для меня более удобна и практична. Как установить библиотеку мы уже раньше рассказывали в этой статье.

После успешного скачивания библиотеки и установки,

Arduino ide ds18b20

запускаем Arduino IDE, и переходим к примерам по работе с датчиком, и выбираем пример Multiple.

В примере ищем строку #define ONE_WIRE_BUS 2 где 2 это номер цифрового пина  arduino к которому подключен датчик ( в нашем случае это 10 пин ) и меняем на строку на #define ONE_WIRE_BUS 10 и заливаем скетч в нашу плату ардуино.

Монитор порта ds18b20

Открываем монитор порта и снимаем галочку с «Автопрокрутка» и перемещаемся в самый верх окна монитора порта.

Монитор порта

Где мы видим  строки

  • Locating devices…Found 2 devices    —    количестве подключенных датчиков 2 штуки
  • Parasite power is: OFF  —   паразитное подключение отключено ( у нас датчики подключены внешним подключением )
  • Device 0 Address: 280054B604000092   —   адрес первого подключенного  датчика
  • Device 1 Address: 289E95B504000057   —   адрес второго подключенного датчика
  • Device 0 Resolution: 9  —  режим измерения первого датчика
  • Device 1 Resolution: 9    режим измерения второго датчика

Далее строки

  • Requesting temperatures…DONE  —  запрос получения температуры с датчиков
  • Device Address: 280054B604000092 Temp C: 7.00 Temp F: 44.60  —  адрес датчика , температура в градусах по Цельсию и температура по Фаренгейту
  • Device Address: 289E95B504000057 Temp C: 27.50 Temp F: 81.50  —  адрес датчика , температура в градусах по Цельсию и температура по Фаренгейту

Датчики как мы видим работают, и температуру мы получаем.

Для удобного отображения температуры и считывания данных с одного датчика без использования библиотеки, можно использовать более простой код. Для указания пина Arduino к которому у вас подключен датчик температуры DS18B20 , измените число в строке OneWire ds(9);  на например 10 

Ну а для отображения температуры с двух и больше датчиков я рекомендую использовать код который указан ниже.

В строке #define ONE_WIRE_BUS 9 указываем номер нашего пина 10, и загружаем код, открываем монитор порта

Arduino ide ds18b20

Где у нас Sensor1       7.50 температура в градусах Цельсия на датчике 1 , который доступен по адресу  0x28, 0x00, 0x54, 0xB6, 0x04, 0x00, 0x00, 0x92, а  Sensor2       27.75 — температура второго датчика доступного по адресу 0x28, 0x9E, 0x95, 0xB5, 0x04, 0x00, 0x00, 0x57.

С этим все ясно, но если нам потребуется подключить три и больше датчиков, как нам изменить код я сейчас расскажу. Для начала нам потребуется запустить тестовый скетч Multiple, потом записать все адреса датчиков ( например 280054B604000086) и потом переводим в формат адреса 0x28, 0x00, 0x54, 0xB6, 0x04, 0x00, 0x00, 0x86 

После этого в скетче выше, после строки

добавляем строку с адресом нашего третьего датчика

потом в void setup () добавляем строку

и переходим к циклу  void loop (), в котором добавляем строку, которая отвечает за отображение температуры с третьего датчика

Для отображения например пяти датчиков , просто дописываем код как указано выше.

Заказать датчик температуры DS18B20 вы можете по ссылке ниже

ds18s20

Заказать датчик температуры DS18B20

15 responses on “Подключение датчика температуры DS18B20 к Arduino

  1. Leon:

    Как преобразовать строку printTemperature(Thermometer2); для вывода на LCD (lcd.print(что писать сюда?);) ?

  2. Женя:

    у меня выбивает вот эту ошибку при загрузки скетча на ардуино нано Arduino: 1.6.5 (Windows XP), Плата»Arduino Nano, ATmega168″

    Multiple.pde:1:21: fatal error: OneWire.h: No such file or directory
    compilation terminated.
    Ошибка компиляции.

    Это сообщение будет содержать больше информации чем
    «Отображать вывод во время компиляции»
    включено в Файл > Настройки

  3. Евгений:

    Здравствуйте, у меня вопрос, как работать с температурой после ее измерения, то есть например мне нужно при определенной температуре зажечь светодиод

  4. Здравствуйте, спасибо за статью. Как можно скорректировать показания датчика? Один датчик явно завышает температуру на 3 гр.

  5. Ярик:

    Здраствуйте! Шыкарная статя, все выложено очень достепно. У вас в ком порт выводит 16 цыфр (Device Address) у меня только 15.(на всех датчиках) что делать? Заранее благодарен за ответ.

  6. Эмиль:

    Пробую аналогичную схему и код на Arduino Nano. Для начала тестирую с одним датчиком. Результат всё время выдаёт ноль, что делать? Схема точно как у вас, всё так же. Код так же проую ваш, подключил к 9-ому пину. Отличие только в том что использую Arduino Nano.

  7. Alex:

    немного кода сам считает датчики (до 10 штук по умолчанию) сам выдает их данные

    #include

    #include
    #include

    // Data wire is plugged into port 2 on the Arduino
    #define ONE_WIRE_BUS A5
    #define TEMPERATURE_PRECISION 9

    // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
    OneWire oneWire(ONE_WIRE_BUS);

    // Pass our oneWire reference to Dallas Temperature.
    DallasTemperature sensors(&oneWire);

    // arrays to hold device addresses
    DeviceAddress Thermometer[10];
    byte realTermometr = 0;
    float tempC;
    // function to print a device address

    void printAddress(DeviceAddress deviceAddress)
    {
    for (uint8_t i = 0; i < 8; i++)
    {
    // zero pad the address if necessary
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
    }
    }

    void setup(void)
    {
    // start serial port
    Serial.begin(9600);
    Serial.println("Dallas Temperature IC Control");

    // Start up the library
    sensors.begin();

    // locate devices on the bus
    Serial.print("Locating devices…");
    Serial.print("Found ");
    realTermometr = sensors.getDeviceCount();
    Serial.print(realTermometr, DEC);
    Serial.println(" devices.");

    // report parasite power requirements
    Serial.print("Parasite power is: ");
    if (sensors.isParasitePowerMode()) Serial.println("ON");
    else Serial.println("OFF");

    // method 1: by index
    for (int i = 0; i < realTermometr; i++)
    {

    if (!sensors.getAddress(Thermometer[i], i))
    {
    Serial.print("Unable to find address for Device 0");
    Serial.println(i);

    }
    Serial.print("Device ");
    Serial.print(i);
    Serial.print(" Address: ");
    printAddress(Thermometer[i]);
    Serial.println();

    sensors.setResolution(Thermometer[i], TEMPERATURE_PRECISION);

    Serial.print("Device ");
    Serial.print(i);
    Serial.print(" Resolution: ");
    Serial.print(sensors.getResolution(Thermometer[i]), DEC);
    Serial.println();

    }

    }

    /*
    * Main function, calls the temperatures in a loop.
    */
    void loop(void)
    {
    delay (1000);

    Serial.print("Requesting temperatures…");
    sensors.requestTemperatures();
    Serial.println("DONE");

    for (int i = 0; i < realTermometr; i++)
    {

    tempC = sensors.getTempC(Thermometer[i]);
    printAddress(Thermometer[i]);
    Serial.print(", Temp ");
    Serial.print(i);
    Serial.print(" = ");
    Serial.println(tempC);

    }

    }

  8. анатолий:

    Я так понял в процессе измерения данная библиотека просто простаивает 750 милисек. что не есть хорошо.

  9. Максим:

    Здравствуйте Дмитрий. Пожалуйста помогите со скетчем, как передать показания датчика DS18B20 через передатчик 433 Мгц.
    Спасибо!

  10. Даниил:

    Arduino: 1.6.4 (Windows 8.1), Плата»Arduino Uno»

    Изменена опция сборки, пересобираем все

    Sketch uses 3 246 bytes (10%) of program storage space. Maximum is 32 256 bytes.

    Global variables use 196 bytes (9%) of dynamic memory, leaving 1 852 bytes for local variables. Maximum is 2 048 bytes.

    avrdude: ser_open(): can’t open device «\\.\COM3»: Не удается найти указанный файл.

    кто знает что делать если компилятор выдаёт такую ошибку ардуино из Китая прошитая или не не знаю так же очень прошу скажите как прошить его

    Проблема загрузки на плату. Для достижения дзен, курить http://www.arduino.cc/en/Guide/Troubleshooting#upload .

    Это сообщение будет содержать больше информации чем
    «Отображать вывод во время компиляции»
    включено в Файл > Настройки

  11. Евгений:

    Как сделать десятые. Народ помогите.

    #include
    OneWire ds(9);

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

    void loop() {

    byte data[2];
    ds.reset();
    ds.write(0xCC);
    ds.write(0x44);
    delay(750);
    ds.reset();
    ds.write(0xCC);
    ds.write(0xBE);
    data[0] = ds.read();
    data[1] = ds.read();
    // проблема где-то здесь, если не ошибаюсь
    int Temp = (data[1]<>4;
    Serial.println(Temp);
    }

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

два × 2 =