【雕爷学编程】Arduino动手做(187)---1.3寸OLED液晶屏模块5

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百八十七:1.3寸OLED液晶屏 I2C IIC通信 4针模块 1106/1306驱动 128*64像素

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
实验场景图

在这里插入图片描述

在这里插入图片描述
【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
实验一百八十一:1.3寸OLED液晶屏 I2C IIC通信 4针模块 1106/1306驱动 132*64像素
项目之八:用于 AVR 平台的小型简单 OLED 库演示,不带画线功能(节省1K RAM)

实验开源代码

/*
  【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
  实验一百八十一:1.3寸OLED液晶屏 I2C IIC通信 4针模块 1106/1306驱动 132*64像素
  项目之八:用于 AVR 平台的小型简单 OLED 库演示,不带画线功能(节省1K RAM)
  实验接线:
  oled模块    Ardunio Uno
  GND---------GND接地线
  VCC---------5V 接电源
  SDA---------A4
  SCL ------- A5
*/

#include <ss_oled.h>

SSOLED ssoled;
#define SDA_PIN -1
#define SCL_PIN -1
// no reset pin needed
#define RESET_PIN -1
// let ss_oled find the address of our display
#define OLED_ADDR -1
#define FLIP180 0
#define INVERT 0
// Use the default Wire library
#define USE_HW_I2C 1

void setup(){
    
    
    int rc;
    rc = oledInit(&ssoled, OLED_128x64, OLED_ADDR, FLIP180, INVERT, USE_HW_I2C, SDA_PIN, SCL_PIN, RESET_PIN, 400000L);       // Standard HW I2C bus at 400Khz

    if (rc != OLED_NOT_FOUND)
    {
    
    
        char *msgs[] =
        {
    
    
          (char *)"SSD1306 @ 0x3C",
          (char *)"SSD1306 @ 0x3D",
          (char *)"SH1106 @ 0x3C",
          (char *)"SH1106 @ 0x3D"
        };

        oledFill(&ssoled, 0, 1);
        oledWriteString(&ssoled, 0, 0, 0, (char *)"OLED found:", FONT_NORMAL, 0, 1);
        oledWriteString(&ssoled, 0, 10, 2, msgs[rc], FONT_NORMAL, 0, 1);
        delay(3000);
    }
}

void loop(){
    
    
    int i, x, y;

    oledFill(&ssoled, 0, 1);
    oledWriteString(&ssoled, 0, 16, 0,(char *)"ss_oled Demo", FONT_NORMAL, 0, 1);
    oledWriteString(&ssoled, 0, 0, 1,(char *)"Written by Larry Bank", FONT_SMALL, 1, 1);
    oledWriteString(&ssoled, 0, 0, 3,(char *)"**Demo**", FONT_STRETCHED, 0, 1);
    oledWriteString(&ssoled, 0, 9, 6,(char *)"for AVR", FONT_STRETCHED, 0, 1);

    delay(2000);
    oledFill(&ssoled, 0, 1);

    for (i = 0; i < 1000; i++)
    {
    
    
        x = random(128);
        y = random(64);
        oledSetPixel(&ssoled, x, y, 1, 1);
    }

    delay(2000);
}

实验场景图

在这里插入图片描述
【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
实验一百八十一:1.3寸OLED液晶屏 I2C IIC通信 4针模块 1106/1306驱动 132*64像素
项目之九:五种字体换行测试

实验开源代码

/*
  【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
  实验一百八十一:1.3寸OLED液晶屏 I2C IIC通信 4针模块 1106/1306驱动 132*64像素
  项目之九:五种字体换行测试
  实验接线:
  oled模块    Ardunio Uno
  GND---------GND接地线
  VCC---------5V 接电源
  SDA---------D8
  SCL ------- D9
*/

#include <ss_oled.h>

// Arduino Pro Mini
// Pin 8 (0xb0 = PORTB, bit 0)
// Pin 9 (0xb1 = PORTB, bit 1)
#define SDA_PIN 0xb0
#define SCL_PIN 0xb1
#define RESET_PIN -1
int rc;
SSOLED oled;
void setup() {
    
    
uint8_t uc[8];
    
  rc = oledInit(&oled, OLED_128x64, 0x3c, 0, 0, 0, SDA_PIN, SCL_PIN, RESET_PIN, 1000000L);
  if (rc != OLED_NOT_FOUND)
  {
    
     
    oledFill(&oled, 0,1);
    oledSetContrast(&oled, 127);
    oledWriteString(&oled, 0,0,0,(char *)"**************** ", FONT_8x8, 0, 1);
    oledWriteString(&oled, 0,4,1,(char *)"BitBank SS_OLED", FONT_8x8, 0, 1);
    oledWriteString(&oled, 0,8,2,(char *)"running on the", FONT_8x8, 0, 1);
    oledWriteString(&oled, 0,8,3,(char *)"SSD1306 128x64", FONT_8x8, 0, 1);
    oledWriteString(&oled, 0,4,4,(char *)"monochrome OLED", FONT_8x8, 0, 1);
    oledWriteString(&oled, 0,24,5,(char *)"Written By", FONT_8x8, 0, 1);
    oledWriteString(&oled, 0,24,6,(char *)"Larry Bank", FONT_8x8, 0, 1);
    oledWriteString(&oled, 0,0,7,(char *)"**************** ", FONT_8x8, 0, 1);
    delay(4000);
  }
}

void loop() {
    
    
int i, j;
char szTemp[32];

  oledFill(&oled, 0,1);
  oledWriteString(&oled, 0,0,0,(char *)"Now with 5 font sizes", FONT_6x8, 0, 1);
  oledWriteString(&oled, 0,0,1,(char *)"6x8 8x8 16x16", FONT_8x8, 0, 1);
  oledWriteString(&oled, 0,0,2,(char *)"16x32 and a new", FONT_8x8, 0, 1);
  oledWriteString(&oled, 0,0,3,(char *)"Stretched", FONT_12x16, 0, 1);
  oledWriteString(&oled, 0,0,5,(char *)"from 6x8", FONT_12x16, 0, 1);
  delay(10000);
  
  oledFill(&oled, 0, 1);
  oledSetTextWrap(&oled, 1);
  oledWriteString(&oled, 0,-1,-1,"This is a test of text wrap", FONT_6x8, 0, 1);
  delay(3000);
  oledFill(&oled, 0,1);
//  oledSetTextWrap(0);
  oledWriteString(&oled, 0,-1,-1,"This ", FONT_16x16, 0, 1);
  oledWriteString(&oled, 0,-1,-1,"is a ", FONT_16x16, 0, 1);
  oledWriteString(&oled, 0,-1,-1,"test of text wrap", FONT_16x16, 0, 1);
  delay(3000);
  oledFill(&oled, 0,1);
  oledSetCursor(&oled, 40,4);
  oledWriteString(&oled, 0,-1,-1,"Middle", FONT_6x8,0,1);
  delay(3000);
  if (rc >= OLED_SH1106_3C)          // We can set pixels on the SH1106 without a back buffer
  {
    
    
    int x, y;
    for (i=0; i<2500; i++)
    {
    
    
      x = random(128);
      y = random(64);
       oledSetPixel(&oled, x, y, 1, 1);
    }
    delay(2000);
  }
#ifndef __AVR__

  for (i=0; i<8; i++)
  {
    
    
    sprintf(szTemp, "Line %d", i);
    oledWriteString(&oled, 0,0,i,szTemp, FONT_8x8, 0, 0);
    oledWriteString(&oled, 0,64,i,szTemp, FONT_8x8, 0, 0);
  } // for i
  j = 0; // missing line
  while (1)
  {
    
    
    for (i=0; i<8; i++) // smooth scroll 8 lines
    {
    
    
//void oledScrollBuffer(int iStartCol, int iEndCol, int iStartRow, int iEndRow, int bUp);
      oledScrollBuffer(&oled, 0,63,0,7,1);
      oledScrollBuffer(&oled, 64,127,0,7,0);
      oledDumpBuffer(&oled, NULL);
//void oledDrawGFX(uint8_t *pSrc, int iSrcCol, int iSrcRow, int iDestCol, int iDestRow, int iWidth, int iHeight, int iSrcPitch);
//      oledDrawGFX(NULL, 0, 0, 0, 0, 64, 7, 0); // left half
//      oledDrawGFX(NULL, 64, 1, 64, 0, 64, 7, 0); // right half 
      delay(40);
    }
    // fill in the missing line which scrolls off
    sprintf(szTemp, "Line %d", j & 7);
    oledWriteString(&oled, 0,0,7,szTemp, FONT_NORMAL, 0, 0);
    sprintf(szTemp, "Line %d", 7-(j & 7));
    oledWriteString(&oled, 0,64,0,szTemp, FONT_NORMAL, 0, 0);
    j++;
  }
#else
  for (i=0; i<256; i++)
  {
    
    
    oledWriteString(&oled, i, 0,0,(char *)"This is a scrolling text demo showing how a long string can be displayed ", FONT_NORMAL, 0, 1);
  }
#endif // __AVR__
} // loop

实验场景图

在这里插入图片描述

实验场景图 动态图

在这里插入图片描述

ss_oled库的特点:

支持任意数量的任意类型的同时显示(混合和匹配)
可选择检测显示地址和类型(仅限 I2C)
支持 72x40、96x16、64x32、128x32、128x64、128x128 (SH1107) 和 132x64 (SH1106) 显示尺寸
从 I2C、SPI 或任何 2 个 GPIO 引脚(虚拟 I2C)驱动显示
5 种大小的固定字体(6x8、8x8、12x16、16x16、16x32)
延迟渲染允许准备一个后台缓冲区,然后显示它(通常更快)
文本滚动功能(垂直和水平)
带有可选换行的文本光标位置
加载 Windows BMP 文件的函数
在 SH1106/7 上进行像素绘图,无需后备 RAM
优化的 Bresenham 线图
优化 Bresenham 轮廓和填充椭圆绘制
优化轮廓和填充矩形绘制
可选的后备 RAM,用于为具有足够 RAM 的系统绘制像素
以任何角度绘制 16x16 平铺/精灵图。
使用简单的 API 以高帧率运行全帧动画
轻到可以在 ATtiny85 上运行

此代码取决于 BitBang_I2C 库。你可以在这里下载:https :
//github.com/bitbank2/BitBang_I2C

使用说明:

首先初始化库。使用硬件 I2C、位碰撞 I2C 或 SPI 与显示器对话。对于 I2C,将自动检测显示器的地址(0x3c 或 0x3d)。典型的 MCU 只允许将 I2C 速度设置为 400Khz,但 SSD1306 显示器可以处理更快的信号。使用 bit-bang 代码,您通常可以指定稳定的 800Khz 时钟,并且使用 Cortex-M0 目标,可以告诉硬件 I2C 几乎是任何速度,但我测试过的显示器往往会在超过 1.6Mhz 时停止工作。初始化显示器后,您可以开始在其上绘制文本或图形。所有绘图函数的最后一个参数是渲染标志。当为真时,图形将被发送到内部后备缓冲区(如果可用)并发送到显示器。您可以选择使用 oledSetBackBuffer() 函数向库传递一个后备缓冲区(如果您的 MCU 有足够的 RAM)。当渲染标志为假时,图形只会被绘制到内部缓冲区中。一旦您准备好将像素发送到显示器,请调用 oledDumpBuffer(NULL),它将整个内部缓冲区复制到显示器。文本绘制功能现在有一个滚动偏移参数。这告诉它在给定的目标坐标处绘制文本之前要跳过多少文本像素。例如,如果为滚动偏移传递值 20 并使用 8 像素宽字体 (FONT_NORMAL),则不会绘制前两个半字符;第三个和后续字符的后半部分将从您指定的 x/y 开始绘制。

【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
实验一百八十一:1.3寸OLED液晶屏 I2C IIC通信 4针模块 1106/1306驱动 132*64像素
项目之十:循环自动计数

实验开源仿真编程(Linkboy V4.62)

在这里插入图片描述
实验场景图

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41659040/article/details/132129540