[Arduino] Несколько датчиков температуры DS18B20
Собрал схему на Arduino UNO с тремя датчиками температуры DS18B20 подключенных последовательно через подтягивающий резистор на 4,7 кОм.
Залил скетч для опроса всех датчиков на шине 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, но его замена ошибку не исправила.
Проблема была в библиотеке DallasTemperature. Скачал другую версию библиотку с этого сайта — http://www.hacktronics.com/Tutorials/arduino-1-wire-tutorial.html. Хотя версия новой библиотеки совпадала с моей, но различия имелись.
Вот обе версии библиотеки DallasTemperature, выложил на Яндекс.Диск:
1. DallasTemperature.zip - с этой библиотекой нормально отображается минусовая температура (https://yadi.sk/d/DsfPqoqsd7g8f)
2. DallasTemperature (-127).zip - с этой библиотекой при температуре меьше -16 датчик показывает -127. (https://yadi.sk/d/g9SMy6fMd7gMS).
Нашли опечатку в тексте? Пожалуйста, выделите ее и нажмите Ctrl+Enter! Спасибо!
Хотите поблагодарить автора за эту заметку? Вы можете это сделать!
Крутая статья, но есть вопрос. Имена датчиков сами выставляются?
Денис
27 Ноя 2015 в 09:50
#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
Вот так будут сниматься показания с двух датчиков на 10,11 пинах и высчитываться разность
Денис
15 Мар 2016 в 18:11
а что же вы подключаете с помощью пустого #include ???
JOhn
03 Июн 2016 в 18:05
JOhn, это все копи-паст. Спасибо, поправил.
did5
14 Июн 2016 в 09:37
Я только начинаю в этом, поэтому плиз
1. Объясните в 2х словах как происходит считывание показаний каждого отдельного датчика при их последовательном соединении? Почему не параллельно?
2. Можно ли подключить таким образом, скажем, 6 датчиков или больше?
Виталий
30 Янв 2017 в 05:35
Виталий, у каждого датчика есть свой уникальный адрес. По ним они и различаются. Программа просто опрашивает шину (она последовательная!) и снимает показания с всех доступных устройств. Откройте пример DS18x20_Temperature из библиотеки OneWire, чтобы узнать адрес датчика.
Библиотечка DallasTemperature — как раз для удобной работы с DS18B20 датчиком. А OneWire — общая для работы с шиной.
Shurovik
04 Авг 2017 в 08:58
1.Index (0) всегда будет один и тот же ? Т.е. sensors.getTempCByIndex (0) если стоит на обратке, то Ардуина его будет всегда видеть как Index (0).
2. Программа просто опрашивает шину (она последовательная!)Однако физически датчики параллельно соединены!
Дмитрий
01 Окт 2018 в 11:40
Блин, что значит
?Как может иметь какой либо адрес транзистор (коим по сути является датчик температуры)
Aleksandr
08 Окт 2018 в 00:19
В том то и дело что 1820 — не транзистор. это контроллер со своим набором команд. библиотеки обеспечивают обмен данными с датчиком.
Олег
27 Окт 2018 в 09:51
Если я собрал «гирлянду» из нескольких штук и хочу знать, какому датчику какой индекс попадет. Как заранее определить, какой индекс будет у каждого датчика?
Павел
30 Сен 2019 в 12:32
Павел, найди в сети скетч для 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
*include для OneWire.h и DallasTemperature.h
MaksFree
09 Окт 2019 в 17:33
объект через объект выражать не нужно и все датчики правильно отображает
СЕРГЕЙ
17 Сен 2021 в 19:28