مستندات ویرالینک

ارسال دما توسط ESP8266 و DHT11

ویرالینک اولین پلتفرم ابری اینترنت اشیا عمومی در ایران است که به شما امکان نظارت و کنترل دستگاه های اینترنت اشیا را می دهد. هم برای استفاده شخصی و هم برای استفاده قابل استفاده است. اگر این اولین تجربه شما با این پلتفرم است، توصیه می‌کنیم صفحه «ویرالینک چیست» و «راهنمای شروع کار» را مرور کنید.

این آموزش نحوه جمع آوری مقادیر دما و رطوبت تولید شده توسط سنسور DHT11 نشان می‌دهد. داده های جمع آوری شده از طریق MQTT به سرور ویرالینک برای ذخیره سازی و نمایش هدایت می شوند. هدف از این برنامه نشان دادن API جمع آوری داده های ویرالینک است.

شما می توانید از تمامی ماژول ها و بردهای توسعه که برپایه ESP8266 می باشند استفاده کنید. برای مثال مدل ماژول های ESP07, ESP07S, ESP12E, ESP12F, ESP12S, ESP14 و برد های توسعه ای از برندهایی مانند Wemos, Nodemcu, TTGO استفاده کنید. ما در این آموزش از Wemos D1 mini استفاده خواهیم کرد.

سنسور DHT11 به ESP8266 و همزمان ESP8266 به شبکه WiFi متصل می شود.ESP8266 داده ها را از طریق پروتکل MQTT با استفاده از کتابخانه ViraLink-MQTT-Client برای آردوینو به سرور ویرالینک منتقل می کند. داده ها با استفاده از داشبورد داخلی قابل تنظیم نشان داده می شوند. برنامه ای که در ESP8266 اجرا می شود با استفاده از Arduino SDK نوشته شده است که کاملاً ساده و قابل درک است.

پس از تکمیل این نمونه/آموزش، داده های حسگر خود را در داشبورد زیر مشاهده خواهید کرد.

لیست سخت افزارها #

  • Wemos D1 mini یا هر برد توسعه مبتنی بر ESP8266
wemos-d1-mini-pinout
  • سنسور دما و رطوبت DHT11 یا DHT21 یا DHT22
dht22-pinout
  • مقاومت ( بین 4.7k و 10k – در صورت استفاده از ماژول DHT نیازی به استفاده از ماژول نمی باشد).
  • بردبرد ( breadboard )
  • مقداری سیم جامپر

برنامه ESP8266 #

در اینجا ما برای کدنویسی میکروکنترلر از Arduino IDE استفاده خواهیم کرد. در این آموزش برای راحتی کار از کتابخانه اختصاصی ویرالینک ViraLink-MQTT-Client برای پروتکل MQTT استفاده خواهیم کرد. توجه کنید که این کتابخانه شامل کتابخانه های مختلفی مانند PubSubClient و ArduinoJson که برای اجرای پروژه لازم است. شما میتوانید با مطالعه MQTT API با نحوه کار پروتکل MQTT ویرالینک بیشتر آشنا شوید.

WeMos D1 mini Esp8266 DHT11 Wiring
ESP8266 PinDHT Pin
5VVCC
GNDGND
D5Data

در نهایت، یک مقاومت (بین 4.7K تا 10K) بین پین شماره 1 و 2 VCC و Data سنسور DHT قرار دهید.

ثبت نام در ویرالینک #

برای ثبت نام به دکمه ورود در گوشه سمت چپ بالا را بزنید.

زبان ویرالینک با زبان پیش فرض مرورگر شما تنظیم می شود و در صورت نیاز به تغییر زبان (فارسی/انگلیسی) به پروفایل خود در گوشه سمت راست بالا مراجعه نمایید. آموزش ها بر اساس زبان فارسی خواهد بود.

تعریف دستگاه #

به بخش “دستگاه ها” بروید. روی دکمه “+” کلیک کنید و دستگاهی با نام “ESP8266 Demo Device” ایجاد کنید.

افزودن دستگاه به پلتفرم اینترنت اشیا ویرالینک

پس از ایجاد دستگاه، جزئیات آن را باز کنید و توکن دسترسی تولید شده به صورت خودکار را از قسمت «کپی توکن دسترسی» کپی کنید. لطفاً این رمز دستگاه را ذخیره کنید. بعداً به عنوان $ACCESS_TOKEN استفاده خواهد شد.

جزئیات دستگاه در پلتفرم اینترنت اشیا ویرالینک

برنامه نویسی ESP8266 #


اگر قبلاً با اصول برنامه نویسی ESP8266 با استفاده از Arduino IDE آشنا هستید، می توانید مرحله زیر را رد کنید.

آماده‌سازی Arduino IDE برای ESP8266 #

برای شروع برنامه نویسی دستگاه ESP8266 به نصب آردوینو IDE و تمامی نرم افزارهای مرتبط نیاز دارید.

Arduino IDE را دانلود و نصب کنید.

پس از راه اندازی آردوینو، Prefrences را از منوی ‘file’ باز کنید.

آدرس زیر را به فیلد Additional board managers URL اضافه نمایید.

http://arduino.esp8266.com/stable/package_esp8266com_index.json

با دکمه OK صفحه را ببندید.

اکنون می توانیم با استفاده از board manager، برد ESP8266 را اضافه کنیم.

افزودن esp8266 به آردوینو

در ابزارهای منو روی گزینه منو Board:… کلیک کنید. در آنجا اولین گزینه “Board Manager” را خواهید یافت.

3 حرف ESP را در نوار جستجو تایپ کنید. ” esp8266 by ESP8266 Community ” را پیدا کرده و روی آن کلیک کنید . بر روی install کلیک کنید و برای دانلود برد صبر کنید.

نصب برد esp8266 در آردوینو

توجه داشته باشید که این آموزش با “ esp8266 by ESP8266 Community ” نسخه ۳.۰.۲ تست شده است.

در منوی Tools Board چند برد جدید به زیرمجموعه ESP8266 Boards اضافه شده است.

“LOLIN(Wemos) D1 R2 & mini” یا هر بردی که استفاده می کنید را انتخاب کنید.

در منوی Tools، پورت مربوطه را انتخاب کنید. نمایشگر سریال را باز کنید (با فشار دادن CTRL-Shift-M یا از منوی Tools). شبیه سازی کلید را روی “Both NL & CR” و سرعت را روی 115200 baud تنظیم کنید. این را می توان در پایین صفحه ترمینال تنظیم کرد.

کتابخانه‌های آردوینو را نصب کنید #

Arduino IDE را باز کنید و به Sketch -> Include Library -> Manage Libraries بروید. کتابخانه زیر را پیدا و نصب کنید:

ViraLink-MQTT-Client

برنامه را آماده و آپلود کنید #

#include <Arduino.h>

#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>

#define DHTPIN 5     // Digital pin connected to the DHT sensor 

// Uncomment the type of sensor in use:
#define DHTTYPE    DHT11     // DHT 11
//#define DHTTYPE    DHT22     // DHT 22 (AM2302)
//#define DHTTYPE    DHT21     // DHT 21 (AM2301)

DHT_Unified dht(DHTPIN, DHTTYPE);

uint32_t delayMS;

#define VIRALINK_DEBUG // enable debug on SerialMon
#define SerialMon Serial // if you need DEBUG SerialMon should be defined

#define WIFI_SSID "xxxxxxx"
#define WIFI_PASSWORD "xxxxxxx"

#define VIRALINK_TOKEN "xxxxxxx"
#define VIRALINK_MQTT_URL "console.viralink.io"
#define VIRALINK_MQTT_PORT 1883

#include "viralink.h"

#if defined(ESP32)
#include "WiFi.h"
#elif defined(ESP8266)
#include "ESP8266WiFi.h"
#endif

MQTTController mqttController;
WiFiClient client;

// store last uptime Milliseconds that we sent telemetry data
uint64_t lastSentTelemetryMs;

// store last uptime Milliseconds that we request attributes values
uint64_t lastRequestedAttributesMs;

bool on_message(const String &topic, DynamicJsonDocument json) {

    Serial.println("New Message: ");
    Serial.print("Topic: ");
    Serial.println(topic);
    Serial.print("Data [json]: ");
    Serial.println(json.as<String>());

    return true;
}

void sendTimeSeriesData() {
    Serial.println("Sending TimeSeries Data");
    DynamicJsonDocument data(100);

    // Get temperature event and print its value.
    sensors_event_t event;
    dht.temperature().getEvent(&event);
    if (isnan(event.temperature)) {
      Serial.println(F("Error reading temperature!"));
    }
    else {
      data["temperature"] = event.temperature;
    }
    // Get humidity event and print its value.
    dht.humidity().getEvent(&event);
    if (isnan(event.relative_humidity)) {
      Serial.println(F("Error reading humidity!"));
    }
    else {
      data["relative_humidity"] = event.relative_humidity;
    }
    
    mqttController.sendTelemetry(data);

}

void sendAttributesData() {
    DynamicJsonDocument data(100);

    sensor_t sensor;
    dht.temperature().getSensor(&sensor);
    data["Temperature Sensor Type"] = sensor.name;
    data["Temperature Driver Version"] = sensor.version;
    data["Temperature Unique ID"] = sensor.sensor_id;
    data["Temperature Max Value"] = sensor.max_value;
    data["Temperature Min Valu"] = sensor.min_value;
    data["Temperature Resolution"] = sensor.resolution;

    dht.humidity().getSensor(&sensor);
    data["Humidity Sensor Type"] = sensor.name;
    data["Humidity Driver Version"] = sensor.version;
    data["Humidity Unique ID"] = sensor.sensor_id;
    data["Humidity Max Value"] = sensor.max_value;
    data["Humidity Min Valu"] = sensor.min_value;
    data["Humidity Resolution"] = sensor.resolution;

    // Set delay between sensor readings based on sensor details.
    delayMS = sensor.min_delay / 1000;
    
    mqttController.sendAttributes(data);
}

void setup() {

    Serial.begin(115200);

    // Initialize device.
    dht.begin();
    
    WiFi.mode(WIFI_STA);
    WiFi.begin(WIFI_SSID, WIFI_PASSWORD);

    Serial.println();
    while (WiFi.status() != WL_CONNECTED) {
        Serial.print(".");
        delay(50);
    }

    Serial.println("Connected to WiFi!");
    Serial.println(WiFi.localIP());

    mqttController.init();
    // sendSystemAttributes send some basic info to the platform like upTime, Free Heap
    mqttController.sendSystemAttributes(true);
    mqttController.connect(client, "esp", VIRALINK_TOKEN, "", VIRALINK_MQTT_URL, VIRALINK_MQTT_PORT, on_message,
                           nullptr, []() {
                Serial.println("Connected To Platform");
            });

    // this function add message to queue. After the MQTT connection occur the message will send automatically
    sendAttributesData();
}

void loop() {
    mqttController.loop();

    // send telemetry data each delayMS second
    if ((Uptime.getMilliseconds() - lastSentTelemetryMs) > delayMS) {
        lastSentTelemetryMs = Uptime.getMilliseconds();
        sendTimeSeriesData();
    }

}

برای کار با هر سنسوری میتوانید مثال mqtt_working_with_telemetry که در پوشه File->Examples->ViraLink-MQTT-Client هست را باز کنید و نسبت به تجهیزاتی که دارید تغییراتی بدهید.

مقادیر زیر را تعیین کنید.

نام وای فای : WIFI_SSID

رمز وای فای :‌WIFI_PASSWORD

توکن دسترسی دستگاه : VIRALINK_TOKEN

Wemos D1 mini را به رایانه شخصی متصل کنید و پورت مربوطه را در Arduino IDE انتخاب کنید. با استفاده از دکمه “Upload” طرح خود را کامپایل و در دستگاه آپلود کنید.

پس از آپلود و شروع برنامه، سعی می‌کند با استفاده از کلاینت mqtt به ویرالینک متصل شود منتظر دستورات باشد.

نتایج لحظه ای سنسور دما و رطوبت در برگه دستگاه زبانه «آخرین تلمتری» ثبت می شود و همچنین برای مشاهده و رسم نمودار میتوانید از داشبورد ها نمودار ها و جداول تلمتری را ایجاد کنید.

DHT11 Telemetry