لوحة TTGO LoRa32 SX1276 OLED هي لوحة تطوير ESP32 مع شريحة LoRa مدمجة وشاشة SSD1306 بمقاس 0.96 بوصة وبتقنية عرض OLED، وسنوضح في هذا المقال كيفية إرسال واستقبال حزم LoRa (اتصال نقطة إلى نقطة) واستخدام شاشة OLED مع أردوينو IDE(برنامج مفتوح المصدر يستخدم لكتابة وتحميل التعليمات البرمجية على لوحات أردوينو).

لوحة TTGO LoRa32 SX1276 OLED واستخدامها مع أردوينو IDE
(صورة TTGO LoRa32 SX1276 OLED  ، مصدر الصورة: موقع randomnerdtutorials.com)

نظرة عامة على TTGO LoRa32 SX1276 OLED

هي لوحة تطوير ESP32 مع شريحة LoRa مدمجة وشاشة SSD1306 بتقنية عرض OLED، وهي شاشة العرض التي نستخدمها في معظم مشاريع الإلكترونيات.

(صورة TTGO LoRa32 SX1276 OLED ، مصدر الصورة: موقع randomnerdtutorials.com)
                      (صورة TTGO LoRa32 SX1276 OLED ، مصدر الصورة: موقع randomnerdtutorials.com)

تتميز اللوحة أيضاً بالعديد من GPIOs (أقطاب الدخل والخرج ذات الاستخدام العام) لتوصيل الأجهزة الطرفية وأزرار PRG (BOOT) وRST وموصل بطارية ليثيوم.

صورة شريحتي TTGO LoRa32، مصدر الصورة: موقع randomnerdtutorials.com)
صورة شريحتي TTGO LoRa32، مصدر الصورة: (موقع randomnerdtutorials.com)

TTGO LoRa32 SX1276 OLED

يوضح الشكل التالي أطراف توصيل شريحة TTGO LoRa32 OLED.

(الشكل4: صورة توضح أطراف توصيل شريحة TTGO LoRa32 OLED، مصدر الصورة: موقع randomnerdtutorials.com)
                   (صورة توضح أطراف توصيل شريحة TTGO LoRa32 OLED، مصدر الصورة: موقع randomnerdtutorials.com)

تتصل شاشات OLED باستخدام بروتوكول اتصال I2C، وهي متصلة داخلياً بـ ESP32 من خلال الأطراف التالية:

ESP32 OLED (built-in)
GPIO 4 SDA
GPIO 15 SCL
GPIO 16 RST

وتتصل شريحة SX1276 LoRa باستخدام بروتوكول اتصال SPI، وهي متصلة داخلياً ب   ESP32على GPIOs التالية:

ESP32 SX1276 LoRa
GPIO 19 MISO
GPIO 27 MOSI
GPIO 5 SCK
GPIO 18 CS
GPIO 26 IRQ
GPIO 14 RST

تثبيت لوحات ESP32 على أردوينو IDE

سنستخدم أردوينو IDE لبرمجة لوحة TTGO LoRa32، لذلك يجب أن يكون أردوينو IDE مثبتاً مع برامج ESP32 الإضافية. اتبع الدليل التالي لتثبيت حزمة ESP32 على أردوينو IDE إذا لم تقم بذلك بعد:

تثبيت مكتبات OLED

توجد العديد من المكتبات المتاحة للتحكم بشاشة OLED باستخدام ESP32، وفي هذا المقال سنستخدم مكتبتي Adafruit: Adafruit_SSD1306 و Adafruit_GFX. .

اتبع الخطوات التالية لتثبيت هذه المكتبات:

  1. افتح أردوينو IDE وانتقل إلى البرنامج > تضمين المكتبة > إدارة المكتبات. يجب أن يٌفتح مدير المكتبة (library Manager).
  2. اكتب “SSD1306” في مربع البحث وقم بتثبيت مكتبة SSD1306 من Adafruit
(الشكل5: صورة تظهر نافذة مدير المكتبة وكتابة SSD1306"" في مربع البحث، مصدر الصورة: موقع randomnerdtutorial)
(صورة تظهر نافذة مدير المكتبة وكتابة SSD1306″” في مربع البحث، مصدر الصورة: موقع randomnerdtutorial)

3. بعد تثبيت مكتبة SSD1306 من Adafruit، اكتب “GFX” في مربع البحث وقم بتثبيت المكتبة.

(الشكل6: صورة تظهر نافذة مدير المكتبة وكتابة "GFX" في مربع البحث، مصدر الصورة: موقع randomnerdtutorial)
           (صورة تظهر نافذة مدير المكتبة وكتابة “GFX” في مربع البحث، مصدر الصورة: موقع randomnerdtutorial)

تثبيت مكتبة LoRa

يوجد العديد من المكتبات المتاحة لإرسال واستقبال حزم LoRa بسهولة باستخدام ESP32. في هذا المثال سنستخدم arduino-LoRa library by sandeep mistry.

افتح أردوينو IDE وانتقل إلى البرنامج > تضمين المكتبة > إدارة المكتبات  وابحث عن “LoRa”. حدد مكتبة LoRa الموضحة في الشكل أدناه وقم بتثبيتها.

(الشكل7: صورة تظهر نافذة مدير المكتبة وكتابة "lora" في مربع البحث، مصدر الصورة: موقع randomnerdtutorial)
                      ( صورة تظهر نافذة مدير المكتبة وكتابة “lora” في مربع البحث، مصدر الصورة: موقع randomnerdtutorial)

أعد تشغيل أردوينو IDE بعد تثبيت المكتبات.

برنامج LoRa المرسل

انسخ الكود البرمجي التالي إلى أردوينو IDE، يرسل هذا الكود رسالة “hello” متبوعة بعداد عبر LoRa كل 10 ثوان ويعرض العداد على شاشة OLED.

يمكنك تحميل الكود من هنا

كيفية عمل الكود البرمجي

ابدأ بتضمين المكتبات للتفاعل مع شريحة LoRa:

#include <SPI.h>
#include <LoRa.h>

ثم قم بتضمين المكتبات للربط مع شاشة I2C OLED:

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

عرّف الأطراف المستخدمة من قبل وحدة LoRa للإرسال والاستقبال:

#define SCK 5
#define MISO 19
#define MOSI 27
#define SS 18
#define RST 14
#define DIO0 26

حدد تردد LoRa:

#define BAND 866E6

تعريف أطراف OLED:

#define OLED_SDA 4
#define OLED_SCL 15 
#define OLED_RST 16

حدد حجم شاشة OLED:

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

أنشئ متغير باسم counter لتتبع عدد حزم LoRa المرسلة:

int counter = 0;

أنشئ كائن Adafruit_SSD1306 يسمى display:

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RST);

في التابع () setup نحتاج إلى إعادة ضبط البرنامج يدوياً باستخدام الطرف RST للبدء باستخدام شاشة OLED، ومن أجل ذلك يجب تعريف الطرف RST كخرج وتعيينه على LOW لفترة قصيرة تقدر بالميلي ثانية، ثم تعيينه على HIGH مرة أخرى.

pinMode(OLED_RST, OUTPUT);
digitalWrite(OLED_RST, LOW);
delay(20);
digitalWrite(OLED_RST, HIGH);

ابدأ اتصال I2C باستخدام أطراف OLED_SDA وOLED_SCL المعرفة باستخدام ()Wire.begin:

Wire.begin(OLED_SDA, OLED_SCL);

بعد ذلك قم بتهيئة شاشة العرض بالبارامترات التالية، وتؤكد البارامترات ذات القيمة (False) أن المكتبة لا تستخدم أطراف I2C الافتراضية وإنما تستخدم الأطراف المعرّفة في الكود البرمجي (GPIO4 وGPIO15):

if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3c, false, false)) { // Address 0x3C for 128x32
  Serial.println(F("SSD1306 allocation failed"));
  for(;;); // Don't proceed, loop forever
}

بعد ذلك يمكنك استخدام التعليمات من مكتبة Adafruit للتفاعل مع شاشة OLED.

اكتب الرسالة “LORA SENDER” على الشاشة:

display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(0,0);
display.print("LORA SENDER ");
display.display();

يجب تهيئة شاشة العرض التسلسلي (serial monitor) لتصحيح الأخطاء:

Serial.begin(115200);
Serial.println("LoRa Sender Test");

عرّف أطراف SPI المستخدمة بواسطة شريحة LoRa:

SPI.begin(SCK, MISO, MOSI, SS);

وقم بإعداد وحدة LoRa للإرسال والاستقبال:

LoRa.setPins(SS, RST, DIO0);

أخيراً قم بتهيئة وحدة LoRa للإرسال والاستقبال باستخدام تعليمة () begin على كائن LoRa وتمرير التردد كوسيط:

if (!LoRa.begin(BAND)) {
  Serial.println("Starting LoRa failed!");
  while (1);
}

إذا نجحنا في تهيئة شاشة العرض، فسنكتب رسالة نجاح على شاشة OLED.

display.setCursor(0,10);
display.print("LoRa Initializing OK!");
display.display();

نرسل الحزم ضمن التابع Loop() حيث نُهيأ حزمةً باستخدام تعليمة ()beginPacket

LoRa.beginPacket();

نكتب البيانات في الحزمة باستخدام () print، ونرسل رسالة “hello” متبوعة بالعداد كما نرى في السطرين التاليين:

LoRa.print("hello ");
LoRa.print(counter);

ثم ننهي الحزمة باستخدام ()endPacket:

LoRa.endPacket();

بعد ذلك نكتب counter على شاشة OLED:

display.clearDisplay();
display.setCursor(0,0);
display.println("LORA SENDER");
display.setCursor(0,20);
display.setTextSize(1);
display.print("LoRa packet sent.");
display.setCursor(0,30);
display.print("Counter:");
display.setCursor(50,30);
display.print(counter);
display.display();

يزيد العداد بمقدار واحد في كل حلقة، ويحدث ذلك كل 10 ثوان.

counter++;
delay(10000);

اختبار مرسل LoRa

حمّل الكود إلى لوحتك بعد اختيار اللوحة المناسبة ومنفذ COM الذي تستخدمه،

ولاختيار اللوحة في أردوينو IDE انتقل إلى الأدوات > لوحة (Tools > Board) وحدد لوحة TTGO LoRa32-OLED V1.

(الشكل8: صورة تظهر خيار TTGO LoRa32-OLED V1 في Arduino IDE، مصدر الصورة: موقع randomnerdtutorials)
                   ( صورة تظهر خيار TTGO LoRa32-OLED V1 في Arduino IDE، مصدر الصورة: موقع randomnerdtutorials)

بعد تحميل الكود إلى لوحتك، يجب أن يبدأ في إرسال حزم LoRa.

(الشكل9: صورة تظهر TTGO LoRa32-OLED تؤكد إرسال الحزم، مصدر الصورة: موقع randomnerdtutorials)
                      (صورة تظهر TTGO LoRa32-OLED تؤكد إرسال الحزم، مصدر الصورة: موقع randomnerdtutorials)

برنامج مستقبل LoRa

الآن حمّل برنامج المستقبل على لوحة TTGO LoRa32 OLED أخرى. يتفقد هذا البرنامج حزم LoRa ضمن نطاقه ويطبع محتوى الحزم وRSSI (قوة الإشارة المستلمة النسبية) على OLED.

يمكنك تحميل الكود من هنا

هذا البرنامج مشابه جدا للبرنامج السابق. نحتاج فقط إلى تعديل بعض الأسطر لاستقبال حزم LoRa بدلاً من إرسالها.

في تعليمة ()loop نتحقق من وجود حزم جديدة لاستلامها باستخدام ()parsePacket:

int packetSize = LoRa.parsePacket();

إذا وُجدت حزمة جديدة نقرأ محتواها، ونستخدم التعليمة ()readString لقراءة البيانات الواردة. تحفظ البيانات المستلمة في المتغير LoRaData:

if (packetSize) {
  //received a packet
  Serial.print("Received packet ");

  //read packet
  while (LoRa.available()) {
    LoRaData = LoRa.readString();
    Serial.print(LoRaData);
  }

نحصل أيضاً على RSSI للحزمة المستلمة باستخدام تعليمة ()packetRSSI:

int rssi = LoRa.packetRssi();

أخيراً نعرض الرسالة المستلمة بالإضافة إلى RSSI:

display.clearDisplay();
display.setCursor(0,0);
display.print("LORA RECEIVER");
display.setCursor(0,20);
display.print("Received packet:");
display.setCursor(0,30);
display.print(LoRaData);
display.setCursor(0,40);
display.print("RSSI:");
display.setCursor(30,40);
display.print(rssi);
display.display();

اختبار مستقبل LoRa

حمّل الكود على لوحتك ولا تنس اختيار TTGO LoRa32-OLED V1من قائمة اللوحات،

ويجب أن تبدأ بتلقي حزم LoRa من اللوحة الأخرى بعد تحميل الكود.

(الشكل10: صورة تظهر TTGO LoRa32-OLED تؤكد استقبال الحزم، مصدر الصورة: موقع randomnerdtutorials)
                   (صورة تظهر TTGO LoRa32-OLED تؤكد استقبال الحزم، مصدر الصورة: موقع randomnerdtutorials)

ملخص

كانت هذه المقالة دليلاً سريعاً للوحة TTGO LoRa32 وكيفية إرسال حزم LoRa في اتصال نقطة إلى نقطة واستخدام شاشة OLED،

والفكرة هي جمع ما تعلمته هنا لبناء مشاريع إنترنت الأشياء، ويمكن أن يكون LoRa مفيداً وخاصةً إذا كنت ترغب في تلقي قراءات المستشعر التي لا تغطيها شبكة wi-fi الخاصة بك وتفصل بينها عدة أمتار، بالإضافة إلى ذلك، يمكنك أيضاً توصيل لوحتك ب TTN (شبكة الأشياء).


المصدر: هنا.

ترجمة: غدير سليمان، مراجعة: يارا قاضون، تصميم: علي العلي، تدقيق لغوي: بولا ابراهيم، تحرير: م.رؤى حمود