در این مقاله قصد داریم ارسال دیتا از سنسور BMP180 توسط بلوتوث کم مصرف در ماژول ESP32 به Node-RED را آموزش دهیم و در پایان جهت مانیتورینگ دیتا ارسالی داشبورد درست کنیم. همراه ما باشید.
ارسال دیتا از سنسور BMP180
کد مورد نظر برای این پروژه برنامه Notify موجود در مثال های Arduino IDE کتابخانه BLE است. البته ما در این کد مطابق با پروژه خود تغییراتی ایجاد کرده ایم. برای آشنایی با سنسور bmp180 به مقاله راه اندازی سنسور بارومتریک فشار و دما (BMP180) مراجعه کنید. به این کد کتابخانه های <Adafruit_BMP085.h> و <Wire.h> را اضافه می کنیم.
برای توضیحات کد زیر می توانید از مقاله آموزش ارسال دیتا از سنسور DHT11 توسط ماژول ESP32 به Node-RED استفاده کنید. کد های زیر تنها در کتابخانه ها و معرفی سنسور تفاوت دارند. دقت داشته باشید که در این سنسور نیاز به معرفی شماره پایه خاصی برای اتصال نیست. چرا که در این سنسور به صورت کامل مشخص می باشد که کدام پایه سنسور به کدام پایه ESP32 متصل شود و به دلخواه نمی توان پایه خاصی را تعریف کرد.
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
#include <Adafruit_BMP085.h>
#include <Wire.h>
#include <string.h>
#include <iostream>
BLEServer* pServer = NULL;
BLECharacteristic* pCharacteristic = NULL;
bool deviceConnected = false;
bool oldDeviceConnected = false;
uint32_t value = 0;
Adafruit_BMP085 bmp;;
int Pressure;
int Temperature;
int Altitude;
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#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);
if (!bmp.begin())
{
Serial.println("Could not find a valid BMP085/BMP180 sensor, check wiring!");
}
// 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 Pressure = bmp.readPressure();
float Temperature = bmp.readTemperature();
float Altitude = bmp.readAltitude();
char PressureString [2];
char TemperatureString [2];
char AltitudeString [2];
dtostrf (Pressure, 1, 2, PressureString);
dtostrf (Temperature, 1, 2, TemperatureString);
dtostrf (Altitude, 1, 2, AltitudeString);
// test if return is valid, otherwise something is wrong.
if (isnan (Temperature) || isnan (Pressure) || isnan (Altitude))
{
Serial.println ("Failed to read from bmp");
}
else
{
Serial.print("Temperature = ");
Serial.print(bmp.readTemperature());
Serial.println(" *C");
Serial.print("Pressure = ");
Serial.print(bmp.readPressure());
Serial.println(" Pa");
Serial.print("Altitude = ");
Serial.print(bmp.readAltitude());
Serial.println(" meters");
}
char bmpDataString [50];
sprintf (bmpDataString, "% f,% f,% f", Pressure, Temperature, Altitude);
Serial.print ("*** Sent Data:");
Serial.print (bmpDataString);
Serial.println ("***");
pCharacteristic-> setValue (bmpDataString);
pCharacteristic-> notify (); // Send the value to the application!
strcpy(bmpDataString, TemperatureString);
strcat(bmpDataString, ",");
strcat(bmpDataString, PressureString);
strcat(bmpDataString, ",");
strcat(bmpDataString, AltitudeString);
}
delay (5000);
}
شماتیک Node-RED
طراحی شماتیک Node-RED به صورت تصویر زیر می باشد. نود های مورد نیاز inject، function، guage، chart، Generic BLE و payload می باشند. تنظیمات نود Generic BLE را در تصاویر زیر می توانید مشاهده کنید. پس از کلیک روی گزینه اسکن، لیست دستگاه هایی که دارای بلوتوث فعال هستند نشان داده می شود و می توانید دستگاه مورد نظر را انتخاب کنید و روی گزینه Apply کلیک کنید تا مشخصات دستگاه خوانده شود.
تغییر نوع دیتا ارسالی از سنسور BMP180
اگر به قسمت دیباگ و خروجی مقاله آموزش ارسال دیتا از سنسور DHT11 توسط ماژول ESP32 به Node-RED دقت کرده باشید، دیتا ارسالی درون یک بافر فرستاده می شود و ما جهت فیلتر دیتا با نوشتن کاراکتر و uuid تنها می توانیم دیتا ارسالی را فیلتر کنیم و فقط مقدار دیتا را نمایش دهیم. اما این بدان معنی نیست که امکان ساخت داشبورد وجود دارد. برای اینکار ابتدا باید بتوان مقدار دیتا درون بافر را به رشته تبدیل و مقدار هر پارامتر را به طور مجزا مشاهده کرد. برای این منظور از نود function استفاده می شود. با نوشتن خط اول در function در حقیقت دیتا ارسالی را از حالت بافر به رشته تبدیل و سپس خروجی را نمایش می دهیم. در خطوط بعدی با نوشتن دستور split و تنظیم function در حالت 3 خروجی، پارامترهای ارسال شده را تفکیک می کنیم.
نتیجه گیری
بهینه سازی مصرف انرژی در صنعت IoT اهمیت فراوانی دارد. از نوع باتری تا پروتکل مورد استفاده در انتقال دیتا، هر کدام اهمیت بسیاری در مصرف انرژی دارند. بلوتوث کم مصرف همانطور که از نامش پیداست به دلیل مصرف پایین توان می تواند نقش مهمی در بهبود مصرف انرژی داشته باشد. این پروتکل در زمان هایی که دیتا ارسال نمی شود در حالت خواب قرار دارد و مصرف توان را به میزان زیادی کاهش می دهد.
از این پروتکل ارتباطی کوتاه برد غالبا در ابزارک های هوشمند شخصی استفاده می شود. همچنین جهت ارسال دیتا از سنسورها بسیار مناسب می باشد. در این مقاله ارسال دیتا از سنسور فشارسنج را توسط این پروتکل آموزش دادیم. شما خواننده گرامی می توانید با استفاده از این آموزش و سنسورهای دیگر پروژه های جذابی داشته باشید.
کارشناس برق- قدرت و کارشناس ارشد کنترل.
علاقه مند به سیستم های هوشمند و اینترنت اشیا. به مدت بیش از 1 سال است که در تیم سخت افزار سازان نام آور مشغول به فعالیت هستم.