سنسور I²C در ESP32 پیدا نمی‌شود؟ عیب‌یابی مرحله‌به‌مرحله

آزمایشگاه سنسورها • ۱۸ مهر ۱۴۰۵

وقتی SHT31، BMP280 یا BH1750 پاسخ نمی‌دهد، از تغذیه و سطح باس شروع کنید؛ همراه اسکنر محدود و قابل‌کامپایل برای ESP32 کلاسیک.

نمودار مفهومی باس I2C شامل کنترل‌کننده، حسگر و دو خط SDA و SCL با بالاکش
نمودار آموزشی تألیفی LCENJ؛ تصویر محصول یا نتیجهٔ آزمون فیزیکی نیست. برچسب‌های انگلیسی برای تطبیق با مستندات فنی آمده‌اند.

۱. اسکنر آخر مسیر نیست

پیدا نشدن آدرس می‌تواند از تغذیه، انتخاب پین، سطح ولتاژ، آدرس یا وضعیت باس باشد. پیش از تعویض کتابخانه، یک سنسور با سیم کوتاه وصل کنید و عکس پین‌های واقعی آن را با مستندات تطبیق دهید. نوشتهٔ روی دو برد هم‌شکل ممکن است یکسان نباشد.

اسکنر این مقاله برای یک باس آزمایشگاهی ساده است و یک بار اجرا می‌شود. آن را روی باس دستگاه فعال یا قطعه‌ای که به دستورات عمومی حساس است بدون بررسی مستندات اجرا نکنید. پاسخ ACK وجود یک پاسخ‌دهنده را نشان می‌دهد؛ مدل حسگر و درستی داده هنوز باید جداگانه بررسی شوند.

۲. قبل از نرم‌افزار، برق و مسیر سیم را ببینید

در I²C متعارف، خطوط باس با بالاکش به سطح بالا می‌روند. ولتاژ بالاکش باید برای همهٔ قطعات روی باس مجاز باشد. وجود رگولاتور تغذیه روی ماژول به معنی وجود تبدیل سطح روی SDA و SCL نیست. اگر ولتاژ نامناسب است، قبل از ادامهٔ آزمون اتصال را اصلاح کنید.

۳. پین و آدرس را دقیق انتخاب کنید

نمونهٔ همراه برای ESP32 کلاسیک DevKit، پین ۲۱ را SDA و پین ۲۲ را SCL انتخاب می‌کند. این انتخاب را به ESP32-C3، S3 یا هر برد دیگری تعمیم ندهید. در آن بردها پین مجاز و در دسترس را از نقشهٔ همان برد انتخاب کنید و کد را تغییر دهید.

بعضی دیتاشیت‌ها مقدار آدرس را با بیت خواندن/نوشتن نشان می‌دهند. API معمول Wire از آدرس ۷ بیتی استفاده می‌کند. اگر سند دو مقدار خواندن و نوشتن نوشته است، قالب آدرس را بررسی کنید و عدد ۸ بیتی را مستقیم وارد نکنید. همچنین پایهٔ انتخاب آدرس باید وضعیت مشخصی داشته باشد.

۴. کد اسکن محدود

پس از تأیید تغذیه و سطح باس، کد زیر را برای برد ذکرشده اجرا کنید. سرعت آغازین ۱۰۰ کیلوهرتز و مهلت ۵۰ میلی‌ثانیه، انتخاب‌های آزمایش این مثال‌اند؛ تضمین سازگاری با همهٔ دستگاه‌ها نیستند. نمایش خطای باس را با «آدرسی پیدا نشد» یکی نگیرید.

#include <Arduino.h>
#include <Wire.h>

// Classic ESP32 DevKit only. Verify your board pinout and logic voltage.
constexpr int SDA_PIN = 21;
constexpr int SCL_PIN = 22;

void setup() {
  Serial.begin(115200);
  if (!Wire.begin(SDA_PIN, SCL_PIN, 100000)) {
    Serial.println("I2C init failed");
    return;
  }
  Wire.setTimeOut(50);
  unsigned found = 0;
  for (uint8_t address = 0x08; address <= 0x77; ++address) {
    Wire.beginTransmission(address);
    uint8_t result = Wire.endTransmission();
    if (result == 0) {
      Serial.printf("ACK at 0x%02X\n", address);
      ++found;
    } else if (result != 2) {
      Serial.printf("Bus error %u at 0x%02X\n", result, address);
    }
  }
  Serial.printf("Responding addresses: %u\n", found);
}
void loop() { delay(1000); }

اگر آدرس پیدا شد، اسکن را کنار بگذارید و مثال کتابخانهٔ رسمی یا سازگار با مدل واقعی حسگر را اجرا کنید. اگر چند آدرس غیرمنتظره یا تعداد بسیار زیادی پاسخ می‌بینید، ابتدا وضعیت خطوط و اتصال‌ها را بررسی کنید؛ به‌سرعت نتیجه نگیرید که تعداد زیادی سنسور روی باس وجود دارد.

۵. بالاکش را حدسی انتخاب نکنید

مقاومت بالاکش با ظرفیت باس و توان کشیدن خط به سطح پایین مرتبط است. راهنمای محاسبهٔ TI روش تعیین محدودهٔ مناسب را توضیح می‌دهد. یک مقدار ثابت برای هر طول کابل، هر سرعت و هر مجموعهٔ ماژول معتبر نیست.

چند برد دارای بالاکش ممکن است مقاومت‌ها را موازی کنند. مقاومت معادل را از مدار واقعی حساب کنید و شکل موج را، اگر ابزار دارید، ببینید. کاهش سرعت می‌تواند برای تشخیص مشکل زمان‌بندی مفید باشد، اما اصلاح سطح ولتاژ یا اتصال اشتباه را جایگزین نمی‌کند.

۶. باس گیر کرده و بازیابی

وقتی یک خط پایین می‌ماند، ابتدا اتصال کوتاه، تغذیهٔ ناقص و دستگاه نگه‌دارندهٔ خط را بررسی کنید. بازیابی نرم‌افزاری را بدون دانستن وضعیت الکتریکی اجرا نکنید. راهنمای NXP روش‌های Bus clear را توضیح می‌دهد؛ انتخاب روش باید با قطعه و طراحی سیستم سازگار باشد.

برای محصول، تعداد تلاش مجدد را محدود کنید و وضعیت خطا را ثبت کنید. حلقهٔ بی‌پایان اسکن یا ریست، علت اصلی را پنهان می‌کند و ممکن است عملکرد بقیهٔ سیستم را متوقف کند. اگر داده دریافت نشد، آن را صفر معتبر معرفی نکنید.

۷. جدول نتیجهٔ آزمایش

نتیجهگام بعدی
هیچ ACK و خطوط آزاد سالمپین، آدرس و حالت فعال‌بودن قطعه
ACK هست، داده نیستفرمان، طول پاسخ و زمان اندازه‌گیری
خطا با اضافه‌شدن ماژول دومتداخل آدرس، بالاکش و ظرفیت باس
باس پس از خطا پایین می‌ماندبررسی دستگاه نگه‌دارندهٔ خط و روش بازیابی

پس از هر اصلاح، فقط همان آزمون کوتاه را تکرار کنید و نتیجه را در برگهٔ همراه ثبت کنید. کد این مقاله از نظر کامپایل بررسی می‌شود؛ عملکرد روی سیم‌کشی شما به آزمون واقعی نیاز دارد.

فایل‌های تمرین و گام بعدی

دریافت برگهٔ تمرین و فایل‌های همراه (ZIP)

فایل‌ها برای تمرین آموزشی آماده شده‌اند. بررسی نرم‌افزاری، جای آزمون قطعه و سیم‌کشی واقعی شما را نمی‌گیرد.

پرسش‌های متداول

آیا پین ۲۱ و ۲۲ برای همهٔ ESP32هاست؟

خیر. این نمونه برای ESP32 کلاسیک DevKit است؛ نقشهٔ بردهای دیگر را بررسی کنید.

آیا یک مقدار بالاکش برای همهٔ باس‌ها مناسب است؟

خیر. ظرفیت باس، سرعت و توان خروجی قطعات در انتخاب اثر دارند.

ACK چه چیزی را ثابت می‌کند؟

وجود یک پاسخ‌دهنده در آن آدرس؛ هویت و صحت اندازه‌گیری را ثابت نمی‌کند.

منابع رسمی

منابع فنی در ۲۰۲۶/۱۰/۱۰ بررسی شده‌اند. برای اجرای سخت‌افزاری، مدل و نسخهٔ مستندات قطعهٔ خود را تطبیق دهید.