Статьи

Проект Internet Of Things: подключите Arduino к убидотам и Android — часть 1

Этот проект Интернета вещей исследует один важный аспект в IoT: как подключить Arduino к облачным платформам IoT, используя сетевой экран . Этот аспект важен, потому что можно хранить данные в облаке и затем анализировать их. Когда данные, такие как значения датчиков, находятся в облаке, можно получить к ним доступ с помощью смартфонов и удаленно управлять платой Arduino.

Этот проект состоит из двух частей:

  1. В первой части описывается, как собирать данные с датчиков, подключенных к плате Arduino, и отправлять эту информацию на облачную платформу, где она хранится.
  2. вторая часть описывает, как получить доступ к этой информации с помощью смартфона Android.

Для этого данные генерируются датчиком DHT11, который считывает температуру и влажность . В качестве облачной платформы IoT для хранения данных мы будем использовать платформу Ubidots . Датчик подключен к плате Arduino, которая использует экран Ethernet для подключения к сети . В этом проекте сетевой экран — Wiznet 5500 .

Обзор проекта

Обзор проекта показан ниже:

iot_ubidots

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

Строительство IoT проекта

Первым шагом является настройка эскиза Arduino и подключение проводов. Датчик DHT11 очень прост в использовании и может быть легко и быстро интегрирован с Arduino, кроме того, есть библиотека, которая помогает в разработке системы.

На рисунке ниже показана схема этого проекта:

ubidots_bb

В этом эскизе датчик DHT11 подключен к плате Arduino, которая, в свою очередь, использует экран Ethernet для подключения к сети для отправки данных.

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

Фрагмент ниже показывает эскиз Arduino для проверки датчика:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include "DHT.h"
#include <spi.h>
 
#define DHTPIN 2
#define DHTTYPE DHT11
 
DHT dht(DHTPIN, DHTTYPE);
 
void setup() {
  Serial.begin(9600);
  dht.begin();
}
 
void loop() {
  delay(50000);
  
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
 
  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.println(" *C ");
}

Следует помнить одну вещь — импортировать библиотеку DHT11 в вашу среду разработки Arduino. Запустив пример, вы должны получить температуру и влажность.

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

Ubidots предоставляет пример, который может быть полезен. В Arduino нам нужно разработать HTTP-клиент, который вызывает службу JSON, передавая данные, которые мы хотим хранить в облаке .

Ссылаясь на документацию Ubidots , необходимо создать токен аутентификации, который клиент должен отправить. Пожалуйста, прочитайте ниже, чтобы узнать больше, как создать токен.

В этом проекте IoT HTTP-клиент Arduino отправляет две переменные одновременно: температуру и влажность, поэтому URL-адрес для вызова:

1
http://things.ubidots.com/api/v1.6/collections/values

в то время как данные в формате JSON для отправки:

1
[{"variable": "varId", "value":val, "timestamp":timestamp}, {"variable": "vardId1", "value":val1, "timestamp":timestamp1}]

Вот эскиз Arduino для HTTP-клиента:

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include "DHT.h"
#include <spi.h>
#include <ethernet.h>
 
 
#define DHTPIN 2
#define DHTTYPE DHT11
 
// Ubidots Data
String tempVarId = "5656116076254219f78cad12";
String humVarId = "565611777625421b5e91a1ef";
String token = "aIk7lh3ipJGRdgAWOwJwDlPFwCdQu6uoLWZcGsMelXVAF62ycFsanB9Yywdk";
 
DHT dht(DHTPIN, DHTTYPE);
byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
 
char server[]="things.ubidots.com";
 
EthernetClient client;
IPAddress ip(192, 168, 1, 40); // Arduino IP Add
IPAddress myDns(8,8,8,8);
IPAddress myGateway(192,168,1,1);
 
void setup() {
  Serial.begin(9600);
  Serial.print("Here");
  dht.begin();
  // start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // try to congifure using IP address instead of DHCP:
   Ethernet.begin(mac,ip,myDns,myGateway);
  }
}
 
void loop() {
   
 
  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
 
  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.println(" *C ");
  save_value(t, h);
  delay(5000);
}
 
void save_value(float tempValue, float humValue)
{
  Serial.println("Sending data...");
  // if you get a connection, report back via serial:
  int num = 0;
  delay(2000);
   
  // Post single value to single var
  // String varString = "{\"value\":"+ String(tempValue) + "}";
  String varString = "[{\"variable\": \"" + tempVarId + "\", \"value\":" + String(tempValue) + "}";
  varString += ",{\"variable\": \"" + humVarId + "\", \"value\":" + String(humValue) + "}]";
  num = varString.length();
 
  Serial.println("Connecting...");
 
  if (client.connect(server,80))
  {
       //client.println("POST /api/v1.6/variables/"+tempVarId+"/values HTTP/1.1");
       //Serial.println("POST /api/v1.6/variables/"+tempVarId+"/values HTTP/1.1");
       client.println("POST /api/v1.6/collections/values HTTP/1.1");
       Serial.println("POST /api/v1.6/collections/values HTTP/1.1");
        
       client.println("Content-Type: application/json");
       Serial.println("Content-Type: application/json");
       client.println("Content-Length: "+String(num));
       Serial.println("Content-Length: "+String(num));
       client.println("X-Auth-Token: "+token);
       Serial.println("X-Auth-Token: "+token);
       client.println("Host: things.ubidots.com\n");
       Serial.println("Host: things.ubidots.com\n");
       client.print(varString);
       Serial.print(varString+"\n");
     
  }
  else
  {
    // if you didn't get a connection to the server:
    Serial.println("connection failed");
  }
 
boolean sta = client.connected();
    Serial.println("Connection ["+String(sta)+"]");
  if (!client.connected())
  {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
  }
   
  Serial.println("Reading..");
  while (client.available())
  {
    char c = client.read();
    Serial.print(c);
  }
  client.flush();
  client.stop();
 
}

Обратите внимание, что в строках 65 и 66 мы строим данные JSON для передачи в службу, используя переменные идентификаторы (см. Ниже, чтобы узнать, как получить идентификатор), а в строке 83 мы отправляем в заголовке токен аутентификации.

HTTP-клиент Arduino для Ubidots почти прочитан, пришло время настроить проект в Ubidots.

Теперь необходимо настроить проект на Ubidots, чтобы клиент Arduino мог отправлять данные. Это можно сделать с помощью веб-интерфейса Ubidots.

Необходимо создать две переменные:

  1. тот, который содержит значения температуры
  2. тот, который содержит значения влажности.

Прежде чем мы должны создать проект Ubidots:

ubidots_project_config

Как только проект настроен, мы можем определить наши переменные:

ubidots_variable

Мы делаем те же шаги для переменной влажности, а затем у нас есть панель инструментов:

ubidots_dashboard

Как видите, эти две переменные имеют два идентификатора, которые мы использовали ранее, когда создавали запрос JSON.

Идентификаторы этих переменных используются в эскизе Arduino:

1
2
3
4
5
...
// Ubidots Data
String tempVarId = "5656116076254219f78cad12";
String humVarId = "565611777625421b5e91a1ef";
...

Последний шаг — создание токена:

ubidots_authentication_token

После того, как переменные настроены, мы можем использовать их для отправки данных.

Запустив скетч, Arduino начинает отправлять данные в Ubidots. Одна из возможностей, предоставляемая Ubidots, — это возможность легко создавать панель инструментов. Например, для температуры мы можем создать простую панель инструментов для отображения данных, отправленных Arduino и DHT11:

ubidots_humidity_chart

ubidots_temperature_chart

Внизу настоящая плата Arduino, подключенная к DHT11 с экраном Ethernet.

arduino_dht11_sketch-мин

В этой первой части проекта «Интернет вещей» вы узнали, как подключить Arduino к облаку с помощью Ubidots и Ethernet-щита. Arduino считывает значения данных DHT11 и отправляет их убидотам.

В следующем посте вы узнаете, как читать эти значения со смартфона Android и как создавать диаграммы на смартфонах.