先放上ESP32-WROOM32的引脚图
引脚资源还是挺丰富的,性能也很可以:ESP32-WROOM-32D(或32U)模组内置ESP32-D0WD双核芯 片,40MHz晶振,32Mbit 3.3V flash 和板载天线。
Arduino IDE下载的第三方库在portable/sketchbook/libraries里
学习过程中主要参考了b站和csdn的两位大佬的教程!感谢!
Naisu的各种笔记_Naisu Xu_CSDN博客-ESP32相关,ESP8266相关,STM32相关领域博主
(3条消息) 【Arduino】一天入门Arduino语言 教程_Z小旋-CSDN博客_arduino编程
Vscode arduino环境配置:
https://blog.csdn.net/qq_30267617/article/details/108266867
第零章 ESP32概述与入门
第一章 环境搭建与Arduino的简单介绍
环境搭建先水了。。。放上资源,直接下载就能用(包含win和mac的,732M的是win版本)
https://pan.baidu.com/s/15cX87HvAJXeW6Ka-_xaQXA 提取码:1234
Arduino语言:
通常我们说的Arduino语言,是指Arduino核心库文件提供的各种应用程序编程接口(Application Programming Interface,简称API)的集合。这些API是对更底层的单片机支持库进行二次封装所形成的。例如,使用AVR单片机的Arduino的核心库是对AVR-Libc(基于GCC的AVR支持库)的二次封装。
Arduino的代码结构:
1.Arduino程序中没有main函数,main函数隐藏在Arduino的核心库文件中,开发时一般不直接操作。
2.Arduino代码结构中有两个主要函数
setup() 初始化变量、引脚模式、调用库函数等
loop() 连续循环执行loop函数内的程序
Arduino 数学函数
Arduino数学库(math.h)包含了许多用于操作浮点数的有用的数学函数
min (x, y) | 求最小值,传回较小者的值 |
max (x, y) | 求最大值,传回较大者的值 |
abs (x) | 计算绝对值,回传该数的绝对值 |
constrain (x, a, b) | …….. |
第二章 系统时间和定时任务调度器Ticker
学习视频:Arduino ESP32视频教程3-Ticker定时器_哔哩哔哩_bilibili
学习文章:(3条消息) 使用Arduino开发ESP32(07):系统时间和定时任务调度器Ticker_Naisu的各种笔记-CSDN博客
这两个功能主要用来为程序设计提供便利性,在多任务应用开发中协调各项任务运行
系统时间
unsigned long micros(); | //返回微秒为单位系统时间(运行当前程序时的微秒数) |
unsigned long millis(); | //返回毫秒为单位系统时间(运行当前程序时的毫秒数) |
void delay(uint32_t); | //设置毫秒级延时 |
void delayMicroseconds(uint32_t us); | //设置微秒级延时 |
定时任务调度器Ticker
使用步骤;
①引入头文件 #include <Ticker.h> //调用Ticker.h库;
②建立Ticker对象; //Ticker ticker1;
③编写回调函数(这个回调函数不推荐进行耗时操作);
④设置调度时间间隔并启用调度任务;
方法
1.detach() 停止Ticker;
2.active() 查询Ticker是否处于激活状态,返bool型值,返回true则处于激活状态,否则未激活;
3.onec方法
①void once(float seconds,callback_function_t callback);
功能:多少秒后只执行一次
两个参数:经过“float seconds”秒后调用回调函数callback_function_t callback
②void once(float seconds, void(*callback)(TArg),TArg arg);
功能:多少秒后只执行一次
三个参数:float seconds秒数,callback回调函数,arg回调函数的参数
③void once_ms(float seconds,callback_function_t callback)
功能:多少毫秒后只执行一次
两个参数:param seconds 秒数,param callback 回调函数
④void once_ms(uint_32_t milliseconds, void(*callback)(TArg),TArg arg);
功能:多少毫秒后只执行一次
三个参数:uint_32_t milliseconds毫秒数,callback回调函数,arg 回调函数的参数
4.attach方法
①void attach(float seconds, callback_function_t callback);
功能:每隔多少秒周期性执行
两个参数:seconds 秒数, 、param callback 回调函数
②void attach(float seconds, void(*callback)(TArg),TArg arg)
功能:每隔多少秒周期性执行
三个参数:float seconds秒数,callback回调函数,arg回调函数的参数
③void attach_ms(float seconds, callback_function_t callback);
功能:每隔多少毫秒周期性执行
两个参数:seconds 秒数, 、param callback 回调函数
④void attach_ms(uint_32_t milliseconds, void(*callback)(TArg),TArg arg)
功能:每隔多少毫秒周期性执行
三个参数:uint_32_t milliseconds毫秒数,callback回调函
数,arg 回调函数的参数
使用示例:
![]() | |||
![]() | |||
第三章 串口(Serial port)
①ESP32有3个串口:Serial、Serial1、Serial2
②Arduino core for ESP32和Arduino原版的串口有差异,无法完全套用
③Serial、Serial1、Serial2是在HardwareSerial.h中被声明的HardwareSerial对象
④ 串口下载程序只能通过串口0!!!
普通使用方法
Serial. begin( ) | 括号内填设定的波特率 |
Arduino 的输出基本就用两个函数 print 和 println,区别在于后者比前者多了回车换行
Serial.println( “data” ) | 从串行端口输出数据,跟随一个回车(ASCII 13, 或 'r')和一个换行符(ASCII 10, 或 'n')。这个函数所取得的值与 Serial.print()一样。 |
Serial.println(b) | 以十进制形式输出b的ASCII编码值,并同时跟随一个回车和换行符。 |
Serial.println(b, DEC) | 以十进制形式输出b的ASCII编码值,并同时跟随一个回车和换行符。 |
Serial.println(b, HEX) | 以十六进数据形式输出b的ASCII编码值,并同时跟随一个回车和换行符。 |
Serial.println(b, OCT) | 以八进数据形式输出b的ASCII编码值,并同时跟随一个回车和换行符。 |
Serial.println(b, BIN) | 以二进数据形式输出b的ASCII编码值,并同时跟随一个回车和换行符。 |
Serial.print(b, BYTE) | 以单个字节输出b,并同时跟随一个回车和换行符。 |
Serial.println(str) | 如果 str是一个字符串或数组,输出整个 str的 ASCII编码字符串。 |
Serial.println() | 仅输出一个回车和换行符。 |
(b:需要输出的字节;str:需要输出的字符串)
使用中的问题
使用Serial1(U1TXD=GPIO10,U1RXD=GPIO9)时程序无法正常运行。
原因:由乐鑫官方的技术规格书可知,Serial1默认使用GPIO9、10,而ESP32的GPIO6~11一般用于连接外部Flash芯片也就是ESP32储存程序的地方
导致程序崩溃。
解决方法:ESP32片上功能模组所发出的信号可映射到任何GPIO引脚,使用HardwareSerial.h库便可将串口RX映射到几乎所有IO口上,
TX映射到GPIO0~13上(可能)。
使用HardwareSerial库需要先声明一个对象,例如HardwareSerial mySerial1(1);
HardwareSerial类在声明对象时接收一个输入参数(0、1、2),分别代表Serial、Serial1、Serial2
声明对象后就可以按
一般串口的方法使用了,方法说明如下:
使能串口
void begin( unsigned long baud, uint32_t config=SERIAL_8N1, int8_t rxPin=-1, int8_t txPin=-1, bool invert=false, unsigned long timeout_ms = 20000UL);
例:mySerial1. Begin (115200, SERIAL_8N1 ,5 , 18); //开启mySerial1,波特率为115200,8数据位、无校验、1停止位,RX-Pin5,TX-Pin18。
参数如下:
baud | 串口波特率,该值写0则会进入自动侦测波特率程序; |
config | 串口参数,默认SERIAL_8N1为8位数据位、无校验、1位停止位; |
rxPin | 接收管脚针脚号 |
txPin | 发送管脚针脚号 |
invert | 翻转逻辑电平,串口默认高电平为1、低电平为0(true\fales) |
timeout_ms | 自动侦测波特率超时时间,如果超过该时间还未获得波特率就不会使能串口 |
其他串口功能
void end(); | 失能串口,释放资源 |
void updateBaudRate (unsigned long baud); | 重新设置波特率 |
int available (void); | 返回接收缓存可读取字节数 |
int availableForWrite (void); | ESP32默认有128字节的硬件TX FIFO,该方法返回TX FIFO空闲字节数 |
int peek (void); | 返回接收缓存中第一个字节数据,但并不从中删除它 |
int read (void); | 返回接收缓存中第一个字节数据,读取过的数据将从接收缓存中清除 |
void flush (void); | 等待串口收发完毕 |
size_t write (uint8_t); | 写数据到TX FIFO,在发送FIFO中的数据会自动输出到TX端口上。该方法有很多重载,可以用来发送字符串、长整型、整形。如果TX FIFO已满,则该方法将阻塞 |
size_t write (const uint8_t *buffer, size_t size); | 写数据到TX FIFO,如果发送FIFO已满,则该方法将阻塞 |
uint32_t baudRate (); | 返回当前串口波特率 |
size_t setRxBufferSize (size_t); | 设置接收缓存大小(默认为256字节) ESP32默认有128字节的硬件RX FIFO,在RX FIFO收到数据后会移送到上面的接收缓存中 |
void setDebugOutput (bool); | 设置该串口打印Debug信息(默认为0,失能后也会置为0);这个方法是用来设置从哪个串口打印的,需要在Arduino IDE>工具中启用Debug才会真正打印信息;(这里有一点点问题,这个库里如果没有别的串口用于打印调试信息,则Serial,即uart0一定会被用于打印调试信息,并且至少会打印Error信息) |
第四章 IO口与相关外设(io、pwm、iic、spi、can等)
一. 数字IO口
基本使用:
pinMode (pin, mode); | 设置GPIO的工作模式,mode可填INPUT / OUTPUT / INPUT_PULLUP / INPUT_PULLDOWN 等。具体能否设置对应模式还得参考技术规格书。一般GPIO0~33都可设置为输入输出。不推荐使用GPIO6~11,因为接了存程序的flash,可能会导致程序崩溃。 |
digitalWrite (pin, value); | 设置输出状态,valuve设置为 High 或 Low,即 1 或 0 |
digitalRead (pin); | 读取GPIO口电平,返回值为 High 或Low ,即 1 或 0 |
注意!!!:IO12上电时的电平会决定存放程序的Flash的工作电压,若上电时IO12为高电平则该Flash工作电压为1.8V,为低电平则工作于3.3V。上拉可能会导致模块工作异常
二. 外部中断
基本使用:
attachInterrupt (uint8_t pin, void (*)(void), int mode) 或 attachInterruptArg(uint8_t pin, void (*)(void*), void * arg, int mode) | 设置外部中断,输入参数有gpio号、中断触发时的回调函数、回调函数输入参数、外部中断触发模式 (RISING、FALLING、CHANGE……上升沿、下降沿、改变时、低电平、高电平等) |
detachInterrupt(uint8_t pin) | 关闭外部中断 |
示例:
三. LEDC(PWM)
ESP32没有一般Arduino中用来输出PWM的analogWrite (pin, value)的方法,而是有一个LEDC设计用来控制LED,也可以用于输出PWM。
ESP32的LEDC有16个通道(0~15),分为高速通道(0~7)由80MHz时钟驱动,低速通道(8~15)由1MHz时钟驱动
基本使用:
double ledcSetup(uint8_t channel, double freq, uint8_t resolution_bits) | 设置LEDC通道对应的频率和计数位数(占空比分辨率) channel为通道号,取值0 ~ 15; freq期望设置频率; resolution_bits计数位数,取值0 ~ 20(该值决定后面ledcWrite方法中占空比可写值,比如该值写10,则占空比最大可写1023 即 (1<<resolution_bits)-1 ); 通道最终频率 = 时钟 / ( 分频系数 * ( 1 << 计数位数 ) );(分频系数最大为1024) 该方法返回最终频率 |
void ledcWrite(uint8_t channel, uint32_t duty) | 指定通道输出一定占空比波形 |
double ledcWriteTone(uint8_t channel, double freq) | 类似于arduino的tone,当外接无源蜂鸣器的时候可以发出某个声音(根据频率不同而不同) |
double ledcWriteNote(uint8_t channel, note_t note, uint8_t octave) | 该方法是上面方法的进一步封装,可以直接输出指定调式和音阶声音的信号,参数如下: note:调式,相当于do、re、mi、fa……这些,取值为NOTE_C, NOTE_Cs, NOTE_D, NOTE_Eb, NOTE_E, NOTE_F, NOTE_Fs, NOTE_G, NOTE_Gs, NOTE_A, NOTE_Bb, NOTE_B octave音阶,取值0~7 |
uint32_t ledcRead(uint8_t channel) | 返回指定通道占空比的值 |
double ledcReadFreq(uint8_t channel) | 返回指定通道当前频率(如果当前占空比为0 则该方法返回0); |
void ledcAttachPin(uint8_t pin, uint8_t channel) | 将LEDC通道绑定到指定IO口上以实现输出; |
void ledcDetachPin(uint8_t pin) | 解除IO口的LEDC功能; |
第五章 IIC总线
一开始使用wire库有个疑惑:wire.begin(),嗯,使用哪个引脚呢?
找半天没找到。。。。很折磨,具体看这篇文章(4条消息) esp32 在arduino1.8下的I2C引脚_xatsoft的博客-CSDN博客_esp32 i2c引脚
答案:默认sda 21,scl22
要分清主机和从机的关系
主机对从机发送信号时,发送完一个字节就进入检测模式,将sda和sdk置1,不断检测sda的电平,检测到sda拉低后就说明从机(接收方)收到信号并作出应答(ack)
应答信号:
ack应答 nack不应答
凡是接收方、发送方都要给一个应答位,发送方只有接收到应答位才继续发送(就像我叫你你不回应我就不再和你说话了)
主机在作为接收方时可以控制是否继续接收,接收最后一个字节时可以不用应答
写应答:在主机读从机数据期间,接收到一个数据时,想继续通信就将sda复位(拉高),不想通信了,就将sda置位()置1,
读应答:主机写数据给从机期间,从机接收到一个数据就会应答一下(拉低sda)
Arduino Wire.h(IIC)库函数详解 - 纪伟 - 博客园 (cnblogs.com)
(4条消息) 【arduino库文件】-wire.h_acktomas的博客-CSDN博客
(4条消息) 玩转 ESP32 + Arduino (六) 硬件定时器, IIC, SPI_finedayforu的博客-CSDN博客
7位寻址:
在stm32中使用的模拟iic代码中,读取时发送的地址是高7位加上一个方向位(标明这个动作是读取还是写入)
但在wire库中不需要这样,address直接填7位地址就可以!方向位会自动添加,坑啊
还是要看wire库的example
第六章 SPI
(4条消息) 玩转 ESP32 + Arduino (六) 硬件定时器, IIC, SPI_finedayforu的博客-CSDN博客
ESP32有四个SPI外设,分别为SPI0、SPI1、HSPI和VSPI
SPI0:专用于Flash的缓存,ESP32将连接的SPI Flash设备映射到内存中
SPI1和SPI0使用相同的硬件线,SPI1专用于写入Flash芯片
HSPI和VSPI可以任意使用
SPI1、HSPI和VSPI共有三条片选线,因此作为SPI主机允许ESP32至多驱动三个SPI设备
下表为HSPI和VSPI的接口及引脚
SPI名 | MOSI | MISO | SCLK | SS |
VSPI | 23 | 19 | 18 | 5 |
HSPI | 13 | 12 | 14 | 15 |
SPI通讯流程:
第七章 U8g2库
学习参考(3条消息) 深入学习Arduino u8g2 OLED库,一篇就够_单片机菜鸟哥的博客-CSDN博客_u8g2
OLED:
下图为由SSD1306芯片驱动的0.96寸oled屏,像素为128x46
这样一个oled屏可看作128x64的像素点阵,显示的图像其实就是一个个像素点连起来
建立如图所示坐标系(X轴为0~127/Y轴为0~63)得出要点亮的像素点坐标
U8g2简介:
是嵌入式设备的单色图形库,基本上支持所有主流显示器(参考选择屏幕 (arduino.cn))
基本上支持所有Arduino API的主板
在Arduino IDE库管理器搜索“U8g2”下载安装
函数详解:
1.基本函数
2.绘制相关函数
3.显示配置相关函数
4.缓存相关函数
5. U8g2绘制模式
1.基本函数
u8g2.begin() | 初始化U8g2库:初始化显示器、重置清屏、唤醒屏幕 |
u8g2.beginSimple() | 简单初始化U8g2库:初始化显示器 |
u8g2.initDisplay() | 初始化显示控制器,注意:①不需要单独调用,会在begin函数主动调用一次,会在里面针对具体的oled进行配置 |
u8g2.clearDisplay() | 清除屏幕内容,注意:①不需要单独调用,会在begin函数主动调用一次,理解即可 ②不要在firstPage和nextPage函数之间调用 |
u8g2.setPowerSave() | 省电模式:1启动省电模式,0禁用省电模式;省电模式仅仅是关闭屏幕,显示器需要的内存消耗依旧存在 |
u8g2.clear() | 清除屏幕显示,清除缓冲区,光标回到原点 |
u8g2.clearBuffer() | 清除缓冲区,注意:一般这个函数与sendBuffer函数配对使用,如下图 |
u8g2.disableUTF8Print() | 禁用UTF8打印,Arduino平台下默认开启支持输出UTF8字符集 |
u8g2.enableUTF8Print() | 启用UTF8打印,中文字符就是UTF8!启用之后可以显示中文 |
u8g2.home() | 重置光标位置,回到原点 |
2.绘制相关函数
u8g2.drawBox() | 画实心方形(左上角X坐标,左上角Y坐标,方形宽度,方形高度)例:u8g2.drawBox(3,7,25,15); |
u8g2.drawCircle() | 画空心圆: void U8G2::drawCircle(u8g2_uint_t x0, u8g2_uint_t y0, u8g2_uint_t rad, uint8_t opt = U8G2_DRAW_ALL) 坐标:x0,y0 半径:rad 直径为2rad+1 opt圆形选项: U8G2_DRAW_ALL 整个圆 U8G2_DRAW_UPPER_RIGHT 右上部分的圆弧 U8G2_DRAW_UPPER_LEFT 左上部分的圆弧 U8G2_DRAW_LOWER_LEFT 左下部分的圆弧 U8G2_DRAW_LOWER_RIGHT 右下部分的圆弧 * 选项可以通过 | 操作符来组合 |
u8g2.drawDisc() | 画实心圆: 坐标:x0,y0 半径:rad 圆形选项: U8G2_DRAW_ALL 整个圆 U8G2_DRAW_UPPER_RIGHT 右上部分的圆弧 U8G2_DRAW_UPPER_LEFT 左上部分的圆弧 U8G2_DRAW_LOWER_LEFT 左下部分的圆弧 U8G2_DRAW_LOWER_RIGHT 右下部分的圆弧 * 选项可以通过 | 操作符来组合 |
u8g2.drawEllipse() | 画空心椭圆: void U8G2::drawEllipse(u8g2_uint_t x0, u8g2_uint_t y0, u8g2_uint_t rx, u8g2_uint_t ry, uint8_t opt) 圆点坐标:x0,y0 椭圆X方向半径,Y方向半径:rx,ry
opt圆形选项: U8G2_DRAW_ALL 整个圆 U8G2_DRAW_UPPER_RIGHT 右上部分的圆弧 U8G2_DRAW_UPPER_LEFT 左上部分的圆弧 U8G2_DRAW_LOWER_LEFT 左下部分的圆弧 U8G2_DRAW_LOWER_RIGHT 右下部分的圆弧 * 选项可以通过 | 操作符来组合 注意:rx*ry在8位模式的u8g2必须小于512 |
u8g2.drawFilledEllipse() | 画实心椭圆:参考上面 |
u8g2.drawFrame() | 画空心方形:(左上角X坐标,左上角Y坐标,方形宽度,方形高度) u8g2.drawFrame(3,7,25,15); |
u8g2.drawGlyph() | 绘制字体字集的符号:左上角坐标 x,y 字符的unicode值关联方法setFont void U8G2::drawGlyph(u8g2_uint_t x, u8g2_uint_t y, uint16_t encoding) 注意点:
|
u8g2.drawHLine() | 绘制水平线:左上角坐标x,y 水平线长度w void U8G2::drawHLine(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w) |
u8g2.drawLine() | 两点之间绘制线:从坐标x0,y0 到 x1,y1 void U8G2::drawLine(u8g2_uint_t x0, u8g2_uint_t y0, u8g2_uint_t x1, u8g2_uint_t y1) |
u8g2.drawPixel() | 绘制像素点:坐标x,y 很多绘制方法的底层都是调用drawPixel void U8G2::drawPixel(u8g2_uint_t x, u8g2_uint_t y) |
u8g2.drawRBox() | 绘制圆角实心正方形:左上角坐标x,y 宽度w 高度h 圆角半径r 要求,w >= 2*(r+1) 并且 h >= 2*(r+1),这是显而易见的限制 void U8G2::drawRBox(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h, u8g2_uint_t r) |
u8g2.drawRFrame() | 和上面那个差不多👆 void U8G2::drawRFrame(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h, u8g2_uint_t r) |
u8g2.drawStr() | 绘制字符串:左下角坐标x,y s绘制字符串的内容 注意点:
u8g2_uint_t U8g2::drawStr(u8g2_uint_t x, u8g2_uint_t y, const char *s) |
u8g2.drawTriangle() | 绘制实心三角形:三点坐标:x0,y0 x1,y1 x2,y2 |
u8g2.drawUTF8() | 绘制UTF8编码的字符:字符左下角坐标x,y 需要绘制的UTF8编码字符串s 注意点: ①你的编译器需要支持UTF-8编码,对于绝大部分Arduino板子已经支持;其次,显示的字符串需要存为“UTF-8”编码,Arduino IDE上默认支持; ②该方法需要依赖于fontMode(setFont)以及drawing Color,也就是说如果你传进来的字符串编码必须在font定义里面; u8g2.setFont(u8g2_font_unifont_t_symbols); u8g2.drawUTF8(5, 20, "Snowman: ☃"); |
u8g2.drawVLine() | 绘制竖直线:左上坐标x,y 高度h void U8G2::drawVLine(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t h) |
u8g2.drawXBM() u8g2.drawXBMP() | 绘制图像:左上坐标x,y 图形宽度w 图形高度h 图形内容bitmap drawXBM和drawXBMP区别在于 XBMP支持PROGMEM void U8G2::drawXBM(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h, const uint8_t *bitmap) void U8G2::drawXBMP(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h, const uint8_t *bitmap) |
u8g2.print() | 绘制内容: u8g2.setFont(u8g2_font_ncenB14_tr); //enableUTF8Print u8g2.setCursor(0, 15); //左下角坐标 u8g2.print("Hello World!"); |
u8g2.sendBuffer() | 绘制缓冲区内容:sendBuffer的RAM占用空间大,需要结合构造器的buffer选项使用 void loop(void) { u8g2.clearBuffer(); // ... write something to the buffer u8g2.sendBuffer(); delay(1000); |
u8g2.firstPage() u8g2.nextPage() | 绘制命令: void U8G2::firstPage(void) / uint8_t U8G2::nextPage(void) 注意:①firstPage方法会把当前页码位置变为0 ②修改内容处于firstPage和nextPage之间,每次都是重新渲染所有内容 ③该方法消耗的ram空间比sendBuffer消耗的少 示例: u8g2.firstPage(); do { /* all graphics commands have to appear within the loop body. */ u8g2.setFont(u8g2_font_ncenB14_tr); u8g2.drawStr(0,20,"Hello World!"); } while ( u8g2.nextPage() ); |
3.显示配置相关函数
u8g2.getAscent() | 获取字体基准线以上的高度:与字体有关(setFont),返回从字体基准线到最高点的高度值 |
u8g2.getDescent() | 获取字体基准线以下的高度:是负值 |
u8g2.getDisplayHeight() | 获取显示器高度 |
u8g2.getDisplayWidth() | 获取显示器宽度 |
u8g2.getMaxCharHeight() | 获取当前字体里的最大字符高度 //每一个字符在font子集里都是一个位图,有高度宽度 |
u8g2.getMaxCharWidth() | 获取当前字体里的最大字符的宽度 |
u8g2.getStrWidth() | 获取字符串的像素宽度 u8g2_uint_t U8G2::getStrWidth(const char *s) |
u8g2.getUTF8Width() | 获取UTF-8字符串的像素宽度 u8g2_uint_t U8G2::getUTF8Width(const char *s) |
u8g2.setAutoPageClear() | 设置自动清除缓冲区:置0关闭,置1开启,默认是开启 void U8G2::setAutoPageClear(uint8_t mode) 注意点:
|
u8g2.setBitmapMode() | 设置位图模式:设置在drawXBM方法中是否绘制背景颜色,置0绘制背景颜色,默认是0;置1不绘制背景颜色,透明 示例:
|
u8g2.setBusClock() | 设置总线时钟:设置总线时钟(iic、spi);总线时钟频率clock_speed(hz) void U8G2::setBusClock(uint32_t clock_speed); 注意点:
|
u8g2.setClipWindow() | 设置采集窗口大小:绘制的内容只能在规定范围内显示 左上角坐标z0,y0 右上角坐标x1,y1 void U8G2::setClipWindow(u8g2_uint_t x0, u8g2_uint_t y0, u8g2_uint_t x1, u8g2_uint_t y1 ); 可以通过setMaxClipWindow去掉限制(直接把范围设置为最大值) |
u8g2.setCursor() | 设置绘制光标的位置:坐标x,y
|
u8g2.setDisplayRotation() | 设置显示器旋转角度: u8g2_cb 旋转选项 * U8G2_R0 不做旋转 水平 * U8G2_R1 旋转90度 * U8G2_R2 旋转180度 * U8G2_R3 旋转270度 * U8G2_MIRROR 不做旋转 水平,显示内容是镜像的,暂时不理解 void setDisplayRotation(const u8g2_cb_t *u8g2_cb) |
u8g2.setDrawColor() | 设置绘制颜色:void U8G2::setDrawColor(uint8_t color) |
u8g2.setFont() | 设置字体集:用于字符串绘制方法或glyph绘制方法,参数为font,填入具体的字体集 void U8G2::setFont(const uint8_t *font)
|
u8g2.setFontDirection() | 设置字体方向:void U8G2::setFontDirection(uint8_t dir) dir方向参数参考下表
|
|
|
4.缓存相关函数
一般不会去操作,了解即可
u8g2.getBufferPtr() | 获取缓存空间的地址 |
u8g2.getBufferTileHeight() | 获取缓冲区的Tile高度(一个Tile等于8个像素点) |
u8g2.getBufferTileWidth() | 获取缓冲区Tile的宽度 |
u8g2.getBufferCurrTileRow() | 获取缓冲区当前的Tile row |
u8g2.setBufferCurrTileRow() | 设置缓冲区当前的Tile row |
U8g2库的具体运用:
1.知道要使用的屏幕型号(大小、驱动芯片型号等)具体参考选择屏幕 (arduino.cn)
2.根据屏幕型号选择使用的总线方式
图像信息是通过物理总线方式发给OLED显示器。通常包括:
3SPI,3-wire SPI:串行外围接口,依靠三个控制信号,Clock、Data、CS;
4SPI, 4-Wire SPI,跟3SPI一样,只是额外多了一条数据命令线,经常叫做D/C;
I2C, IIC or TWI: SCL SDA;
8080:A 8-Bit bus which requires 8 data lines, chip select and a write strobe signa
6800: Another 8-Bit bus, but with a different protocol.
3.物理连线,将屏幕引脚连接到开发板对应端口
4.U8g2初始化,使用初始化构造器
例如:U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, 22, 21, U8X8_PIN_NONE);
构造器的命名包括以下几个部分
5. U8g2绘制模式
U8g2支持三种绘制模式:
1.Full screen buffer mode,全屏缓存模式
2.Page mode,分页模式
3.U8x8,character only mode 仅支持普通字符