DS18B20 (Arduino)

DS18B20 цифровой термометр с программируемым разрешением, от 9 до 12–bit, которое может
сохраняться в EEPROM памяти прибора. DS18B20 обменивается данными по 1-Wire шине и при этом может
быть как единственным устройством на линии так и работать в группе. Все процессы на шине управляются
центральным микропроцессором.
Диапазон измерений от –55°C до +125°C и точностью 0.5°C в диапазоне от –10°C до +85°C. В дополнение,
DS18B20 может питаться напряжением линии данных (“parasite power”), при отсутствии внешнего источника
напряжения.
Каждый DS18B20 имеет уникальный 64-битный последовательный код, который позволяет, общаться с
множеством датчиков DS18B20 установленных на одной шине. Такой принцип позволяет использовать один
микропроцессор, чтобы контролировать множество датчиков DS18B20, распределенных по большому
участку. Приложения, которые могут извлечь выгоду из этой особенности, включают системы контроля
температуры в зданиях, и оборудовании или машинах, а так же контроль и управление температурными
процессами.

При подключении датчика DS18B20 к Arduino будем использовать библиотеку  Dallas Temperature, которая значительно упрощает процесс подключения.

Скетч показанный ниже используется для подключения нескольких датчиков температуры, при этом не нужно указывать адрес датчика, программа сама определит адреса всех датчиков, произведет измерения температуры и выведет информацию в монитор порта:

#include <OneWire.h>
#include <DallasTemperature.h>
 
OneWire oneWire(A0);// вход для датчиков 18b20
DallasTemperature t(&oneWire);
 
void setup() {
  Serial.begin(9600);
  t.begin();
}
 
void loop() {
  t.requestTemperatures();
 
  for (int i = 0; i < t.getDeviceCount(); i++){ 
    Serial.print("Sensor ");
    Serial.print(i);
    Serial.print(": ");
    Serial.print(t.getTempCByIndex(i)); 
    Serial.println("C"); 
  } 
  Serial.println();
  delay(1000);
}

Для вывода на индикатор LCD 1602 можно использовать следующий скетч:

#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h> 
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);// RS,E,D4,D5,D6,D7
OneWire oneWire(A0);// вход для датчиков 18b20
DallasTemperature t(&oneWire);
 
void setup() {
  lcd.begin(16,2);
  t.begin();
}
 
void loop() {
  t.requestTemperatures();
    lcd.setCursor(1,0);lcd.print("t1 = "); 
    lcd.print(t.getTempCByIndex(0)); // датчик № 1
    lcd.print(char(223)); lcd.print("C"); 
 
    lcd.setCursor(1,1);lcd.print("t2 = ");
    lcd.print(t.getTempCByIndex(1)); // датчик № 2
    lcd.print(char(223)); lcd.print("C"); 
 
  delay(1000);
}

DallasTemperature.h

OneWire.h

Comments

  1. Здравствуйте. Собрал подобный термометр. Использовал один датчик 18в20. С дисплеем 1602. Вторую часть скетча просто не прописывал Работает, но с погрешностью. Контролировал по двум ртутным термометрам. Температура тела 36,7 градусов. На дисплее 36, 04. Датчик ничем не закрыт, контакт с телом прямой. Как програмно устранить погрешность в показаниях? С ув. Александр.

    1. Здравствуйте! Укажите максимальную битность датчика добавив строку в раздел void setup():
      t.setResolution(12);//12 бит

      если не поможет, то это погрешность самого датчика, можно только ввести поправку:
      t.getTempCByIndex(0)+0.64; или некий коэффициент t.getTempCByIndex(0)*1,0001

  2. Спасибо. Внесение поправки в скетч помогло. Опытным путём установил разницу в показаниях и сделал соответствующую поправку. Всё работает.

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

Войти с помощью: