#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 اهمیت فراوانی دارد. از نوع باتری تا پروتکل مورد استفاده در انتقال دیتا، هر کدام اهمیت بسیاری در مصرف انرژی دارند. بلوتوث کم مصرف همانطور که از نامش پیداست به دلیل مصرف پایین توان می تواند نقش مهمی در بهبود مصرف انرژی داشته باشد. این پروتکل در زمان هایی که دیتا ارسال نمی شود در حالت خواب قرار دارد و مصرف توان را به میزان زیادی کاهش می دهد. از این پروتکل ارتباطی کوتاه برد غالبا در ابزارک های هوشمند شخصی استفاده می شود. همچنین جهت ارسال دیتا از سنسورها بسیار مناسب می باشد. در این مقاله ارسال دیتا از سنسور فشارسنج را توسط این پروتکل آموزش دادیم. شما خواننده گرامی می توانید با استفاده از این آموزش و سنسورهای دیگر پروژه های جذابی داشته باشید.