يكون الجو باردًا في الكوخ ، وتريد تشغيل المدفأة قبل ساعات قليلة من وصولك ، أو كنت قلقًا من احتمال حدوث إغلاق طارئ لنظام التدفئة في منزل ريفي في غيابك. يمكن حل كل هذه المشكلات باستخدام وحدة GSM ، والتي يمكنها إرسال واستقبال رسائل SMS والرد عليها ، وتشغيل وإيقاف الحمل اللازم. من الناحية النظرية ، كل شيء بسيط ، في الممارسة العملية ، في الطريق إلى تنفيذ مثل هذا الجهاز ، هناك العديد من المزالق.

كانت خطتي هي إنشاء جهاز بسيط ورخيص مجهز بمستشعرين لدرجة الحرارة ، ومستشعر للرطوبة ، ووحدة GSM ، بالإضافة إلى مرحل الحالة الصلبة ومقبس لتوصيل الحمل. ما حدث في النهاية يمكن أن ينظر إليه في الصورة. تم اختيار مستشعر المناخ BME280 كمستشعر لدرجة الحرارة والرطوبة ؛ لا يتم استخدام قناة الضغط الخاصة به. في الصورة ، يمكنك رؤيتها أسفل الغطاء الشفاف على يسار الوحدة الرئيسية. يقلل هذا الترتيب من تأثير توليد الحرارة داخل الهيكل على قراءات المستشعر. كغطاء ، يتم استخدام أنبوب اختبار صيني من البلاستيك به فتحتان للتهوية. جهاز استشعار درجة الحرارة الثاني هو بعيد ، المحرز في DS18B20. يقع داخل مسبار معدني ، متصلاً بالإسكان باستخدام كابل من خلال مقبس الصوت العادي لسماعات الرأس. تم تصميم المسبار لقياس درجة حرارة نظام التدفئة مباشرة. يشغل حجم الجسم الرئيسي مرحل الحالة الصلبة (اخترت أكثر قوة) ومحول من 220V إلى 5V لتشغيل الدائرة. يتم تثبيت مأخذ توصيل الحمل على الجانب الخلفي من العلبة ، في الصورة غير مرئية. تعرض شاشة OLED المستندة إلى جهاز التحكم SH1106 قراءات المستشعر وتوضح أيضًا ما إذا كان التحميل قيد التشغيل. للتحكم في النظام بالكامل ، يتم استخدام وحدة Arduino Pro Mini في الإصدار 3.3V 8MHz. لست من المعجبين بهذا النظام الأساسي ، لكن وفرة المكتبات ، بما في ذلك الكاتب في حالة سكر بعناية ، تجعلها الخيار الأفضل عندما تحتاج إلى عمل شيء بسيط بسرعة.
توجد وحدة SIM800L GSM في حاوية معدنية منفصلة لتقليل التداخل الذي يحدثه على بقية الدائرة. كما أظهرت الممارسة ، لا يتم تقليل التداخل الناتج عن ذلك كثيرًا. ويتم تقليلها جذريًا بواسطة هوائي خارجي متصل بواسطة كبل محمي بالموصل المحوري ، في الصورة أعلاه يكون في المقدمة. ولكن سنتحدث عن هذا بمزيد من التفصيل في وقت لاحق.

تمت كتابة الكثير من المقالات حول استخدام وحدات GSM ، بما في ذلك على المحور ، لذلك سأتجنب التكرار وأتحدث عما لم أره في المنشورات المتعلقة بهذا الموضوع ، وهي كيفية صنع جهاز موثوق به يعتمد على هذه الوحدة.
في المرائب ، حيث أقوم بزيارتها في كثير من الأحيان ، وضعت مؤخراً حاجزًا عند المدخل ، والذي يفتح عند الاتصال برقم معين. على ما يبدو ، وهي مصنوعة على وحدة GSM مماثلة. لقد فوجئت بمدى صعوبة الحصول على هذا الرقم لفتحه. الآن أعرف الكثير من الأسباب لهذا. هذه المعرفة كلفتني عدة أشهر من التجارب وكمية هائلة من الأموال التي أنفقت عليها. آمل أن تخدم هذه المعرفة الآن شخصًا آخر. فكر في ما يجب الانتباه إليه ، والانتقال من مشاكل الأجهزة الواضحة إلى مشاكل البرامج الأقل وضوحًا.
أول شيء هو المهم القيام به بشكل صحيح هو إدخال بطاقة SIM.
بدا لي واضحًا أن بطاقة SIM يتم إدخالها مع زاوية مشطوفة للأمام. منذ أسبوع كنت أحاول أن أفهم لماذا لا تريد الوحدة النمطية التسجيل على الشبكة ، وفي نفس الوقت إتقان الأوامر في الجهاز. نتيجة لذلك ، في بعض المنتديات باللغة الإنجليزية ، وجدت إشارة إلى أنك بحاجة إلى إدراجه بزاوية مشطوفة. من الغريب أن يتم إدراجها بشكل عام بهذه الطريقة وذاك.
للعمل بشكل جيد ، تحتاج إلى تناول الطعام بشكل جيد.
متطلبات الطاقة لوحدة GSM محددة تمامًا. وهي مصنوعة على أساس رقاقة مصممة للهواتف المحمولة بضغطة زر ومصممة لتكون مدعومة مباشرة من بطارية ليثيوم. لذلك ، 5V هو الكثير بالنسبة له ، و 3.3 V ليست كافية. بالإضافة إلى ذلك ، في وضع النقل بأقصى طاقة ، يمكنه استهلاك تيار يصل إلى 2A. إذا كان مصدر الطاقة غير قادر على توفير التيار المطلوب ، فقد تتم إعادة تشغيل وحدة GSM عند محاولة التسجيل على الشبكة والاستمرار في إعادة التشغيل في دورة لا نهاية لها. تدوم فترات استهلاك الذروة عادة أقل من ثانية ، لذلك من المغري استخدام عامل استقرار منخفض التيار مع تخزين الطاقة لفترات الحمل القصوى. على هذا النحو ، يمكنك استخدام بطارية ليثيوم. في الوقت نفسه ، من المهم التأكد من إمكانية فصله ومن المهم عدم نسيان استخدامه ، وإلا فإن فصل الجهاز عن الشبكة سيؤدي إلى تفريغ عميق للبطارية وتلفها الذي لا رجعة فيه. خيار آخر هو استبدال البطارية مع أيونيتور (supercapacitor). انه لا يخاف من التفريغ العميق. لكنه أيضا لديه مشاكل مع الموثوقية. عادة ما يتم تصنيف خلية واحدة من الأيونستور للجهد من 2.5 إلى 3V. تتكون الأيونات المصممة للجهد العالي من عدة خلايا (عادة 2). في هذه الحالة ، ومع ذلك ، قد يؤدي عدم التوازن في الجهد في الخلايا إلى انهيار الخلية. يتم الحصول بسهولة على مثل هذا الخلل بسبب الاختلاف في سعة الخلية أو الفرق في تيار التسرب. وينبغي أيضا أن تؤخذ في الاعتبار المعلمة المقاومة الداخلية للأيونور. الأيونات ذات المقاومة الداخلية العالية عند التيارات العالية عديمة الفائدة ، والأيونات ذات المقاومة المنخفضة ليست أرخص من البطارية. بعد أن توفي فجائي المتأين بسبب خلل في الخلايا ، قمت للتو بتطبيق محول من 220 فولت إلى 5 فولت من الطاقة الكافية. من أجل خفض الجهد إلى وحدة GSM المطلوبة ، أضع الصمام الثنائي السيليكون العادي بين المحول والوحدة. في مثل هذا الصمام الثنائي ، يسقط 0.7V عادة ، وبالتالي تحصل الوحدة على 4.3V الضروري. بعد الصمام الثنائي ، من المفيد وضع مكثف كهربائيا ذو سعة كبيرة. سوف يخفف من انخفاضات الجهد عند تشغيل جهاز الإرسال فجأة.
الابتعاد عن هوائي الإرسال.
حتى بعد أن زودت وحدة GSM بالقدرة المطلوبة ، ظهرت أعراض إعادة التشغيل بشكل دوري ، لكن هذه المرة أعيد تشغيل Arduino. أظهرت قوتها باستخدام الذبذبات أن القوة ليست ضرورية هنا. على ما يبدو ، أنشأ المرسل الوحدة النمطية ، حيث أن المشكلة نشأت في كثير من الأحيان في ظروف استقبال إشارة المحطة الأساسية. هذا التأثير الجذري للتداخل من هوائي الإرسال يمكن تفسيره تمامًا إذا ذكرنا أن مرسل الوحدة قادر على توصيل 2 واط إلى الهوائي. هذه الطاقة يمكن أن تغلي ملليلتر من الماء في 5 دقائق أو تسخن أذنك بضع درجات. لمكافحة هذه المشكلة ، تم تجريب العديد من الطرق. أولاً ، قمت بتوصيل هوائي خارجي ، كان موجودًا خارج العلبة ومتصلًا بالوحدة باستخدام كابل قصير متحد المحور. ومع ذلك ، فإن هذا لم يعطي التأثير المتوقع. ثم وضعت الوحدة في صندوق معدني منفصل ، تم توصيل الهوائي به من الخارج. لقد أصبح أفضل ، لكن ليس كثيرًا. حسّن الوضع بشكل جذري إزالة الهوائي فقط على مسافة معينة من الجهاز بسبب اتصاله بكبل متحد المحور بطول كافٍ.
لماذا يحدث هذا أمر سهل الفهم من الاعتبارات المادية. الهوائي النموذجي هو دبوس رباعي الموجة ، أي نصف الهوائي ثنائي القطب. ولكن لإنشاء حقل كهربائي ، لا يكفي نصف ثنائي القطب ، فأنت تحتاج إلى النصف الثاني ، ثم سيظهر حقل كهربائي بين العناصر المشحونة سالبًا وإيجابيًا في الهوائي. بالنسبة إلى هوائي سوط منتظم ، يكون النصف الآخر إما سطح الأرض أو جسم الصك أو "أرصدة" موصلة خاصة. لكن بالنسبة إلى المسوقين ، كل هذا معقد للغاية ، لذلك عادة ما نبيع نصف الهوائي العادي فقط. كيف تعمل؟ بسيط للغاية - النصف الآخر هو الكابل الذي يتصل به الهوائي. حقيقة أنه محمي لا يغير شيئا. يلعب السطح الخارجي لجديله دور النصف الثاني من هوائي ثنائي القطب. في هذه الحالة ، يحدث التداخل بسهولة على الأسلاك التي تمر في الحي ، على الرغم من حقيقة أن الكابل يبدو محميًا. حسنًا ، إذا لم يكن هناك كبل ، على سبيل المثال ، قمنا بإخفاء الوحدة في شاشة معدنية ، والتي ينطلق منها الهوائي؟ إذا كانت الشاشة كبيرة (مقارنة بطول الموجة) ، فإنها تعمل مثل النصف الثاني من باعث ، وإذا كانت صغيرة ، ثم تنبعث منها الأسلاك الأخرى المتصلة بهذه الوحدة ، لا يهم أي منها. يوضح الشكل التالي ما سبق (تظهر إيجابيات وسلبيات الوضوح ، في الواقع ، تتغير شحنة عناصر الهوائي مع تردد الموجة الحاملة).

يظهر الهوائي "الأيمن" على اليسار ؛ ولا ينبعث كابل الرصاص في التداخل. تظهر الصورة الوسطى الهوائي الذي تشتريه عادة. هنا ، يعتبر الكبل الرصاصي جزءًا من الباعث ويتداخل مع الأسلاك التي تمر في مكان قريب. يظهر الموقف على اليمين عند إخفاء مصدر الإشارة في حاوية محمية مدمجة. هنا ، أي أسلاك جلبت إلى مثل هذا السكن هي جزء من باعث.
الأخلاقية هي أن الطريقة الوحيدة الموثوقة لحماية نفسك من التداخل الناجم عن هوائي الإرسال تتمثل في إخراجها من بقية الأجهزة الإلكترونية عن طريق توصيلها بكبل متحد المحور بطول كافٍ. كم من الوقت يكفي؟ من الطبيعي قياس المسافة بطول الموجة ، وفي هذه الحالة يكون الحد الأقصى هو 30 سم ، وهذا هو الحد الأدنى للمسافة التي ينبغي تخصيص الهوائي بها ، ولكن كلما كان ذلك أفضل.
ليست كل المنافذ التسلسلية مفيدة بنفس القدر.
في ميكروكنترولر AVR البسيطة ، والتي يستخدمها الجميع عادة ، لا يوجد سوى منفذ تسلسلي واحد للأجهزة ، ويستخدم لتنزيل البرنامج. لذلك ، يعد تنفيذ البرنامج للمنفذ التسلسلي حلاً شائعًا للغاية. سأثبت عبارة تفيد بأن الكثير من الناس سيجدون غير متوقعين - لإدارة وحدة GSM ، فإن تنفيذ البرنامج للمنفذ التسلسلي غير مناسب على الإطلاق.
يكمن جوهر المشكلة في أن تنفيذ برنامج المنفذ التسلسلي يحظر المقاطعة طوال الوقت الذي يتم فيه إرسال الحرف التالي أو استلامه. يبدو أن هذا سيء ، كما يفعل كثيرون. على سبيل المثال ، يحظر تنفيذ بروتوكول سلك واحد لقراءة موازين الحرارة لأشباه الموصلات في دالاس الانقطاعات أثناء نقل بت واحد ، أي 65 ميكروثانية. هذا بالطبع ليس جيدا جدا. إذا كان لدى النظام معالجات مقاطعة أخرى ، فلن يتمكنوا من توفير وقت استجابة المقاطعة أقل من 65 ميكروثانية. إذا وصل طلب المقاطعة عند رفضه ، فلن تتم معالجته إلا بعد حل المقاطعة مرة أخرى. على سبيل المثال ، يستخدم المنفذ التسلسلي للجهاز المقاطعات لوضع الحرف المستلم التالي في المخزن المؤقت للمتلقي. إذا وصل الحرف التالي حتى تتم معالجة المقاطعة من الحرف السابق ، فستضيع. هذا يعني أن المنفذ التسلسلي للجهاز لن يكون قادرًا على العمل بسرعة أكبر من 115200 بت في الثانية. في حالة تنفيذ برنامج المنفذ التسلسلي ، كل شيء أسوأ. لتشغيله ، من الضروري أن يكون زمن الاستجابة للمقاطعة أقل من وقت إرسال بت واحد. هذا يحدنا بسرعة 9600 بت في الثانية.
المشكلة الأكثر خطورة هي أن برنامج المنفذ التسلسلي نفسه يحظر المقاطعات. علاوة على ذلك ، فإن الوقت الذي تحظره (وقت إرسال أو استقبال حرف واحد) هو دائمًا حوالي 10 مرات أطول من الحد الأقصى لوقت معالجة المقاطعة المطلوب للتشغيل الصحيح لمستقبل نفس المنفذ التسلسلي للبرنامج. بمعنى أنه يتداخل دائمًا مع نفسه إلى الحد الذي يتعذر عليه في الوقت نفسه استلام البيانات وإرسالها. بالطبع ، في معظم الحالات هذا غير مطلوب. في معظم ، ولكن ليس في حالتنا مع وحدة GSM. يمكنه ، بشكل غير متوقع بالنسبة لنا ، بمبادرة منه ، البدء في نقل البيانات (على سبيل المثال ، عند تلقي رسالة SMS). وفي حالة استخدام برنامج المنفذ التسلسلي ، يمكن أن يؤدي هذا بسهولة إلى فشل بروتوكول الاتصال مع الوحدة النمطية. لذلك ، قمت للتو بتطبيق نفس المنفذ التسلسلي للجهاز لبرمجة Arduino وللتواصل مع وحدة GSM. غير مريح بالطبع ، ولكن هذه هي الطريقة الوحيدة لصنع جهاز موثوق.
بروتوكول غير متزامن - معالج غير متزامن
البروتوكول غير المتزامن هو بروتوكول يستطيع أحد جانبي التبادل فيه بدء نقل المعلومات بشكل غير متوقع إلى الجانب الآخر ، أي دون تزامن مع رسائله. هذا هو بالضبط بروتوكول الاتصالات مع وحدة GSM. يستجيب بشكل منتظم لطلبات Arduino ، ولكنه قد يبدأ أيضًا في إرسال شيء خاص به ، على سبيل المثال ، للإبلاغ عن رسالة SMS المستلمة. وهذا يخلق مشكلة حقيقية ، لأن أيا من المكتبات التي أعرفها للعمل مع الوحدة النمطية لـ Arduino تأخذ في الاعتبار عدم التزامن في البروتوكول على الإطلاق. تخيل أن Arduino أرسل أمرًا إلى الوحدة النمطية ، وأن الوحدة في نفس الوقت نقلت معلومات حول رسالة SMS المستلمة. سيتم قبول هذه المعلومات بدلاً من الاستجابة إلى الأمر. نتيجةً لذلك ، ستُرجع المكتبة خطأً استجابةً للأمر (في أفضل الأحوال ، كل شيء "سيعلق" في أسوأ الأحوال) ، وستفقد الرسالة المتعلقة بالرسائل القصيرة المستلمة.
هذا سهل الإصلاح - تحتاج فقط إلى كتابة معالج البروتوكول الخاص بك غير المتزامن. يجعل المعالج غير المتزامن الحد الأدنى من المتطلبات اللازمة لاستجابات الوحدة النمطية لأوامرها فقط. نتيجة لذلك ، الوحدة النمطية إجابات إما "موافق" أو "خطأ" لكل أمر. وهذا كل ما يتطلبه الأمر لإصلاح الإجابة. تتم معالجة جميع الأسطر الأخرى التي تأتي من الوحدة النمطية بغض النظر عما إذا كانت تأتي استجابة لأمر أو بمفردها. يمكن دائمًا تحديد معنى هذه الخطوط من بدايتها. إذا بدأ الخط بـ + CSQ ، فسيحتوي على معلومات حول جودة الإشارة. إذا بدأت + CMT ، فهذه هي معلومات حول الرسائل القصيرة المستلمة ، وهي تحتوي على عنوان المرسل. يتم إرسال السطر الأول كجزء من الاستجابة لأمر AT + CSQ ، ويتم إرسال الوحدة الثانية بمبادرة منها ، لكن بالنسبة لنا هذا الاختلاف ليس له أهمية تذكر. تقوم الوحدة بإرسال رسائل SMS المستلمة مباشرة إلى المنفذ التسلسلي. هذا يتجنب قراءتها من الذاكرة والحذف اللاحق. لكي نتعرف على رسائل SMS في تدفق الرسائل العامة من الوحدة ، يجب أن تبدأ برمز # ، وإلا يتم تجاهل الرسالة.
توجد مكتبة أنشأها المؤلف وتنفذ النهج أعلاه
هنا .
لاستلام السطور التي تبدأ بتسلسل معين من الأحرف ، يقوم العميل بإنشاء كائن خاص - فخ. يمكنه إنشاء أي عدد من هذه الفخاخ. يتم تجاهل الخطوط التي تم تلقيها من الوحدة النمطية ، بخلاف OK ، ERROR ، والتي لم تقع في أي من الملائمات ، ببساطة. نظرًا لأن مثل هذه البنية لا تتطلب تحليلًا كاملًا لاستجابات الوحدة النمطية للعديد من أنواع الأوامر المختلفة ، فإن رمز المكتبة يكون مضغوطًا عدة مرات أكثر من أي من المكتبات التي أعرفها.
ما هي النتيجة؟
والنتيجة هي جهاز يعمل بشكل موثوق في منطقة ذات تغطية ضعيفة ، حتى أفضل من الهاتف العادي. أدناه هو مخطط كامل منه.

للمهتمين ، هناك رابط إلى github حيث ستجد الكود المصدر للمشروع ووصف للأوامر التي يمكن إرسالها إلى الجهاز في رسائل SMS.
github.com/olegv142/GsmMon