#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED 디스플레이의 너비
#define SCREEN_HEIGHT 64 // OLED 디스플레이의 높이
#define OLED_RESET -1 // OLED 리셋 핀 (하드웨어 리셋 사용하지 않음)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
const uint8_t Roboto_Bold7pt7bBitmaps[] PROGMEM = {
0x00, 0xFF, 0xFC, 0x3C, 0xFF, 0xBA, 0x12, 0x16, 0x16, 0x7F, 0x7F, 0x34,
0x24, 0xFE, 0x2C, 0x28, 0x68, 0x10, 0x71, 0xF6, 0x6C, 0x3C, 0x1E, 0x06,
0xC7, 0x9B, 0xF1, 0x81, 0x00, 0xE0, 0x48, 0x24, 0x9E, 0x86, 0xC0, 0x40,
0x48, 0x2F, 0x2D, 0xB6, 0xC1, 0xC0, 0x38, 0x1E, 0x19, 0x0C, 0x83, 0xC1,
0xC1, 0xE7, 0xDA, 0xC7, 0x3F, 0x8F, 0xE0, 0xF0, 0x23, 0x6C, 0xCC, 0xCC,
0xCC, 0xCC, 0x62, 0x30, 0x84, 0x62, 0x33, 0x33, 0x33, 0x32, 0x64, 0x80,
0x32, 0xEF, 0xCC, 0x58, 0x18, 0x30, 0x67, 0xFF, 0xE3, 0x06, 0x0C, 0x6D,
0x60, 0xFF, 0xF0, 0x1C, 0x61, 0x8C, 0x30, 0xC6, 0x18, 0x61, 0x0C, 0x30,
0x7B, 0xFC, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0xF7, 0x80, 0x1F, 0xF3, 0x33,
0x33, 0x33, 0x30, 0x7B, 0xFC, 0xC3, 0x0C, 0x63, 0x9C, 0x63, 0xFF, 0xC0,
0x79, 0xFB, 0x30, 0x61, 0xC7, 0x03, 0x06, 0xCF, 0xF9, 0xE0, 0x0E, 0x0E,
0x1E, 0x1E, 0x36, 0x66, 0x66, 0xFF, 0xFF, 0x06, 0x06, 0xFF, 0xFC, 0x30,
0xFF, 0x30, 0xC3, 0xCF, 0xF7, 0x80, 0x3C, 0xF3, 0x06, 0x0F, 0xDF, 0xB3,
0x63, 0xCD, 0xF9, 0xE0, 0xFF, 0xFC, 0x18, 0x60, 0xC3, 0x06, 0x0C, 0x18,
0x30, 0x60, 0x79, 0xFB, 0x36, 0x6F, 0xCF, 0x33, 0x63, 0xCD, 0xF9, 0xE0,
0x7B, 0xFC, 0xF3, 0xCF, 0xFF, 0xC3, 0x0D, 0xF7, 0x80, 0xF0, 0x0F, 0xF0,
0x0F, 0xE0, 0x04, 0x7F, 0x38, 0x3C, 0x30, 0x40, 0xFF, 0xF0, 0x3F, 0xFC,
0x83, 0x83, 0xC7, 0x7B, 0x08, 0x00, 0x79, 0xFB, 0x18, 0x30, 0xC3, 0x86,
0x18, 0x00, 0x60, 0xC0, 0x0F, 0x81, 0x04, 0x20, 0x26, 0x02, 0x47, 0x34,
0xF9, 0xC9, 0x9D, 0x91, 0xD9, 0x35, 0x92, 0x4F, 0xC6, 0x00, 0x30, 0x01,
0xF8, 0x1C, 0x0E, 0x07, 0x07, 0xC3, 0x61, 0xB1, 0xD8, 0xFE, 0x7F, 0x31,
0xB0, 0x60, 0xFD, 0xFF, 0x1E, 0x3F, 0xDF, 0xBF, 0xE3, 0xC7, 0xFF, 0xF0,
0x3C, 0xFF, 0x1E, 0x3C, 0x18, 0x30, 0x63, 0xC6, 0xFC, 0xF0, 0xF8, 0xFE,
0xC6, 0xC6, 0xC3, 0xC3, 0xC3, 0xC6, 0xC6, 0xFE, 0xF8, 0xFF, 0xFC, 0x30,
0xFF, 0xFC, 0x30, 0xC3, 0xFF, 0xC0, 0xFF, 0xFC, 0x30, 0xC3, 0xFC, 0x30,
0xC3, 0x0C, 0x00, 0x3C, 0x7E, 0xC6, 0xC0, 0xC0, 0xC0, 0xCF, 0xC3, 0xC3,
0x7E, 0x3C, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0xFF, 0xFF, 0xC3, 0xC3, 0xC3,
0xC3, 0xFF, 0xFF, 0xFC, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0xC6,
0xF8, 0xE0, 0xC7, 0xCE, 0xCC, 0xD8, 0xF8, 0xF0, 0xF8, 0xDC, 0xCC, 0xCE,
0xC7, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0xFF, 0xC0, 0xE1, 0xF8,
0x7E, 0x1F, 0xC7, 0xF3, 0xF4, 0xFD, 0xAF, 0x7B, 0xCE, 0xF3, 0x3C, 0xCC,
0xC3, 0xE3, 0xE3, 0xF3, 0xF3, 0xDB, 0xCB, 0xCF, 0xC7, 0xC7, 0xC3, 0x3C,
0x7E, 0xC7, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC7, 0x7E, 0x3C, 0xFD, 0xFF,
0x1E, 0x3C, 0x7F, 0xFF, 0x60, 0xC1, 0x83, 0x00, 0x3C, 0x3F, 0x31, 0xD8,
0x6C, 0x36, 0x1B, 0x0D, 0x86, 0xC7, 0x3F, 0x0F, 0xC0, 0x30, 0xFC, 0xFE,
0xC6, 0xC6, 0xCE, 0xFC, 0xFE, 0xC6, 0xC6, 0xC6, 0xC7, 0x79, 0xFF, 0x1E,
0x0E, 0x0F, 0x83, 0x83, 0xC7, 0xFD, 0xF0, 0xFF, 0xFF, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3,
0xC3, 0xC3, 0xC7, 0x7E, 0x3C, 0xC1, 0xB1, 0x98, 0xCC, 0x66, 0x21, 0xB0,
0xD8, 0x6C, 0x1C, 0x0E, 0x07, 0x00, 0xC6, 0x3C, 0x63, 0x67, 0x36, 0x72,
0x6F, 0x66, 0xD6, 0x29, 0xE3, 0x9E, 0x39, 0xC3, 0x8C, 0x30, 0xC0, 0xE3,
0xB1, 0x8D, 0x86, 0xC1, 0xC0, 0xE0, 0x70, 0x6C, 0x36, 0x31, 0xB8, 0xE0,
0xC3, 0xB1, 0x98, 0xC6, 0xC3, 0x60, 0xE0, 0x70, 0x30, 0x18, 0x0C, 0x06,
0x00, 0xFF, 0xF1, 0xC6, 0x30, 0xC6, 0x18, 0xC3, 0xFF, 0xC0, 0xFB, 0x6D,
0xB6, 0xDB, 0x6F, 0xC0, 0xC1, 0x86, 0x18, 0x30, 0xC3, 0x06, 0x18, 0x60,
0xC3, 0xED, 0xB6, 0xDB, 0x6D, 0xBF, 0xC0, 0x30, 0xC7, 0x9A, 0x4B, 0x30,
0xFF, 0xF0, 0xE3, 0x3C, 0xFD, 0x99, 0xF6, 0x78, 0xFF, 0xBB, 0xC3, 0x0C,
0x3E, 0xFF, 0x3C, 0xF3, 0xCF, 0xFF, 0x80, 0x3C, 0xFD, 0x9E, 0x0C, 0x0C,
0xDF, 0x9E, 0x06, 0x0C, 0x19, 0xF7, 0xEC, 0xF1, 0xE3, 0x66, 0xFC, 0xF8,
0x3C, 0xF9, 0x9F, 0xFF, 0xEC, 0x1F, 0x9E, 0x3B, 0xD9, 0xFF, 0xB1, 0x8C,
0x63, 0x18, 0x3E, 0xFD, 0x9E, 0x3C, 0x6C, 0xDF, 0x9F, 0x06, 0xFD, 0xF0,
0xC3, 0x0C, 0x3E, 0xFF, 0x3C, 0xF3, 0xCF, 0x3C, 0xC0, 0xF3, 0xFF, 0xFC,
0x33, 0x03, 0x33, 0x33, 0x33, 0x33, 0xFE, 0xC1, 0x83, 0x06, 0x6D, 0x9F,
0x3C, 0x78, 0xD9, 0xBB, 0x38, 0xFF, 0xFF, 0xFC, 0xF9, 0xBF, 0xFC, 0xCF,
0x33, 0xCC, 0xF3, 0x3C, 0xCF, 0x33, 0xFB, 0xFC, 0xF3, 0xCF, 0x3C, 0xF3,
0x3C, 0xFD, 0x9E, 0x3C, 0x6C, 0xDF, 0x9E, 0xFB, 0xFC, 0xF3, 0xCF, 0x3F,
0xFE, 0xC3, 0x0C, 0x00, 0x3E, 0xFD, 0x9E, 0x3C, 0x6C, 0xDF, 0x9F, 0x06,
0x0C, 0x18, 0xFF, 0xCC, 0xCC, 0xCC, 0x38, 0xF9, 0x9B, 0x81, 0xD8, 0xDB,
0x9E, 0x63, 0x3D, 0xE6, 0x31, 0x8C, 0x71, 0xC0, 0xCF, 0x3C, 0xF3, 0xCF,
0x3F, 0xDF, 0xC6, 0xCD, 0xB3, 0x62, 0xC7, 0x0E, 0x1C, 0xCC, 0xD3, 0x36,
0xC9, 0xBA, 0x7F, 0x9C, 0xE3, 0x38, 0xCC, 0xEE, 0xD8, 0xF1, 0xC3, 0x87,
0x9B, 0x73, 0xC6, 0xCD, 0xB3, 0x62, 0xC7, 0x0E, 0x0C, 0x30, 0xE1, 0x80,
0xFF, 0xE3, 0x8C, 0x63, 0x8F, 0xFF, 0x13, 0x22, 0x26, 0xEE, 0x62, 0x22,
0x31, 0xFF, 0xFF, 0xFF, 0xC0, 0x8C, 0x66, 0x66, 0x33, 0x66, 0x66, 0x6C,
0xF3, 0xFE, 0x30 };
const GFXglyph Roboto_Bold7pt7bGlyphs[] PROGMEM = {
{ 0, 1, 1, 3, 0, 0 }, // 0x20 ' '
{ 1, 2, 11, 4, 1, -10 }, // 0x21 '!'
{ 4, 4, 4, 6, 1, -10 }, // 0x22 '"'
{ 6, 8, 11, 8, 0, -10 }, // 0x23 '#'
{ 17, 7, 13, 8, 1, -10 }, // 0x24 '$'
{ 29, 9, 11, 10, 1, -10 }, // 0x25 '%'
{ 42, 9, 11, 9, 0, -10 }, // 0x26 '&'
{ 55, 1, 4, 3, 1, -10 }, // 0x27 '''
{ 56, 4, 15, 5, 1, -11 }, // 0x28 '('
{ 64, 4, 15, 5, 0, -11 }, // 0x29 ')'
{ 72, 6, 5, 6, 0, -7 }, // 0x2A '*'
{ 76, 7, 8, 8, 0, -8 }, // 0x2B '+'
{ 83, 3, 4, 4, 0, -1 }, // 0x2C ','
{ 85, 4, 2, 6, 1, -5 }, // 0x2D '-'
{ 86, 2, 2, 4, 1, -1 }, // 0x2E '.'
{ 87, 6, 12, 6, 0, -10 }, // 0x2F '/'
{ 96, 6, 11, 8, 1, -10 }, // 0x30 '0'
{ 105, 4, 11, 8, 1, -10 }, // 0x31 '1'
{ 111, 6, 11, 8, 1, -10 }, // 0x32 '2'
{ 120, 7, 11, 8, 1, -10 }, // 0x33 '3'
{ 130, 8, 11, 8, 0, -10 }, // 0x34 '4'
{ 141, 6, 11, 8, 1, -10 }, // 0x35 '5'
{ 150, 7, 11, 8, 1, -10 }, // 0x36 '6'
{ 160, 7, 11, 8, 0, -10 }, // 0x37 '7'
{ 170, 7, 11, 8, 1, -10 }, // 0x38 '8'
{ 180, 6, 11, 8, 1, -10 }, // 0x39 '9'
{ 189, 2, 8, 4, 1, -7 }, // 0x3A ':'
{ 191, 2, 10, 4, 1, -7 }, // 0x3B ';'
{ 194, 6, 7, 7, 0, -6 }, // 0x3C '<'
{ 200, 6, 5, 8, 1, -6 }, // 0x3D '='
{ 204, 6, 7, 7, 1, -6 }, // 0x3E '>'
{ 210, 7, 11, 7, 0, -10 }, // 0x3F '?'
{ 220, 12, 14, 12, 0, -10 }, // 0x40 '@'
{ 241, 9, 11, 9, 0, -10 }, // 0x41 'A'
{ 254, 7, 11, 9, 1, -10 }, // 0x42 'B'
{ 264, 7, 11, 9, 1, -10 }, // 0x43 'C'
{ 274, 8, 11, 9, 1, -10 }, // 0x44 'D'
{ 285, 6, 11, 8, 1, -10 }, // 0x45 'E'
{ 294, 6, 11, 8, 1, -10 }, // 0x46 'F'
{ 303, 8, 11, 9, 1, -10 }, // 0x47 'G'
{ 314, 8, 11, 10, 1, -10 }, // 0x48 'H'
{ 325, 2, 11, 4, 1, -10 }, // 0x49 'I'
{ 328, 7, 11, 8, 0, -10 }, // 0x4A 'J'
{ 338, 8, 11, 9, 1, -10 }, // 0x4B 'K'
{ 349, 6, 11, 8, 1, -10 }, // 0x4C 'L'
{ 358, 10, 11, 12, 1, -10 }, // 0x4D 'M'
{ 372, 8, 11, 10, 1, -10 }, // 0x4E 'N'
{ 383, 8, 11, 10, 1, -10 }, // 0x4F 'O'
{ 394, 7, 11, 9, 1, -10 }, // 0x50 'P'
{ 404, 9, 12, 10, 1, -10 }, // 0x51 'Q'
{ 418, 8, 11, 9, 1, -10 }, // 0x52 'R'
{ 429, 7, 11, 9, 1, -10 }, // 0x53 'S'
{ 439, 8, 11, 8, 0, -10 }, // 0x54 'T'
{ 450, 8, 11, 10, 1, -10 }, // 0x55 'U'
{ 461, 9, 11, 9, 0, -10 }, // 0x56 'V'
{ 474, 12, 11, 12, 0, -10 }, // 0x57 'W'
{ 491, 9, 11, 9, 0, -10 }, // 0x58 'X'
{ 504, 9, 11, 9, 0, -10 }, // 0x59 'Y'
{ 517, 6, 11, 8, 1, -10 }, // 0x5A 'Z'
{ 526, 3, 14, 4, 1, -11 }, // 0x5B '['
{ 532, 6, 12, 6, 0, -10 }, // 0x5C '\'
{ 541, 3, 14, 4, 0, -11 }, // 0x5D ']'
{ 547, 6, 6, 6, 0, -10 }, // 0x5E '^'
{ 552, 6, 2, 6, 0, 1 }, // 0x5F '_'
{ 554, 4, 2, 5, 0, -10 }, // 0x60 '`'
{ 555, 7, 8, 8, 0, -7 }, // 0x61 'a'
{ 562, 6, 11, 8, 1, -10 }, // 0x62 'b'
{ 571, 7, 8, 7, 0, -7 }, // 0x63 'c'
{ 578, 7, 11, 8, 0, -10 }, // 0x64 'd'
{ 588, 7, 8, 7, 0, -7 }, // 0x65 'e'
{ 595, 5, 11, 5, 0, -10 }, // 0x66 'f'
{ 602, 7, 11, 8, 0, -7 }, // 0x67 'g'
{ 612, 6, 11, 8, 1, -10 }, // 0x68 'h'
{ 621, 2, 11, 4, 1, -10 }, // 0x69 'i'
{ 624, 4, 14, 4, -1, -10 }, // 0x6A 'j'
{ 631, 7, 11, 8, 1, -10 }, // 0x6B 'k'
{ 641, 2, 11, 4, 1, -10 }, // 0x6C 'l'
{ 644, 10, 8, 12, 1, -7 }, // 0x6D 'm'
{ 654, 6, 8, 8, 1, -7 }, // 0x6E 'n'
{ 660, 7, 8, 8, 0, -7 }, // 0x6F 'o'
{ 667, 6, 11, 8, 1, -7 }, // 0x70 'p'
{ 676, 7, 11, 8, 0, -7 }, // 0x71 'q'
{ 686, 4, 8, 5, 1, -7 }, // 0x72 'r'
{ 690, 7, 8, 7, 0, -7 }, // 0x73 's'
{ 697, 5, 10, 5, 0, -9 }, // 0x74 't'
{ 704, 6, 8, 8, 1, -7 }, // 0x75 'u'
{ 710, 7, 8, 7, 0, -7 }, // 0x76 'v'
{ 717, 10, 8, 10, 0, -7 }, // 0x77 'w'
{ 727, 7, 8, 7, 0, -7 }, // 0x78 'x'
{ 734, 7, 11, 7, 0, -7 }, // 0x79 'y'
{ 744, 6, 8, 7, 1, -7 }, // 0x7A 'z'
{ 750, 4, 14, 5, 0, -11 }, // 0x7B '{'
{ 757, 2, 13, 4, 1, -10 }, // 0x7C '|'
{ 761, 4, 14, 5, 0, -11 }, // 0x7D '}'
{ 768, 7, 3, 9, 1, -5 } }; // 0x7E '~'
const GFXfont Roboto_Bold7pt7b PROGMEM = {
(uint8_t *)Roboto_Bold7pt7bBitmaps,
(GFXglyph *)Roboto_Bold7pt7bGlyphs,
0x20, 0x7E, 16 };
byte customChar[] = {
0x0040,
0x7C40,
0x0640,
0x0440,
0x0440,
0x0440,
0x0840,
0x1040,
0x2040,
0xC040,
0x0040,
0x0040,
0x0040,
};
int16_t x2[2],y2[2];
uint16_t w2[2],h2[2];
const int cursorX[2] = {30, 101};
const int cursorY[2] = {30, 37};
const char text2[2][6] = {
"88.8",
"0.8"
};
int16_t x,y;
uint16_t w,h;
const char *text = "88.8";
float num = 56.2;
float num2 = 0.2;
void setup() {
Serial.begin(9600);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // I2C 주소가 0x3C인 경우
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
display.clearDisplay();
display.setTextSize(1); // 텍스트 크기 설정
display.setFont(&Roboto_Bold7pt7b);
display.setTextColor(SSD1306_WHITE); // 텍스트 색상: 검정색
display.setCursor(0, 0); // 텍스트 커서 위치 설정
// 텍스트가 들어갈 하얀색 배경 박스 그리기
uint8_t padding = 1; // 여유 공간 (4픽셀씩 추가)
for(int i = 0; i<2; i++){
display.getTextBounds(text2[i], cursorX[i], cursorY[i], &x2[i], &y2[i], &w2[i], &h2[i]);
x2[i] -= padding; // 좌측 여유 공간
y2[i] -= padding; // 상단 여유 공간
w2[i] += 2 * padding; // 좌우 여유 공간
h2[i] += 2 * padding; // 상하 여유 공간
}
//display.getTextBounds(text, 80, 37, &x, &y, &w, &h); // int16_t 과 uint16_t만 가능
Serial.print("x[0]:");Serial.print(x2[0]);
Serial.print(" y[0]:");Serial.print(y2[0]);
Serial.print(" w[0]:");Serial.print(w2[0]);
Serial.print(" h[0]: ");Serial.println(h2[0]);
/*Serial.print("x:");Serial.print(x);
Serial.print(" y:");Serial.print(y);
Serial.print(" w:");Serial.print(w);
Serial.print(" h: ");Serial.println(h);*/
//uint8_t padding = 1; // 여유 공간 (4픽셀씩 추가)
x -= padding; // 좌측 여유 공간
y -= padding; // 상단 여유 공간
w += 2 * padding; // 좌우 여유 공간
h += 2 * padding; // 상하 여유 공간
}
void loop() {
//display.clearDisplay();
display.setTextSize(1);
//display.setFont(&Roboto_Bold7pt7b);
//display.setTextColor(SSD1306_WHITE);
//display.fillRect(x2[0], y2[0], w2[0], h2[0], SSD1306_WHITE);
//display.fillRect(x, y, w, h, SSD1306_WHITE);
display.fillRect(30,19,29,13,1);
display.setTextColor(SSD1306_BLACK);
display.setCursor(30, 30);
display.print(num);
//display.display();
delay(1000);
display.fillRect(x2[0], y2[0], w2[0], h2[0], SSD1306_BLACK);
display.setTextColor(SSD1306_WHITE);
display.setCursor(30, 30);
display.print(num,1);
display.drawBitmap(10, 10, customChar, 8, 8, SSD1306_WHITE);
display.display();
delay(1000);
// 메인 코드 루프
}