ThingSpeak представляет собой платформу Интернета вещей, которая позволяет агрегировать, визуализировать и анализировать потоки данных в реальном времени в облаке. Вы можете отправлять данные в ThingSpeak со своих устройств, создавать мгновенную визуализацию данных в реальном времени и отправлять оповещения.

В данном проекте мы попытаемся подружить ESP8266 с платформой Thingspeak. Мы подключим ESP8266 к DHT11 и отправим данные о температуре и влажности с помощью MQTT на платформу Thingspeak через Интернет.
Платформа в первую очередь нацелена на проекты Интернета вещей и аналитику данных с использованием визуальных элементов. Чтобы начать пользоваться бесплатными услугами Thingspeak, вам сначала необходимо зарегистрироваться, используя свой идентификатор электронной почты, как только это будет сделано вы увидите следующую страницу.

Теперь рассмотрим некоторые термины, которые могут помочь вам лучше понять принципы Thingspeak и сделать вашу работу с такими веб-серверами более удобной.
Ключ API: для обеспечения безопасности данных и предотвращения случайного чтения/записи данных кем-либо на ваш сервер должен быть какой-то тип защиты/пароля, и ключ API предназначен для этого. Ключ API – это длинный буквенно-цифровой ключ, который необходим для чтения/передачи данных на сервер.
Канал: канал в Thingspeak – это программный аналог аппаратного устройства IoT, которое вы подключаете к Thingspeak, в нашем случае ESP8266 будет использовать один весь канал нашей полосы пропускания. В бесплатном аккаунте Thingspeak у вас может быть максимум 4 канала.
Поле: каждый канал имеет 8 полей. Поле является переменной и хранит/разделяет тип данных, например, когда мы отправляем температуру и влажность с нашего устройства на сервер, оба параметра будут использовать по одному полю для каждого канала.
Скопируйте и сохраните ключ API записи, он понадобится нам позже при тестировании связи с Thingspeak.

Для организации связи нам также потребуется MQTT. MQTT – это облегченный протокол передачи данных, который мы можем использовать для тех же целей, для которых мы используем Thingspeak. Mosquitto – это организация, бесплатно предоставляющая сервер/брокер MQTT для тестовых целей. Больше информации можно найти на Mosquitto.org. В данной статье мы не будем углубляться в принципы работы MQTT.

Теперь перейдем непосредственно к тестированию.
Подключите DHT11 к выводе D0 модуля ESP8266, не забудьте и про линии питания. После этого с помощью Arduino IDE загрузите следующий код для записи информации в thingspeak.
#include <dht.h>
#include <ESP8266WiFi.h>
String api_key = "YOUR API KEY"; // Введите свой ключ API записи из ThingSpeak
const char *ssid = "YOUR WIFI SSID"; // замените на ваш Wi-Fi ssid и ключ wpa2
const char *pass = "YOUR WIFI PASSWORD"; // замените на ваш пароль Wi-Fi
const char* server = "api.thingspeak.com";
#define DHTPIN 0
dht DHT;
WiFiClient client;
void setup()
{
Serial.begin(115200);
delay(10);
pinMode(2, OUTPUT);
digitalWrite(2, 0);
Serial.println("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
}
void loop()
{
int chk = DHT.read11(DHTPIN);
float h = DHT.humidity;
float t = DHT.temperature;
if (isnan(h) || isnan(t))
{
Serial.println("Failed to read from DHT sensor!");
return;
}
if (client.connect(server,80)) // "184.106.153.149" или api.thingspeak.com
{
String data_to_send = api_key;
data_to_send += "&field1=";
data_to_send += h;
data_to_send += "&field2=";
data_to_send += t;
data_to_send += "\r\n\r\n";
client.print("POST /update HTTP/1.1\n");
client.print("Host: api.thingspeak.com\n");
client.print("Connection: close\n");
client.print("X-THINGSPEAKAPIKEY: " + api_key + "\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: ");
client.print(data_to_send.length());
client.print("\n\n");
client.print(data_to_send);
delay(1000);
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" degrees Celcius, Humidity: ");
Serial.print(h);
Serial.println("%. Send to Thingspeak.");
}
client.stop();
Serial.println("Waiting...");
delay(10000);
}
Не забудьте внести в код API платформы. Теперь после успешной загрузки кода в последовательном мониторе вы получите сообщения, как на следующем изображении. Модуль сначала подключается к Wi-Fi, а затем отправляет данные на сервер после чтения параметров из DHT11.

На странице Thingspeak вы сможете увидеть записи, как на следующем изображении.

Если вы хотите пойти другим путем и управлять вещами из Thingspeak с помощью ESP8266 и читать данные сервера, вы можете использовать следующий код.
#include "ThingSpeak.h"
#include <ESP8266WiFi.h>
const char* ssid = "SSID"; // Замените на имя своего Wi-Fi
const char* password = "PASSWORD; // Замените своим паролем Wi-Fi
unsigned long channel =742359; // Замените на свой собственный идентификатор канала учетной записи ThingSpeak
//1,2 и 3 - поля каналов. Вам не нужно ничего менять, если вы следуете этому руководству. Однако вы можете изменить это в соответствии с вашим приложением
unsigned int led1 = 1;
unsigned int led2 = 2;
unsigned int led3 = 3;
WiFiClient client;
void setup() {
Serial.begin(115200);
delay(100);
pinMode(D1, OUTPUT);
pinMode(D2, OUTPUT);
pinMode(D3, OUTPUT);
digitalWrite(D1, 0);
digitalWrite(D2, 0);
digitalWrite(D3, 0);
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
Serial.print("Netmask: ");
Serial.println(WiFi.subnetMask());
Serial.print("Gateway: ");
Serial.println(WiFi.gatewayIP());
ThingSpeak.begin(client);
}
void loop() {
int led_1 = ThingSpeak.readFloatField(channel, led1);
int led_2 = ThingSpeak.readFloatField(channel, led2);
int led_3 = ThingSpeak.readFloatField(channel, led3);
if(led_1 == 1){
digitalWrite(D1, 1);
Serial.println("D1 is On..!");
}
else if(led_1 == 0){
digitalWrite(D1, 0);
Serial.println("D1 is Off..!");
}
if(led_2 == 1){
digitalWrite(D2, 1);
Serial.println("D2 is On..!");
}
else if(led_2 == 0){
digitalWrite(D2, 0);
Serial.println("D2 is Off..!");
}
if(led_3 == 1){
digitalWrite(D3, 1);
Serial.println("D3 is On..!");
}
else if(led_3 == 0){
digitalWrite(D3, 0);
Serial.println("D3 is Off..!");
}
Serial.println(led_1);
Serial.println(led_2);
Serial.println(led_3);
delay(5000);
}
© digitrode.ru