RisalDash RisalDash

مشروع · I2C · اختبار حساسات

قارِن أربعة حساسات I2C على لوحة معلومات ESP واحدة — وشاهدها تتباعد

تتشارك حساسات BME280 و BMP280 و AHT20 و HDC1080 ناقل I2C واحدًا. لكلٍّ منها قيمته الحيّة و رسمٌ بيانيٌّ للاتجاه، جنبًا إلى جنب، لترى بنظرة واحدة أيّ الحساسات تتوافق — وأيّها لا. دون سحابة، دون تطبيق. في هذا التشغيل قرأ الـ HDC1080 رطوبة أعلى بنحو 10% من الـ BME280 الجالس على بُعد 5 مم منه.

BME280BMP280AHT20HDC1080I2CESP32 + ESP8266
لوحة معلومات RisalDash Sensor Compare — ‏BME280 و BMP280 و AHT20 و HDC1080 جنبًا إلى جنب، لكلٍّ منها مؤشّر LED للاتصال، وحرارة ورطوبة وضغط حيّة، ورسم بياني لاتجاه الحرارة
أربعة حساسات، ناقل واحد، صفحة واحدة — يُقدّمها الـ ESP نفسه، حيّةً عبر WebSocket.

كل حساس حرارة/رطوبة يعلن هامش خطأه في ورقة البيانات، لكن الاختبار الصادق هو وضع عدّة منها في الهواء نفسه وقراءتها في اللحظة نفسها. هذا المشروع يفعل ذلك بالضبط: أربع قطع I2C شائعة — BME280 وBMP280 وAHT20 وHDC1080 — على ناقل واحد، وESP32 أو ESP8266 واحد، ولوحة معلومات ويب واحدة تُظهرها جميعًا في آنٍ معًا.

مبنية بـ RisalDash، وهي مكتبة Arduino مفتوحة المصدر تحوّل بضع استدعاءات dash.metric(...) / dash.chart(...) إلى لوحة معلومات حيّة ومتجاوبة تُقدَّم مباشرةً من اللوحة عبر WebSocket.

ماذا قالت الأرقام

اتصلت الأربعة معًا. كانت درجات الحرارة متقاربة — ضمن نصف درجة تقريبًا. أما الرطوبة فكانت الجزء المثير للاهتمام:

الحساس العنوان الحرارة الرطوبة الضغط
BME280 0x76 28.5 °C 30.3 % 967 hPa
BMP280 0x77 29.0 °C 968 hPa
AHT20 0x38 28.6 °C 32.3 %
HDC1080 0x40 28.7 °C 39.7 %

تجمّعت حساسات BME280 و BMP280 و AHT20 حول 30–32% رطوبة نسبية. أما الـ HDC1080 فاستقرّ عند 39.7% — أعلى بنحو عشر نقاط. لا يمكن القول إنّ أيًّا منها «خاطئ» بوضوح: هذا بالضبط نوع الانزياح بين النسخ الذي لا تكتشفه إلا بمقارنة الحساسات في النَّفَس نفسه. وهو أيضًا حجّة قوية لصالح المعايرة مقابل مرجع بدلًا من الوثوق بوحدة عارية واحدة. وقد توافق حساسا الضغط (BME280 مقابل BMP280) ضمن 1 hPa.

العتاد

أربع لوحات حساسات I2C على لوحة تجارب — وحدات BME280 و BMP280 و AHT20 البنفسجية إضافةً إلى HDC1080، جميعها موصولة بلوحة ESP صغيرة عبر SDA/SCL مشتركين
تتشارك الوحدات الأربع خطوط SDA و SCL و 3V3 و GND نفسها على لوحة التجارب.

التوصيل في غاية البساطة: كل حساس يتشارك الأسلاك الأربعة نفسها — SDA و SCL و 3V3 و GND. هذا هو جوهر I2C بأكمله. على ESP8266 يكون الناقل SDA = D2 (GPIO4)، SCL = D1 (GPIO5)؛ وعلى ESP32 يكون GPIO21 / GPIO22. يستجيب كل جهاز على عنوانه الخاص، فلا يقع تعارض ما لم تتشارك قطعتان عنوانًا واحدًا — وهنا الأربعة مختلفة.

لقطة مقرّبة للوحة حساس رطوبة I2C بنفسجية مطبوع عليها SI7021 / HTU21D / SHT21 / SHT20 / HDC1080 — لوحة واحدة قد تحمل أيًّا من هذه الرقائق؛ هذه HDC1080 على العنوان 0x40
لوحة واحدة، خمسة أسماء. هذه اللوحات البنفسجية مطبوع عليها SI7021 / HTU21D / SHT21 / SHT20 / HDC1080 — وهذه HDC1080 على 0x40.

هذه الطباعة فخّ كلاسيكي: تُباع اللوحة نفسها مركّبةً بأيٍّ من خمس رقائق مختلفة، وهي تستخدم مشغّلات مختلفة. إن لم تكن متأكدًا مما لديك، فإنّ المثال المرافق I2C Scanner يطبع كل عنوان على الناقل مع تخمين أفضل للرقاقة — وصِّل اللوحة وسيخبرك.

الكود

لوحة المعلومات تصريحية. كل حساس هو كتلة صغيرة — مؤشّر LED للاتصال، وبضع مقاييس ورسم بياني للاتجاه — و RisalDash يرتّبها ويبثّ القيم حيّةً:

#include <RisalDash.h>
#include <Wire.h>
#include <Adafruit_BME280.h>
#include <Adafruit_BMP280.h>
#include <Adafruit_AHTX0.h>
#include <ClosedCube_HDC1080.h>

RisalUI dash("Sensor Compare");

void setup() {
  Wire.begin();                       // ESP8266: D2/D1  ·  ESP32: 21/22
  bmeOK = bme.begin(0x76);            // كشف تلقائي: وصِّله، يتصل من تلقائه
  bmpOK = bmp.begin(0x77);
  ahtOK = aht.begin();                // 0x38
  hdcOK = i2cPresent(0x40);

  dash.separator("BME280 · 0x76");
  dash.led("BME280 online", &bmeOK);
  dash.metric("BME280 temp", &bmeT, "°C").decimals(1);
  dash.chart("BME280 temp trend", &bmeT, "°C");
  dash.metric("BME280 humidity", &bmeH, "%").decimals(1);
  // ...ثلاث كتل أخرى: BMP280 و AHT20 و HDC1080

  dash.enableOTA();
  dash.apName("SensorCompare");
  dash.begin();                       // بوابة أسر، ثم ينضم إلى شبكة Wi-Fi لديك
}

تُكتشف الحساسات تلقائيًّا: يُرجع begin() ما إذا كانت الرقاقة قد استجابت، والقيمة المنطقية نفسها تقود مؤشّر LED «online» على البطاقة. انزع حساسًا عن الناقل فتُظهر بطاقته ببساطة offline — وتستمر البقية في العمل. اقرأ القيم كل ثانيتين في loop() مع فحوص isnan()، وسيتحدّث كل متصفّح مفتوح دفعةً واحدة.

إعداد Wi-Fi — تمامًا كما في كل مشاريع RisalDash

لا شيء يُدرَج في الكود مباشرةً. عند أول إقلاع لا تجد اللوحة شبكة محفوظة، فترفع نقطة وصول ببوابة أسر باسم SensorCompare. وصِّل هاتفك بها، فتظهر صفحة الإعداد تلقائيًّا، تختار شبكة Wi-Fi المنزلية وتدخل كلمة المرور. يحفظ الـ ESP البيانات، ويُعيد الإقلاع، ومن تلك اللحظة ينضم إلى شبكتك من تلقائه — ولوحة المعلومات تنتظر على عنوان IP الخاص به في شبكتك المحلية. كل شيء يُقدّمه الجهاز نفسه؛ لا شيء يمسّ سحابة، وقراءاتك لا تغادر شبكتك أبدًا.

ولأنّ dash.enableOTA() مفعّل، تجري عمليات التحديث اللاحقة للبرنامج الثابت عبر الأثير من المتصفّح — دون كابل USB بعد أول تحميل.

ولماذا نقارن أصلًا؟

إن كنت تسجّل بيانات دفيئة أو غرفة خوادم أو حوض زواحف، فانزياح رطوبة بنسبة 10% هو الفرق بين «طبيعي» و«إنذار». مراقبة عدّة حساسات معًا تخبرك أيّها تثق به، وهل تنجرف وحدة ما، ومقدار اختلاف قطعة جديدة عن أخرى تعمل منذ عام. إنها أرخص فحص معايرة موجود — وتصنع لوحة معلومات حيّة مُرضية حقًّا.

مصدر كامل ومُختبَر البناء لأجهزة ESP32 & ESP8266.