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