Qoʻllanma · I²C · Debug
I²C sensor aniqlanmayaptimi? Mana yechim — tartib bilan
BME280 (yoki OLED, yoki MPU6050) ni uladingiz, skechni yozdingiz, javobiga esa — jimlik. Plata sensorni koʻrmayapti. Oʻntadan toʻqqizida aybdor toʻrtta narsadan biri, va ular toʻgʻri tartibda borilsa bir daqiqada tekshiriladi. ESP32, ESP8266 va Arduinoda bir xil ishlaydi.
Agar I²C simda aslida nima qilishini — START, ACK, taktni choʻzish — fizik jihatdan tushunmoqchi boʻlsangiz, interaktiv «bir bayt — olti shina» tahlilini koʻring. Bu post uning amaliy yarmi: shina jim, endi nima?
1-qadam — avval doim shinani skanerlang
Hech qachon koʻr-koʻrona debug qilmang. Har bir I²C qurilma oʻzining 7-bitli manzilida javob beradi, va shinadan toʻgʻridan-toʻgʻri kim aloqada ekanini soʻrasa boʻladi. Buni yozing va Serial Monitor’ni 115200 da oching:
#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 = qurilma ACK bilan javob berdi
Serial.printf(" found device at 0x%02X\n", addr);
found++;
}
}
Serial.println(found ? "done." : "No devices found — check wiring & pull-ups.");
delay(3000);
} Uch natija — uch tashxis:
- Sensorning manzili chiqdi (masalan, BME280 uchun
0x76) — quvvat va simlar joyida; xato drayver kodida yoki kutubxonadagi notoʻgʻri manzilda. - Boshqa manzil chiqdi — sizda notoʻgʻri mikrosxema yoki notoʻgʻri manzil (koʻp platalar payvand jamperi bilan ikki manzil orasida oʻtadi).
- «No devices found» — elektr qatlami buzilgan. Davomini oʻqing.
Serial-kabel emas, veb-sahifadagi skanerni xohlaysizmi? RisalDash I2C-Scanner misoli har bir manzilni chip haqidagi taxmin bilan, brauzerda jonli koʻrsatadi.
2-qadam — tortuvchi rezistorlar (jim shinaning №1 sababi)
I²C chiqishlari ochiq stokli: qurilma liniyani faqat nolga tortib tushira oladi. Uni yana yuqoriga, mantiqiy birga qaytarib tortadigan narsa — bir juft tortuvchi rezistor: biri SDA’da, biri SCL’da, 3V3 ga. Ularsiz liniyalar «suzib yuradi», hech narsa yuqori daraja sifatida oʻqilmaydi, va skaner umuman hech narsa topmaydi.
- Koʻp breakout platalarida tortuvchilar allaqachon bor (koʻpincha 10 kΩ yoki 4,7 kΩ). Kalta simdagi bitta sensor odatda shundoq ishlayveradi.
- Oʻzingiznikini faqat master plata’da ular boʻlmasa qoʻying. Odatiy qiymatlar: 100 kHz da 4,7 kΩ, 400 kHz da 2,2 kΩ — butun shinaga ikki rezistor, har bir qurilmaga emas.
- Har birida oʻz tortuvchisi bor koʻp modulni ustma-ust osdingizmi? Parallel qarshilik juda pastga tushadi va liniyalarni toza tortib boʻlmaydi — ortiqchalarini olib tashlang.
Qiymat — bu murosa: kichikroq qarshilik = aniqroq frontlar, lekin koʻproq tok; datashit bo‘yicha chegara — shina sigʻimi (≤400 pF), va bu bizni keyingi tuzoqqa olib keladi.
3-qadam — uzun simlar I²C’ni oʻldiradi
I²C bitta plata’dagi mikrosxemalar uchun oʻylab topilgan — santimetrlar, metrlar emas. Har bir ortiqcha santimetr sim sigʻim qoʻshadi, koʻtarilish fronti yumshaydi, va ~400 pF dan keyin master 1 ni 0 dan farqlay olmaydi. Alomati: stolda ishlaydi, sensorni xona boʻylab tortsangiz — nosozlik boshlanadi.
- Tezlikni tushiring 100 kHz gacha (yoki pastroq):
Wire.setClock(100000); - Sigʻimga qarshi kurashish uchun kuchliroq tortuvchilar (2,2 kΩ) qoʻying.
- Buralgan yoki ekranlangan juftlik ishlating, simlarni kalta tuting va ularni shovqinli signallar bilan bitta shleyfda yubormang.
- Chindan metrlar kerakmi? Unda I²C — notoʻgʻri shina, differensialini oling (RS-485/CAN). Qarang: nega I²C qisqa masofali.
4-qadam — ikki sensor, bitta manzil
Skaner qurilmani koʻradi, ammo ikkinchi xuddi shunday sensor koʻrinmaydi — chunki ular bitta qatʼiy manzilni
boʻlishadi. Ikkita BME280 0x76 da javob beradi va bir-birini boʻgʻadi. Yechimlar:
- Manzil pini — koʻp sensorlarda ularni ikkinchi manzilga oʻtkazadigan
ADDR/SDOpini bor (masalan,0x76→0x77). Birini yuqoriga, birini pastga ulang. - I²C multiplekseri —
TCA9548Asizga 8 ta izolyatsiyalangan sub-shina beradi, shunda sakkizta bir xil sensor bitta manzil ortida yashaydi. - Ikkinchi shina — ESP32’da ikkita apparat I²C bloki bor; boshqa pinlarda
Wire1.begin(sda2, scl2)ni ishga tushiring.
Baribir jimmi? Odatdagi soʻnggi gumondorlar
- SDA/SCL almashib qolgan — klassikasi. SDA→SDA, SCL→SCL; ularni chalkashtirib ulash bir xil koʻrinadi, lekin shina jim qoladi.
- Kuchlanish darajalari — 3,3 V li ESP32’dagi 5 V sensor (yoki aksincha) daraja oʻzgartirgichni talab qiladi; 5 V ni toʻgʻridan-toʻgʻri ESP32 piniga bermang.
- Quvvat — 3V3 shinasini oqizib yuboradigan ochkoʻz modul shinadan tushib qoladi. Unga barqaror manba va ajratuvchi kondensator bering.
- Osilib qolgan qul SDA’ni pastda ushlab, butun shinani bloklaydi.
Wire.begin()dan oldin SCL’ni 9 martagacha impulslash bilan tiklang, yoki shunchaki quvvatni oʻchirib-yoqing.
Roʻyxatni yuqoridan pastga bajaring — skaner, tortuvchilar, sim uzunligi, manzillar, keyin mayda-chuydalar — va oʻlik I²C shina deyarli har doim bir necha daqiqada tiriladi.
Oʻz datchigingiz bilan sxema yigʻing va rasmni eksport qiling — brauzerda, Fritzingsiz.