Блог did5.ru

Про АйТи и около айтишные темы

[Arduino] Несколько датчиков температуры DS18B20

14 комментариев

Собрал схему на Arduino UNO с тремя датчиками температуры DS18B20 подключенных последовательно через подтягивающий резистор на 4,7 кОм.

arduino ds18b20 3 thumb [Arduino] Несколько датчиков температуры DS18B20

Залил скетч для опроса всех датчиков на шине 1-Wire:

#define ONE_WIRE_BUS 10
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup(void){
Serial.begin(9600);
sensors.begin();
}
void loop(void){
sensors.requestTemperatures();
Serial.print("T0=");
Serial.println(sensors.getTempCByIndex(0));
delay(200);
Serial.print("T1=");
Serial.println(sensors.getTempCByIndex(1));
delay(200);
Serial.print("T2=");
Serial.println(sensors.getTempCByIndex(2));
}

Тестовая схема заработала, в консоле появились значения (с точностью до сотых) температуры со всех трех датчиков DS18B20. Следующая стадия испытания была в среде с минусовой температурой. На тот момент на улице был плюс, поэтому пришлось прибегнуть к помощи морозилки.

Засунул один из датчиков в морозильную камеру и включил режим супер-заморозка (до –32 градусов Цельсия). Значения температуры стало стремительно падать, перевалило через 0 и продолжало падать. В этот момент я отвлекся на 20 минут, чтобы не ждать возле холодильника. Но когда вернулся к стенду увидел, что датчик показывает –127 градусов. Вот и первый баг, т.к. морозилка не могла выдать такую температуру.

Опытным путем выяснил, что баг проявляется при температуре меньше –15,75°. Следующее значение уже -127°. Начал грешить на китайский датчик DS18B20, но его замена ошибку не исправила.

arduino ds18b20 1 thumb [Arduino] Несколько датчиков температуры DS18B20

Проблема была в библиотеке DallasTemperature. Скачал другую версию библиотку с этого сайта — http://www.hacktronics.com/Tutorials/arduino-1-wire-tutorial.html. Хотя версия новой библиотеки совпадала с моей, но различия имелись.

arduino ds18b20 4 thumb [Arduino] Несколько датчиков температуры DS18B20

Вот обе версии библиотеки DallasTemperature, выложил на Яндекс.Диск:

1. DallasTemperature.zip - с этой библиотекой нормально отображается минусовая температура (https://yadi.sk/d/DsfPqoqsd7g8f)

2. DallasTemperature (-127).zip - с этой библиотекой при температуре меьше -16 датчик показывает -127. (https://yadi.sk/d/g9SMy6fMd7gMS).

Нашли опечатку в тексте? Пожалуйста, выделите ее и нажмите Ctrl+Enter! Спасибо!


Хотите поблагодарить автора за эту заметку? Вы можете это сделать!


Автор: did5

03 Дек 2014 в 11:41

Рубрика: Arduino

Метки:

14 комментариев на «[Arduino] Несколько датчиков температуры DS18B20»

Вы можете подписаться на RSS-ленту комментариев или оставить трекбек для публикации «[Arduino] Несколько датчиков температуры DS18B20».

  1. Крутая статья, но есть вопрос. Имена датчиков сами выставляются?

    Денис

    27 Ноя 2015 в 09:50

  2. #include

    #include

    //пин 10 датчик темепературы 1

    OneWire oW_podacha (10);

    //пин 11 датчик темепературы 2

    OneWire oW_Obratka (11);

    DallasTemperature podacha (&oW_podacha);

    DallasTemperature Obratka (&oW_Obratka);

    DeviceAddress podachaAddress, ObratkaAddress;

    int Obrat;

    int podach;

    int raznost;

    // float floatObrat;

    // float floatpodach;

    void setup (void)

    {

    Serial.begin (9600);

    podacha.begin ();

    Obratka.begin ();

    podacha.setResolution (11);

    Obratka.setResolution (11);

    // При максимальной точности вермя срабатывания 2 секунды если не указана точность

    // 12 точность 0.06

    // 11 точность 0.12

    // 10 точность 0.25

    // 9 точность 0.5

    // 6 точность 0.5

    }

    void loop (void)

    {

    Serial.println ("Datchik temperaturi: ");

    Obratka.requestTemperatures ();

    delay (40);

    podacha.requestTemperatures ();

    delay (40);

    Serial.print ("Podacha: ");

    Serial.println (podacha.getTempCByIndex (0));

    Serial.print ("Obratka: ");

    Serial.println (Obratka.getTempCByIndex (0));

    int Obrat = Obratka.getTempCByIndex (0);

    int podach = podacha.getTempCByIndex (0);

    int raznost = podach-Obrat;

    Serial.print ("RaZnost: ");

    Serial.println (raznost);

    delay (100);

    oW_podacha.reset_search ();

    oW_Obratka.reset_search ();

    if ( !podacha.getAddress (podachaAddress, 0)){Serial.print («datchika Podachi net»);}

    if ( !Obratka.getAddress (ObratkaAddress, 0)){Serial.print («datchika Obratki net»);}

    Денис

    15 Мар 2016 в 18:10

  3. Вот так будут сниматься показания с двух датчиков на 10,11 пинах и высчитываться разность

    Денис

    15 Мар 2016 в 18:11

  4. а что же вы подключаете с помощью пустого #include ???

    JOhn

    03 Июн 2016 в 18:05

  5. JOhn, это все копи-паст. Спасибо, поправил.

    did5

    14 Июн 2016 в 09:37

  6. Я только начинаю в этом, поэтому плиз

    1. Объясните в 2х словах как происходит считывание показаний каждого отдельного датчика при их последовательном соединении? Почему не параллельно?

    2. Можно ли подключить таким образом, скажем, 6 датчиков или больше?

    Виталий

    30 Янв 2017 в 05:35

  7. Виталий, у каждого датчика есть свой уникальный адрес. По ним они и различаются. Программа просто опрашивает шину (она последовательная!) и снимает показания с всех доступных устройств. Откройте пример DS18x20_Temperature из библиотеки OneWire, чтобы узнать адрес датчика.

    Библиотечка DallasTemperature — как раз для удобной работы с DS18B20 датчиком. А OneWire — общая для работы с шиной.

    Shurovik

    04 Авг 2017 в 08:58

  8. 1.Index (0) всегда будет один и тот же ? Т.е. sensors.getTempCByIndex (0) если стоит на обратке, то Ардуина его будет всегда видеть как Index (0).

    2. Программа просто опрашивает шину (она последовательная!)Однако физически датчики параллельно соединены!

    Дмитрий

    01 Окт 2018 в 11:40

  9. Блин, что значит

    каждый датчик имеет свой адрес
    ?

    Как может иметь какой либо адрес транзистор (коим по сути является датчик температуры)

    Aleksandr

    08 Окт 2018 в 00:19

  10. В том то и дело что 1820 — не транзистор. это контроллер со своим набором команд. библиотеки обеспечивают обмен данными с датчиком.

    Олег

    27 Окт 2018 в 09:51

  11. Если я собрал «гирлянду» из нескольких штук и хочу знать, какому датчику какой индекс попадет. Как заранее определить, какой индекс будет у каждого датчика?

    Павел

    30 Сен 2019 в 12:32

  12. Павел, найди в сети скетч для OneWireScanner, т.к. датчики цифровые к ним можно обращаться по адресам, с его помощью определяешь адреса каждого из датчиков и в последствии берешь показания от каждого из датчиков можно как то так->>>>

    #include

    #include

    DeviceAddress Term01 = { 0×28, 0xFF, 0×64, 0×18, 0×98, 0x7C, 0×66, 0x2C };

    DeviceAddress Term02 = { 0×28, 0xFF, 0×64, 0×18, 0×98, 0×66, 0×65, 0xC5 };

    OneWire oneWire (10);

    DallasTemperature sensors (&oneWire);

    void setup () {

    Serial.begin (9600);

    sensors.begin ();

    }

    void loop () {

    sensors.requestTemperatures ();

    Serial.println («New loop»);

    Serial.println (sensors.getTempC (Term01));

    Serial.println (sensors.getTempC (Term02));

    delay (1000);

    }

    MaksFree

    09 Окт 2019 в 17:31

  13. *include для OneWire.h и DallasTemperature.h

    MaksFree

    09 Окт 2019 в 17:33

  14. объект через объект выражать не нужно и все датчики правильно отображает

    СЕРГЕЙ

    17 Сен 2021 в 19:28

Ваш отзыв