驴友花雕 发表于 2022-6-2 10:59:22

【Arduino】168种传感器模块系列实验(97)---0.96寸OLED液晶屏

0.96寸I2C OLED液晶屏模块的实物照片

驴友花雕 发表于 2022-6-9 06:18:48

程序十五:动画示例中的雪花飘(1)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序十五:动画示例中的雪花飘
Arduino------OLED屏
5V------------VCC
GND-----------GND
A4-----------SDA IIC 数据线
A5-----------SCL IIC 时钟线
*/

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>//导入驱动库

#define SCREEN_WIDTH 128 //设置OLED参数
#define SCREEN_HEIGHT 64

#define OLED_RESET   4
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define NUMFLAKES   10

#define LOGO_HEIGHT   16
#define LOGO_WIDTH    16
static const unsigned char PROGMEM logo_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
};

void setup() {
Serial.begin(9600);

if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for (;;);
}

display.display();
delay(2000);
display.clearDisplay();
display.drawPixel(10, 10, WHITE);
display.display();
delay(2000);
testdrawline();
testdrawrect();
testfillrect();
testdrawcircle();
testfillcircle();
testdrawroundrect();
testfillroundrect();
testdrawtriangle();
testfilltriangle();
testdrawchar();
testdrawstyles();
testscrolltext();
testdrawbitmap();

display.invertDisplay(true);
delay(1000);
display.invertDisplay(false);
delay(1000);
testanimate(logo_bmp, LOGO_WIDTH, LOGO_HEIGHT);
}

void loop() {
}

void testdrawline() {
int16_t i;
display.clearDisplay();
for (i = 0; i < display.width(); i += 4) {
    display.drawLine(0, 0, i, display.height() - 1, WHITE);
    display.display();
    delay(1);
}
for (i = 0; i < display.height(); i += 4) {
    display.drawLine(0, 0, display.width() - 1, i, WHITE);
    display.display();
    delay(1);
}
delay(250);
display.clearDisplay();

for (i = 0; i < display.width(); i += 4) {
    display.drawLine(0, display.height() - 1, i, 0, WHITE);
    display.display();
    delay(1);
}
for (i = display.height() - 1; i >= 0; i -= 4) {
    display.drawLine(0, display.height() - 1, display.width() - 1, i, WHITE);
    display.display();
    delay(1);
}
delay(250);

display.clearDisplay();
for (i = display.width() - 1; i >= 0; i -= 4) {
    display.drawLine(display.width() - 1, display.height() - 1, i, 0, WHITE);
    display.display();
    delay(1);
}
for (i = display.height() - 1; i >= 0; i -= 4) {
    display.drawLine(display.width() - 1, display.height() - 1, 0, i, WHITE);
    display.display();
    delay(1);
}
delay(250);

display.clearDisplay();
for (i = 0; i < display.height(); i += 4) {
    display.drawLine(display.width() - 1, 0, 0, i, WHITE);
    display.display();
    delay(1);
}
for (i = 0; i < display.width(); i += 4) {
    display.drawLine(display.width() - 1, 0, i, display.height() - 1, WHITE);
    display.display();
    delay(1);
}
delay(2000);
}

void testdrawrect(void) {
display.clearDisplay();
for (int16_t i = 0; i < display.height() / 2; i += 2) {
    display.drawRect(i, i, display.width() - 2 * i, display.height() - 2 * i, WHITE);
    display.display();
    delay(1);
}
delay(2000);
}

void testfillrect(void) {
display.clearDisplay();
for (int16_t i = 0; i < display.height() / 2; i += 3) {
    //使用了 INVERSE 颜色,因此矩形交替出现白色/黑色
    display.fillRect(i, i, display.width() - i * 2, display.height() - i * 2, INVERSE);
    display.display();
    delay(1);
}
delay(2000);
}

void testdrawcircle(void) {
display.clearDisplay();
for (int16_t i = 0; i < max(display.width(), display.height()) / 2; i += 2) {
    display.drawCircle(display.width() / 2, display.height() / 2, i, WHITE);
    display.display();
    delay(1);
}
delay(2000);
}

void testfillcircle(void) {
display.clearDisplay();
for (int16_t i = max(display.width(), display.height()) / 2; i > 0; i -= 3) {
    display.fillCircle(display.width() / 2, display.height() / 2, i, INVERSE);
    display.display();
    delay(1);
}
delay(2000);
}

void testdrawroundrect(void) {
display.clearDisplay();
for (int16_t i = 0; i < display.height() / 2 - 2; i += 2) {
    display.drawRoundRect(i, i, display.width() - 2 * i, display.height() - 2 * i,
                        display.height() / 4, WHITE);
    display.display();
    delay(1);
}

delay(2000);
}

void testfillroundrect(void) {
display.clearDisplay();
for (int16_t i = 0; i < display.height() / 2 - 2; i += 2) {
    display.fillRoundRect(i, i, display.width() - 2 * i, display.height() - 2 * i,
                        display.height() / 4, INVERSE);
    display.display();
    delay(1);
}

delay(2000);
}

void testdrawtriangle(void) {
display.clearDisplay();
for (int16_t i = 0; i < max(display.width(), display.height()) / 2; i += 5) {
    display.drawTriangle(
      display.width() / 2, display.height() / 2 - i,
      display.width() / 2 - i, display.height() / 2 + i,
      display.width() / 2 + i, display.height() / 2 + i, WHITE);
    display.display();
    delay(1);
}
delay(2000);
}

void testfilltriangle(void) {
display.clearDisplay();
for (int16_t i = max(display.width(), display.height()) / 2; i > 0; i -= 5) {
    display.fillTriangle(
      display.width() / 2, display.height() / 2 - i,
      display.width() / 2 - i, display.height() / 2 + i,
      display.width() / 2 + i, display.height() / 2 + i, INVERSE);
    display.display();
    delay(1);
}
delay(2000);
}

void testdrawchar(void) {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);

display.cp437(true);
for (int16_t i = 0; i < 256; i++) {
    if (i == '\n') display.write(' ');
    else          display.write(i);
}
display.display();
delay(2000);
}

void testdrawstyles(void) {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println(F("Hello, world!"));

display.setTextColor(BLACK, WHITE);
display.println(3.141592);
display.setTextSize(2);
display.setTextColor(WHITE);
display.print(F("0x")); display.println(0xDEADBEEF, HEX);
display.display();
delay(2000);
}

void testscrolltext(void) {
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(10, 0);
display.println(F("scroll"));
display.display();
delay(100);
display.startscrollright(0x00, 0x0F);
delay(2000);
display.stopscroll();
delay(1000);
display.startscrollleft(0x00, 0x0F);
delay(2000);
display.stopscroll();
delay(1000);
display.startscrolldiagright(0x00, 0x07);
delay(2000);
display.startscrolldiagleft(0x00, 0x07);
delay(2000);
display.stopscroll();
delay(1000);
}

void testdrawbitmap(void) {
display.clearDisplay();
display.drawBitmap(
    (display.width()- LOGO_WIDTH ) / 2,
    (display.height() - LOGO_HEIGHT) / 2,
    logo_bmp, LOGO_WIDTH, LOGO_HEIGHT, 1);
display.display();
delay(1000);
}

#define XPOS   0
#define YPOS   1
#define DELTAY 2

void testanimate(const uint8_t *bitmap, uint8_t w, uint8_t h) {
int8_t f, icons;
for (f = 0; f < NUMFLAKES; f++) {
    icons   = random(1 - LOGO_WIDTH, display.width());
    icons   = -LOGO_HEIGHT;
    icons = random(1, 6);
    Serial.print(F("x: "));
    Serial.print(icons, DEC);
    Serial.print(F(" y: "));
    Serial.print(icons, DEC);
    Serial.print(F(" dy: "));
    Serial.println(icons, DEC);
}

for (;;) {
    display.clearDisplay();
    for (f = 0; f < NUMFLAKES; f++) {
      display.drawBitmap(icons, icons, bitmap, w, h, WHITE);
    }

    display.display();
    delay(200);
    for (f = 0; f < NUMFLAKES; f++) {
      icons += icons;
      if (icons >= display.height()) {
      icons   = random(1 - LOGO_WIDTH, display.width());
      icons   = -LOGO_HEIGHT;
      icons = random(1, 6);
      }
    }
}
}

驴友花雕 发表于 2022-6-16 05:00:48

程序二十二:OLED屏显示矢量图片(1)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序二十二:OLED屏显示矢量图片
实验接脚: 0.96寸OLED液晶屏SDA接A4, SCL接A5
*/

#include "ssd1306.h"
const uint8_t Owl [] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
0x0A, 0x05, 0x0D, 0x01, 0x01, 0x03, 0x87, 0xFE, 0xFE, 0xFC, 0xF8, 0xF0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0E,
0x08, 0x0C, 0x0C, 0x0C, 0x0E, 0x0F, 0x0F, 0x07, 0x07, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0x30,
0x98, 0xDE, 0xE6, 0xE7, 0xF7, 0xD7, 0xD6, 0x56, 0x56, 0xD7, 0xD7, 0x5F, 0xDF, 0x3F, 0x3F, 0x2F,
0x9F, 0xD7, 0xDF, 0x6F, 0x6B, 0x6B, 0x7F, 0xF7, 0xF3, 0xF3, 0xE0, 0xEC, 0x98, 0x30, 0xE0, 0x80,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x60, 0x70, 0x70, 0x60,
0x40, 0x60, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xC0, 0xC0, 0xE0, 0xF0, 0xE0, 0x40, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFB, 0xE0,
0xDF, 0xB1, 0xEF, 0x5F, 0xB9, 0xB0, 0xA0, 0xE6, 0x6E, 0x2E, 0xB6, 0xB9, 0x9F, 0xAF, 0xA0, 0xA7,
0xBF, 0x99, 0xB6, 0xB6, 0xA6, 0xA6, 0xB0, 0xB0, 0xA9, 0xDF, 0xCF, 0xF0, 0x7F, 0x77, 0xFD, 0x01,
0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x08, 0xEE, 0xB3, 0x7D, 0xBE, 0x7F, 0xC7, 0x87, 0xB7,
0xB7, 0xB7, 0xCD, 0x7D, 0x83, 0x93, 0xFB, 0xCD, 0xB5, 0x35, 0xA5, 0x87, 0xCE, 0xFE, 0x1C, 0xF9,
0xC3, 0x1C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x1F, 0x3F, 0x3C, 0x73,
0xEF, 0x9E, 0x7E, 0xFD, 0xFD, 0xED, 0xAD, 0xFD, 0xDD, 0xFF, 0xBF, 0xFF, 0x5F, 0xDF, 0xEF, 0xFF,
0xFF, 0xFF, 0x6F, 0xFF, 0xDF, 0xEF, 0xFD, 0xDD, 0xFD, 0xBC, 0xFE, 0x7E, 0xBF, 0xEF, 0x7B, 0x3E,
0x1F, 0x0F, 0x07, 0x00, 0x00, 0x0E, 0x1F, 0x3C, 0x77, 0x5F, 0x3D, 0x7D, 0xFB, 0xFB, 0x7A, 0xFA,
0xFE, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0x7E, 0xFE, 0xBF, 0xFD, 0xF5, 0xF5, 0xF6, 0xFA, 0xFB, 0xDF,
0x67, 0x78, 0x3C, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xC0, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x40, 0x00, 0x10, 0x38, 0x80, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0x00, 0x00, 0x81, 0x83, 0x83, 0x87, 0xE7, 0xEF, 0xEF, 0xEB, 0xFF, 0xF7, 0xDF,
0xFA, 0xFE, 0xFF, 0xEB, 0xEE, 0xEE, 0xE7, 0x67, 0x63, 0x61, 0x60, 0x60, 0x60, 0xE0, 0xE0, 0xE0,
0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x71, 0x73, 0x7B,
0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7E, 0x7F, 0x77, 0x76, 0x73, 0x73, 0x71, 0x71, 0x70, 0x71, 0x70,
0x70, 0x70, 0x70, 0x70, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF1, 0xF1, 0xF1, 0xE0, 0xE0,
0xE8, 0xEC, 0xEE, 0xE7, 0xE2, 0xE4, 0xE8, 0xD0, 0xE0, 0xE0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0,
0x10, 0x10, 0x10, 0x10, 0x1F, 0x13, 0xA1, 0xAD, 0xC8, 0x49, 0x47, 0x42, 0x40, 0xC0, 0xDC, 0x78,
0x60, 0x60, 0x20, 0x21, 0x31, 0x30, 0x11, 0x1A, 0x1B, 0x0B, 0x0D, 0x0C, 0x04, 0x06, 0x06, 0x06,
0x03, 0x03, 0x03, 0x13, 0x31, 0x71, 0x71, 0x61, 0x81, 0x81, 0x41, 0x20, 0x26, 0x0C, 0x1C, 0x30,
0x78, 0x00, 0x00, 0x84, 0xC4, 0x84, 0x84, 0x0C, 0x04, 0x02, 0x02, 0x01, 0x01, 0x07, 0x0E, 0x0E,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xE0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xE0, 0xC0, 0xC0, 0x00, 0x00, 0x81, 0x81, 0x81, 0x41, 0x41,
0x21, 0x21, 0x13, 0x13, 0x13, 0x03, 0x0B, 0x0B, 0x0B, 0x0F, 0x0F, 0x07, 0x07, 0x07, 0x07, 0x07,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x01, 0x00, 0x00, 0x06, 0x07, 0x03, 0x03, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0C, 0x40, 0xEE, 0x79,
0x35, 0x02, 0x08, 0x08, 0x04, 0x04, 0x02, 0x1F, 0x3D, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
0x04, 0x24, 0x00, 0x0D, 0x30, 0x31, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0xC6, 0xC6, 0x36, 0x68, 0x44,
0xB4, 0xA0, 0x52, 0x62, 0x02, 0x02, 0x02, 0x00, 0x01, 0x03, 0x32, 0x7A, 0x3E, 0x1A, 0x02, 0x02,
0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x1D, 0x3D, 0x1D, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

const uint8_t Soba [] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80,
0x09, 0x00, 0x00, 0x00, 0xc0, 0x0c, 0x00, 0x00,
0x00, 0x60, 0x06, 0x00, 0x00, 0x00, 0x30, 0x03,
0x00, 0x00, 0x00, 0x98, 0x01, 0x00, 0xf8, 0x00,
0xcc, 0x00, 0x00, 0xde, 0x03, 0x66, 0x00, 0x80,
0x07, 0x0f, 0x33, 0x00, 0xc0, 0x01, 0x9c, 0x19,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff,
0xff, 0xff, 0x07, 0xe0, 0xff, 0xff, 0xff, 0x07,
0xe0, 0xff, 0xff, 0xff, 0x07, 0xe0, 0xff, 0xff,
0xff, 0x07, 0xe0, 0xff, 0xff, 0xff, 0x07, 0xc0,
0xff, 0xff, 0xff, 0x03, 0xc0, 0xff, 0xff, 0xff,
0x03, 0x80, 0xff, 0xff, 0xff, 0x01, 0x80, 0xff,
0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0xff, 0x00,
0x00, 0xfe, 0xff, 0x7f, 0x00, 0x00, 0xfc, 0xff,
0x3f, 0x00, 0x00, 0xf8, 0xff, 0x1f, 0x00, 0x00,
0xf0, 0xff, 0x0f, 0x00, 0x00, 0xc0, 0xff, 0x03,
0x00, 0x00, 0x80, 0xff, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

void setup() {
ssd1306_128x64_i2c_init();
}

void loop() {
ssd1306_clearScreen( );
ssd1306_drawBitmap(0, 0, 128, 64, Owl);
delay(2000);
ssd1306_clearScreen( );
ssd1306_drawXBitmap(0, 0, 40, 32, Soba);
delay(2000);
}

驴友花雕 发表于 2022-6-9 06:27:32

程序十七:杰森创工的文字与图片(1)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序十七:杰森创工的文字与图片
Arduino------OLED屏
5V------------VCC
GND-----------GND
A4-----------SDA IIC 数据线
A5-----------SCL IIC 时钟线
*/

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED 寬度像素
#define SCREEN_HEIGHT 64 // OLED 高度像素

// 設定OLED
#define OLED_RESET   4 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
//自訂圖形,從Image2LCD轉過來的,尺寸是128x48,少掉的16個像素是上方黃色區塊(假設是用藍黃雙色的OLED)
//本範例為了在上方區塊顯示文字,所以圖形就沒有涵蓋整個高度

static const unsigned char PROGMEM logo_bmp[] =
{
0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0XFF, 0XFF, 0XF8, 0X7F, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0XFE, 0XFF, 0XF8, 0X3F, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0XFE, 0X1F, 0XFC, 0X7F, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0XFC, 0X03, 0XFD, 0XFF, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0XE4, 0X00, 0XFB, 0XFF, 0XFF, 0X83, 0X00, 0X18, 0X00, 0X60, 0X00, 0X38, 0X02, 0X00, 0X00, 0X00,
0XE4, 0X00, 0X1B, 0XFF, 0XFF, 0X83, 0X7E, 0X18, 0X3F, 0XFF, 0XC0, 0XFE, 0X03, 0X0F, 0XFF, 0XFC,
0XCC, 0X00, 0X03, 0XFF, 0XFF, 0X83, 0X7F, 0XFE, 0X7F, 0XFF, 0XC3, 0XC7, 0XB3, 0X0F, 0XFF, 0XFC,
0XC8, 0X7C, 0X00, 0XFF, 0XFF, 0X83, 0X46, 0XFC, 0X01, 0XF8, 0X07, 0XFE, 0XB3, 0X00, 0X0C, 0X00,
0XC8, 0XFE, 0X00, 0X1F, 0XFF, 0X86, 0XE6, 0XD8, 0X03, 0XFE, 0X00, 0XFE, 0X33, 0X00, 0X0C, 0X00,
0X99, 0XFF, 0X00, 0X07, 0XFF, 0X87, 0XF4, 0XD8, 0X1F, 0X67, 0X80, 0X00, 0X33, 0X00, 0X0C, 0X00,
0X91, 0XFF, 0X00, 0X00, 0XFF, 0X8E, 0X1C, 0XD8, 0X7C, 0X61, 0XE3, 0XFF, 0X33, 0X00, 0X0C, 0X00,
0X91, 0XFF, 0X00, 0X00, 0X1F, 0X8E, 0X1B, 0XFE, 0X64, 0X62, 0X23, 0XFF, 0XB3, 0X00, 0X0C, 0X00,
0XE1, 0XFF, 0X00, 0X00, 0X1F, 0X9E, 0X31, 0XFE, 0X0C, 0X26, 0X03, 0XFF, 0XB3, 0X00, 0X0C, 0X00,
0XE0, 0XFE, 0X01, 0X80, 0X1F, 0X9E, 0XE1, 0X18, 0X7F, 0X9F, 0XE3, 0XFF, 0XB3, 0X00, 0X0C, 0X00,
0XE0, 0X7C, 0X03, 0XE0, 0X3F, 0X86, 0X43, 0X08, 0XFF, 0X9F, 0XE3, 0X01, 0XB3, 0X00, 0X0C, 0X00,
0XC0, 0X38, 0X07, 0XE0, 0X3F, 0X86, 0XFF, 0XFC, 0X0C, 0X07, 0X03, 0XFF, 0XB3, 0X00, 0X0C, 0X00,
0XF0, 0X00, 0X07, 0XF0, 0X4F, 0X86, 0XFF, 0XFC, 0X1E, 0X0F, 0X03, 0XFF, 0X33, 0X00, 0X0C, 0X00,
0XFE, 0X00, 0X07, 0XE0, 0X4F, 0X86, 0X07, 0X80, 0X3F, 0X9F, 0X83, 0X00, 0X33, 0X00, 0X0C, 0X00,
0XC7, 0XC0, 0X07, 0XE0, 0X9F, 0X86, 0X0F, 0XC0, 0X3D, 0X9E, 0XC2, 0X7F, 0X33, 0X00, 0X0C, 0X00,
0X81, 0XF0, 0X03, 0XC0, 0X9F, 0X86, 0X3F, 0X70, 0X6C, 0X36, 0XE6, 0X7F, 0X83, 0X00, 0X0C, 0X00,
0X80, 0X3E, 0X00, 0X01, 0X9F, 0X86, 0XF3, 0X3C, 0XCC, 0X66, 0X66, 0X61, 0X83, 0X00, 0X0C, 0X00,
0XC0, 0X07, 0X80, 0X01, 0X3F, 0X86, 0XE3, 0X0C, 0X0C, 0X06, 0X06, 0X7F, 0X83, 0X1F, 0XFF, 0XFE,
0XF8, 0X01, 0XF0, 0X01, 0X31, 0X86, 0X03, 0X00, 0X0C, 0X06, 0X06, 0X7F, 0XBE, 0X1F, 0XFF, 0XFE,
0XBF, 0X00, 0X3E, 0X03, 0XF1, 0X86, 0X03, 0X00, 0X04, 0X02, 0X00, 0X41, 0X1C, 0X00, 0X00, 0X00,
0X8F, 0XC0, 0X0F, 0X83, 0XF1, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0XCC, 0XE0, 0X01, 0XF7, 0XF3, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0XCC, 0X1C, 0X00, 0X3F, 0XF1, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X8D, 0XC7, 0XC0, 0X0F, 0XF0, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X8E, 0X38, 0XF8, 0X0F, 0XF8, 0X83, 0X00, 0X00, 0X30, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X83, 0X8E, 0X1E, 0X0F, 0XFF, 0X82, 0X00, 0X00, 0X30, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X80, 0X71, 0XC7, 0XDF, 0XF3, 0X80, 0X00, 0X00, 0X30, 0X00, 0X00, 0X00, 0X00, 0X00, 0X30, 0X00,
0X80, 0X1C, 0X67, 0XFF, 0XF9, 0X83, 0X7D, 0XCF, 0X33, 0X39, 0XE0, 0XE3, 0X9F, 0X70, 0X7A, 0X26,
0X81, 0XE3, 0X8C, 0X7F, 0XC7, 0X83, 0X6E, 0XC9, 0XB6, 0X6D, 0XE1, 0X86, 0XDD, 0XD8, 0X33, 0X66,
0X81, 0XFC, 0XF8, 0X1F, 0X83, 0X83, 0X66, 0X61, 0XBC, 0X4D, 0X81, 0X0C, 0X59, 0X98, 0X33, 0X74,
0X80, 0XFE, 0X13, 0X1C, 0X47, 0X83, 0X66, 0X6F, 0XBC, 0XFD, 0X83, 0X0C, 0X79, 0X98, 0X33, 0X54,
0X80, 0X3E, 0X00, 0X24, 0X6F, 0X83, 0X66, 0X69, 0XB6, 0XC1, 0X81, 0X0C, 0X59, 0X98, 0X31, 0XDC,
0X83, 0X3E, 0X00, 0X64, 0X7F, 0X83, 0X66, 0X79, 0XB6, 0X61, 0X8D, 0X86, 0XD9, 0X9B, 0X31, 0X98,
0X83, 0X70, 0X00, 0X47, 0XFF, 0X83, 0X66, 0X6F, 0XB3, 0X39, 0X8C, 0XE3, 0X99, 0X9B, 0X19, 0X98,
0X87, 0XF0, 0X00, 0XC7, 0XFF, 0X83, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X87, 0XF0, 0X00, 0X8F, 0XFF, 0X86, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X81, 0XE0, 0X01, 0XFF, 0XFF, 0X84, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X80, 0X60, 0X03, 0XFF, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X80, 0X00, 0X03, 0XFF, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X80, 0X00, 0X67, 0XFF, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
};

void setup() {
Serial.begin(9600);
// 偵測是否安裝好OLED了
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 一般1306 OLED的位址都是0x3C
    Serial.println(F("SSD1306 allocation failed"));
    for (;;); // Don't proceed, loop forever
}

// 顯示Adafruit的LOGO,算是開機畫面
display.display();
delay(1000); // 停1秒
// 清除畫面
display.clearDisplay();
testdrawstyles();    // 測試文字
testdrawbitmap();    // 顯示圖形
}

void loop() {
}

void testdrawstyles(void) {
display.clearDisplay();
display.setTextSize(2);             // 設定文字大小
display.setTextColor(1);      // 1:OLED預設的顏色(這個會依該OLED的顏色來決定)
display.setCursor(0, 0);            // 設定起始座標
display.print("Hello OLED");      // 要顯示的字串
display.display();                  // 要有這行才會把文字顯示出來
delay(1000);
}

void testdrawbitmap(void) {
//display.clearDisplay();
//顯示圖形,x,y,圖形文字,寬,高,1:OLED預設的顏色(這個會依該OLED的顏色來決定)
display.drawBitmap(0, 16, logo_bmp, 128, 48, 1);
display.display();// 要有這行才會把文字顯示出來
delay(1000);
}

驴友花雕 发表于 2022-6-2 11:01:44

科普知识点:有机发光半导体与0.96寸I2C OLED液晶屏模块一、有机发光半导体(OrganicElectroluminesence Display,简称OLED)1、OLED又称为有机电激光显示。OLED属于一种电流型的有机发光器件,是通过载流子的注入和复合而致发光的现象,发光强度与注入的电流成正比。OLED在电场的作用下,阳极产生的空穴和阴极产生的电子就会发生移动,分别向空穴传输层和电子传输层注入,迁移到发光层。当二者在发光层相遇时,产生能量激子,从而激发发光分子最终产生可见光。一般而言,OLED可按发光材料分为两种:小分子OLED和高分子OLED(也可称为PLED)。OLED是一种利用多层有机薄膜结构产生电致发光的器件,它很容易制作,而且只需要低的驱动电压,这些主要的特征使得OLED在满足平面显示器的应用上显得非常突出。OLED显示屏比LCD更轻薄、亮度高、功耗低、响应快、清晰度高、柔性好、发光效率高,能满足消费者对显示技术的新需求。全球越来越多的显示器厂家纷纷投入研发,大大的推动了OLED的产业化进程。

驴友花雕 发表于 2022-6-2 11:03:08

2、OLED结构
由基板、阴极、阳极、空穴注入层(HIL)、电子注入层(EIL)、空穴传输层(HTL)、电子传输层(ETL)、电子阻挡层(EBL)、空穴阻挡层(HBL)、发光层(EML)等部分构成。

驴友花雕 发表于 2022-6-2 11:06:13

其中,基板是整个器件的基础,所有功能层都需要蒸镀到器件的基板上;通常采用玻璃作为器件的基板,但是如果需要制作可弯曲的柔性OLED器件,则需要使用其它材料如塑料等作为器件的基板。阳极与器件外加驱动电压的正极相连,阳极中的空穴会在外加驱动电压的驱动下向器件中的发光层移动,阳极需要在器件工作时具有一定的透光性,使得器件内部发出的光能够被外界观察到;阳极最常使用的材料是ITO。空穴注入层能够对器件的阳极进行修饰,并可以使来自阳极的空穴顺利的注入到空穴传输层;空穴传输层负责将空穴运输到发光层;电子阻挡层会把来自阴极的电子阻挡在器件的发光层界面处,增大器件发光层界面处电子的浓度;发光层为器件电子和空穴再结合形成激子然后激子退激发光的地方;空穴阻挡层会将来自阳极的空穴阻挡在器件发光层的界面处,进而提高器件发光层界面处电子和空穴再结合的概率,增大器件的发光效率;电子传输层负责将来自阴极的电子传输到器件的发光层中;电子注入层起对阴极修饰及将电子传输到电子传输层的作用;阴极中的电子会在器件外加驱动电压的驱动下向器件的发光层移动,然后在发光层与来自阳极的空穴进行再结合。

驴友花雕 发表于 2022-6-2 11:08:31

3、发光原理OLED器件的发光过程可分为:电子和空穴的注入、电子和空穴的传输、电子和空穴的再结合、激子的退激发光。具体为:
(1)电子和空穴的注入。处于阴极中的电子和阳极中的空穴在外加驱动电压的驱动下会向器件的发光层移动,在向器件发光层移动的过程中,若器件包含有电子注入层和空穴注入层,则电子和空穴首先需要克服阴极与电子注入层及阳极与空穴注入层之间的能级势垒,然后经由电子注入层和空穴注入层向器件的电子传输层和空穴传输层移动;电子注入层和空穴注入层可增大器件的效率和寿命。关于OLED器件电子注入的机制还在不断的研究当中,目前最常被使用的机制是穿隧效应和界面偶极机制。
(2)电子和空穴的传输。在外加驱动电压的驱动下,来自阴极的电子和阳极的空穴会分别移动到器件的电子传输层和空穴传输层,电子传输层和空穴传输层会分别将电子和空穴移动到器件发光层的界面处;与此同时,电子传输层和空穴传输层分别会将来自阳极的空穴和来自阴极的电子阻挡在器件发光层的界面处,使得器件发光层界面处的电子和空穴得以累积。
(3)电子和空穴的再结合。当器件发光层界面处的电子和空穴达到一定数目时,电子和空穴会进行再结合并在发光层产生激子。
(4)激子的退激发光。在发光层处产生的激子会使得器件发光层中的有机分子被活化,进而使得有机分子最外层的电子从基态跃迁到激发态,由于处于激发态的电子极其不稳定,其会向基态跃迁,在跃迁的过程中会有能量以光的形式被释放出来,进而实现了器件的发光。

驴友花雕 发表于 2022-6-2 11:09:49

4、OLED与LED\LCD对比
(1)相较于LED或LCD的晶体层,OLED的有机塑料层更薄、更轻而且更富于柔韧性。
(2)OLED的发光层比较轻,因此它的基层可使用富于柔韧性的材料,而不会使用刚性材料。OLED基层为塑料材质,而LED和LCD则使用玻璃基层。
(3)OLED比LED更亮,OLED有机层要比LED中与之对应的无机晶体层薄很多,因而OLED的导电层和发射层可以采用多层结构。此外,LED和LCD需要用玻璃作为支撑物,而玻璃会吸收一部分光线。OLED则无需使用玻璃。
(4)OLED并不需要采用LCD中的逆光系统。LCD工作时会选择性地阻挡某些逆光区域,从而让图像显现出来,而OLED则是靠自身发光。因为OLED不需逆光系统,所以它们的耗电量小于LCD(LCD所耗电量中的大部分用于逆光系统)。这一点对于靠电池供电的设备(例如移动电话)来说,尤其重要。
(5)OLED制造起来更加容易,还可制成较大的尺寸。OLED为塑胶材质,因此可以将其制作成大面积薄片状。而想要使用如此之多的晶体并把它们铺平,则要困难得多。
(6)OLED的视野范围很广,可达170度左右。而LCD工作时要阻挡光线,因而在某些角度上存在天然的观测障碍。OLED自身能够发光,所以视域范围也要宽很多。

驴友花雕 发表于 2022-6-2 11:11:11




驴友花雕 发表于 2022-6-2 11:12:27


驴友花雕 发表于 2022-6-2 11:13:52

5、OLED特点(1)功耗低——与LCD相比,OLED不需要背光源,而背光源在LCD中是比较耗能的一部分,所以OLED是比较节能的。例如,24in的AMOLED模块功耗仅仅为440mw,而24in的多晶硅LCD模块达到了605mw。
(2)响应速度快——OLED技术与其他技术相比,其响应速度快,响应时间可以达到微秒级别。较高的响应速度更好的实现了运动的图像。根据有关的数据分析,其响应速度达到了液晶显示器响应速度的1000倍左右。
(3)较宽的视角——与其他显示相比,由于OLED是主动发光的,所以在很大视角范围内画面是不会显示失真的。其上下,左右的视角宽度超过170度。
(4)能实现高分辨率显示——大多高分辨率的OLED显示采用的是有源矩阵也就是AMOLED,它的发光层可以是吸纳26万真彩色的高分辨率,并且随着科学技术的发展,其分辨率在以后会得到更高的提升。
(5)宽温度特性——与LCD相比,OLED可以在很大的温度范围内进行工作,根据有关的技术分析,温度在-40摄氏度到80摄氏度都是可以正常运行的。这样就可以降低地域限制,在极寒地带也可以正常使用。
(6)OLED能够实现软屏——OLED可以在塑料、树脂等不同的柔性衬底材料上进行生产,将有机层蒸镀或涂布在塑料基衬上,就可以实现软屏。
(7)OLED成品的质量比较轻——与其他产品相比,OLED的质量比较小,厚度与LCD相比是比较小的,其抗震系数较高,能够适应较大的加速度,振动等比较恶劣的环境。

驴友花雕 发表于 2022-6-2 19:39:15

二、0.96寸I2COLED液晶屏模块1、模块介绍驱动IC:SSD1306提供底层驱动技术支持军工级工艺标准,长期稳定工作128x64分辨率,显示效果清晰,对比度高0.96寸OLED屏,支持黑白、黑蓝或者黄蓝双色显示超大可视角度:大于160°(显示屏中可视角度最大的一种屏幕)宽电压供电(3V~5V),兼容3.3V和5V逻辑电平,无需电平转换芯片默认为4线制SPI总线,可以选择3线制SPI总线或者IIC总线超低功耗:正常显示仅为0.06W(远低于TFT显示屏)提供丰富的STM32、C51、Arduino、Raspberry Pi以及MSP430平台示例程序
有效面积:21.74 * 11.2mm /0.86*0.44英寸(约)完全兼容51系列,MSP430系列,STM32 / 2,CSR IC等面板尺寸:26.70 * 19.26 * 1.85mm / 1.03 * 0.76 * 0.07英寸(约)

驴友花雕 发表于 2022-6-2 19:41:48

2、外观规格

驴友花雕 发表于 2022-6-2 19:42:56

3、主要参数

驴友花雕 发表于 2022-6-2 19:43:57

4、模块电原理图

驴友花雕 发表于 2022-6-2 19:45:03


驴友花雕 发表于 2022-6-2 19:46:51

5、模块管脚图

驴友花雕 发表于 2022-6-2 19:48:16

0.96寸I2C OLED液晶屏模块的实验环境一、0.96寸I2C OLED液晶屏模块实验所需硬件清单光敏电阻模块X1DS1302时钟模块X1Arduino Uno开发板 X1杜邦线 若干(备了9条)HC-RS04超声波测距模块X1DHT11数字温湿度传感器模块X10.96寸I2C OLED液晶屏模块 X1Proto Shield 原型扩展板(带mini面包板)X1

驴友花雕 发表于 2022-6-2 19:49:22

二、传感器模块实验所需软件平台代码编程 Arduino IDE (版本1.8.19)仿真编程 Linkboy   (版本V4.6.3)图形编程 Mind+(版本 V1.7.0 RC2.0)以及编玩边学(线上平台https://ide.codepku.com/?type=Arduino)



三、搜索和安装“SSD1306”相关库1、打开Arduino IDE——工具——管理库,搜索SSD1306

驴友花雕 发表于 2022-6-2 19:50:36

2、打开网页https://github.com/,搜索SSD1306

驴友花雕 发表于 2022-6-2 19:51:37

3、打开Arduino IDE——工具——管理库,搜索U8glib

驴友花雕 发表于 2022-6-2 19:53:07

四、实验接线示意图

驴友花雕 发表于 2022-6-4 07:42:55

五、补充:0.96寸I2C OLED的二维坐标系


页: [1] 2 3 4 5
查看完整版本: 【Arduino】168种传感器模块系列实验(97)---0.96寸OLED液晶屏