미세먼지 표시기 만들 때 사용했던 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 라이브러리 살펴보면 많은 참고가 되겠으나 복잡해서... 일단 간단하게 사용하기에는 위의 내용만으로도 충분할 듯.
'아두이노' 카테고리의 다른 글
[모듈] RC522 RFID 모듈 (0) | 2019.04.16 |
---|---|
[모듈] L298N 모터 드라이버 (0) | 2019.04.15 |
아두이노 나노에 스케치에서 업로드 안 될 때 (0) | 2019.04.11 |
[모듈] 라인 트레이서 센서(적외선 송수신 센서) Part 2 (완성) (0) | 2019.04.11 |
스케치에서 WeMos(LOLIN) D1 mini 보드를 선택할 수 없을 경우 (0) | 2019.04.11 |