Вывод температуры и влажности DTH11 на смартфон через сеть

В этом примере покажем, как при помощи сервиса RemoteXY легко вывести на экран смартфона или планшета показания датчика DTH11: температуру и влажность. Датчик подключается к контроллеру Arduino, который передает показания датчика по локальной сети на смартфон. На смартфоне необходимо установить мобильное приложение RemoteXY. В качестве модуля связи в данном примере использован Ethernet W5100 шильд для Arduino. Однако вы можете выбрать наиболее подходящий для вас модуль связи, который поддерживается сервисом RemoteXY, например Bluetooth или Wi-Fi.

Для реализации проекта вам понадобится:

  • контроллер Arduino UNO;
  • Ethernet W5100 шильд;
  • датчик DTH11.

Ethernet W5100 шильд соединяется с Arduino, разместив их одну над другой. Необходимо обеспечить подключение Ethernet шильда к локальной сети.

Выход датчика подключен к контакту 2 платы Arduino. Питание датчика осуществляется от платы Arduino. Схема подключения датчика приведена на рисунке.

При помощи сервиса RemoteXY разрабатывается графический интерфейс, на котором размещены индикаторы температуры и влажности. Каждый индикатор представлен в виде текстового поля и линейного индикатора. В текстовом поле будет отображаться числовое представления температуры в градусах Цельсия и влажности в процентах. Линейный индикатор будет дополнять числовое значение.

Линейный индикатор температуры состоит из двух индикаторов, отдельно для положительной температуры красного цвета и отрицательной температуры синего цвета. Для индикатора отрицательной температуры установлен признак центра шкалы с правой стороны, это позволит заполнять индикатор начиная справа при увеличении отрицательной температуры.

Шкала влажности имеет зеленый цвет.

Для удобства можно переопределить имена элементов интерфейса. Эти имена в дальнейшем будут назначены переменным в исходном коде интерфейса. На рисунке изображен пример графического интерфейса.

Так же в редакторе RemoteXY необходимо настроить конфигурацию проекта, установив способ связи Ethernet и выбрав модуль связи Ethernet W5100 шильд.

После нажатия кнопки «Получить исходный код» необходимо скачать код реализации интерфейса. Загруженный исходный код вы можете скомпилировать и загрузить в Arduino. Вы уже сможете подключиться к интерфейсу со смартфона, используя приложение RemoteXY. Однако интерфейс еще не показывает данные температуры и влажности. Далее нам предстоит доработать код и интегрировать в интерфейс нашу задачу — опрос датчика и передачу полученных данных для отображения.

Для опроса датчика DTH-11 используется библиотека "DHT.h". Скачать актуальную версию библиотеки можно по ссылке. В код проекта добавляем подключение этой библиотеки. Подключаем и настраиваем датчик на контакт 2 Arduino тем же самым способом, которым рекомендует это делать библиотека.

Опрос датчиков и преобразование данных для отображения в графическом интерфейсе выполняется в каждом цикле функции loop(). Ниже приведен код опроса датчика.


  float temp = dht.readTemperature();  
  float hum = dht.readHumidity();

Преобразование данных с датчика в текстовую строку для отображения в графическом интерфейсе выполняется при помощи функции dtostrf из стандартной библиотеки.


  dtostrf(temp, 0, 1, RemoteXY.text_temp);
  dtostrf(hum, 0, 1, RemoteXY.text_hum);

Следующий код преобразует данные датчика для отображения на линейном индикаторе влажности.


  RemoteXY.level_hum = hum;

Код для отображения температуры на двух линейных индикаторах выглядит немного сложнее. В зависимости от знака измеренной температуры задействуется один из индикаторов, в то время как на другой подается 0. Если температура равна нулю, тогда на оба индикатора подаем 0.


  if (temp<0) {
    RemoteXY.level_temp_up = 0;
    RemoteXY.level_temp_down = min (-temp*2,100);
  }
  else if (temp>0) {
    RemoteXY.level_temp_up = min(temp*2,100);
    RemoteXY.level_temp_down = 0;
  }
  else {
    RemoteXY.level_temp_up = 0;
    RemoteXY.level_temp_down = 0;
  }

Ниже приведен полный код скетча. Вы можете скопировать его в IDE Arduino, скомпилировать и загрузить в контроллер. Не забудьте установить библиотеку RemoteXY для Arduino IDE.


//////////////////////////////////////////////
//        RemoteXY include library          //
//     use  library  version 2.1.3 or up    //
//   use ANDROID app version 3.4.1 or up    //
//////////////////////////////////////////////

/* RemoteXY select connection mode and include library */
#define REMOTEXY_MODE__W5100_SPI
#include <Ethernet.h>
/* Ethernet shield used pins: 10(SS) */
#include <SPI.h>
/* SPI interface used pins: 11(MOSI), 12(MISO), 13(SCK) */

#include <RemoteXY.h>

/* RemoteXY connection settings */
#define REMOTEXY_ETHERNET_MAC "DE:AD:BE:EF:EF:ED"
#define REMOTEXY_SERVER_PORT 6377


/* RemoteXY configurate  */
unsigned char RemoteXY_CONF[] =
  { 0,25,88,0,4,5,67,4,53,14
  ,30,6,0,11,67,4,53,34,30,6
  ,0,11,66,193,15,21,34,4,6,66
  ,129,49,21,34,4,1,66,129,15,41
  ,68,4,4,129,0,14,14,38,6,0
  ,84,101,109,112,101,114,97,116,117,114
  ,101,58,0,129,0,15,34,28,6,0
  ,72,117,109,105,100,105,116,121,58,0
  ,129,0,44,25,10,6,0,48,194,176
  ,67,0 };
  
/* this structure defines all the variables of your control interface */
struct {

    /* output variable */
  char text_temp[11];  /* string end zero UNICODE */
  char text_hum[11];  /* string end zero UNICODE */
  signed char level_temp_down; /* =0..100 level position */
  signed char level_temp_up; /* =0..100 level position */
  signed char level_hum; /* =0..100 level position */

    /* other variable */
  unsigned char connect_flag;  /* =1 if wire connected, else =0 */

} RemoteXY;

/////////////////////////////////////////////
//           END RemoteXY include          //
/////////////////////////////////////////////

#include "DHT.h"
#define DHTPIN 2
DHT dht(DHTPIN, DHT11);

void setup() 
{
  RemoteXY_Init (); 
  

  // TODO you setup code
  
}

void loop() 

  RemoteXY_Handler ();
  
  

  // TODO you loop code
  // use the RemoteXY structure for data transfer
  float temp = dht.readTemperature();  
  float hum = dht.readHumidity();
  dtostrf(temp, 0, 1, RemoteXY.text_temp);
  dtostrf(hum, 0, 1, RemoteXY.text_hum);
  
  if (temp<0) {
    RemoteXY.level_temp_up = 0;
    RemoteXY.level_temp_down = min (-temp*2,100);
  }
  else if (temp>0) {
    RemoteXY.level_temp_up = min(temp*2,100);
    RemoteXY.level_temp_down = 0;
  }
  else {
    RemoteXY.level_temp_up = 0;
    RemoteXY.level_temp_down = 0;
  }
  RemoteXY.level_hum = hum;
}

Для подключения к Arduino со смартфона или планшета необходимо использовать мобильное приложение RemoteXY. В приложении выбирается вариант соединения Net. В открывшемся окне необходимо указать IP адрес, который был выдан Ethernet шильду DHCP сервером вашего роутера. Этот IP адрес можно узнать из web-панели настройки роутера, из таблицы подключенных сетевых устройств. Устройство можно идентифицировать по MAC адресу, который был задан в скетче.

Если роутер, в сеть которого подключен построенный датчик, имеет подключение к интернету по белому или динамическому IP адресу глобальной сети интернет, в этом случае имеется возможность реализовать просмотр температуры и влажности из любой точки планеты, где имеется интернет. В самом роутере необходимо настроить виртуальный сервер, который откроет внешний порт и перенаправит запросы на внутренний IP адрес и порт вашего устройства. В мобильном приложении при подключении указывается внешний IP адрес вашего роутера.

Если у вас динамический адрес, это дополнительно потребует использования одного из сервисов динамических адресов, например DynDNS. Настройка использования данного сервиса поддерживается большинством моделей роутеров. Многие производителей роутеров предоставляют собственный подобный сервис, например сервис DLink расположен по адресу dlinkddns.com. В мобильном приложении при подключении вместо IP адреса необходимо указать URL вашего динамического адреса.