Modul I2C untuk LCD kadang menyebalkan. Sebab, jika salah dalam memilih
address yang berbeda, maka efeknya bukan layar lcd tidak menyala, tapi layar lcd
muncul kotak-kotak berbaris. Pada dasarnya, address I2C yang digunakan setiap
modul punya rentang dari 0-126. Misal, pada tulisan ini saya contohkan 2 modul
I2C dengan merk yang sama, tapi memiliki address yang berbeda yaitu 0x27 dan
0x3F. Berikut contoh program arduino lcd 16x2, untuk setting I2C adapter untuk
LCD dengan address 0x3F.
Kita tidak ingin membahas protokol I2C pada artikel ini. Tapi, beberapa modul yang
kadang membutuhkan komunikasi ini yaitu RTC, EEPROM, LCD (meski ada
tambahan modul), dan beberapa sensor lainnya. Hal yang paling penting dan perlu
diingat adalah : jalur SDA dan SCL tidak boleh terbalik. Kalau terbalik? Ya tentu
tidak bisa berkomunikasi lah, hehe (becanda). Tapi, karena setiap modul I2C
didentifikasi berdasarkan address yang berbeda, maka kita bisa memasangnya
secara paralel dengan modul I2C yang lain. Kita akan contohkan pada penjelasan
selanjutnya.
Pada Arduino Uno dan Nano, jalur SDA sama-sama ada pada pin A4 (Analog 5)
sedangkan jalur SCL sama-sama pada pin A5 (Analog 5). Nah, pada Arduino, pin
SDA dan SCL hanya ada satu. Jadi, jika kita memiliki banyak perangkat yang harus
berkomunikasi dengan I2C, maka kita bisa menyambungnya secara paralel.
Seperti gambar di bawah ini, dari Arduino disambung ke RTC1307 dan LCD
adapter.
Nah, ketika mencoba modul LCD yang kedua, ternyata address 0x20 tidak works.
Kita kebingungan, bahkan kita sampai mengira bahwa modul tersebut sudah
rusak! Whatt!!! Dalam hati berkata, "haruskah Aku komplain sama penjual
ituuuuh?!!". Dua jam berlalu tanpa hasil, modul itu kita tinggal tidur. =))
Setelah bangun, kita coba cari-cari lagi di internet. Ternyata ada orang di
stackoverflow yang berhasil menggunakan address 0x3F. Dengan sedikit harapan,
kita coba alamat tersebut, eh, ternyata bisa. Dari pengalaman tersebut, muncul
pertanyaan dalam hati, "Apakah setiap modul punya address yang berbeda?". Lalu
kita coba googling dengan keyword "how do we know i2c lcd address", sok
keminggris, hehe. Ya, sebab referensi yang bagus belum banyak yang berbahasa
Indonesia. v^_^
Berdasarkan diskusi-diskusi, protokol, dan contoh source code yang ada, maka
dibuatlah program untuk mencari tahu address modul I2C dengan program berikut
ini:
1. /*
2. * I2C Scanner
3. * Explored by Elangsakti.com
4. * # Hack Your Skill!
5. */
6.
7. #include <Wire.h>
8.
9. void setup() {
10. Wire.begin();
11. Serial.begin(9600);
12. while(!Serial);
13.
14. Serial.println("#============o0o=============#");
15. Serial.println("# I2C Scanner #");
16. Serial.println("# Explored by Elangsakti.com #");
17. Serial.println("#============================#");
18.
19. Cari_Alamat();
20. }
21.
22. void loop() { }
23.
24. void Cari_Alamat() {
25. byte respon, alamat, modul = 0;
26.
27. Serial.println("Scanning...");
28. Serial.println();
29.
30. for(alamat=0; alamat<127; alamat++){
31. Wire.beginTransmission(alamat);
32. respon = Wire.endTransmission();
33. switch(respon){
34. case 0:
35. Serial.print(" ");
36. Serial.print(modul+1);
37. Serial.print(". Alamat = 0x");
38. if( alamat < 16 ) Serial.print("0");
39. Serial.println(alamat, HEX);
40. modul++;
41.
42. break;
43.
44. case 4:
45. Serial.print(" - Error ");
46. if( alamat < 16 ) Serial.print("0");
47. Serial.println(alamat, HEX);
48. }
49. }
50. Serial.println();
51.
52. if(modul > 0){
53. Serial.print("Ditemukan ");
54. Serial.print(modul);
55. Serial.println(" modul I2C.");
56. }else{
57. Serial.println("Tidak ada modul I2C.");
58. }
59.
60. delay(2000);
61. }