Arduino-esp32学习笔记

先放上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相关领域博主

xy972853的个人空间_哔哩哔哩_Bilibili

(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)

①ESP323个串口:SerialSerial1Serial2

②Arduino core for ESP32Arduino原版的串口有差异,无法完全套用

③SerialSerial1Serial2是在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默认使用GPIO910ESP32GPIO6~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_8N18位数据位、无校验、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号、中断触发时的回调函数、回调函数输入参数、外部中断触发模式

RISINGFALLINGCHANGE……上升沿、下降沿、改变时、低电平、高电平等)

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支持16位以内的unicode字符集,也就是说encoding的范围为0-65535,drawGlyph方法只能绘制存在于所使用的字体字集中的unicode值;
  • 这个绘制方法依赖于当前的字体模式和绘制颜色;

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绘制字符串的内容

注意点:

  • 需要先设置字体,调用setFont方法;
  • 这个方法不能绘制encoding超过256的,超过256需要用drawUTF8或者drawGlyph;说白了就是一般用来显示英文字符
  • x,y属于字符串左下角的坐标;

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)

注意点:

  • 该方法用于 firstPage 和 nextPage(看上面的源码解析);
  • 建议该方法保持默认就好,如果用户禁止了,那么需要自己维护缓冲区的状态或者手动调用clearBuffer;

u8g2.setBitmapMode()

设置位图模式:设置在drawXBM方法中是否绘制背景颜色,置0绘制背景颜色,默认是0;置1不绘制背景颜色,透明

示例:

 

                            

 

 

u8g2.setBusClock()

设置总线时钟:设置总线时钟(iic、spi);总线时钟频率clock_speed(hz)

void U8G2::setBusClock(uint32_t clock_speed);

注意点:

  • 仅仅Arduino平台支持;
  • 必须在u8g2.begin() 或者 u8g2.initDisplay()之前调用;

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 仅支持普通字符

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值