محطة الطقس على اردوينو من الألف إلى الياء الجزء 3

يتبع. الجزء السابق .


جدول المحتويات:



الوحدة المركزية. البرمجيات


أخيرًا ، وصلنا إلى الجزء الأكثر صعوبة لأي مبرمج - لوصف ما فعله هناك بمصطلحات بشرية.


الكود المصدري للخادم هو حوالي 1300 سطر ، بما في ذلك المسافة البادئة ، ولكن هذا لا ينبغي أن يخيفك. يتم تزويد النص المصدر بتعليقات تفصيلية ، وفي هذا الصدد ، لن أخطئ إذا قلت إن مصادري موصوفة بشكل أفضل من أي مصادر أخرى يمكنك العثور عليها فقط. ستجد في التعليقات الموجودة مباشرة في شفرة المصدر جميع نقاط التوصيل لتوصيل الوحدات وجميع الروابط الضرورية للوثائق الخارجية. السر بسيط - لقد كتبت تعليقات لنفسي باستمرار ، "في سياق المسرحية" ، لذلك لم أواجه أي صعوبات في التوثيق.


كما كتبت بالفعل ، يمكنك البدء دون وجود جميع الوحدات في متناول اليد. على سبيل المثال ، يمكنك البدء دون الحاجة إلى وحدة راديو أو ESP8266. قد يكون مستشعر الضغط الجوي BMP180 مفقودًا أيضًا. أضف لاحقًا. صحيح ، في هذه الحالة ، (قد) يجب عليك التعليق بشكل مستقل في رسم تلك الأقسام من التعليمات البرمجية المسؤولة عن التفاعل مع الكتل المفقودة ، ولكن على الأرجح لن يكون هذا مطلوبًا. الشيء الرئيسي هو أن شيئًا ما قد تجمع واكتسب ، على الأقل ، من الأفضل الاستمرار.


على وجه التحديد ، في هذه المرحلة من القصة ، لم نقم بتجميع وحدة بدون نوافذ (خارجية) حتى الآن وليس لدينا خادم الويب الخاص بنا بقاعدة بيانات ، لا نحتاجها بعد (ولكن إذا كان الأمر كذلك ، فقم بتوصيلها على الفور حتى لا تضطر إلى الحفر)


  • وحدة راديو nRF24L01 +
  • وحدة WiFi ESP8266.

ومع ذلك ، ربما سأبدأ بـ ESP8266 ، باعتباره الأكثر إشكالًا في برمجة الوحدة وتشغيلها. يكمن السبب في تنوع أداء الوحدات نفسها وبرامجها الثابتة.


كما كتبت البرامج الثابتة القياسية AT لذلك ، هناك عدد من العيوب:


  • لا تزال رطبة (اعتبارًا من عام 2016)
  • لم أتمكن من العثور على مكتبة عادية لـ Arduino للتحكم في وحدة ESP8266 باستخدام أوامر AT ، كان علي "المزرعة الجماعية" بنفسي.

لم أصدر رمز ESP8266 في مكتبة منفصلة ، ولكن ببساطة كتبت الوظائف اللازمة ، لذلك خرج الرسم لفترة طويلة. علاوة على ذلك ، قمت بتنفيذ الوظيفة التي أحتاجها فقط. جميع البرمجة لـ ESP باستخدام أوامر AT ترجع إلى تحليل السلاسل وتعيين التأخير بين الأوامر.


يمكنك العثور على الكود المصدري وتنزيله للخادم (الوحدة المركزية) server.ino هنا .


بعد ذلك أضع البرامج الثابتة لـ ESP8266 في ملف firmware/AT23-SDK101-nocloud.bin والوثائق الخاصة بالفضول موجودة في نفس الدليل. من خلال وميض البرامج الثابتة المشار إليها ، يمكنك التأكد من أن الرسم الخاص بي سيعمل مع WiFi كما كان مقصودًا. لم أجرب مع البرامج الثابتة AT الأخرى. الحقيقة هي أنني تمكنت من العثور على البرامج الثابتة "المتقدمة" غير AT ، وحتى المشاركة قليلاً في إنشائها ، وهو مناسب تمامًا لأغراضنا ( هنا هو رابط خاص ). ومع ذلك ، كما يحدث في كثير من الأحيان ، حدث كل شيء بعد اكتمال العمل على النسخة الحالية من محطة الطقس ، لذلك تقرر تركها كما هي.


لذلك ، في البداية عليك وميض البرامج الثابتة AT المحددة. لا يوجد شيء معقد ، ولكنه بسيط أيضًا. يتم وصف كيفية القيام بذلك كثيرًا على الشبكة - ESP8266 - توصيل وتحديث البرامج الثابتة .


نظرًا لأن محول USB-TTL الخاص بي لم يكن لديه ما يكفي من الطاقة الحالية وانقطع منفذ USB باستمرار (هذا هو الدور!) ، فقد قمت بتوصيل الوحدة كهربائياً لبرامجها الثابتة باستخدام طريقة "Arduino كمحول بسيط من USB إلى Serial TTL".


نظرًا لأنني أعمل على نظام Linux ، كنت esptool.py باستخدام esptool.py . من أجل راحة البرامج الثابتة ، أنا "nakolhozil" لوحة مساعدة صغيرة مع مفاتيح (غير موصوفة هنا).


بعد التفليش ، تحتاج إلى ضبط سرعة المنفذ على 57600 (نظرًا لأن SoftSerial ، تكون سرعة المنفذ عند 115200 كبيرة ولا تضمن التشغيل المستقر) باستخدام الأمر


 AT+UART_DEF=57600,8,1,0,0 

بعد ذلك ، تحتاج إلى تعديل مكتبات Arduino IDE القياسية قليلاً ، أي في ملف arduino/hardware/arduino/avr/libraries/SoftwareSerial/SoftwareSerial.h ، قم بتغيير السطر المقابل إلى


 #define _SS_MAX_RX_BUFF 128 // RX buffer size 

في ملف arduino/hardware/arduino/avr/cores/arduino/HardwareSerial.h بتغيير الأسطر المقابلة إلى


 #define SERIAL_TX_BUFFER_SIZE 128 #define SERIAL_RX_BUFFER_SIZE 128 

وفي الملف arduino/hardware/arduino/avr/cores/arduino/USBAPI.h بتغيير الخط المقابل إلى


 #define SERIAL_BUFFER_SIZE 128 

بالمعنى الدقيق للكلمة ، هذا خطأ ، لأنه عند تحديث Arduino SDK ، من المرجح أن تتم الكتابة فوق هذه الملفات وسيتعين عليك تكرار جميع التصحيحات مرة أخرى. في العلم ، يجب أن نخترع مكتبتنا الخاصة التي تتعامل مع القيم المحددة (إن أمكن) ، ولكن هذا ليس للجميع.


بطريقة أو بأخرى ، انتهت التلاعبات الأولية.


الآن ننتقل مباشرة إلى رمز الوحدة المركزية (الخادم) server.ino


في الأسطر الأولى ، يجب عليك تغيير إعدادات الوصول لنقطة WiFi الخاصة بك


 const String SSID = "..."; const String PASSWORD = "..."; 

العمل مع خادم الويب سيتم مناقشته بالتفصيل لاحقًا.


فيما يلي تعريفات تصحيح (تعليق):


 //#define DEBUG //#define DEBUG_RF //#define DEBUG_ESP //#define DEBUG_LOG_SD 

إذا حدث خطأ ما ، يمكنك دائمًا إلغاء تعليقهم ، وإعادة تجميع الرسم وإعادة تحميله والحصول على المزيد من معلومات التصحيح في وحدة التحكم أو كتابتها إلى ملف على بطاقة SD. ويمكنك أن تعلق فقط ما تحتاجه. على سبيل المثال ، الوحدة النمطية nRF24L01 +؟ ثم فك التعليق DEBUG_RF فقط ، إلخ.


فيما يلي تعليقات مكثفة مع pinouts ، التهيئة ، ووصف مفصل للمحيط بأكمله.


هنا يمكنك تغيير رقم قناة الراديو لـ nRF24L01 +


 #define RF_CHANNEL 73 

يأتي بعد ذلك void setup() ، والذي تم توضيحه من التعليقات التفصيلية هناك. حسنًا ، ثم void loop() ، لا يتم النظر في رمز العمل مع خادم الويب حتى الآن.


بعد ملء الرسم التخطيطي ، ستعود وحدتك المركزية إلى الحياة وتظهر لك شيئًا ، ولكن ليس على الفور ، ولكن بعد 10 دقائق - القيمة DELAY_LOCAL_SENSOR . يمكنك تغييره بالطبع.
يجب أن تُظهر الشاشة: درجة حرارة الغرفة والرطوبة (بيانات من مستشعر DHT11) والضغط الجوي (من BMP180).


الوظائف التالية هي المسؤولة عن العرض على شاشة LCD 16 × 4:


 void lcdClearRow(int row) //     ,   void lcdPrintOutdoor(int temperature, int humidity, float voltage) //     ,   void lcdPrintHome(int temperature, int humidity, int pressure) void lcdPrintInfo(char info[LCD_MAX_COLS]) void lcdPrintStatus() void lcdPrintLastSensorTime() 

تصميم شاشة LCD1604 على النحو التالي.


تصميم شاشة LCD1604


يطبع الخط الأول (العلوي) رمزًا منمقًا (رجل يمشي) مصمم للإشارة إلى الطقس في الشارع (خرج في الشارع ، نزل في الشارع). لقد توصلت إلى الرمز بنفسي ، لذلك إذا كانت لديك فكرة أفضل (والتي تناسب 5 × 8 بكسل) ، فيمكنك تحديدها في التعليقات (كمصفوفة بايت). يمكنك ممارسة فن البكسل هنا Custom Character Generator لوحدات HD44780 LCD . في نفس الخط ، تتم طباعة جهد وحدة النافذة.


يطبع السطر الثاني "الطقس في المنزل" والضغط الجوي. رمز المنزل قياسي ومفهوم للجميع.


في السطر الثالث ، يطبع lcdPrintLastSensorTime() مقدار الوقت (بالثواني) من لحظة أخذ آخر قراءات lcdPrintLastSensorTime() الاستشعار ، على التوالي في الشارع ، ويفصل بينها فاصلة ، المنزل. من المفيد أن تعرف على وجه اليقين أن محطة الأرصاد الجوية لا تعرض حالة الطقس بالأمس. في الواقع ، هذه معلومات تصحيح الأخطاء ويمكن إزالتها في الإصدار النهائي.


وفي السطر الأخير من الشاشة باستخدام وظيفة lcdPrintStatus() ، تتم طباعة معلومات الحالة ، حيث


  • s عبارة عن مستشعر ضغط محلي
  • e هي وحدة ESP8266
  • أنا اتصال WiFi
  • w هو توفر خادم الويب
  • ل - ملف الدخول على بطاقة SD

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


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


التالي. بمجرد ملء الرسم التخطيطي والتأكد من أن كل شيء يعمل كما ينبغي ، يمكنك إعادة توصيل "اللوحة الأم" Arduino Mega بمصدر طاقة خارجي. أو اتركه كما هو ، متصلاً بـ USB للكمبيوتر لإلقاء نظرة على كل هذا الجمال في وحدة تحكم التصحيح.


إذا لم يكن لديك كل الكتل مجمعة ، فيمكنك التعليق على الكود غير الضروري. على الرغم من أنني أكرر ، يجب أن تعمل على هذا النحو ، فقط احصل على رسائل خطأ في وحدة التحكم. كيف تتجنب هذا؟


على سبيل المثال ، لم تقم بشراء مستشعر ضغط جوي BMP180. في مخطط server.ino ، نبحث عن الخطوط المسؤولة عن ربط المكتبات المقابلة ، في حالتنا


 #include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_BMP085_U.h> 

التعليق على هذه الكتلة.


بعد ذلك ، في Arduino IDE ، نبدأ في تجميع الكود (وليس البرامج الثابتة) ونلقي نظرة على الخطوط التي يقسم المترجم عليها. نعلق على هذه السطور. نكرر العملية حتى يتم جمع الكود بشكل طبيعي ، دون أخطاء. قبل التحرير ، من الممارسات الجيدة إنشاء نسخة من الرسم التخطيطي بحيث لا يكرر كل العمليات مرة أخرى عند وصول المستشعر المطلوب من الصين المشمسة.


يتم توفير روابط إلى المكتبات المستخدمة في التعليمات البرمجية المصدر. إذا لم يكن هناك مثل هذا الرابط ، فقد تم استخدام مكتبة Arduino IDE القياسية.


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


التالي هو تجميع محول الطاقة ، لذلك خرج هذا الجزء قصيرًا حتى لا يختلط.

Source: https://habr.com/ru/post/ar425953/


All Articles