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

والنتيجة - بمتوسط 10 دقائق - ستكون غنية بالمعلومات. بالقرب من السطح ، تكون الرياح أكثر عظمة من ارتفاعها ، في 10 دقائق يمكن أن تغير السرعة والاتجاه عشرين مرة ، والمعلومات حول هذه العواصف أكثر إفادة للشخص العادي من متوسط القيمة. دعني أذكرك بأن مستشعر السرعة هنا يوضح القيمة القصوى لأربعة قياسات لكل دورة 8 ثوانٍ ، وتبين أن هذا هو الخيار الصحيح (في الواقع ، لقد حصلنا على مستشعر تموج بدلاً من مستشعر السرعة المتوسط).
ولكن تبين أن ريشة الطقس أكثر مزاجية من مستشعر السرعة. وفقًا للخوارزمية الأولية لمحطة الطقس الخاصة بي (والتي تم اختيارها بناءً على أقصى توفير ممكن للطاقة) ، تم قياس الاتجاه مرة واحدة في الدورة ، أي حتى النبضات لم تعمل: كانت هناك عينات عشوائية من العملية المستمرة لتعليق ريشة الطقس ذهابًا وإيابًا بتردد أكبر بكثير من مرة واحدة كل 8 و أكثر من 16 ثانية.
لذلك ، تقرر متوسط اتجاه متجه السرعة لكل دورة ، مع أخذ القياسات كل ثانيتين وحساب المتوسط. والأمر ليس كذلك بحيث يمكن حلها بنصف ركلة - لا تشكل قيم الاتجاه صفيفًا متساويًا من الأرقام التي يمكن إضافتها وتقسيمها مباشرة (كلمة واحدة هي متجه ، وليس مقياس هراء). عادة ما يتم إعطاء مثال بقيم درجة واحدة و 359 درجة: من السهل معرفة أنه في المتوسط سيكون 360 بالضبط (أو 0 ، لا فرق) ، ولكن الحساب العادي سيعطي الرقم 180 درجة.
ليست هناك حاجة لاختراع أي شيء - لقد تم بالفعل اختراع كل شيء أمامك. يتم حل المشكلة من خلال طريقة حساب المتوسطات ، المعروفة جيدًا لأولئك الذين تعاملوا مع قياسات الرياح أو التيارات. الطريقة بسيطة للغاية في الأساس: نظرًا لأنه لا يمكننا متوسط الزوايا بشكل مباشر ، فلنقم بعد ذلك بتوقع إسقاطات المتجه على محور الإحداثيات ، والتي ، بحكم تعريفها ، هي قيمة قياسية ، أي أنها يمكن أن تخضع للحساب العادي دون سؤال.
إسقاطات متجه الرياح الحالي W '(الفاصلة العليا تلعب دور مرتفع) على المحور X و Y هي wx = Wa • cos (α) و wy = Wa • sin (α) ، حيث Wa هي معامل المتجه (قيمة السرعة) و α - قيمة الزاوية بين المتجه ومحور الإحداثيات الصفري. إذا قمنا بحساب متوسط قيم الإسقاطات هذه ، ثم قمنا بتحويل المتوسطات مرة أخرى إلى متجه ، فإننا نحصل على القيمة الحقيقية لمتوسط سرعة واتجاه الرياح.
ملاحظة للتآكل بشكل خاصللحصول على متوسط صحيح تمامًا بهذه الطريقة ، من الضروري قياس قيمة Wa (قيمة السرعة) بشكل متزامن تمامًا مع قيمة الزاوية. من الناحية العملية ، يجب مراقبة ذلك فقط إذا كانت فترات التقلبات الكبيرة في سعة التدفق أقل أو قابلة للمقارنة مع وقت القياسات. بالنسبة للرياح (ولجميع حالات التدفق الطبيعي للمياه تقريبًا) ، ليس من الضروري عادةً المراقبة ، لأن وقت القياس بالنسبة لنا هو بحد أقصى جزء من الثانية ، ونبضات الرياح الكبيرة ، بالطبع ، تستمر لفترة أطول. يمكننا تجاهل التجانس عالي التردد للتدفق ، لأنها لا تؤثر على أي شيء: القصور الذاتي للأجسام المادية الحقيقية (بما في ذلك المستشعرات) أكبر بكثير من هذه التجانسات ، ولن نشعر بها - سترتعد قصاصة من الورق ، ولكن لا شيء أكثر. في الحالات القصوى ، ستخرج كضجيج عشوائي صغير لا يؤثر بشكل كبير على جودة القياسات.
هذه الطريقة الرائعة (دعنا نسميها المتوسط الكامل للمتجه) لها عيب أساسي واحد من وجهة نظر عملية: في حالة عدم وجود موضوع قياس (أي عندما يكون هناك هدوء كامل ، وهو حالة شائعة تمامًا) ، فإنها تعطي نتيجة غير صحيحة رياضياً: نظرًا لأن سرعة الرياح صفر ، ثم وكلا الإسقاطين يساويان الصفر ، والذي لا يمكن أن يكون (لأن الخطية و cos وظائف مكملة). بتعبير أدق ، قد يكون ذلك ، ولكن من المستحيل بشكل أساسي استخراج المعلومات من مثل هذه الحالة. ماذا تريد أن تظهر على الشاشة؟ لأكون صريحًا ، ما زلت لا أعرف الطريقة الصحيحة للتغلب على هذا الموقف (في عدادات التدفق التي صممتها ذات مرة ، كانت دورات المتوسط ساعات ، وكان يعتقد أن بعض التحريك سيحدث على الأقل).
ولكن في حالتنا ، فإن المهمة ، لحسن الحظ ، أسهل - لا نحتاج إلى متوسط السرعة ، ويمكننا القيام به مع إسقاطات واحدة للمتجه ، دون مراعاة حجم وحدته. وبعبارة أخرى ، يمكن للمرء أن يعمل بجيب وجيب التمام النقي ، اللذين لا يأخذان صفرًا في وقت واحد: حتى عندما لا تكون هناك رياح ، فإن ريشة الطقس المجمدة في العقارات تظهر بعض الاتجاه. نسمي مثل هذه الطريقة بمتوسط متجه مبسط للاتجاه (ربما يكون له بعض الاسم الرسمي ، لكنني لست على علم).
كانت هناك صعوبة واحدة الآن: تحويل متوسط قيم الإسقاط المحسوبة إلى قيمة الزاوية. لهذا ، عادة ما يتم استخدام الدالة α = arctan (sin (α) / cos (α)) ، ولكن إذا قمنا بالحساب من خلال الدوال المثلثية العكسية ، فمن الأسهل أن تأخذ ببساطة arcos (cos (α)) (أو arcsin (sin (α)) ، على أي حال) ، ولتكملة هذه النتيجة للحصول على دائرة كاملة (على سبيل المثال ، من 0 إلى 359 درجة) ، وتحليل علامات الإسقاط ، لا يزال عليك على أي حال: جميع الوظائف العكسية تعطي النتيجة داخل نصف دائرة (من 0 إلى 180 أو من -90 إلى +90). (راجع UPD حول هذا في نهاية المقال.)
نقوم بإضفاء الطابع الرسمي على كل ما سبق في خوارزمية حقيقية (بالإشارة إلى Arduino). بادئ ذي بدء ، سنقرأ مؤشرات الاتجاه ليس كل دورة ، ولكن كل قياس (بعد قيمة تردد مقياس شدة الريح). سنحول النتيجة بالرمز الرمادي (في بلدنا تم تعيينه على أنه wind_Gray من نوع بايت ، انظر
هذا المنشور ) إلى رمز ثنائي عادي ، ومثل تواتر مقياس شدة الريح ، سنضعه في مصفوفة عالمية ، والتي سنعلنها باسم wDirAvr [4] ، حيث 4 هو عدد القياسات في الدورة. لن نرسم تحويل الرمز الرمادي المكون من أربعة أرقام إلى رمز ثنائي - يمكن القيام بذلك بعدة طرق وفقًا لتقدير المبرمج ويتم وصفه في أي مرجع.
سيأخذ هذا الرمز الثنائي قيمًا من 0 إلى 15 ، ونحن نتفق على أننا سنحسب الزوايا ، ليس كجغرافيين / طوبوغرافيين / ملاحين متغيرين ، ولكن كأشخاص عاديين درسوا علم المثلثات في المدرسة - عكس اتجاه عقارب الساعة. أي ، إذا كان الشمال يتوافق مع القيمة الصفرية ، فإن 90 درجة ليست الشرق ، كما هو الحال في "المحولة" ، ولكن الغرب. نظرًا لأن لدينا 16 تدرجًا للاتجاه ، فإننا بحاجة إلى ضرب قيمة الشفرة في 22.5 (360/16) للحصول على الاتجاه بالدرجات العادية للقوس.
الآن الخوارزمية الفعلية لمتوسط متجه مبسط للاتجاه من 4 قيم كود:
. . . . . float wSin=0; // sin float wCos=0; // cos float wind_Rad; // for (byte i=0; i<4; i++){ wind_Rad= ((float(wDirAvr[i])*22.5)*M_PI/180); // wSin=wSin+sin(wind_Rad);// sin wCos=wCos+cos(wind_Rad);// cos } // wSin=wSin/4;// sin – , wCos=wCos/4; // cos wind_Rad = acos(wCos); // arccos if (wSin<0) wind_Rad=2*M_PI-wind_Rad; // sin int wind_G = round ((wind_Rad*180/M_PI)/22.5); // 0-15 . . . . .
السطر الأخير نقوم بتحويل المتوسط ، معبرًا عنه بوحدات الراديان ، إلى المتوسط ، المعبر عنه في رمزنا من 0 إلى 15. يمكنك بعد ذلك تحويله مرة أخرى إلى الرمز الرمادي ، ثم لا يتعين عليك حتى تغيير البرنامج في الوحدة الرئيسية لعرض الاتجاه.
هنا ، في الواقع ، هي الخوارزمية بأكملها. كنت خائفا من أن حساب جيب التمام والأركسين سيبطئ الضعيف (مرات 32 اليوم) من وحدة تحكم Arduino ، ولكن لم يحدث شيء: لقد ابتلع الكود دون حتى وميض ... LED ، على الأرجح.
تحديث : بالنسبة للمؤلف ، تعمل الخوارزمية في هذا النموذج لعدة أشهر دون فشل. ومع ذلك ، قادني المعلقون إلى خطأ محتمل ، على الرغم من أنه بعيد الاحتمال للغاية في الممارسة العملية: إذا كانت البيانات تحتوي على مجموعتين من القياسات التي تبعد عن بعضها تقريبًا 180 درجة بالقرب من قيمة جيب التمام الصفري (أي حوالي 90 و 270 درجة) ، فإن الخوارزمية ستنتج خطأ القيمة. لتجنب ذلك ، بدلاً من acos () ، استخدم الدالة atan2 (wSin، wCos) ، والتي تعطي النتيجة الصحيحة فورًا مع مراعاة علامات الجيب وجيب التمام (شكرا
aamonster للمساعدة). يجب أن يكون الخط الذي يتم فيه حساب متوسط قيمة wSin بدون تعليق ، ولا حاجة إلى الخط المعدل لعلامة wSin. بدلاً من ذلك ، تحتاج إلى إدراج الصب إلى القيم الموجبة للزاوية (نظرًا لأن atan2 يعطي قيمًا من pi إلى -pi):
if (wind_Rad<0) wind_Rad=2*M_PI+wind_Rad;