لوحة TTGO LoRa32 SX1276 OLED هي لوحة تطوير ESP32 مع شريحة LoRa مدمجة وشاشة SSD1306 بمقاس 0.96 بوصة وبتقنية عرض OLED، وسنوضح في هذا المقال كيفية إرسال واستقبال حزم LoRa (اتصال نقطة إلى نقطة) واستخدام شاشة OLED مع أردوينو IDE(برنامج مفتوح المصدر يستخدم لكتابة وتحميل التعليمات البرمجية على لوحات أردوينو).
نظرة عامة على TTGO LoRa32 SX1276 OLED
هي لوحة تطوير ESP32 مع شريحة LoRa مدمجة وشاشة SSD1306 بتقنية عرض OLED، وهي شاشة العرض التي نستخدمها في معظم مشاريع الإلكترونيات.
تتميز اللوحة أيضاً بالعديد من GPIOs (أقطاب الدخل والخرج ذات الاستخدام العام) لتوصيل الأجهزة الطرفية وأزرار PRG (BOOT) وRST وموصل بطارية ليثيوم.
TTGO LoRa32 SX1276 OLED
يوضح الشكل التالي أطراف توصيل شريحة TTGO LoRa32 OLED.
تتصل شاشات 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. .
اتبع الخطوات التالية لتثبيت هذه المكتبات:
- افتح أردوينو IDE وانتقل إلى البرنامج > تضمين المكتبة > إدارة المكتبات. يجب أن يٌفتح مدير المكتبة (library Manager).
- اكتب “SSD1306” في مربع البحث وقم بتثبيت مكتبة SSD1306 من Adafruit
3. بعد تثبيت مكتبة SSD1306 من Adafruit، اكتب “GFX” في مربع البحث وقم بتثبيت المكتبة.
تثبيت مكتبة LoRa
يوجد العديد من المكتبات المتاحة لإرسال واستقبال حزم LoRa بسهولة باستخدام ESP32. في هذا المثال سنستخدم arduino-LoRa library by sandeep mistry.
افتح أردوينو IDE وانتقل إلى البرنامج > تضمين المكتبة > إدارة المكتبات وابحث عن “LoRa”. حدد مكتبة LoRa الموضحة في الشكل أدناه وقم بتثبيتها.
أعد تشغيل أردوينو 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.
بعد تحميل الكود إلى لوحتك، يجب أن يبدأ في إرسال حزم LoRa.
برنامج مستقبل 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 من اللوحة الأخرى بعد تحميل الكود.
ملخص
كانت هذه المقالة دليلاً سريعاً للوحة TTGO LoRa32 وكيفية إرسال حزم LoRa في اتصال نقطة إلى نقطة واستخدام شاشة OLED،
والفكرة هي جمع ما تعلمته هنا لبناء مشاريع إنترنت الأشياء، ويمكن أن يكون LoRa مفيداً وخاصةً إذا كنت ترغب في تلقي قراءات المستشعر التي لا تغطيها شبكة wi-fi الخاصة بك وتفصل بينها عدة أمتار، بالإضافة إلى ذلك، يمكنك أيضاً توصيل لوحتك ب TTN (شبكة الأشياء).
المصدر: هنا.
ترجمة: غدير سليمان، مراجعة: يارا قاضون، تصميم: علي العلي، تدقيق لغوي: بولا ابراهيم، تحرير: م.رؤى حمود