이번 시간에는 I2C 통신을 이용한 128x64 OLED 디스플레이 모듈 사용에 대해 배워보겠습니다.


먼저, I2C 통신을 하기 위해서는 장치의 Address를 알아야 하는데, 보통은 장치의 Spec sheet를 보면 나와있습니다.

만에 하나 Address를 모른다고 하면, 아래처럼 하드웨어를 연결하고 코드를 업로드 하시면 연결된 장치의 Address를 알 수 있습니다^^


 

 OLED모듈    아두이노

     VCC  ----  5V
     GND ---- GND

     SDA ---- SDA (A4)

     SCL  ---- SCL (A5)



  1. // --------------------------------------
  2. // i2c_scanner
  3. //
  4. // Version 1
  5. //    This program (or code that looks like it)
  6. //    can be found in many places.
  7. //    For example on the Arduino.cc forum.
  8. //    The original author is not know.
  9. // Version 2, Juni 2012, Using Arduino 1.0.1
  10. //     Adapted to be as simple as possible by Arduino.cc user Krodal
  11. // Version 3, Feb 26  2013
  12. //    V3 by louarnold
  13. // Version 4, March 3, 2013, Using Arduino 1.0.3
  14. //    by Arduino.cc user Krodal.
  15. //    Changes by louarnold removed.
  16. //    Scanning addresses changed from 0...127 to 1...119,
  17. //    according to the i2c scanner by Nick Gammon
  18. //    http://www.gammon.com.au/forum/?id=10896
  19. // Version 5, March 28, 2013
  20. //    As version 4, but address scans now to 127.
  21. //    A sensor seems to use address 120.
  22. // Version 6, November 27, 2015.
  23. //    Added waiting for the Leonardo serial communication.
  24. //
  25. //
  26. // This sketch tests the standard 7-bit addresses
  27. // Devices with higher bit address might not be seen properly.
  28. //
  29.  
  30. #include <Wire.h>
  31.  
  32.  
  33. void setup()
  34. {
  35.   Wire.begin();
  36.  
  37.   Serial.begin(9600);
  38.   while (!Serial);             // Leonardo: wait for serial monitor
  39.   Serial.println("\nI2C Scanner");
  40. }
  41.  
  42.  
  43. void loop()
  44. {
  45.   byte error, address;
  46.   int nDevices;
  47.  
  48.   Serial.println("Scanning...");
  49.  
  50.   nDevices = 0;
  51.   for(address = 1; address < 127; address++ )
  52.   {
  53.     // The i2c_scanner uses the return value of
  54.     // the Write.endTransmisstion to see if
  55.     // a device did acknowledge to the address.
  56.     Wire.beginTransmission(address);
  57.     error = Wire.endTransmission();
  58.  
  59.     if (error == 0)
  60.     {
  61.       Serial.print("I2C device found at address 0x");
  62.       if (address<16)
  63.         Serial.print("0");
  64.       Serial.print(address,HEX);
  65.       Serial.println("  !");
  66.  
  67.       nDevices++;
  68.     }
  69.     else if (error==4)
  70.     {
  71.       Serial.print("Unknow error at address 0x");
  72.       if (address<16)
  73.         Serial.print("0");
  74.       Serial.println(address,HEX);
  75.     }    
  76.   }
  77.   if (nDevices == 0)
  78.     Serial.println("No I2C devices found\n");
  79.   else
  80.     Serial.println("done\n");
  81.  
  82.   delay(5000);           // wait 5 seconds for next scan
  83. }



그리고 시리얼 모니터 창을 켜보시면 아래와 같이 Address가 나옵니다.



자 그럼 Address도 알았겠다, 본격적으로 시작을 해보겠습니다.


우선 필요한 라이브러리부터 다운받도록 하겠습니다.

1. https://github.com/adafruit/Adafruit_SSD1306 (Adafruit_SSD1306)

2. https://github.com/adafruit/Adafruit-GFX-Library (Adafruit-GFX-Library)


위 라이브러리들을 다운받으신 뒤, 아래 폴더에 압축을 푸시면 아두이노에서 라이브러리를 쓰실 수 있습니다.

C:\Users\(사용자 이름)\Documents\Arduino\libraries


자 이제 아두이노를 실행시켜서 예제를 먼저 업로드 해보겠습니다.



제대로 업로드가 되면 아래와 같은 영상이 OLED 디스플레이에 나타나게 됩니다^^






본 디스플레이 모듈에서 특정 이미지나 아이콘을 보여주고싶으시다면, 


static const unsigned char PROGMEM logo16_glcd_bmp[] =

{ B00000000, B11000000,

  B00000001, B11000000,

  B00000001, B11000000,

  B00000011, B11100000,

  B11110011, B11100000,

  B11111110, B11111000,

  B01111110, B11111111,

  B00110011, B10011111,

  B00011111, B11111100,

  B00001101, B01110000,

  B00011011, B10100000,

  B00111111, B11100000,

  B00111111, B11110000,

  B01111100, B11110000,

  B01110000, B01110000,

  B00000000, B00110000

};


위와같이 특정 변수들을 define해주셔야 합니다.


그럼 다음시간엔 어떻게 원하는 아이콘을 디스플레이 하는지 배워보도록 할게요ㅎㅎ

+ Recent posts