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 UnoGND---------GND接地线VCC---------5V 接电源SDA---------A4SCL ------- 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 1void 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 400Khzif (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 UnoGND---------GND接地线VCC---------5V 接电源SDA---------D8SCL ------- 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 ij = 0; // missing linewhile (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 offsprintf(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++;}
#elsefor (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)
实验场景图