এই পোস্টটি মূলত www.jaredwolff.com থেকে
আমি পরাজিত হয়েছিলাম।
আমি একটি ব্লুটুথ লো এনার্জি প্রকল্পে কাজ করার চেষ্টা করে সারা রাত কাটিয়েছি। এটা খুবই কষ্টকর ছিল. এটা হতাশাজনক ছিল. আমি হাল ছেড়ে দিতে প্রস্তুত ছিলাম।
এটি ব্লুটুথ লো এনার্জির প্রথম দিনগুলিতে ছিল। তারপর থেকে এটি বিকাশ করা সহজ এবং সহজ হয়ে গেছে। পার্টিকেল মেশ ব্লুটুথ লাইব্রেরিও এর ব্যতিক্রম নয়৷
৷এই ওয়াকথ্রুতে, আমি আপনাকে দেখাব কিভাবে পার্টিকেলের ব্লুটুথ API ব্যবহার করতে হয়। আমরা কিছু এলইডি কনফিগার করব এবং মেশ নেটওয়ার্কের সমস্ত ডিভাইসে তাদের পরিবর্তন দেখব। আমরা একটি আর্গন এবং জেনন বোর্ড ব্যবহার করব।
প্রস্তুত? চলুন শুরু করা যাক!
পুনশ্চ. এই পোস্ট দীর্ঘ. আপনি যদি কিছু ডাউনলোড করতে চান তবে একটি সুন্দর ফরম্যাট করা PDF এর জন্য এখানে ক্লিক করুন।
পর্যায় 1:ব্লুটুথ সেট আপ করা হচ্ছে
-
কণা ওয়ার্কবেঞ্চ ডাউনলোড/ইনস্টল করুন
-
একটি নতুন প্রকল্প তৈরি করুন। আমি একটি উপযুক্ত অবস্থান বেছে নিয়েছি এবং তারপর এটির নাম
ble_mesh
করেছি -
আপনার
/src/
এ যান direcory এবং আপনার<your project name>.ino
খুলুন ফাইল -
তারপর নিশ্চিত করুন যে আপনি আপনার deviceOS-এর সংস্করণ 1.3.0-এ পরিবর্তন করেছেন৷
কোডটি লিখুন
আমরা 3টি বৈশিষ্ট্য সহ একটি পরিষেবা সেট আপ করতে চাই৷ বৈশিষ্ট্যগুলি যথাক্রমে আরজিবি এলইডিগুলির তীব্রতার সাথে সম্পর্কিত। কিভাবে আপনার ব্লুটুথ সেট আপ করবেন তা এখানে:
-
আপনার
অ্যাপ নিয়ন্ত্রণ সক্ষম করেSetup()
-এ ফাংশন আপনার LEDRGB.control(true);
-
আপনার
.ino
এর উপরে আপনার UUID সেট আপ করুন ফাইলconst char* serviceUuid = "6E400001-B5A3-F393-E0A9-E50E24DCCA9E"; const char* red = "6E400002-B5A3-F393-E0A9-E50E24DCCA9E"; const char* green = "6E400003-B5A3-F393-E0A9-E50E24DCCA9E"; const char* blue = "6E400004-B5A3-F393-E0A9-E50E24DCCA9E";
UUID হল অনন্য শনাক্তকারী বা ঠিকানা। এগুলি একটি ডিভাইসে বিভিন্ন পরিষেবা এবং বৈশিষ্ট্যগুলিকে আলাদা করতে ব্যবহৃত হয়৷
উপরের UUIDগুলি পূর্ববর্তী কণা উদাহরণগুলিতে ব্যবহৃত হয়। আপনি যদি নিজের তৈরি করতে চান তাহলে আপনি
uuidgen
ব্যবহার করতে পারেন OSX কমান্ড লাইনে। আপনি অনলাইন GUID জেনারেটর-এর মতো একটি ওয়েবসাইটেও যেতে পারেনআপনার নিজস্ব UUID পেতে উপরের সেটিংস ব্যবহার করুন। তারপর আপনি এই তৈরি করা থেকে আপনার পরিষেবা এবং বৈশিষ্ট্যযুক্ত UUIDS তৈরি করতে পারেন:
const char* serviceUuid = "b425040**0**-fb4b-4746-b2b0-93f0e61122c6"; //service const char* red = "b4250401-fb4b-4746-b2b0-93f0e61122c6"; //red char const char* green = "b4250402-fb4b-4746-b2b0-93f0e61122c6"; //green char const char* blue = "b4250403-fb4b-4746-b2b0-93f0e61122c6"; //blue char
এটি করার কোন সঠিক বা ভুল উপায় নেই। কিন্তু আপনাকে সতর্ক থাকতে হবে আপনি ব্লুটুথ SIG দ্বারা সংরক্ষিত UUID ব্যবহার করছেন না। এটি অত্যন্ত অসম্ভাব্য। আপনি যদি দুবার চেক করতে চান তবে আপনি এখানে এবং এখানে যেতে পারেন।
আপাতত, আমরা UUID-এর প্রথম সেটের সাথে লেগে থাকব।
-
Setup()
-এ , আপনার পরিষেবা শুরু করুন৷// Set the RGB BLE service BleUuid rgbService(serviceUuid);
এটি আপনার পরিষেবা "নিবন্ধন" করার প্রথম ধাপ৷ নীচে এই সম্পর্কে আরও৷
৷ -
Setup()
-এ প্রতিটি বৈশিষ্ট্য শুরু করুনBleCharacteristic redCharacteristic("red", BleCharacteristicProperty::WRITE_WO_RSP, red, serviceUuid, onDataReceived, (void*)red); BleCharacteristic greenCharacteristic("green", BleCharacteristicProperty::WRITE_WO_RSP, green, serviceUuid, onDataReceived, (void*)green); BleCharacteristic blueCharacteristic("blue", BleCharacteristicProperty::WRITE_WO_RSP, blue, serviceUuid, onDataReceived, (void*)blue);
এই সেটআপের জন্য, আমরা
WRITE_WO_RSP
ব্যবহার করতে যাচ্ছি সম্পত্তি এটি আমাদের ডেটা লিখতে এবং কোন প্রতিক্রিয়া আশা করতে দেয়।
আমি পরবর্তী দুটি পরামিতি হিসাবে UUIDs উল্লেখ করেছি। প্রথমটি বৈশিষ্ট্যযুক্ত UUID। দ্বিতীয়টি হল পরিষেবা UUID।পরবর্তী প্যারামিটার হল কলব্যাক ফাংশন। যখন এই কলব্যাকে ডেটা লেখা হয়, তখন এই ফাংশনটি ফায়ার হবে৷
৷অবশেষে শেষ পরামিতি হল প্রসঙ্গ। তুমি আসলে কি বোজাতে ছাচ্ছ? আমরা তিনটি বৈশিষ্ট্যের জন্য একই কলব্যাক ব্যবহার করছি। কোন বৈশিষ্ট্যটি (অন্তত deviceOS এ) লেখা হয়েছে তা আমরা জানতে পারি একমাত্র উপায় হল একটি প্রসঙ্গ সেট করে। এই ক্ষেত্রে আমরা ইতিমধ্যে উপলব্ধ UUID ব্যবহার করতে যাচ্ছি।
-
বৈশিষ্ট্যগুলি সংজ্ঞায়িত করার ঠিক পরে, আসুন সেগুলিকে যুক্ত করি যাতে তারা দেখায়:
// Add the characteristics BLE.addCharacteristic(redCharacteristic); BLE.addCharacteristic(greenCharacteristic); BLE.addCharacteristic(blueCharacteristic);
-
কলব্যাক ফাংশন সেট আপ করুন৷
৷// Static function for handling Bluetooth Low Energy callbacks static void onDataReceived(const uint8_t* data, size_t len, const BlePeerDevice& peer, void* context) { }
আপনি ফাইলের শীর্ষে এটি করতে পারেন (উপরে
Setup()
) আমরা এটিকে আরও পরে সংজ্ঞায়িত করব। -
অবশেষে, আপনার ডিভাইসটি সংযোগযোগ্য হওয়ার জন্য, আমাদের বিজ্ঞাপন সেট আপ করতে হবে। এই কোডটি আপনার
Setup()
এর শেষে রাখুন ফাংশন// Advertising data BleAdvertisingData advData; // Add the RGB LED service advData.appendServiceUUID(rgbService); // Start advertising! BLE.advertise(&advData);
প্রথমে আমরা একটি
BleAdvertisingData
তৈরি করি বস্তু আমরাrgbService
যোগ করি ধাপ 3 থেকে। অবশেষে, আমরা বিজ্ঞাপন শুরু করতে পারি যাতে আমাদের পরিষেবা এবং বৈশিষ্ট্যগুলি আবিষ্কার করা যায়!
পরীক্ষা করার সময়
এই মুহুর্তে আমরা একটি ন্যূনতম কার্যকর প্রোগ্রাম আছে. আসুন এটিকে কম্পাইল করে আমাদের পার্টিকেল হার্ডওয়্যারে প্রোগ্রাম করি। এটি যেকোন মেশ সক্ষম ডিভাইসের সাথে কাজ করা উচিত। (জেনন, আর্গন, বোরন)
-
আমরা পরীক্ষা শুরু করার আগে, সাময়িকভাবে
SYSTEM_MODE(MANUAL);
যোগ করুন আপনার ফাইলের শীর্ষে। এটি ডিভাইসটিকে জাল নেটওয়ার্কের সাথে সংযুক্ত হতে বাধা দেবে। যদি স্টার্টআপে ডিভাইসটি নীল হয়ে যায়, তাহলে চালিয়ে যাওয়ার আগে আপনাকে পার্টিকেল অ্যাপের সাথে এটি সেট আপ করতে হবে। -
1.3.0-rc.1 ছবিটি এখানে ডাউনলোড করুন। জেননের জন্য, আপনার প্রয়োজন হবে [email protected]৷ অন্যদের জন্য দেখুন [email protected] এবং [email protected]৷ ফাইলগুলি সম্পদ-এর অধীনে পৃষ্ঠার নীচে রয়েছে৷
-
আপনার ডিভাইসটি DFU মোডে রাখুন। মোড বোতাম ধরে রাখুন এবং মুহূর্তের জন্য রিসেট ক্লিক করুন বোতাম। মোড বোতাম ধরে রাখা চালিয়ে যান যতক্ষণ না এলইডি হলুদ হয়ে যায়।
-
একটি কমান্ড লাইন উইন্ডোতে, আপনি ডাউনলোড করা ফাইলটি যেখানে সংরক্ষণ করেছেন সেখানে ডিরেক্টরি পরিবর্তন করুন। আমার ক্ষেত্রে কমান্ড হল
cd ~/Downloads/
-
তারপর চালান:
particle flash --usb [email protected]
এটি আপনার জেননে সর্বশেষ OS ইনস্টল করবে। একবার এটি সম্পন্ন হলে এটি দ্রুত হলুদ মিটমিট করতে থাকবে। আবার যদি আপনার কাছে আলাদা পার্টিকেল মেশ ডিভাইস থাকে, তাহলে ফাইলের নাম পরিবর্তন করুন।
-
ভিজ্যুয়াল কোডে, Command + Shift + P ব্যবহার করুন কমান্ড মেনু পপ আপ করার জন্য কী সমন্বয়। কণা:কম্পাইল অ্যাপ্লিকেশন (স্থানীয়) নির্বাচন করুন
-
পপ আপ হতে পারে যে কোনো ত্রুটি সংশোধন করুন.
-
তারপর, একই মেনু খুলুন এবং ফ্ল্যাশ অ্যাপ্লিকেশন (স্থানীয়) নির্বাচন করুন৷
-
প্রোগ্রামিং সম্পূর্ণ হলে, আপনার ফোন টানুন. তারপর, আপনার প্রিয় ব্লুটুথ লো এনার্জি অ্যাপ খুলুন। সেরাগুলো হল NRF কানেক্ট এবং হালকা নীল এক্সপ্লোরার। আমি এই উদাহরণের জন্য হালকা নীল এক্সপ্লোরার ব্যবহার করতে যাচ্ছি।
-
"Xenon-
" নামের একটি ডিভাইস আছে কিনা তা পরীক্ষা করুন বিজ্ঞাপন হয়।ঢোকান আপনার ডিভাইসের জন্য অনন্য আইডি সহ। -
আপনার ডিভাইস খুঁজুন এবং নাম ক্লিক করুন.
-
পরিষেবা এবং বৈশিষ্ট্যের তালিকা দেখুন। এটি কি পরিষেবা এবং বৈশিষ্ট্যযুক্ত UUID এর অন্তর্ভুক্ত যা আমরা এখন পর্যন্ত সেট করেছি? উদাহরণস্বরূপ, পরিষেবা UUID কি 6E400001-B5A3-F393-E0A9-E50E24DCCA9E হিসাবে দেখায় ?
যদি সবকিছু আপনার প্রত্যাশা অনুযায়ী দেখা যায়, আপনি একটি ভাল জায়গায় আছেন। যদি না হয় তবে সবকিছু মিলে যায় তা নিশ্চিত করতে আগের নির্দেশাবলীর মাধ্যমে যান৷
পর্যায় 2:ডেটা হ্যান্ডলিং
আমাদের প্রকল্পের পরবর্তী পর্যায় হল লেখার ইভেন্টগুলি প্রক্রিয়া করা। আমরা আমাদের onDataReceived
আপডেট করব ফাংশন।
কোডটি লিখুন
-
প্রথমে, আসুন একটি স্ট্রাকট তৈরি করি যা এলইডিগুলির অবস্থা বজায় রাখবে। এটি ফাইলের শীর্ষে করা যেতে পারে৷
৷// Variables for keeping state typedef struct { uint8_t red; uint8_t green; uint8_t blue; } led_level_t;
-
এর দ্বিতীয়ার্ধটি হল এই ডেটা টাইপ
ব্যবহার করে একটি স্ট্যাটিক ভেরিয়েবল তৈরি করা// Static level tracking static led_level_t m_led_level;
প্রথম দুটি ধাপে RGB LED-এর তিনটি মান উপস্থাপন করার জন্য আমাদের একটি একক ভেরিয়েবল ব্যবহার করার অনুমতি দেয়।
-
এর পরে, আসুন
onDataReceive
-এর ভিতরে মৌলিক ত্রুটিগুলি পরীক্ষা করি৷ ফাংশন উদাহরণস্বরূপ আমরা নিশ্চিত করতে চাই যে আমরা শুধুমাত্র একটি বাইট পাচ্ছি।// We're only looking for one byte if( len != 1 ) { return; }
-
পরবর্তী, আমরা দেখতে চাই এই ঘটনাটি কোন বৈশিষ্ট্য থেকে এসেছে। আমরা
context
ব্যবহার করতে পারি এটি নির্ধারণ করতে পরিবর্তনশীল।// Sets the global level if( context == red ) { m_led_level.red = data[0]; } else if ( context == green ) { m_led_level.green = data[0]; } else if ( context == blue ) { m_led_level.blue = data[0]; }
মনে রাখবেন, এই ক্ষেত্রে প্রসঙ্গ লাল, সবুজ বা নীল UUID স্ট্রিং-এর পয়েন্টারের সমান হবে। এছাড়াও আপনি লক্ষ্য করতে পারেন যে আমরা
m_led_level
সেট করছি . এইভাবে আমরা আরজিবি লেড আপডেট করতে পারি এমনকি যদি শুধুমাত্র একটি মান পরিবর্তিত হয়। -
অবশেষে, একবার সেট হয়ে গেলে, আপনি
RGB
এ লিখতে পারেন বস্তু// Set RGB color RGB.color(m_led_level.red, m_led_level.green, m_led_level.blue);
কোডটি পরীক্ষা করুন
ডিভাইসটি ফ্ল্যাশ করার জন্য আগের মতো একই পদ্ধতির মধ্য দিয়ে যাওয়া যাক।
-
আপনার ডিভাইসটি DFU মোডে রাখুন। মোড বোতাম ধরে রাখুন এবং রিসেট ক্লিক করুন বোতাম। মোড বোতাম ধরে রাখা চালিয়ে যান যতক্ষণ না এলইডি হলুদ হয়ে যায়।
-
তারপর, একই মেনু খুলুন এবং ফ্ল্যাশ অ্যাপ্লিকেশন (স্থানীয়) নির্বাচন করুন৷
-
এটি প্রোগ্রামিং হয়ে গেলে, হালকা নীল এক্সপ্লোরার ব্যবহার করে ডিভাইসের সাথে সংযোগ করুন৷ .
-
লাল LED-তে প্রযোজ্য বৈশিষ্ট্যটিতে আলতো চাপুন।
-
FF লিখুন . লাল LED চালু করা উচিত।
-
00 লিখুন . লাল LED বন্ধ করা উচিত।
-
অন্য দুটি বৈশিষ্ট্যের জন্য একই কাজ করুন। আমাদের এখন ব্লুটুথ লো এনার্জির উপর RGB LED এর সম্পূর্ণ নিয়ন্ত্রণ আছে!
পর্যায় 3:মেশের মাধ্যমে ভাগ করা
অবশেষে, এখন যেহেতু আমরা সফলভাবে BLE বার্তা পাচ্ছি, এখন সময় এসেছে সেগুলিকে আমাদের মেশ নেটওয়ার্কে ফরওয়ার্ড করার।
কোডটি লিখুন
-
প্রথমে ম্যানুয়াল মোড সরিয়ে দেওয়া যাক।
SYSTEM_MODE(MANUAL);
মন্তব্য করুন -
ফাইলের শীর্ষে চলুন একটি ভেরিয়েবল যোগ করি যা আমরা প্রকাশ করার প্রয়োজন হলে ট্র্যাক করতে ব্যবহার করব
// Tracks when to publish to Mesh static bool m_publish;
-
তারপর এটিকে
Setup()
এ আরম্ভ করুন// Set to false at first m_publish = false;
-
তারপর, RGB সেট করার পরে
onDataReceived
এ নেতৃত্ব দেয় কলব্যাক, আসুন এটি সত্য সেট করি:// Set RGB color RGB.color(m_led_level.red, m_led_level.green, m_led_level.blue); // Set to publish m_publish = true;
-
চলুন
loop()
এ একটি শর্তসাপেক্ষ যোগ করি ফাংশন এর ফলে আমরা মেশ নেটওয়ার্কে LED স্ট্যাটাস প্রকাশ করব:if( m_publish ) { // Reset flag m_publish = false; // Publish to Mesh Mesh.publish("red", String::format("%d", m_led_level.red)); Mesh.publish("green", String::format("%d", m_led_level.green)); Mesh.publish("blue", String::format("%d", m_led_level.blue)); }
Mesh.publish
উভয় ইনপুটের জন্য একটি স্ট্রিং প্রয়োজন। সুতরাং, আমরাString::format
ব্যবহার করছি আমাদের লাল, সবুজ এবং নীল মান দিয়ে একটি স্ট্রিং তৈরি করতে। -
তাহলে চলুন
Setup()
-এ একই ভেরিয়েবলের সদস্যতা নেওয়া যাক . এইভাবে অন্য ডিভাইস এই ডিভাইসে LED আপডেট করতে পারে।Mesh.subscribe("red", meshHandler); Mesh.subscribe("green", meshHandler); Mesh.subscribe("blue", meshHandler);
-
ফাইলের উপরের দিকে আমরা
meshHandler
তৈরি করতে চাই// Mesh event handler static void meshHandler(const char *event, const char *data) { }
-
এই অ্যাপ্লিকেশনে, আমাদের
event
প্রয়োজন প্যারামিটার এবংdata
প্যারামিটার এগুলি ব্যবহার করার জন্য, আমাদের সেগুলিকে একটিString
এ পরিবর্তন করতে হবে প্রকার এইভাবে আমরা বিল্ট ইন কনভার্সন এবং তুলনা ফাংশন ব্যবহার করতে পারি। সুতরাং,meshHandler
এর ভিতরে ফাংশন যোগ করুন:// Convert to String for useful conversion and comparison functions String eventString = String(event); String dataString = String(data);
-
অবশেষে আমরা কিছু তুলনা করি। আমরা প্রথমে ইভেন্টের নাম মেলে কিনা তা পরীক্ষা করি। তারপর আমরা
dataString
এর মান সেট করি সংশ্লিষ্ট নেতৃত্বাধীন স্তরে।// Determine which event we recieved if( eventString.equals("red") ) { m_led_level.red = dataString.toInt(); } else if ( eventString.equals("green") ) { m_led_level.green = dataString.toInt(); } else if ( eventString.equals("blue") ) { m_led_level.blue = dataString.toInt(); } else { return; } // Set RGB color RGB.color(m_led_level.red, m_led_level.green, m_led_level.blue);
তারপর শেষে আমরা নতুন আরজিবি রঙ সেট করি। লক্ষ্য করুন কিভাবে আমি একটি
return
যোগ করে একটি অজানা অবস্থা পরিচালনা করিelse
এ বিবৃতি অধ্যায়. সর্বদা ত্রুটির শর্তগুলি ধ্বংস করার আগে ফিল্টার আউট করা ভাল!
কোডটি পরীক্ষা করুন
-
আপনার ফোনে পার্টিকেল অ্যাপ খুলুন
-
প্রথমে আর্গন সেট আপ করা যাক। যদি এটি নীল না জ্বলে, মোড বোতামটি যতক্ষণ না নীল হয়ে যাচ্ছে ততক্ষণ ধরে রাখুন৷
দ্রষ্টব্য:আপনি যদি ইতিমধ্যে অ্যাপটি প্রোগ্রাম করে থাকেন তবে LED ডিফল্টরূপে বন্ধ হয়ে যাবে। 5 সেকেন্ডের জন্য মোড বোতামটি ধরে রাখুন এবং তারপর চালিয়ে যান৷৷
-
পেয়ারিং প্রক্রিয়ার মধ্য দিয়ে যান। অ্যাপটি আপনাকে সমস্ত পদক্ষেপে নিয়ে যায়। নিশ্চিত করুন যে আপনি আপনার মেশ নেটওয়ার্কের জন্য অ্যাডমিন পাসওয়ার্ড মনে রেখেছেন৷৷
-
সর্বশেষ ফার্মওয়্যার (1.3.0) সহ একটি আর্গন প্রোগ্রাম করুন (দেখুন পর্যায় 1 - পরীক্ষা করার সময় - ধাপ 2 এটি কিভাবে করতে হবে সে সম্পর্কে একটি অনুস্মারকের জন্য)
-
একবার দ্রুত হলুদ হয়ে গেলে, টিঙ্কার অ্যাপের সাহায্যে আর্গন প্রোগ্রাম করুন। আপনি এটি রিলিজ পৃষ্ঠা থেকে ডাউনলোড করতে পারেন।
-
একবার আমাদের কাছে একটি সুন্দর কঠিন সায়ান এলইডি (পার্টিকেল ক্লাউডের সাথে সংযুক্ত) হয়ে গেলে আমরা অ্যাপটি প্রোগ্রাম করব। ক্লাউড ফ্ল্যাশ ব্যবহার করুন ড্রপ ডাউন মেনুতে বিকল্প।
আমি যতদূর বলতে পারি, ক্লাউডের সাথে সংযোগ করার সময় পার্টিকল যেকোনো ডিভাইসকে নিরাপদ মোডে ফ্ল্যাশ করে। এটা আমার সেটআপ হতে পারে. আপনার মাইলেজ এখানে পরিবর্তিত হতে পারে। ক্লাউড ফ্ল্যাশ ব্যবহার করা ভাল .
নিশ্চিত করুন যে আপনি সঠিক deviceOS সংস্করণ নির্বাচন করেছেন (1.3.0-rc1 ), ডিভাইসের ধরন (আর্গন ) এবং ডিভাইসের নাম (সেটআপের সময় আপনি এটিকে কী নাম দিয়েছেন৷ )
-
ফোন অ্যাপ ব্যবহার করে জেননের সাথে সংযোগ করুন৷
-
ফোন অ্যাপ ব্যবহার করে জেননকে আপনার মেশ নেটওয়ার্কে সংযুক্ত করুন
-
ক্লাউড ফ্ল্যাশ ব্যবহার করে আপনার জেনন ফ্ল্যাশ করুন . ফোন অ্যাপ সেটআপের সময় আপনি যে নামটি দিয়েছিলেন সেটি ব্যবহার করুন। যতক্ষণ পর্যন্ত ডিভাইসটি পার্টিকেল ক্লাউডের সাথে বা নিরাপদ মোডে (বেগুনি LED) সংযুক্ত থাকে, ততক্ষণ এটি প্রোগ্রাম করা উচিত।
-
একবার সংযুক্ত হয়ে গেলে, মজার অংশে আসা যাক। হালকা নীল এক্সপ্লোরার খুলুন আর্গন এর সাথে সংযোগ করুন অথবা জেনন .
-
LED বৈশিষ্ট্যগুলির মধ্যে একটি নির্বাচন করুন এবং মান পরিবর্তন করুন।
সমস্ত ডিভাইসে LED পরিবর্তন করা উচিত!
চূড়ান্ত কোড
এখানে সব টুকরা একসাথে রাখা সঙ্গে চূড়ান্ত কোড আছে. আপনি তাদের সঠিক জায়গায় রেখেছেন তা নিশ্চিত করতে আপনি এটি ব্যবহার করতে পারেন!!
/*
* Project ble_mesh
* Description: Bluetooth Low Energy + Mesh Example
* Author: Jared Wolff
* Date: 7/13/2019
*/
//SYSTEM_MODE(MANUAL);
// UUIDs for service + characteristics
const char* serviceUuid = "6E400001-B5A3-F393-E0A9-E50E24DCCA9E";
const char* red = "6E400002-B5A3-F393-E0A9-E50E24DCCA9E";
const char* green = "6E400003-B5A3-F393-E0A9-E50E24DCCA9E";
const char* blue = "6E400004-B5A3-F393-E0A9-E50E24DCCA9E";
// Set the RGB BLE service
BleUuid rgbService(serviceUuid);
// Variables for keeping state
typedef struct {
uint8_t red;
uint8_t green;
uint8_t blue;
} led_level_t;
// Static level tracking
static led_level_t m_led_level;
// Tracks when to publish to Mesh
static bool m_publish;
// Mesh event handler
static void meshHandler(const char *event, const char *data)
{
// Convert to String for useful conversion and comparison functions
String eventString = String(event);
String dataString = String(data);
// Determine which event we recieved
if( eventString.equals("red") ) {
m_led_level.red = dataString.toInt();
} else if ( eventString.equals("green") ) {
m_led_level.green = dataString.toInt();
} else if ( eventString.equals("blue") ) {
m_led_level.blue = dataString.toInt();
} else {
return;
}
// Set RGB color
RGB.color(m_led_level.red, m_led_level.green, m_led_level.blue);
}
// Static function for handling Bluetooth Low Energy callbacks
static void onDataReceived(const uint8_t* data, size_t len, const BlePeerDevice& peer, void* context) {
// We're only looking for one byte
if( len != 1 ) {
return;
}
// Sets the global level
if( context == red ) {
m_led_level.red = data[0];
} else if ( context == green ) {
m_led_level.green = data[0];
} else if ( context == blue ) {
m_led_level.blue = data[0];
}
// Set RGB color
RGB.color(m_led_level.red, m_led_level.green, m_led_level.blue);
// Set to publish
m_publish = true;
}
// setup() runs once, when the device is first turned on.
void setup() {
// Enable app control of LED
RGB.control(true);
// Init default level
m_led_level.red = 0;
m_led_level.green = 0;
m_led_level.blue = 0;
// Set to false at first
m_publish = false;
// Set the subscription for Mesh updates
Mesh.subscribe("red",meshHandler);
Mesh.subscribe("green",meshHandler);
Mesh.subscribe("blue",meshHandler);
// Set up characteristics
BleCharacteristic redCharacteristic("red", BleCharacteristicProperty::WRITE_WO_RSP, red, serviceUuid, onDataReceived, (void*)red);
BleCharacteristic greenCharacteristic("green", BleCharacteristicProperty::WRITE_WO_RSP, green, serviceUuid, onDataReceived, (void*)green);
BleCharacteristic blueCharacteristic("blue", BleCharacteristicProperty::WRITE_WO_RSP, blue, serviceUuid, onDataReceived, (void*)blue);
// Add the characteristics
BLE.addCharacteristic(redCharacteristic);
BLE.addCharacteristic(greenCharacteristic);
BLE.addCharacteristic(blueCharacteristic);
// Advertising data
BleAdvertisingData advData;
// Add the RGB LED service
advData.appendServiceUUID(rgbService);
// Start advertising!
BLE.advertise(&advData);
}
// loop() runs over and over again, as quickly as it can execute.
void loop() {
// Checks the publish flag,
// Publishes to a variable called "red" "green" and "blue"
if( m_publish ) {
// Reset flag
m_publish = false;
// Publish to Mesh
Mesh.publish("red", String::format("%d", m_led_level.red));
Mesh.publish("green", String::format("%d", m_led_level.green));
Mesh.publish("blue", String::format("%d", m_led_level.blue));
}
}
উপসংহার
এই টিউটোরিয়ালে আপনি শিখেছেন কিভাবে একটি পার্টিকেল মেশ প্রজেক্টে ব্লুটুথ যোগ করতে হয়। আপনি যেমন কল্পনা করতে পারেন, সম্ভাবনাগুলি অন্তহীন। উদাহরণ স্বরূপ আপনি অভিজ্ঞতায় ব্যবহারকারী/প্রশাসনিক অ্যাপ যোগ করতে পারেন। এখন এটি দুর্দান্ত৷৷ ?
আপনি আমার আসন্ন বইতে এই ধরনের আরও সামগ্রী আশা করতে পারেন:কণা জালের চূড়ান্ত নির্দেশিকা . আপডেট এবং অভ্যন্তরীণ বিষয়বস্তুর জন্য আমার তালিকা সদস্যতা. এছাড়াও সমস্ত প্রারম্ভিক গ্রাহকরা যখন এটি প্রকাশ করা হয় তখন একটি ছাড় পান! সাইন আপ করতে এখানে ক্লিক করুন৷