آموزش‌های کاربردیاینترنت اشیاء (IOT)بایگانی مطالبپروژه‌های ESP32

ارسال دیتا از سنسور DHT11 توسط ماژول ESP32 به Node-Red

در این مقاله قصد داریم ارسال دیتا از سنسور DHT11 توسط بلوتوث کم مصرف در ماژول ESP32 به Node-Red را آموزش دهیم. همراه ما باشید.

سنسور DHT11 و نحوه اتصال به ماژول ESP32

توسط سنسور DHT11 می توان اطلاعات مربوط به دما و رطوبت محیط مورد نظر را بصورت دقیق و کالیبر، اندازه گیری و بصورت سریال دریافت کرد. برای مشاهده لیست فروشندگان و قیمت سنسور DHT11 کلیک کنید.

ساخت مدار حساس به نور با مقاومت LDR

سنسور رطوبت DHT11 به دو بخش اصلی تقسیم می شود :

  • یک مقاومت گرمایی
  • یک سنسور رطوبت خازنی

برای دریافت خروجی دیجیتال نیز یک تبدیل کننده ی آنالوگ به دیجیتال درون این سنسور وجود دارد. ولتاژ عملیاتی و ورودی/خروجی این سنسور 3 تا 5 ولت و حداکثر جریان استفاده هنگام عملیات تبدیل 2/5 میلی آمپر است. مناسب برای خواندن رطوبت 20-95% با دقت 2-5% و خواندن دمای 0 تا 50 درجه با دقت 2 سانتی گراد می باشد.


ارسال دیتا از سنسور DHT11

جهت ارسال دیتا به Node-Red توسط بلوتوث کم مصرف نیاز به اقدام عمل خاصی در سرور (رزبری پای) نیست. نود مربوطه خود در نقش دیوایس گیرنده عمل می کند.

کد مورد نظر برای این پروژه برنامه Notify موجود در مثال های Arduino IDE کتابخانه BLE است. البته ما در این کد مطابق با پروژه خود تغییراتی ایجاد کرده ایم. به این کد کتابخانه های “DHT.h” و <iostream> و <string> را اضافه می کنیم. خروجی برنامه و شماتیک Node-Red در تصاویر زیر قابل مشاهده است.

#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
#include "DHT.h"
#include <iostream>
#include <string>

BLEServer* pServer = NULL;
BLECharacteristic* pCharacteristic = NULL;
bool deviceConnected = false;
bool oldDeviceConnected = false;
uint32_t value = 0;


#define DHTPIN 13 // DHT11 data pin
#define DHTTYPE DHT11 // sets the sensor type, in case DHT11

DHT dht (DHTPIN, DHTTYPE);

int Humidity;
int Temperature;


#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b" // UART service UUID
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"


class MyServerCallbacks: public BLEServerCallbacks {
void onConnect (BLEServer * pServer) {
deviceConnected = true;
};

void onDisconnect (BLEServer * pServer) {
deviceConnected = false;
}
};

void setup() {
Serial.begin(115200);
Serial.println(F("DHT11 test!"));

dht.begin();

// Create the BLE Device
BLEDevice::init("MyESP32");

// Create the BLE Server
pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks());

// Create the BLE Service
BLEService *pService = pServer->createService(SERVICE_UUID);

// Create a BLE Characteristic
pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_READ |
BLECharacteristic::PROPERTY_WRITE |
BLECharacteristic::PROPERTY_NOTIFY |
BLECharacteristic::PROPERTY_INDICATE
);

// Create a BLE Descriptor
pCharacteristic->addDescriptor(new BLE2902());

// Start the service
pService-> start ();

// Start advertising
BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
pAdvertising->addServiceUUID(SERVICE_UUID);
pAdvertising->setScanResponse(false);
pAdvertising->setMinPreferred(0x0); // set value to 0x00 to not advertise this parameter
BLEDevice::startAdvertising();
Serial.println("Waiting a client connection to notify...");
}

void loop () {
if (deviceConnected) {

float Humidity = dht.readHumidity();
float Temperature = dht.readTemperature();
// test if return is valid, otherwise something is wrong.
if (isnan (Temperature) || isnan (Humidity))
{
Serial.println ("Failed to read from DHT");
}
else
{

Serial.print ("Humidity:");
Serial.print (Humidity);
Serial.print ("% \ t ");
Serial.print ("Temperature:");
Serial.print (Temperature);
Serial.println ("* C");
}

char HumidityString [2];
char TemperatureString [2];
dtostrf (Humidity, 1, 2, HumidityString);
dtostrf (Temperature, 1, 2, TemperatureString);

char dhtDataString [50];
sprintf (dhtDataString, "% f,% f", Temperature, Humidity);
Serial.print ("*** Sent Data:");
Serial.print (dhtDataString);
Serial.println ("***");

pCharacteristic-> setValue (dhtDataString);
pCharacteristic-> notify (); // Send the value to the application!

}
delay (5000);
}

ارسال دیتا از سنسور DHT11

نکات مهم برنامه

در اینجا نکات مهمی که برای کد نویسی نیاز دارید را می توانید پیدا کنید:

# define DHTPIN 13
 #define DHTTYPE DHT11

با کد فوق پایه ای از ماژول ESP32 که دیتا را از سنسور دریافت می کند معرفی می کنیم. انتخاب این پایه (پین) دلخواه است. در خط دوم مدل سنسور معرفی می شود.

پس از اضافه کردن کتابخانه های مورد نیاز باید UUID هایی برای Service و Characteristic تعریف کنید.

# define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"

این دو UUID به صورت رندوم تولید شده اند. می توانید UUID دلخواه خود را با استفاده از این سایت بسازید.

class MyServerCallbacks: public BLEServerCallbacks }
void onConnect (BLEServer * pServer) }
deviceConnected = true;
{;
void onDisconnect (BLEServer * pServer) {
deviceConnected = false;
}
};

کلاس MyServerCallbacks در صورت اتصال کلاینت به سرور مقدار متغیر deviceConnected را true و در غیر این صورت مقدار آن را false می کند.

pServer = BLEDevice :: createServer();
pServer -> setCallbacks (new MyServerCallbacks ());

در بخش  setup، تنظیمات مورد نیاز برای راه اندازی سرور انجام می شود. ESP32 در حالت سرور شروع به کار می کند. با استفاده از دو خط فوق، سروری با نامی که تعریف کرده اید ساخته می شود.

BLEService *pService = pServer -> createService (SERVICE_UUID);

سپس سرویسی با UUID تعریف شده روی سرور ساخته می شود.

pCharacteristic = pService -> createCharacteristic (
                      CHARACTERISTIC_UUID,
                      BLECharacteristic::PROPERTY_READ   |
                      BLECharacteristic::PROPERTY_WRITE  |
                      BLECharacteristic::PROPERTY_NOTIFY |
                      BLECharacteristic::PROPERTY_INDICATE
                  );

پس از آن، یک Characteristic با UUID تعریف شده روی سرور ساخته می شود. PROPERTY_READ و PROPERTY_WRITE و… اجازه دسترسی به این Characteristic را مشخص می کنند.

BLEAdvertising *pAdvertising = BLEDevice :: getAdvertising ();
pAdvertising -> addServiceUUID (SERVICE_UUID);
pAdvertising -> setScanResponse (false);
pAdvertising -> setMinPreferred (0x0);
BLEDevice :: startAdvertising ()

با دستورات فوق، سرور شروع به ارسال بسته های اعلان (Advertising) می کند. در بخش loop می توانید کد اصلی خود را بنویسید.

float Humidity = dht.readHumidity ();
float Temperature = dht.readTemperature ();

در دو خط فوق سنسور دیتا را می خواند.

پس از چاپ دیتا دریافتی در سریال مانیتور Arduino IDE، در نهایت دو خط زیر دیتا را به اپلیکیشن مورد نظر که در این پروژه Node-Red می باشد ارسال می کنند.

pCharacteristic -> setValue (dhtDataString);
pCharacteristic -> notify ();

شماتیک‌ Node-Red

شماتیک طراحی در Node-Red به صورت تصویر زیر می باشد. دیتا ارسالی از سنسور در کنسول Node-Red قابل مشاهده است. نود های مورد نیاز در این آموزش drbug، inject و generic ble in می باشند. در نود generic ble in ابتدا گزینه اسکن را فعال کرده و پس از اسکن دستگاه مورد نظر را انتخاب کرده و به آن کانکت می شویم

ارسال دیتا از سنسور DHT11

نتیجه گیری

در این مقاله آموختیم که چگونه می توان دیتا خوانده شده توسط سنسور DHT11 را با استفاده از بلوتوث کم مصرف به Node-red ارسال کنیم. اما مهترین هدف ازارسال دیتا به Node-Red امکان ساخت داشبورد و مانیتورینگ لحظه به لحظه اطلاعات است. در مقاله ها آتی طریقه ساخت داشبورد برای دیتا ارسالی توسط بلوتوث کم مصرف را آموزش خواهیم داد پس مقالات ما را دنبال کنید.

سنجش دما با سنسور LM35 در ماژول ESP32


این مقاله چطور بود ؟
+1
28
+1
81
+1
6
مشاهده بیشتر

پریسا اکبری

کارشناس برق- قدرت و کارشناس ارشد کنترل. علاقه مند به سیستم های هوشمند و اینترنت اشیا. به مدت بیش از 1 سال است که در تیم سخت افزار سازان نام آور مشغول به فعالیت هستم.

نوشته های مشابه

دکمه بازگشت به بالا