مقدمة:
تتميز لوحة ESP32 بوجود وحدة اتصال لاسلكي واي فاي Wi-Fi وبلوتوث منخفض استهلاك الطاقة BLE وبلوتوث عادي. ستتعلم في هذا المشروع كيفية استخدام البلوتوث العادي فيESP32 باستخدام بيئة الأردوينو (Arduino IDE) لتبادل البيانات بين لوحة الـ ESP32 وهاتف ذكي يعمل بنظام أندرويد، حيث سنتحكم بخرج اللوحة ونرسل قراءات الحساس إلى هاتف ذكي يعمل بنظام أندرويد باستخدام البلوتوث العادي .
ملاحظة:
هذا المشروع ملائم فقط للهواتف الذكية التي تعمل بنظام أندرويد.
يمكنك مشاهدة الفيديو أو متابعة قراءة هذا المقال
استخدام البلوتوث العادي في لوحة ESP32:
يعد استخدام البلوتوث العادي حالياً أبسط بكثير من البلوتوث منخفض استهلاك الطاقة، وبرمجته عن طريق الأردوينو مماثلة لبرمجة وحدة بلوتوث مثل HC-06 حيث يستخدم البروتوكول التسلسلي القياسي والتوابع القياسية.
سنبدأ في مشروعنا باستخدام مثال جاهز في بيئة أردوينو ثم سننشئ مشروعاً بسيطاً لتبادل البيانات بين ESP32 والهاتف الذكي الذي يعمل بنظام أندرويد.
القطع المطلوبة
– لوحة ESP32 DOIT DEVKIT V1
– هاتف ذكي يعمل بنظام أندرويد مزود بتقنية بلوتوث
– ليد
– مقاومة 330 أوم
– حساس حرارة DS18B20
– مقاومة 4.7 كيلو أوم
– أسلاك توصيل
– لوحة توصيل
تطبيق Bluetooth Terminal
تحتاج إلى تثبيت تطبيق Bluetooth Terminal على الهاتف الذكي.
يوصى باستخدام تطبيق “Serial Bluetooth Terminal” المتوفر في Play Store
الاتصال التسلسلي بين الأردوينو وشريحة البلوتوث
سنبرمج ESP32 باستخدام بيئة أردوينو، لذلك يجب التأكد من تثبيت إضافة ESP32 قبل المتابعة.
نفتح بيئة أردوينو وننتقل إلى ملف < أمثلة BluetoothSerial < < SerialtoSerialBT
يظهر الكود التالي: هنا
آلية عمل البرنامج
ينشئ هذا الكود اتصال بلوتوث تسلسلي ثنائي الاتجاه بين جهازين.
يبدأ الكود بتضمين مكتبة BluetoothSerial
#include "BluetoothSerial.h"
تتحقق الأسطر الثلاثة التالية من تفعيل البلوتوث.
if !defined(CONFIG_BT_ENABLED) || defined(CONFIG_BLUEDROID_ENABLED)#
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif
ثم ننشئ كائن BluetoothSerial يسمى SerialBT
BluetoothSerial SerialBT;
ننشئ اتصال تسلسلي بمعدل إرسال 115200 في ()setup.
Serial.begin(115200);
نشغل جهاز بلوتوث التسلسلي ونمرر اسم الجهاز كوسيط، حيث يطلق عليه افتراضياً ESP32test ولكن يمكن إعادة تسميته ومنحه اسماً فريداً.
SerialBT.begin("ESP32test"); //Bluetooth device name
تنجز عملية إرسال واستقبال البيانات عبر البلوتوث التسلسلي في الحلقة ()loop
نتحقق في عبارة if الأولى ما إذا كانت هناك بيانات مستلمة في المنفذ التسلسلي، وفي حال وجودها نرسل تلك المعلومات عبر البلوتوث إلى الجهاز المتصل.
if (Serial.available()) {
SerialBT.write(Serial.read());
}
التعليمة ()SerialBT.write ترسل البيانات باستخدام البلوتوث التسلسلي.
التعليمة ()Serial.Read تعيد البيانات المستلمة في المنفذ التسلسلي.
نتحقق في عبارة if الثانية فيما إذا كانت هناك بيانات متاحة للقراءة في منفذ البلوتوث التسلسلي، وفي حال وجودها نكتبها على الشاشة التسلسلية.
if (SerialBT.available()) {
;Serial.write(SerialBT.read())
{
سيكون فهم كيفية عمل البرنامج أسهل من خلال التوضيح العملي.
اختبار البرنامج:
حمَل الكود السابق إلى شريحة ESP32، ويجب التأكد من تحديد اللوحة الصحيحة ومنفذ COM الصحيح.
ثم نفتح الشاشة التسلسلية بعد تحميل الكود بمعدل إرسال 115200 ونضغط على زر تفعيل ESP32
ستصل رسالة بعد بضع ثوانٍ تقول: “The device started, now you can pair it with bluetooth!”
ننتقل إلى الهاتف الذكي ونفتح تطبيق “Serial Bluetooth Terminal” ونتأكد من تفعيل البلوتوث على الهاتف الذكي.
نحتاج إلى الاقتران بجهاز جديد للاتصال بـ ESP32 لأول مرة، لذا ننتقل إلى “Devices”
انقر على أيقونة الإعدادات، وحدد الاقتران بجهاز جديد. يجب أن تظهر قائمة بأجهزة البلوتوث المتاحة بما في ذلك ESP32test فنقرن معه.
نعود إلى تطبيق Serial Bluetooth Terminal وننقر على الأيقونة في الجزء العلوي للاتصال بـ ESP32 حيث يجب أن تتلقى رسالة “متصل”.
نحاول بعد ذلك كتابة شيء ما في التطبيق، على سبيل المثال كلمة “Hello”.
يجب أن تتلقى هذه الرسالة على الفور على الشاشة التسلسلية في برنامج Arduino IDE كما في الشكل أدناه.
يمكن أيضاً تبادل البيانات بين الشاشة التسلسلية والهاتف الذكي.
لتجريب ذلك نكتب شيء ما في الشريط العلوي للشاشة التسلسلية ونضغط على الزر “إرسال”.
يجب أن تتلقى هذه الرسالة على الفور في تطبيق Serial Bluetooth Terminal
تبادل البيانات باستخدام Bluetooth Serial
يمكن الآن، بعد معرفة كيفية تبادل البيانات باستخدامBluetooth Serial ، تعديل المخطط السابق لجعله أفضل، على سبيل المثال: التحكم بخرج ESP32 عند تلقي رسالة معينة، أو إرسال بيانات إلى هاتف ذكي مثل قراءات الحساس.
يرسل المشروع الذي سننشئه قراءات درجة الحرارة كل 10 ثوانٍ إلى الهاتف الذكي حيث سنستخدم حساس الحرارة DS18B20
سنرسل رسائل للتحكم بخرج ESP32 من خلال تطبيق على الأندرويد، حيث عندما تتلقى ESP32 رسالة “led_on” نقوم بتشغيل أطراف الدخل/خرج للأغراض العامة (GPIO)، وعندما تتلقى رسالة “led_off” لإيقاف التشغيل.
المخطط
توصل الدارة كما في المخطط التالي
– يوصل الليد بالطرف 25 لشريحة ESP32
– يوصل طرف البيانات لـ DS18B20 بالطرف 32 لشريحة ESP32
الكود البرمجي
نحتاج إلى تثبيت مكتبة One Wire ومكتبةDallas Temperature للعمل مع حساس الحرارة DS18B20
اتبع الخطوات التالية لتثبيت مكتبة One Wire
رابط التحميل: هنا
– انقر على الرابط لتنزيل المكتبة، ويجب أن يظهر لديك مجلد مضغوط .zip في التنزيلات.
– قم بفك ضغط المجلد وستحصل على مجلد OneWire-master
– أعد تسمية المجلد من OneWire-master إلى OneWire
– انقل مجلد OneWire إلى مجلد “libraries” في مجلد بيئة الأردوينو.
– أعد فتح بيئة الأردوينو
اتبع الخطوات التالية لتثبيت مكتبة Dallas Temperature
رابط المكتبة: هنا
– انقر على الرابط لتنزيل المكتبة، ويجب أن يظهر لديك مجلد مضغوط .zip في التنزيلات.
– قم بفك ضغط المجلد وستحصل على مجلد Arduino-Temperature-Control-Library-master.
– أعد تسمية المجلد من Arduino-Temperature-Control-Library-master إلى DallasTemperature.
– انقل مجلد DallasTemperature إلى مجلد “libraries” في بيئة أردوينو
– أعد فتح بيئة الأردوينو
نقوم بنسخ الكود التالي إلى بيئة الأردوينو بعد توصيل الدارة وتثبيت المكتبات الضرورية. هنا
شرح عمل البرنامج
نبدأ بتضمين المكتبات الضرورية: مكتبة BluetoothSerial للبلوتوث ومكتبة OneWire ومكتبة DallasTemperature لحساس الحرارة DS18B20
#include “BluetoothSerial.h”
#include <OneWire.h>
#include <DallasTemperature.h>
نقوم بإنشاء كائن BluetoothSerial يسمى SerialBT
BluetoothSerial SerialBT;
نقوم بإنشاء متغير يسمى ledPin ليشير إلى الطرف الذي نريد التحكم به.
يتصل GPIO25 في هذه الحالة بالليد.
const int ledPin = 25
نعرف طرف الحساس DS18B20 وننشئ كائنات لكي يعمل، حيث يكون حساس الحرارة متصل بالطرف GPIO32
// GPIO where the DS18B20 is connected to
const int oneWireBus = 32;
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(oneWireBus);
// Pass our oneWire reference to Dallas Temperature sensor
DallasTemperature sensors(&oneWire);
ننشىء سلسلة فارغة تسمى message لتخزين الرسائل المستلمة.
String message = "";
ننشىء متغير من نوع محرف يسمى incomingChar لحفظ المحارف الواردة عبر Bluetooth Serial
char incomingChar;
يحتفظ متغير temperatureString بقراءات درجة الحرارة لإرسالها عبر البلوتوث.
String temperatureString = "";
ننشئ متغيرات مؤقتة إضافية لإرسال قراءات كل 10 ثوانٍ.
unsigned long previousMillis = 0; // Stores last time temperature was published
const long interval = 10000; // interval at which to publish sensor readings
تابع ()setup
نعين ledPin كخرج
pinMode(ledPin, OUTPUT);
نهيئ ESP32 كجهاز بلوتوث باسم “ESP32”
SerialBT.begin("ESP32"); //Bluetooth device name
الحلقة ()loop
نرسل قراءات درجة الحرارة ونقرأ الرسائل المستلمة وننفذ الإجراءات في ()loop يتحقق المقطع التالي من البرنامج من مرور 10 ثوانٍ منذ آخر قرارة وعندما يحين الوقت لإرسال قراءة جديدة نحفظ آخر درجة حرارة حصلنا عليها بالدرجة المئوية وبالفهرنهايت في متغير سلسلة درجة الحرارة.
unsigned long currentMillis = millis();
if (currentMillis – previousMillis >= interval) {
previousMillis = currentMillis;
sensors.requestTemperatures();
temperatureString = " " + String(sensors.getTempCByIndex(0)) + "C " + String(sensors.getTempFByIndex(0)) + "F";
نستخدم ()SerialBT.println لإرسال سلسلة temperatureString عبر البلوتوث.
SerialBT.println(temperatureString);
عبارة if التالية تقرأ الرسائل الواردة حيث تتلقى محرفاً في كل مرة تستلم فيها رسائل عبر الاتصال التسلسلي، وتنتهي الرسالة عندما تتلقى محرف نهاية السطر \n
نتحقق فيما إذا كانت هناك بيانات متاحة في منفذ البلوتوث التسلسلي.
if (SerialBT.available()) {
إذا تحقق الشرط نحفظ الأحرف في متغير InomingChar
char incomingChar = SerialBT.read();
نربط المحرف هذا برسالتنا في حال كان InomingChar مختلفاً عن محرف نهاية السطر
if (incomingChar!= '\n'){
message += String(incomingChar);
}
نقوم بمسح متغير message عندما ننتهي من قراءة الأحرف، وإلا تٌلحق جميع الرسائل المستلمة ببعضها البعض.
message = "";
تتحقق بعد ذلك عبارتا if من محتوى الرسالة.
يعمل الليد إذا كانت الرسالة led_on
if (message =="led_on"){
digitalWrite(ledPin, HIGH);
}
ينطفئ الليد إذا كانت الرسالة led_off
else if (message =="led_off"){
digitalWrite(ledPin, LOW);
}
اختبار المشروع
نبدأ بتحميل الكود السابق على لوحة ESP32، ونفتح الشاشة التسلسلية ثم نضغط على زر تفعيل ESP32
يمكن الانتقال إلى الهاتف الذكي والاتصال بـ ESP32 عند تلقي الرسالة التالية.
يمكنك كتابة رسائل ” led_on ” أو ” led_off” للتحكم بالليد.
يحتوي التطبيق على العديد من الأزرار التي يمكن من خلالها حفظ الرسائل الافتراضية، على سبيل المثال، يمكن ربط M1 برسالة ” led_on” و M2 برسالة “led_off”.
أصبحنا الآن قادرين على التحكم في أطراف الشريحة ESP32
يجب أن تتلقى في نفس الوقت قراءات درجة الحرارة كل 10 ثوان.
المصدر: هنا
ترجمة: إيليا سليمان, مراجعة: يارا قاضون, تدقيق لغوي: حنين غاليه, تصميم: علي العلي, تحرير: نور البوشي.