أردوينو والإلكترونيات

قراءة الحساسات بدقة: كيف تتخلص من التشويش والقراءات القافزة

بقلم أحمد قطف · · 3 دقائق قراءة

أول صدمة يواجهها من يقرأ حساساً تناظرياً: الرقم لا يثبت. حساس حرارة في غرفة هادئة يقفز بين 24.1 و25.3، وزر واحد يُحسب ثلاث ضغطات. هذا طبيعي تماماً، وله حلول بسيطة في العتاد والبرمجة نستخدمها في كل مشروع.

من أين يأتي التشويش؟

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

ارتداد الأزرار (Debounce)

الزر الميكانيكي لا يغلق الدائرة بشكل نظيف؛ عند الضغط تتلامس الشرائح المعدنية وتنفصل عدة مرات خلال بضعة ملّي ثوانٍ قبل أن تستقر. المتحكم سريع جداً، فيرى هذه الارتدادات كضغطات متعددة. الحل البرمجي البسيط: عندما تكتشف تغيراً في حالة الزر، انتظر بضعة ملّي ثوانٍ وتأكد أن الحالة ما زالت كما هي قبل أن تعتبرها ضغطة.

const int BTN = 2;
int lastStable = HIGH, lastRead = HIGH;
unsigned long changedAt = 0;

void loop() {
  int r = digitalRead(BTN);
  if (r != lastRead) { changedAt = millis(); lastRead = r; }
  if (millis() - changedAt > 30 && r != lastStable) {
    lastStable = r;
    if (r == LOW) { /* ضغطة حقيقية واحدة */ }
  }
}

والحل العتادي مكثف صغير (نحو 100 نانوفاراد) بين طرف الزر والأرضي مع مقاومة، يمتص الارتدادات قبل وصولها للمتحكم. في أغلب المشاريع يكفي الحل البرمجي، وتوجد مكتبات جاهزة مثل Bounce2 تختصر هذا الكود.

المتوسط المتحرك

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

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

المرشح الأسي: ذاكرة أقل ونتيجة ممتازة

بديل أنيق للمتوسط المتحرك لا يحتاج مصفوفة: filtered = filtered + a * (reading - filtered); حيث a رقم بين 0 و1. كلما صغر الرقم (مثلاً 0.1) كانت القراءة أنعم وأبطأ استجابة، وكلما كبر (مثلاً 0.5) كانت أسرع وأقل نعومة. هذا المرشح يسمى المتوسط المتحرك الأسي (EMA)، ويعطي وزناً أكبر للقراءات الحديثة دون أن ينسى القديمة تماماً. نستخدمه كثيراً لأنه سطر واحد ومتغير واحد، ويمكن ضبطه بتجربة بسيطة لقيمة a حتى تحصل على التوازن المطلوب.

مرشح الوسيط ضد القفزات المفاجئة

المتوسط يتأثر بشدة بقراءة شاذة واحدة؛ إذا قرأ حساس المسافة بالموجات فوق الصوتية فجأة 400 سم بدل 50 سم بسبب ارتداد صدى، فسيرتفع المتوسط كله. هنا يفيد مرشح الوسيط (Median): خذ خمس قراءات، رتبها، واختر الوسطى. القراءات الشاذة تذهب إلى أطراف الترتيب ولا تؤثر في النتيجة. ويمكن الجمع بين الطريقتين: وسيط لإزالة الشواذ ثم متوسط أسي لتنعيم النتيجة.

تحسينات العتاد التي تُغني عن نصف البرمجة

مرجع الجهد في المداخل التناظرية

المحول التناظري الرقمي يقيس الجهد مقارنة بمرجع، وهو افتراضياً جهد التغذية في أونو (5 فولت). إذا كان جهد USB فعلياً 4.8 فولت، فكل قراءاتك منحرفة بنسبة 4% دون أن تعرف. للقياسات المهمة يمكن استخدام المرجع الداخلي الثابت في الشريحة (1.1 فولت في أونو عبر analogReference(INTERNAL)) مع مقسم جهد مناسب، فتصبح القراءة مستقلة عن تذبذب التغذية. وفي ESP32 ننصح بمعايرة القراءة بقياس جهود معروفة بجهاز القياس، كما أشرنا في مقارنة ESP32 وأونو.

كيف تعرف أن المرشح يعمل؟

لا تحكم بالعين على أرقام تتغير في الشاشة التسلسلية. استخدم أداة Serial Plotter في بيئة أردوينو: اطبع القراءة الخام والقراءة المرشحة في السطر نفسه مفصولتين بفاصلة، وسترى خطين على الرسم البياني، واحداً متعرجاً وآخر ناعماً يتبعه. جرّب تغيير معامل المرشح وراقب كيف يتغير التوازن بين النعومة والتأخر. ثم اختبر الحالة الحقيقية: سخّن الحساس بيدك أو قرّب جسماً من حساس المسافة، وتأكد أن القراءة المرشحة تلحق بالتغير خلال زمن مقبول لمشروعك.

الخلاصة: ترتيب العمل

  1. أصلح العتاد أولاً: مصدر طاقة جيد، أسلاك قصيرة، مكثف قرب الحساس، أرضي منظم.
  2. أزل الارتداد من الأزرار والمفاتيح.
  3. أزل القراءات الشاذة بمرشح الوسيط إذا كان الحساس يعطي قفزات.
  4. نعّم القراءة بالمتوسط المتحرك أو الأسي.
  5. اعرض النتيجة بدقة منطقية: لا معنى لعرض الحرارة بثلاث خانات عشرية إذا كانت دقة الحساس نصف درجة.

وإذا كنت ستتحكم بحمل كبير بناءً على هذه القراءة، فتذكر أن المحرك نفسه مصدر تشويش، واقرأ تشغيل الأحمال بأمان قبل التوصيل.

اقرأ أيضاً