
قبل أن نتمكن من هزيمة
حافلة CAN ، كان علينا هزيمة القطعة التالية من الأجهزة ، وهي وحدة GPRS. هذه هي حياتها كمطوّرة - طوال الوقت يجب أن تكسب شخصًا (يجب أن تكون هناك ابتسامة ممنوعة).
بالنسبة لأحد المشاريع المخصصة ، كنت بحاجة إلى إضافة القدرة على التحكم في القياس عن بُعد وتلقيه عبر GSM باستخدام الرسائل القصيرة. نظرت إلى قائمة الخيارات المتاحة واستقرت على درع GPRS من Amperka. لما لا؟ يبدو لائقًا ، يتم إنتاجه من قبل شركة معروفة جيدًا ، ولديه دعم تقني ، ولا يختلف السعر كثيرًا عن المنافسين وعادة ما يترك انطباعًا جيدًا.
ولكن كان هناك. يمكنك التعرف على هذا المسعى ودورات التعليم المستمر المذهلة التي كان علي أن أذهب إليها ، ودمج وحدة GPRS هذه مع
خادم Arduino Mega بالضغط على الزر أدناه.
الوحدة النمطية نفسها
كما قلت ،
فإن الوحدة نفسها تعطي انطباعًا جيدًا للغاية من خلال دقة التنفيذ والعلاقة مع شركة معروفة. مرة أخرى ، يحتوي موقع الشركة المصنعة على أمثلة الاستخدام ومكتبة أصلية. نظرًا لأن الوحدة النمطية لها علامة تجارية ، فهناك أمل في الحصول على دعم مناسب في حالة حدوث أي مشاكل معها.
في المستقبل ، سأقول أن الدعم الفني أجاب على أسئلتي بشكل صحيح لمدة أسبوعين ، وبحث عن الأخطاء في مكتبتي وحتى أصدر نسخة جديدة بناءً على سبب التواصل معي. ولكن ... كان لا يزال عليّ أن أجعل الوحدة تعمل بمفردي.
المشروع
بضع كلمات حول
مشروع تعاونية GSM ، التي تتطلب وحدة GPRS. كان من الضروري تطوير التشغيل الآلي لإدارة حظيرة الدجاج. في الواقع ، في وقت مدهش نعيش فيه ، يجب الآن التحكم في حظيرة الدجاج عبر متصفح الويب وأجهزة الاستشعار الذكية اللاسلكية والقياس عن بُعد GSM. إنه كائن استراتيجي من نوع ما ، وليس حظيرة دجاج.
ولكن إذا لزم الأمر ، فمن الضروري. نشتري مكونات ، من بينها وحدة GPRS ، ونستمر.
كعب أخيل
الآن عن ميزات الوحدة. في الأساس ، يعمل. يعمل مع الأمثلة المقدمة على موقع الشركة المصنعة وعلى أساسه يمكنك حتى إنشاء بعض رسم بسيط. ولكن هناك ثلاثة "استثناءات".
ملاحظة تم استخدام لوحتين رئيسيتين في المشروع: Arduino Mega 2560 و Arduino Due ، وكل ما يلي ينطبق بشكل خاص عليهم وفقط لهم.الأجهزة "لكن" الأولى. لا تعمل الوحدة النمطية مع Arduino Due. مستحيل. حتى المراسلات متعددة الأيام مع الدعم الفني من Amperka لم تساعد. لم أستطع أنا ولا متخصصي الشركة الحصول على GPRS Shield للعمل مع Arduino Due. وهذا أمر مخيب للآمال للغاية لأن Due هو وحدة تحكم ممتازة ذات قدرات رائعة ويحب أن يكون قادرًا على استخدامها مع GPRS Shield.
والثاني "لكن" نظامي. تتطلب الوحدة النمطية مكتبة البرامج حتى تعمل. عندما بدأت محادثتي مع GPRS Shield والدعم الفني من Amperka ، كان هذا حلاً غير بديل. بعد إجراءاتنا ، تم إصدار نسخة منقحة من المكتبة مع دعم للعمل على المسلسل الحديدي ، ولكن ... لم تكسب أبدًا إما Due أو Mega. ما الذي يصعب شرحه بشكل عام - إذا كانت الوحدة تعمل على SoftSerial ، فما الذي يمنعها من العمل على Serial iron؟
الثالث "لكن" ، المفاهيمي. هذا ليس كل شيء. الكمين الرئيسي يكمن في مبدأ مكتبة الوحدة النمطية. يعمل في الوضع المغلق ، أي أنه يمنع تشغيل وحدة التحكم أثناء انتظار وصول الرسائل القصيرة (والتي تبلغ 99٪ من الوقت) وأثناء جميع العمليات الأخرى للوحدة النمطية. ماذا يعني هذا؟ هذا يعني أنه في المكتبة القياسية من الشركة المصنعة ، لا يمكنك بناء أي شيء سوى رسم تخطيطي. لا يتألق حظيرة الدجاج الإستراتيجية بالنسبة لك ، لأن آلاف التطبيقات الرائعة مثل أنظمة الأمان ، وإدارة الاحتباس الحراري ، والتحكم في المنزل الذكي عبر GSM ، وما إلى ذلك ، لا تتألق.
المزيد عن SoftwareSerial
لا تعمل الوحدة على Arduino Due ، لذلك سنتحدث عن Arduino Mega. تكمن المشكلة في أن امتلاك Mega له ثلاثة منافذ أجهزة مجانية Serial1 و Serial2 و Seria3 ، فنحن مضطرون للاتصال واستخدام مكتبة SoftwareSerial. في أي طريقة لا يمكن تصورها ولا يمكن تصوره ، بما في ذلك إعادة ترتيب القفز على الوحدة والاستجواب مع إدمان الدعم الفني من Amperka ، فشلت في جعل GPRS Shield للعمل مع منافذ الأجهزة على Arduino Mega.
حسنًا ... نستخدم SoftwareSerial ، ولكن هنا ننتظر كمينًا. يمكن أن يعمل SoftwareSerial على العديد من دبابيس Arduino Mega ، ولكن لسبب ما يعمل فقط على دبابيس 62 و 63. لماذا فقط عليهم؟ هذا اللغز رائع. لجميع المظاهر ، لن نعرف جواب هذا السؤال.
طحين الاختيار
والآن ، كالعادة ، نفهم أن المكتبة القياسية غير مناسبة للاستخدام العملي. من خلال حظر وحدة التحكم أثناء انتظار تلقي استجابة من وحدة GPRS ، تقوم المكتبة أيضًا بحظر جميع العمليات الأخرى. يسقط جهاز التحكم ببساطة عن الواقع بنسبة 99٪ من الوقت ، وينتظر حتى وصول طلب أو استجابة أو انتهاء المهلة.
هذا يضع نهاية لأي تطبيق لـ GPRS Shield ، باستثناء الاختبار الأول: أرسل طلبًا لتشغيل المقبس - تم تشغيله ، أرسل طلبًا لإيقافه - تم إيقافه. لا يمكن أن يكون هناك أي حديث عن أي عمل لخادم الويب ، والعمل مع أجهزة الاستشعار ، والتحكم في المشغلات وأشياء أخرى ؛ لن يعمل أي من هذا ببساطة.
نشأ السؤال - إما أن نتخلى عن مكتبة الشركة المصنعة ونكتب رمز تحكم GPRS Shield (من السهل القول) ، أو نتخلى عن الوحدة نفسها ونبحث عن حل بديل. لكن الوحدة موجودة بالفعل ، لذلك تقرر التخلي عن المكتبة وكتابة رمز التحكم الخاص بها.
غزو ايفرست
أتخطى العملية برمتها لإنشاء الكود الذي يحل محل المكتبة القياسية من Amperka ، ألاحظ فقط أنه كان صعبًا جدًا جدًا ويتطلب عملًا بحثيًا كبيرًا ، وتجميع خوارزمية متطورة وجهود كبيرة لاختبار الحل الناتج.
سيكون كل شيء بسيطًا بالنسبة لك - القليل من السحر وكود العمل الجاهز لوحدة AMS لدعم GPRS Shield جاهز.
كود كامل لوحدة AMS يحل محل المكتبة القياسية #ifdef GPRS_FEATURE #include <SoftwareSerial.h> #define ALWAYS 1 #define GPRS_ON_PIN 2 #define GPRS_STATE_PIN 3 #define GPRS_RX_PIN 62 #define GPRS_TX_PIN 63 #define MASTER "+7yyyxxxxxxx" #define MESSAGE "Hello" #define CHECK_ERROR 0 #define CHECK_MARKER 1 #define CHECK_OK 2 #define NO_CHECK 3 #define MARKER_OK "OK" #define MARKER_NO_CHECK "-"
تم تطوير الوحدة واختبارها على AMS الإصدار 0.16 لـ Arduino Mega. أظهر الاختبار تشغيلًا مستقرًا وموثوقًا به لـ GPRS Shield تحت سيطرة هذه الوحدة.
اتصل بوحدة دعم درع AMS GPRS
من أجل توصيل وحدة GPRS Shield بخادم Arduino Mega Server ، تحتاج إلى تنفيذ بعض الخطوات البسيطة. أولاً ، أضف الأسطر التالية إلى ملف AMS الرئيسي
#define GPRS_FEATURE
و
byte modulGprs = MODUL_NOT_COMPILLED;
في الأقسام المناسبة. هناك تحتاج إلى إضافة متغيرات الاختبار التي ستكون في مشروعك الحقيقي مسؤولة عن المعلمات التي يتم التحكم فيها (درجة الحرارة ، حالة الاتصال ، إلخ).
float lpTempTemp; byte lpContCont1; byte lpLeakLeak1; byte smokeSmoke; byte relayRelay; byte servoState;
شرح الميزات المدعومة
تحتوي الوحدة النمطية على مجموعة أساسية من الاستعلامات والأوامر ، ولكن يمكنك استبدال هذه الأوامر بأي أوامر أخرى و / أو توسيع المجموعة الأساسية من الأوامر والاستعلامات التي تحتاجها.
استفسارات
يتم إرسال الطلبات عبر الرسائل القصيرة ، يرسل النظام ردودًا (أيضًا عبر الرسائل القصيرة) تحتوي على معلومات حول المعلمة المطلوبة. بسيط للغاية: نرسل طلب "temp1" من الهاتف ، ويرسل النظام استجابة لقيمة درجة الحرارة الحالية
temp1=20.50
.
temp1 - طلب درجة الحرارة
cont1 - طلب حالة الاتصال
تسرب 1 - طلب حالة جهاز استشعار التسرب
الدخان 1 - الاستعلام عن حالة كاشف الدخان
relay1 - طلب حالة التتابع (المفتاح)
servo1 - طلب حالة وحدة التغذية المؤازرة
الفترة - طلب فترة حزم القياس الآلي عن بعد
الكل - طلب جميع معلمات النظام
استجابة لطلب "الكل" ، يرسل النظام قائمة بجميع المعلمات. في حالة إرسال أمر غير مسجل ، سيرسل النظام استجابة "خطأ". إذا كانت المعلمات المراقبة خارج النطاق الطبيعي ، فيمكن للنظام نفسه إرسال رسائل إنذار إلى الهاتف الذكي الخاص بالمشغل.
من أجل إدارة النظام يمكن فقط للمشغل المسجل ، يتمتع النظام بالحماية ضد الوصول غير المصرح به - فهو يستجيب فقط للأوامر من رقم (أرقام) هاتف معين.
الفرق
يتم إرسال الأوامر عبر الرسائل القصيرة ، بعد قبول الأمر ، يقوم النظام بتغيير حالته ويرسل ردودًا بمعلومات حول الحالة الجديدة لمشغلاته أو إعداداته.
relay1 = - أمر التحكم في التتابع (المفتاح)
servo1 = - أمر التحكم في وحدة التغذية
نقطة = - أمر لتغيير فترة الإرسال التلقائي للقياس عن بعد
مثال.
relay1=1
الأمر
relay1=1
،
relay1=ON
الاستجابة
relay1=1
relay1=ON
.
relay1=0
الأمر
relay1=0
،
relay1=OFF
الاستجابة
relay1=OFF
.
تفسيرات التعليمات البرمجية
تهيئة وحدة GPRS. التهيئة القياسية لوحدة AMS ، وإطلاق SoftwareSerial ، والقليل من السحر لأوامر GSM AT. الغرض من هذه الكتلة هو إحياء وحدة GPRS وإعادتها من السكينة إذا كانت قد تركتها في هذه اللحظة لسبب خارج عن سيطرتنا.
void gprsInit() { initStart("GPRS", true); GPRS.begin(9600); gprsOnOff(); gprsStart(); sendGprs("AT+CFUN=1", "OK"); sendGprs("AT+CNMI=2,1", "OK"); sendGprs("AT+CMGF=1", "OK"); sendGprs("AT+CLIP=1", "OK"); modulGprs = MODUL_ENABLE; initDone(true); }
وظيفة العمل الرئيسية للوحدة. كل 20 ثانية ، يتحقق خادم Arduino Mega Server من الرسائل القصيرة الواردة ، وفي حالة وجود أي طلبات أو أوامر ، ينفذها. ونتيجة لذلك ، فإن متوسط التأخير في تنفيذ الأمر هو 10 ثوانٍ (باستثناء التأخير في إرسال رسائل SMS من قبل مشغل الاتصالات). يمكن تكوين هذا الفاصل الزمني ، يتم تحديد 20 ثانية كحل وسط بين سرعة رد الفعل لأوامر SMS وتشغيل النظام.
في هذه الثواني الـ 20 ، يمكن لـ AMS القيام بكل ما تحتاجه ، ولا تضيع الرسائل القصيرة الواردة في هذه الفترة الزمنية. عند استخدام المكتبة القياسية ، لا يمكن للنظام أن يفعل شيئًا سوى انتظار وصول الرسائل القصيرة ، وإلا فإنه يفقدها فقط (ولا يمكن لوحدة التحكم القيام بأي شيء في هذا الوقت أيضًا).
يوجد أيضًا رمز إرسال للقياس عن بُعد بفاصل زمني محدد قدره ساعة واحدة أو 6 ساعات أو 12 ساعة أو 24 ساعة. يمكن تغيير هذا الفاصل الزمني عن طريق إرسال الأمر المناسب عبر الرسائل القصيرة.
void gprsWorks() { if (cycle20s) { readSms(); } switch (gprsPeriod) { case 1: if (cycle1h) {sendPeriod();} break; case 6: if (cycle6h) {sendPeriod();} break; case 12: if (cycle12h) {sendPeriod();} break; default: if (cycle24h) {sendPeriod();} break; } }
يتم تنفيذ تفاعل وحدة GPRS ووحدة التحكم باستخدام أوامر AT الخاصة ، وتشكل الوظائف التالية أوامر وحدة GPRS في أكواد يمكن فهمها لها.
وظيفة إرسال الرسائل القصيرة. في معلمات الوظيفة ، يتم إرسال رقم هاتف الوجهة والأمر أو الطلب في شكل نص.
bool sendSms(char *number, String data) { String numstr = "AT+CMGS=\"" + String(number) + "\""; String messtr = data + String((char)26); if (sendGprs(numstr, ">")) { if (sendGprs(messtr, MARKER_NO_CHECK)) { return true; } } return false; }
وظيفة قراءة الرسائل القصيرة. يتم وضع القيم المقبولة في رسالة المتغيرات والهاتف والتاريخ ، والتي تحتوي على التوالي على الأمر المستلم ورقم الهاتف ووقت الإرسال.
void readSms() { byte result = sendGprs("AT+CMGR=1,1", "+CMGR:"); if (result == CHECK_MARKER) { parseSms(message, phone, datetime); Serial.print(F("Number: ")); Serial.println(phone); Serial.print(F("Datetime: ")); Serial.println(datetime); Serial.print(F("Message: ")); Serial.println(message); deleteSms(); if (String(phone) == String(MASTER)) { Serial.println(F("Message from MASTER!")); gprsAnswer(); } } else if (result == CHECK_OK) { Serial.println(F("No SMS")); } else { Serial.println(F("Error read SMS")); } }
وظيفة تشكيل استجابة لطلبات وأوامر SMS. هذه الوظيفة خاصة بكل مشروع ويمكنك تغييرها في مشاريعك وفقًا لمنطق نظامك.
void gprsAnswer() { String s = ""; String mess = String(message); String data = ""; if (mess == DATA_TEMP1) {s += mkTemp1();} else if (mess == DATA_CONT1) {s += mkCont1();} else if (mess == DATA_LEAK1) {s += mkLeak1();} else if (mess == DATA_SMOKE1) {s += mkSmoke1();} else if (mess == DATA_RELAY1) {s += mkRelay1();} else if (mess == DATA_SERVO1) {s += mkServo1();} else if (mess == DATA_PERIOD) {s += mkPeriod();} else if (mess == DATA_ALL) {s += mkAll();} else if (mess.indexOf(F("=")) >= 0) { byte p = mess.indexOf(F("=")); if (mess.indexOf(CMD_RELAY1) >= 0) {data = mess.substring(p + 1); gprsSetRelay(data.toInt()); s += DATA_RELAY1; s += '='; s += stringSens(relayRelay);} else if (mess.indexOf(CMD_SERVO1) >= 0) {data = mess.substring(p + 1); gprsSetServo(data.toInt()); s += DATA_SERVO1; s += '='; s += stringSens(servoState);} else if (mess.indexOf(CMD_PERIOD) >= 0) {data = mess.substring(p + 1); gprsPeriod = data.toInt(); s += DATA_PERIOD; s += '='; s += String(gprsPeriod);} } else { Serial.println(F("Not command!")); }
وظائف تشكيل الأجوبة. هذه هي الوظائف التي تشكل الاستجابات التي يرسلها النظام عبر الرسائل القصيرة إلى الهاتف الذكي الخاص بالمستخدم استجابة لطلب أو حسب تقديره ، وفقًا للبرنامج المنصوص عليه.
String stringSens(byte v) String stringLeak(byte v) String stringSmoke(byte v) String mkTemp1() String mkCont1() String mkLeak1() String mkSmoke1() String mkRelay1() String mkServo1() String mkPeriod() String mkAll()
ووظائف تنفيذ الأمر. هذه هي الوظائف التي يتم تنفيذها بواسطة أوامر SMS وتغيير حالة النظام ، أي تغيير إعداداته أو تمكين أو تعطيل المشغلات.
void gprsSetRelay(byte v) void gprsSetServo(byte v)
الوظائف المتبقية هي تقنية بحتة ، حيث تقوم بكل العمل الصعب لخدمة التفاعل بين درع GPRS وجهاز التحكم الدقيق.
المزيد عن SoftwareSerial
كل ما سبق غير كافٍ لكي يعمل GPRS Shield في وضع شفاف ويتوقف عن حظر العمليات الأخرى التي تعمل على وحدة التحكم الدقيقة. من الضروري أيضًا تعديل رمز مكتبة SoftwareSerial. والحقيقة هي أن المخزن المؤقت القياسي 64 بايت لا يكفي لهضم معظم أوامر AT GSM والحفاظ على التفاعل الديناميكي بين الوحدة ووحدة التحكم.
تحتاج إلى زيادة هذا المخزن المؤقت إلى 128 بايت على الأقل ، وبعد ذلك فقط سيعمل السحر وسيبدأ GPRS Shield في العمل بشكل طبيعي في وضع شفاف. يتم ذلك في ملف
SoftwareSerial.h
. الخط
#define _SS_MAX_RX_BUFF 64
بحاجة إلى التغيير إلى
#define _SS_MAX_RX_BUFF 128
الخلاصة
ترى تبادل أوامر المشغل واستجابات النظام على شاشة الهاتف الذكي. وبينما ينفذ النظام العشرات من العمليات في وضع تعدد المهام الزائف. وبدأ GPRS Shield في شغل أقل من 1٪ من وقت المعالج ، بدلاً من 99٪ كما كان من قبل ، مما وفر الوقت المتبقي لخادم الويب والمهام الأخرى لإدارة حظيرة الدجاج.
هذا كل شيء ، قمنا بدمج GPRS Shield في
AMS ، وتغلبنا على جميع العقبات ، وجعلنا نعمل في وضع شفاف ، دون حظر العمليات الأخرى مثل خادم الويب ، وتشغيل أجهزة الاستشعار اللاسلكية والمحركات ، وهذا يفتح آفاقًا جذابة لبناء عدد كبير من الأنظمة مع التحكم في الرسائل القصيرة SMS والتحكم على أساس AMS - الدفيئات ، وأنظمة الأمن والتدفئة ، وخيارات مختلفة للمنزل الذكي ، وما إلى ذلك ، وما إلى ذلك تقريبًا إلى ما لا نهاية.