ESP8266开发学习笔记_OLED屏幕的IIC驱动

ESP8266 开发学习笔记_By_GYC 【OLED屏幕的IIC驱动】

在我之前的文章中简单介绍过oled的IIC驱动程序,包括SSD1306芯片手册的一些内容,并参考了Arduino大神的代码,将OLED在Arduino上的的驱动改写为了能够应用于ESP8266 RTOS SDK的C语言版本,并作为我的常用库使用。在发现ESP8266可以使用C++编程之后我决定将 ThingPulse 的OLED驱动库(c++版本)完整的进行移植,让我能够在SDK中也能够方便的使用。

最近我也在研究应用在stm32单片机的FreeRtos操作系统,所以本次OLED的驱动也考虑了在其他FreeRtos操作系统中的适配,可以方便的通过宏定义配置的方式,直接应用在支持FreeRtos操作系统的单片机上。

(目前库中仅支持ESP8266 IDF版本和STM32F103 FreeRTOS及 STM32F103 无操作系统版本。 如果使用其他系列单片机 通信协议还是需要自己修改的)。

适用范围

|—|
|ESP8266_RTOS_SDK V3.0  (ESP-IDF Style)|
|STM32F103裸机|
|STM32F103 FreeRtos操作系统版本|

user_config 用户配置
使用宏定义在“user_oled_config.h”中使用不同的使用方式

1
2
3
4
5
#define ESP8266_IDF // ESP-IDF支持 (默认启用FreeRtos支持)

#define STM32F103 // Stm32支持

#define USE_FreeRTOS // FreeRTOS支持

如果您不使用FreeRTOS操作系统,则需要自己覆盖millis()函数。

I2C使用方法
使用IIC方式驱动OLED屏幕的方式

1
2
3
#include "SSD1306I2C.hpp"

SSD1306I2C display(ADDRESS, SCL, SDA);

对于 esp8266-idf

1
SSD1306I2C display(0x3c,GPIO_NUM_5,GPIO_NUM_4);// OLED_Address SCL SDA

对于 stm32

1
SSD1306I2C  display(0x3c, GPIO_Pin_10, GPIO_Pin_11); //OLED_Address SCL SDA

API接口

显示控制

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
//初始化显示
void init();

//释放显示器使用的内存
void end();

//循环初始化
void resetDisplay(void);

//再次通过I2C连接到显示器
void reconnect(void);

//打开显示屏
void displayOn(void);

//关闭显示屏
void displayOff(void);

//清除本地像素缓冲区
void clearvoid);

//将缓冲区写入显示内存
void displayvoid);

//倒置显示模式
void invertDisplay(void);

//正常显示模式
void normalDisplay(void);

//设置显示对比度
//真正的低亮度和对比度:对比度= 10,预充电= 5,comdetect = 0
//正常亮度和对比度:对比度= 100
void setContrast(uint8_t contrast,uint8_t precharge = 241uint8_t comdetect = 64);

//访问的便捷方法
void setBrightness(uint8_t);

//翻转显示屏
void flipScreenVertically();

//绘制镜像的屏幕
void mirrorScreen();

像素绘图 

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
/ *绘图功能* /
//设置所有像素操作的颜色
void setColor(OLEDDISPLAY_COLOR color);

//在给定位置绘制一个像素
void setPixel(int16_t x,int16_t y);

//从位置0到位置1绘制一条线
void drawLine(int16_t x0,int16_t y0,int16_t x1,int16_t y1);

//在给定位置绘制矩形的边框
void drawRect(int16_t x,int16_t y,int16_t widthint16_t height);

//填充矩形
void fillRect(int16_t x,int16_t y,int16_t widthint16_t height);

//绘制圆的边框
void drawCircle(int16_t x,int16_t y,int16_t radius);

//填圈
void fillCircle(int16_t x,int16_t y,int16_t radius);

//水平画一条线
void drawHorizo​​ntalLine(int16_t x,int16_t y,int16_t length);

//垂直画一个林
void drawVerticalLine(int16_t x,int16_t y,int16_t length);

//绘制一个圆形进度条,其外部尺寸由宽度和高度给定。进步是
// 0到100之间的无符号字节值
void drawProgressBar(uint16_t x,uint16_t y,uint16_t widthuint16_t heightuint8_t progress);

//以内部图像格式绘制位图
void drawFastImage(int16_t x,int16_t y,int16_t widthint16_t heightconst uint8_t * image);

//画一个XBM
void drawXbm(int16_t x,int16_t y,int16_t widthint16_t heightconst char * xbm);

文字操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void drawString(int16_t x,int16_t y,String text);

//在给定位置绘制一个最大宽度的字符串。
//如果给定的String宽于指定的宽度
//文本将被包装到空格或短划线的下一行
void drawStringMaxWidth(int16_t x,int16_t y,int16_t maxLineWidth,String text);

//返回带有当前值的const char *的宽度
//字体设置
uint16_t getStringWidth(const char * textuint16_t length);

// const char版本的Convencience方法
uint16_t getStringWidth(String text);

//指定相对于哪个锚点
//文字被渲染。可用常数:
// TEXT_ALIGN_LEFT,TEXT_ALIGN_CENTER,TEXT_ALIGN_RIGHT,TEXT_ALIGN_CENTER_BOTH
void setTextAlignment(OLEDDISPLAY_TEXT_ALIGNMENT textAlignment);

//设置当前字体。可用的默认字体
// ArialMT_Plain_10,ArialMT_Plain_16,ArialMT_Plain_24
//或者使用http://oleddisplay.squix.ch上的字体工具创建一个
void setFont(const uint8_t * fontData);

由于这个库本身是由 ThingPulse 开发而来,我再此就不做过多的说明,功能研究请移步 ThingPulse 网站,我仅将移植好的原代码放在我的github仓库中(https://github.com/gengyuchao/oled_ssd1306) 如果有需要可以自己下载研究,有任何问题欢迎与我交流讨论。我会把以后遇到的问题在博客中进行补充说明。

Comments

:D 一言句子获取中...

Loading...Wait a Minute!