아두이노
[모듈] 0.96인치 OLED 디스플레이
galad
2019. 4. 11. 16:10
미세먼지 표시기 만들 때 사용했던 0.96인치 OLED 디스플레이에 대한 사용법 테스트
(https://code-for-fun.tistory.com/9)
준비물
1) 아두이노 나노
2) 0.96인치 OLED
순서
1) 회로도 작성 및 연결
2) 테스트 예제 작성
3) 테스트
1. 회로도 작성 및 연결
OLED - 아두이노 나노
SCL - A5
SDA - A4
VCC - 5V
GND - GND
2. 테스트 예제 작성
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | //#include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> // 이 헤더 안에 Adafruit_GFX.h, Wire.h 등이 들어있음. 이거 하나만 include 해도 OK #define SCREEN_WIDTH 128 // OLED 디스플레이 가로 픽셀 수 #define SCREEN_HEIGHT 64 // OLED 디스플레이 세로 픽셀 수 // 아두이노에 연결할 리셋 핀번호. -1이면 리셋기능 안 씀 설정이지만 디스플레이에 따라서 마이크로컨트롤러의 리셋과 연결 #define OLED_RESET -1 // 디스플레이 객체 생성. 다른 생성자도 있으나 아래것이 제일 무난해 보임. Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); void setup() { // put your setup code here, to run once: Serial.begin(115200); // begin(): 이미지버퍼를 위한 램 할당 및 디스플레이 초기화. 디스플레이 사용을 위해 필수적. // SSD1306_SWITCHCAPVCC: 3.3V에서 디스플레이용 전압을 만드는 설정이라고 함. 다만 사용한 OLED 제품은 3.3V~5V지원. // 실제로 5V로 사용했으나 문제없었음. // 0x3C: I2C주소. 기본값은 128x32용 0x3C, 나머지는 0x3D로 되어있음. // 하지만 사용한 OLED 제품은 128x64지만 0x3C를 써야했음. // I2C주소 스캔 프로그램을 돌려서 확실하게 하는 편이 좋다고 생각됨. if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println(F("SSD1306 initialize failed")); // 디스플레이 초기화 실패 시 return; } } void loop() { // put your main code here, to run repeatedly: // OLED에 표시 display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0,0); display.println(F("1")); display.println(F("2")); display.println(F("3")); display.println(F("4")); display.println(F("5")); display.println(F("6")); display.println(F("7")); display.println(F("8")); // 8까지만 보임. display.println(F("9")); display.println(F("10")); display.println(F("11")); display.println(F("12")); display.display(); delay(3000); display.clearDisplay(); display.setTextSize(3); display.setTextColor(WHITE); display.setCursor(0,0); display.println(F("12345678")); // 8은 다음줄로 줄바꿈 됨. display.display(); delay(3000); display.clearDisplay(); // 화면 지우기 display.setTextSize(1); // 글자 크기 설정. 1은 너무 작음. 세로는 8픽셀. display.setTextColor(WHITE); // 글자 색 설정 display.setCursor(0,0); // 커서 위치 설정(열,행) display.println(F("TEST1")); // 램에 println. 줄바꿈 됨. display.setTextSize(2); // 세로는 16픽셀. display.println(F("TEST2")); display.setTextSize(3); // 글자 크기 3은 너무 큼. 7자 정도가 한계. 세로는 24픽셀. display.println(F("TEST3")); display.display(); // 화면에 표시. 현재 램의 내용을 디스플레이에 표시 delay(2000); // 오른쪽으로 화면 스크롤 시작. 0x00~0x0F는 현재 화면의 시작부터 끝까지 전체를 스크롤 시킨다는 것 display.startscrollright(0x00, 0x0F); delay(2000); // 스크롤 되는 동안 프로그램은 대기. 화면은 별개로 스크롤 됨. 즉 이 delay는 스크롤 되는 시간. display.startscrollright(0x00, 0x0F); // 현재 화면의 스크롤이므로 위에 스크롤 된 것에서 이어서 스크롤 됨. // 화면 넘어가면 반대쪽으로 이어짐. delay(1000); display.startscrollright(0x00, 0x00); // TextSize=1만큼만 스크롤. 세로 4픽셀만 가로로 스크롤. delay(2000); display.startscrollright(0x00, 0x02); // 0~2. 3/8만큼만 스크롤. 세로 12픽셀만 가로로 스크롤. delay(2000); display.startscrollright(0x00, 0x05); // 0~5. 6/8만큼만 스크롤. 세로 48픽셀만 가로로 스크롤. delay(2000); display.stopscroll(); // 스크롤 멈춤 delay(1000); testdrawbitmap(); // 16x16짜리 별모양 그리기 display.invertDisplay(true); // 디스플레이 반전 delay(1000); display.invertDisplay(false); delay(1000); delay(1000*60); } void testdrawbitmap(void) { display.clearDisplay(); display.drawBitmap( (display.width() - LOGO_WIDTH ) / 2, // 시작 x위치 (display.height() - LOGO_HEIGHT) / 2, // 시작 y위치 logo_bmp, // bitmap. byte array with monochrome bitmap LOGO_WIDTH, // Width of bitmap in pixels LOGO_HEIGHT,// Hieght of bitmap in pixels 1); // color. 16-bit 5-6-5 Color to draw with. 색깔인데 어차피 단색 OLED라서... display.display(); delay(1000); } | cs |
3. 테스트
잘 됩니다.
마무리
1) Adafruit_SSD1306 display(디스플레이 가로 픽셀 수, 디스플레이 세로 픽셀 수, &Wire, -1) 로 사용하면 무난하게 가능함
2) display.begin(SSD1306_SWITCHCAPVCC, I2C주소) 에서 I2C주소는 스캔해서 정확하게 넣어주면 OK
3) 글자 크기, 스크롤 방법 등은 예제 참조.
4) Adafruit 라이브러리 살펴보면 많은 참고가 되겠으나 복잡해서... 일단 간단하게 사용하기에는 위의 내용만으로도 충분할 듯.