● 4.2. Подключение цифровой датчика температуры DS18B20 (RI002)

Опубликовано: 23.01.2018

Мечта каждого человека - обеспечить максимальный комфорт и уют в своем доме. И первый шаг на пути к цели - создание оптимальной температуры в жилище - загородном доме, даче или квартире. "Умный дом" включает в себя полноценную климатическую систему. И первый шаг на пути к этому – получение реальных данных значения температуры.
Для измерения температуры "умного" дома в набор включен датчик температуры RI002 (рис. 4.7). Это хорошо известный цифровой датчик температуры DS18B20 водонепроницаемом корпусе из нержавейки. Приемущества водонепроницаемого корпуса – возможность измерить температуру в неблагоприятной для микросхем среде: в почве, на дожде или даже в аквариуме.
ri002
Рис. 4.7. Датчик температуры RI002

Этот датчик температуры основан на популярной микросхеме DS18B20. Он позволяет определить температуру окружающей среды в диапазоне от -55°C до +125°C и получать данные в виде цифрового сигнала с 12-битным разрешением по 1-Wire протоколу. Этот протокол позволит подключить огромное количество таких датчиков, используя всего 1 цифровой порт контроллера, и всего 2 провода для всех датчиков: земли и сигнала. В этом случае применяется так называемое «паразитное питание», при котором датчик получает энергию прямо с линии сигнала. Каждый датчик имеет уникальный прошитый на производстве 64-битный код, который может использоваться микроконтроллером для общения с конкретным сенсором на общей шине.
Датчик температуры RI002 изготавливается с тремя выходными контактами (черный – GND, красный – Vdd и белый – Data).
Рассмотрим подключение модуля датчика температуры RI002 к плате Arduino Mega и модулю NodeMcu ESP8266.

4.2.1. Подключение датчика RI002 к плате Arduino Mega

Для подключение модуля датчика DS18B20 к плате Arduino Mega используется однопроводной интерфейс 1-Wire. Питание для датчика берем также с платы Arduino. 1-Wire вывод датчика необходимо подтянуть к питанию резистором номиналом 4.7 кОм. Схема соединений представлена на рис. 4.8.


Рис. 4.8. Схема подключений DS18B20 к Arduino Mega

Для считывания данных датчика DTH22 с помощью Arduino, существует готовая библиотека DHT. Для её установки необходимо скопировать папку с файлами библиотеки  в директорию libraries своего Arduino IDE.
Загрузим на плату Arduino Mega скетч получения данных с датчика температуры DS18B20 и вывода в последовательный порт Arduino.  Получение данных влажности оформим в виде отдельной процедуры get_data_ds18b20(). Содержимое скетча представлено в листинге 4.3.
Листинг 4.3

#define INTERVAL_GET_DATA 2000  // интервала измерений, мс
#define DS18B20PIN 23           // пин подключения контакта DATA
// подключение библиотеки OneWire
#include <OneWire.h>
// создание объекта OneWire
OneWire ds(DS18B20PIN);

// переменная для интервала измерений
unsigned long millis_int1=0;

void setup(void) {
   // запуск последовательного порта
   Serial.begin(9600);
}

void loop(void) {
   if(millis()-millis_int1 >= INTERVAL_GET_DATA) {
      // получение данных c DS18B20
      float temp = get_data_ds18b20();
      // вывод в монитор последовательного порта
      if(temp<100) {
        Serial.print("temp=");Serial.println(temp);
      }
      // старт интервала отсчета
      millis_int1=millis();
   }
}
// получение данных с датчика DS18B20
float get_data_ds18b20()  {
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];
  int Temp;
  float fTemp=0.0;
  
  if ( !ds.search(addr)) {
    Serial.print("No more addresses.\n");
    ds.reset_search();
    return 999;
  }
  // вывод в монитор уникального адреса 1-Wire устройства
  for( i = 0; i < 8; i++)  {
    Serial.print(addr[i], HEX);
    Serial.print(" ");
  }
  if ( OneWire::crc8( addr, 7) != addr[7]) {
    Serial.print("CRC is not valid!\n");
    return 999;
  }
  if ( addr[0] != 0x28) {
    Serial.print("Device is not a DS18S20 family device.\n");
    return 999;
  }
  ds.reset();
  ds.select(addr);
  // запустить конвертацию температуры датчиком
  ds.write(0x44,1);
  delay(750); // ждем 750 мс
  present = ds.reset();
  ds.select(addr);
  ds.write(0xBE); 
  // считываем ОЗУ датчика
  for ( i = 0; i < 9; i++) { 
    data[i] = ds.read();
  }
  Temp=((data[1]<<8)+data[0]);
  // перевод в значение float
  fTemp=1.0*Temp/16+(float(Temp%16))*1.0/16;

  return fTemp;
}



Загрузим скетч на плату Arduino Mega, откроем монитор последовательного порта и видим вывод данных, получаемых с датчика температуры RI002 (рис. 4.9).


 
Рис. 4.9. Вывод данных RI002 в монитор последовательного порта

Скачать данный скетч можно на сайте www.arduino-kit.ru по ссылке .

4.1.2. Подключение датчика DHT22 к модулю NodeMCU ESP8266

Теперь рассмотрим подключение датчика DS18B20 к модулю NodeMcu ESP8266. 1-Wire вывод датчика необходимо подтянуть к питанию резистором номиналом 4.7 кОм. Схема соединений представлена на рис. 4.10.


 
Рис. 4.10. Схема подключений DS18B20 к NodeMcu ESP8266

Для считывания данных датчика DS18B20 с помощью ESP8266 будем использовать  библиотеку OneWire.  Библиотека OneWire должна быть адаптирована для ESP8266 (внесены изменения в OneWire.h) . Содержимое скетча представлено в листинге 4.4.
Листинг 4.4

// константы
#define DSD18B20PIN 5      // пин подключения контакта DATA (D1, GPIO5)
#define INTERVAL_GET_DATA 2000  // интервала измерений, мс

// подключение библиотеки
// http://www.pjrc.com/teensy/td_libs_OneWire.html
#include <OneWire.h>
// создание экземпляра OneWire
OneWire  ds(DSD18B20PIN); 
// переменная для интервала измерений
unsigned long millis_int1=0; 

void setup(void) {
  // запуск последовательного порта
  Serial.begin(9600);
}

void loop() {
   if(millis()-millis_int1 >= INTERVAL_GET_DATA) {
      // получение данных c DS18B20
      float temp = get_data_ds18b20();
      // вывод в монитор последовательного порта
      if(temp<100) {
        Serial.print("temp=");Serial.println(temp);
      }
      // старт интервала отсчета
      millis_int1=millis();
      // старт интервала отсчета
      millis_int1=millis();
   }
}

float get_data_ds18b20(void) {
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float fTemp;
  
  if ( !ds.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(250);
    return 999;
  }
  
  Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return 999;
  }
  Serial.println();
 
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      Serial.println("  Chip = DS18S20");  // or old DS1820
      type_s = 1;
      break;
    case 0x28:
      Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
      Serial.println("  Chip = DS1822");
      type_s = 0;
      break;
    default:
      Serial.println("Device is not a DS18x20 family device.");
      return 999;
  } 

  ds.reset();
  ds.select(addr);
  // запустить конвертацию температуры датчиком
  ds.write(0x44, 1);          
  delay(1000);     // ждем 750 мс
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);       
  // считываем ОЗУ датчика
  for ( i = 0; i < 9; i++) {           
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  // перевод полученных данных в значение температуры
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; 
    if (data[7] == 0x10) {
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw & ~7;  
    else if (cfg == 0x20) raw = raw & ~3; 
    else if (cfg == 0x40) raw = raw & ~1; 
  }
  fTemp = (float)raw / 16.0;

  return fTemp;
}



Загрузим скетч на модуль NodeMcu ESP8266, откроем монитор последовательного порта и видим вывод данных, получаемых с датчика DS18B20 (рис. 4.11)


 
Рис. 4.11. Вывод данных DS18B20 в монитор последовательного порта

Скачать данный скетч можно на сайте www.arduino-kit.ru по ссылке


Главное меню

Каталог

Полезные ссылки

Цена
от
до