RisalDash RisalDash

دليل · I²C · تصحيح الأخطاء

مستشعر I²C لا يظهر؟ إليك الحل — بالترتيب

وصّلت مستشعر BME280 (أو شاشة OLED، أو MPU6050)، رفعت السكتش، وكانت النتيجة… لا شيء. اللوحة لا ترى المستشعر. في تسع حالات من كل عشر يكون السبب واحدًا من أربعة أمور — وكلها سريعة الفحص إذا سِرت بالترتيب الصحيح. يعمل الأمر بالطريقة نفسها على ESP32 وESP8266 وArduino.

I²Cتصحيح الأخطاءالمقاومات الرافعةESP32ESP8266Arduino

إن أردت أن تفهم الصورة الفيزيائية لما يفعله I²C فعليًا على السلك — START وACK وتمديد النبضة — فاطّلع على الشرح التفاعلي «بايت واحد — ست نواقل». هذا المقال هو نصفه العملي: الناقل صامت، فماذا بعد؟

ESP32 موصّل بمستشعر BME280 وشاشة SSD1306 OLED على ناقل I²C واحد — SDA إلى GPIO21 وSCL إلى GPIO22 مع مشاركة 3V3 وGND
ناقل I²C سليم: يتشارك BME280 (0x76) وSSD1306 (0x3C) زوج SDA/SCL واحدًا — عنوانان مختلفان وسلكان اثنان. مبنيّ في BoardLab: اسحب الأطراف بنفسك وصدّر صورة PNG.

الخطوة 1 — امسح الناقل أولًا دائمًا

لا تصحّح الأخطاء وأنت أعمى. كل جهاز I²C يستجيب على عنوان من 7 بتات، ويمكنك أن تسأل الناقل من الموجود. ارفع هذا وافتح Serial Monitor على 115200:

#include <Wire.h>

void setup() {
  Serial.begin(115200);
  Wire.begin();               // ESP8266: D2/D1  ·  ESP32: 21/22  ·  Uno: A4/A5
}

void loop() {
  byte found = 0;
  Serial.println("Scanning I2C bus...");
  for (byte addr = 1; addr < 127; addr++) {
    Wire.beginTransmission(addr);
    if (Wire.endTransmission() == 0) {          // 0 = الجهاز ردّ بإشارة ACK
      Serial.printf("  found device at 0x%02X\n", addr);
      found++;
    }
  }
  Serial.println(found ? "done." : "No devices found — check wiring & pull-ups.");
  delay(3000);
}

ثلاث نتائج — ثلاثة تشخيصات:

تفضّل ماسحًا على صفحة ويب بدل كابل السيريال؟ مثال RisalDash I2C-Scanner يسرد كل عنوان مع تخمين لنوع الشريحة، حيًّا داخل المتصفح.

الخطوة 2 — المقاومات الرافعة (السبب الأول للناقل الصامت)

مخارج I²C مفتوحة المصرف: يستطيع الجهاز فقط أن يسحب الخط نحو الأسفل إلى الصفر. أما ما يعيده إلى الأعلى، إلى المستوى المنطقي العالي، فهو زوج من المقاومات الرافعة — واحدة على SDA وواحدة على SCL، إلى 3V3. بدونها تظل الخطوط عائمة، ولا يُقرأ شيء كمستوى عالٍ، ولا يجد الماسح أي شيء إطلاقًا.

القيمة مقايضة: مقاومة أصغر = حواف أوضح لكن تيار أكبر؛ والحدّ في ورقة البيانات هو سعة الناقل (≤400 pF)، وهذا يقودنا إلى المطبّ التالي.

الخطوة 3 — الأسلاك الطويلة تقتل I²C

صُمِّم I²C لشرائح على لوحة واحدة — سنتيمترات لا أمتار. كل سنتيمتر إضافي من السلك يضيف سعة، فتتقوّس الحافة الصاعدة، وبعد ~400 pF لا يستطيع السيّد أن يميّز 1 من 0. العرَض: يعمل على الطاولة، ثم يبدأ بالتعثّر بمجرد مدّ المستشعر عبر الغرفة.

الخطوة 4 — مستشعران، عنوان واحد

يرى الماسح جهازًا، لكن مستشعرك الثاني المطابق غير مرئي — لأنهما يتشاركان العنوان الثابت نفسه. مستشعرا BME280 كلاهما يستجيب على 0x76 ويطمس أحدهما الآخر. الحلول:

لا يزال لا شيء؟ المشتبه بهم الأخيرون المعتادون

اعمل بالقائمة من أعلى إلى أسفل — المسح، المقاومات الرافعة، طول السلك، العناوين، ثم المتخلّفون — وناقل I²C الميت يعود إلى الحياة تقريبًا دائمًا خلال دقائق معدودة.

وصّل مستشعرك الخاص وصدّر مخططًا نظيفًا — مباشرة في المتصفح، دون Fritzing.