1.Arduino 语言

  1.概念:通常所说的Arduino语言,是指Arduino核心库文件提供的各种应用程序编 程接口(API)的集合。这些API是对更底层的单片机支持库进行二次封装所形 成的。例如,使用ESP32单片机的Arduino核心库是对ESP32-Libc的二次封装

2.程序结构:main函数被隐藏,一般不直接操作main函数,而是使用setup()和loop()函数

    1.setup()函数:Arduino 控制器通电或复位后,即会开始执行setup()函数中的程序,该程 序只会执行一次。通常是在setup()函数中完成Arduino的初始化设置,如配置 IO 口状态和初始化串口等操作。

    2.loop()函数:setup()函数执行完毕后,Arduino会接着执行loop()函数。而loop()函数 是一个死循环,其中的程序会不断的重复运行。通常在loop()函数中完成程序 的主要功能,如驱动各种模块和采集数据等

3.添加第三方库

    1.安装步骤:进入图中界面,点击安装

    离线安装

    2.添加完成后,调用其API函数即可

4.LED实验

  1.pinMode()函数

    1.作用:ESP32 上每一个带有数字编号的引脚几乎都具备输入/输出数字信号的功能。 在使用输入或输出功能前,需要先通过pinMode()函数配置引脚的模式为输入模 式或输出模式

    2.函数原型:void pinMode(uint8_t pin, uint8_t mode),其中参数pin为指定配置的引脚标号,参数mode为指定的配置模式

    3.模式种类

    注:PULLUP 模式适用于不确定的信号输入,而INPUT_PULLUP模式适用于读取传 感器信号或开关信号

    4.使用方法:pinMode(3, OUTPUT);

    5.digitalWrite()函数

      1.配置模式:配置为输出模式

      2.函数使用:使用该引脚输出高电平或低电平

      3.函数原型:void digitalWrite(uint8_t pin, uint8_t val)

      4.函数具体使用方法:其中参数pin为指定输出的引脚编号。参数value为要指定的输出电平,使 用HIGH指定输出高电平,使用LOW指定输出低电平

      5.高,低电平判定:电压大于2.5V的认为是高电 平,电压小于0.5V的认为是低电平(HIGHT被定义为1,LOW被定义为0,因此也可 以直接使用数字0和1表示输出低电平和高电平)

      6.使用方法示例:digitalWrite(3, HIGH);

                                   digitalWrite(3, 1);

   6. delay()函数(毫秒延时函数)

      1.函数原型:void delay(uint32_t)

      2.具体用法:将要延时的时间传递函数参数内即可

    7.LED点亮实验

实操实例:

    8.LED闪烁实验

实操实例:

5.蜂鸣器实验

  1.简介:蜂鸣器分有源和无源,有源蜂鸣器控制相对简单,只需得电即可发出声音; 而无源蜂鸣器需要连续输出一定频率的脉冲信号才能使蜂鸣器发出声音,即循环 让IO口输出高低电平,最佳发声频率在1.5K-5KHz之间

  2.目的:让ESP32 的IO口输出一个2KHz频率的脉冲信号控制板载无源蜂鸣器发声

  3.delayMicroseconds()函数

    1.函数原型:void delayMicroseconds(unsigned int microseconds);

    2.用法:delayMicroseconds(50);

  4.实操实例:

6.继电器实验

  1.简介:继电器是一种电子控制器件,相当于一个开关,接在任意线上,断开状态下 线就断开,没导通,闭合状态下线就接在一起,导通。通常使用继电器可实现小 电流控制大电流,或者低压控制高压等设备

  2.示意图:

7.按键控制实验

  1.简介:按键是一种电子开关,使用时轻轻按开关按钮就可使开关接通,当松开手时, 开关断开

  2.一般机械按键按下和松开时存在抖动情况,可能会影响程序误判,通常使用软件延时10ms来消斗

  3.函数原型:int digitalRead(int pin);

  4.该函数的功能是读取一个指定引脚的状态,并将其返回为一个整数(HIGH 或LOW)

  5.digitalRead 函数通常用于读取连接到数字输入引脚的设备状态。引脚编号 作为参数传递给函数,函数返回引脚的状态。如果引脚连接到一个开关或按钮,那么根据开关的状态,函数将返回HIGH或LOW。

  6.注:在使用digitalRead函数之前,需要将引脚配置为数字输入模式。

8.直流电机实验

  1.简介:直流电机是指能将直流电能转换成机械能(直流电动机)或将机械能转换成 直流电能(直流发电机)的旋转电机。 直流电机没有正负之分,在两端加上直流电就能工作。开发板配置的直流电 机为5V直流电机

实操实例:

9.步进电机实验

  1.内部结构等效图

  2.步进电机旋转控制图

  3.旋转驱动方式

  4.主要参数

  5.多文件创建方法

    

注:  1.通常在创建好.cpp源文件,会同时创建.h头文件,并且源文件名称和头文 件名称保持一致,且能代表该文件内代码主要功能的英文缩写。

         2.文件创建好后可以给其添加对应的代码,.cpp源文件内主要存放函数的实 现,.h头文件内主要存放管脚定义和函数声明。

10.外部中断实验

  1.简介:当按键被按 下(产生中断)时,才去执行相关功能。

  2.attachInterrupt()函数

    1.作用:该函数用于将一个中断服务例程(Interrupt Service Routine,ISR)附加 到一个特定的中断引脚。当中断引脚上的中断被触发时,会调用指定的ISR。

  2.原型:void attachInterrupt(uint8_t interruptPin, void (*userFunction)(void), uint8_t mode)

    参数说明:

  3.1.interruptPin:指定中断引脚的中断号。

    2.userFunction:指向用户定义的中断服务程序的指针。当在指定的中断引脚 上触发中断时,这个函数将被调用。

    3.mode:指定触发模式。

      常见模式

      1.LOW(ONLOW): 当引脚变为低电平时触发中断。

      2.HIGH(ONHIGH): 当引脚变为高电平时触发中断。

      3.CHANGE: 当引脚状态发生变化时触发中断。

      4.FALLING: 当引脚从高电平变为低电平时触发中断。

      5.RISING: 当引脚从低电平变为高电平时触发中断。

  3.digitalPinToInterrupt()函数

    1.功能:1.将指定的GPIO引脚映射为对应的中 断号。这个函数的参数是引脚编号,返回值是中                       断号。

                  2.digitalPinToInterrupt函数可以将指定的 GPIO 引脚与特定类型的中断号关联起来,以                       便在程序中响应和处理该引脚上发 生的中断事件。

                 3.注意事项:在使用digitalPinToInterrupt函数时,需要确保引脚编号 是有效的,并且已                      正确配置为对应的中断类型。

  4.detachInterrupt()函数

    功能:1.用于取消之前为某个引脚设置的中断服务程序(。这个函数可以用于在不需要中断功                      能时释放资源,或者在更换中断服 务程序时先清除原来的设置。)

               2.注意事项:在使用detachInterrupt()函数时,需要提供中断引脚的中断号作为参数。

11.定时器中断实验

  1.简介:通过定时器可以完成各种预设好的 任务。ESP32定时器到达指定时间后也会产生中断,然后在回调函数内执行所需功能

  2.定时器配置步骤:①选择定时器(两组四个)

                                  ②配置合适分频系数

                                  ③绑定中断函数

                                  ④配置报警计数器保护值

                                  ⑤开启报警

  3.timerBegin()函数

    1.原型:hw_timer_t * timerBegin(uint8_t num, uint16_t divider, bool countUp)

    2.参数说明:num(选择定时器);

                         0-3divider(分频系数):0-65535,

                         countUp:是否位向上计数

    3.返回值:返回一个计时器结构体指针 hw_timer_t * ,我们预定义一个指针接收它。

  4.timerEnd()函数:取消初始化定时器

    1.原型:void timerEnd(hw_timer_t *timer)

    2.参数:*timer:目标定时器

  5.timerAttachInterrupt()函数:开启定时器中断

    1.原型:void timerAttachInterrupt(hw_timer_t *timer, void (fn)(void), bool edge)

    2.参数:1.*timer:目标定时器(计时器结构体指针 hw_timer_t *)

                  2.void (*fn)(void):中断函数入口地址

                 3.中断边沿触发:是否跳变沿触发中断;定时器中断触发方式有: 电平触发中 断(level                         type) 边缘触发中断(edge type)

  6.timerDetachInterrupt()函数:取消定时器中断

    1.原型:void timerDetachInterrupt(hw_timer_t *timer)

  7.timerAlarmWrite()函数:配置报警计数器保护值(设置时间)

    1.原型:void timerAlarmWrite(hw_timer_t *timer, uint64_t alarm_value, bool autoreload)

    2.参数:1.*timer:目标定时器(计时器结构体指针hw_timer_t *)

                  2.alarm_value:计数上限值,单位:微秒

                  3.Autoreload:是否开启自动重载

  8.timerAlarmEnable()函数:使能定时器报警

    1.原型:void timerAlarmEnable(hw_timer_t *timer)

    2.参数:*timer:目标定时器(计时器结构体指针 hw_timer_t * )

  9.timerAlarmDisable()函数:失能定时器

    1.原型:void timerAlarmDisable(hw_timer_t *timer)

  10.timerAlarmEnabled()函数:判断定时器是否启动

    1,原型:bool timerAlarmEnabled(hw_timer_t *timer)

12.PWM呼吸灯实验

  1.简介:PWM 是脉冲宽度调制,简称脉宽调制。它是利用微处理器的数字输出来对模 拟电路进行控制的一种非常有效的技术。PWM主要用于输出不同频率、占空比(一 个周期内高电平出现时间占总时间比例)的方波。以实现固定频率或平均电压输 出。频率固定,改变占空比可改变输出电压

  2.函数使用:通过LEDC的功能来实现(ESP32 的 LEDC 总共有16个路通道(0 ~ 15),分为高低速两组,高速通 道(0 ~ 7)由80MHz时钟驱动,低速通道(8 ~ 15)由 1MHz 时钟驱动。)

  3.实现步骤:

    1.选择一个通道(0-15)

    2.设置PWM的频率

    3.设置占空比的分辨率,例如8位或者16位

    4.将该通道绑定到具体的GPIO上

    5.设置通道号和占空比实现PWM

  4.ledcSetup()函数:设置LEDC通道对应的频率和计数位数(占空比分辨率),该方法返回最终频率

    1.原型:double ledcSetup(uint8_t channel, double freq, uint8_t resolution_bits)

  

  5.ledcAttachPin()函数:将LEDC通道绑定到指定IO口上以实现输出

    1.原型:void ledcAttachPin(uint8_t pin, uint8_t channel)

    2.参数:1.Pin:引脚编号制定了PWM信号要输出的GPIO引脚号

                  2.Channel:LED通道编号指定了PWM信号要输出的LED通道编号,可以是0-15之间                         的任意值

  6.ledcDetachPin()函数:解除IO口的LEDC功能

    1.原型:void ledcDetachPin(uint8_t pin)

  7.ledcWrite()函数:指定通道输出一定占空比波形

    1.原型:void ledcWrite(uint8_t channel, uint32_t duty)

  8.ledcRead()函数:返回指定通道占空比的值

    1.原型:uint32_t ledcRead(uint8_t channel)

  9.ledcReadFreq()函数:返回指定通道当前频率(若当前占空比为0,则返回0)

    1.原型:double ledcReadFreq(uint8_t channel)

  10.ledcWriteTone()函数:当外接无源蜂鸣器使可以发出根据频率不同而不同的声音

    1.原型:double ledcWriteTone(uint8_t channel, double freq)

  11.ledcWriteNote()函数:对ledcWriteTone()函数的进一步封装,可以直接输出指定调式和音节声         音的信号

    1.原型:double ledcWriteNote(uint8_t channel, note_t note, uint8_t octave)、

    2.参数:1.channel:这是要控制的LED通道编号,它是一个8位无符号整数,范围从0 到15。                                        (可以确定要使用哪个PWM通道来控制LED或电机)

                  2.note:这是要发出的音调和音符编号,是一个8为无符号整数,范围从 NOTE_B0 到                                  NOTE_C8。(可以确定要发出哪个音调和音符)

                  3.octave:要发出的音调和音符的八度,是一个8位无符号整数,范围从0-7

                                 (可以确定要发出哪个八度的音调和音符)

13.串口通信实验

  1.简介:使用户就可以在无须考虑底层实现原理的前提下将各类串口功能模块灵活应用起来。

  2.所需硬件介绍

  3.原理:1.UART0用于下载和REPL调试,因此可以使用UART2与外部串口设备通信

                2.通信的过程中,数据传输实际上都是以数字信号(即电平高低变化)的形式进行的,                      串口通信也是如此。当使用Serial.print()函数输出数据时,Arduino的发送端会输出一                      连串的数字信号,称这些数字信号为数据帧

  4.格式

    1.起始位:起始位总为低电平,是一组数据帧开始传输的信号。

    2.数据位:数据位是一个数据包,其中承载了实际发送的数据的数据段。当Arduino通

                      过串口发送一个数据包时,实际的数据可能不是8位的
    3.校验位:校验位是串口通信中一种简单的检错方式。可以设置为偶校验或者奇校验。
                      当然,没有校验位也可以。默认为无校验位。
    4.停止位:每段数据帧的最后都有停止位表示该段数据帧传输结束。停止位总为高电
                     平,可以设置停止位为1位或2位。默认是1位停止位。当串口通信速率较高或
                     外部干扰较大时,可能会出现数据丢失的情况。为了保证数据传输的稳定性,最
                      简单的方式就是降低通信波特率或整加停止位和校验位
  5.函数使用
    1.available()函数
      1.功能:获取串口接收到的数据个数,即获取串口接收缓冲区的字节数。接受缓冲区最多可保                      存64字节的数据
      2.语法:Serial.available()
      3.返回值:可读取的字节数
    2.begin()函数
      1.功能:串口初始化。可配置串口的各项参数
      2.语法:1.Serial.begin(speed)
                    2.Serial.begin(speed,config)
                    3.Serial.begin(speed,config,rxPin,txPin)
      3.参数:1.speed:波特率
                    2.config:数据为,校验位,停止位配置
                    3.rxPin和txPin:接收发送引脚
    3.end()函数
      1.功能:结束串口通信。该操作可释放该串口所在的数字引脚,使其作为普通数字引脚使用
      2.语法:语法:Serial.end()
    4.find()函数
      1.功能:从串口缓冲区读取数据,直至督导指定的字符串
      2.语法:Serial.find(target)
      3.参数:target-->需要搜索的字符串或字符
      4.返回值:boolean型值,为true表示找到,为false表示没有找到。
    5.findUntil()函数
      1.功能:从串口缓冲区读取数据,直至读到指定的字符串或指定的停止符
      2.Serial.findUntil(target,terminal)
      3.参数:1.target,需要搜索的字符串或字符。
                    2.terminal,停止符。
    6.flush()函数
      1.功能:等待正在发送的数据发送完成。需要注意的是,在早期的Arduino版本中,该函数用                        作清空接收缓冲区。
      2.语法:Serial.flush()
    7.parseFloat()函数
      1.功能:从串口缓冲区返回第一个有效的float型数据
      2.语法:Serial.parseFloat()
      3.返回值:float型数据。
    8.parseInt()函数
      1.功能:从串口流中查找第一个有效的整型数据。
      2.语法:Serial.parseInt()
      3.返回值:int类型数据
    9.peek()函数
      1.功能:返回1字节的数据,但不会从接收缓冲区删除该数据。与read()函数不同,read()函数                      读取数据后,会从接收缓冲区删除该数据。 
      2.语法:Serial.peek()
      3.返回值:进图接收缓冲区的第1字节的数据:如果没有可读数据,则返回-1
    10.print()函数
      1.功能:将数据输出到串口。数据会以 ASCII 码形式输出。如果想以字节形式输出数据,这需                      要使用 write()函数。
      2.语法:1.Serial.print(val)
                    2.Serial.print(val,format)
      3.参数:1.val,需要输出的数据。
                    2.format,分两种情况:
                ①输出的进制形式,包括:BIN(二进制)、DEC(十进制)、OCT(八进制)、HEX(十六制)。
                ②指定输出的 float 型数据带有小数的位数(默认输出 2 位),例如:
                   1.Serial.print(1.23456)输出为“1.23";
                   2.Serial.print(1.23456,0)输出为“1";
                   3.Serial.print(1.23456,2)输出为“1.23";
                   4.Serial.print(1.23456,4)输出为“1.2346";
      4.返回值:输出的字节数
    11.println()函数
      1.功能:将数据输出到串口,并回车换行。数据会以 ASCII 码形式输出。
      2.语法:1.Serial.println(val)
                    2.Serial.println(val,format)
      3.参数:同print()函数
    12.read()函数
      1.功能:从串口读取数据。与 peek()函数不同,read()函数每读取 1 字节,就会从接收缓冲区                      移除 1 字节的数据
      2.语法:Serial.read()
      3.返回值:进入串口缓冲区的第 1 个字节;如果没有可读数据,则返回-1。
    13.readBytes()函数
      1.功能:从接收缓冲区读取指定长度的字符,并将其存入一个数组中。若等待数据时间超过设                      定的超时时间,则退出该函数。
      2.语法:Serial.readBytes(buffer,length)
      3.参数:1.buffer,用于存储数据的数组(char[]或者 byte[])。
                    2.length,需要读取的字符长度。
      4.返回值:读到的字节数;如果没有找到有效的数据,则返回 0。
    14.readBytesUntil()函数
      1.功能:从接收缓冲区读取指定长度的字符,并将其存入一个数组中。如果读到停止符,或者                      等待数据时间超时,则退出该函数。
      2.语法:Serial.readBytesUntil(character,buffer,length)
      3.参数:1.character,停止符。
                    2.buffer,用于存储数据的数组(char[]或者 byte[])。
                    3.length,需要读取的字符长度。
      4.返回值:读到的字节数:如果没有找到有效的数据,则返回0
    15.setTimeout()函数
      1.功能:设置超时时间。用于设置 Serial.readBytesUntil()函数和Serial.readBytes()函数的等待                      串口数据时间。
      2.语法:Serial.setTimeout(time)
      3.参数:time,超时时间,单位为毫秒。
    16.write()函数
      1.功能:输出数据到串口。以字节形式输出到串口。
      2.语法:1.Serial.write(val)
                    2.Serial.write(str)
                    3.Serial.write(buf,len)
      3.参数:1.val,发送的数据。
                    2.str,String 型的数据。
                    3.buf,数组型的数据。
                    4.len,缓冲区的长度。
                    5.返回值:输出的字节数。
14.ADC实验
  1.简介:ADC(analog to digital converter)即模数转换器,它可以将模拟信号转换为数字信                       号。由于单片机只能识别二进制数字,所以外界模拟信号常常会通过ADC 转换成其可以                  识别的数字信息。常见的应用就是将变化的电压转成数字信号。
  2.可以使用以下引脚作为模拟输入
    
    ADC1 通道 0 至 9:对应引脚 GPIO1 至 GPIO10。
    ADC2 通道 0 至 9:对应引脚 GPIO11 至 GPIO20
  3.注:analogRead 函数返回的整数值是模拟输入电压转换为数字后的结果,其范围根据所选通                道和 ADC 分辨率而有所不同(返回值区间默认为0-4096,更高或更低的分辨率,可以通                过设置 analogReadResolution()函数来修改)
  4.函数使用
    1.analogReadResolution()函数
      1.用途:设置模拟读取返回值的分辨率(默认为12位,范围时0-4096。当设置不同的分辨率               时,读取的值将被移动以匹配给定的分辨率。
      2.原型:void analogReadResolution(uint8_t bits);
    2.analogSetClockDiv()函数
      1.用途:用于设置ADC时钟的分频器
      2.原型:void analogSetClockDiv(uint8_t clockDiv);
    3.analogSetAttenuation()函数
      1.用途:用于设置所有通道的衰减,实现修改ADC的电压测量范围
      2.原型:void analogSetAttenuation(adc_attenuation_t attenuation)
      3,参数:
      4.ADC 的默认满量程电压为 1.1V。要读取更高的电压(最高为引脚最大电压,通常为 3.3V)           则需要将该 ADC 通道的信号衰减设置为> 0dB。
         1.0dB 衰减(ADC_ATTEN_0db)表示参考电压为 1.1V
         2.2.5dB 衰减(ADC_ATTEN_2_5db)表示参考电压为 1.5V
         3.6dB 衰减(ADC_ATTEN_6db)表示参考电压为 2.2V
         4.11dB 衰减(ADC_ATTEN_11db)表示参考电压为 3.9V
    4.analogSetPinAttenuation()函数
      1.用途:用于设置特定pin/ADC通道的衰减
      2.原型:void analogSetPinAttenuation(uint8_t pin, adc_attenuation_t attenuation)
    5.analogRead()函数
      1.用途:用于获取给定 pin/ADC 通道的 ADC 原始值
      2.原型:uint16_t analogRead(uint8_t pin);
    6.analogReadMillivolts()函数
      1.用途:用于获取给定 pin/ADC 通道的 ADC 值,f 返回值单位为毫伏
      2.原型:uint32_t analogReadMilliVolts(uint8_t pin)
15.RGB彩灯实验
  1.简介:WS2812B 是一款智能控制 LED 光源,控制电路和 RGB 芯片集成在一个 5050组件的                    封装中。内部包括智能数字端口数据锁存器和信号整形放大驱动电路
  2.管脚图:
  3.多个RGB灯珠级联
    1.用途:可使ESP32仅需通过1个GPIO口就可以控制数十上百的灯珠
    2.注:级联的灯珠越多,所需电流就越大,如果数量很多的情况,建议外接 5V 电源,然后与开                发板共 GND 即可。
    3.颜色从亮到暗分别用0-255表示,0最暗,255最亮
  4.函数使用
    1.clear()函数:用 0 填充整个像素条,即关闭所有 WS2812 灯珠
      1.原型:void clear(void)
    2.Color()函数:设置 RGB 的值,从 0,0,0 到 255,255,255。返回的是 32 位压缩 RGB 值,然
                              后可以将其分配给 a 变量,供以后使用或传递给 setPixelColor()函数
      1.原型:uint32_t Color(uint8_t r, uint8_t g, uint8_t b)
    3.setPixelColor()函数:使用 32 位“打包”RGB 或 RGBW 值设置像素的颜色。n 为像素索引,                                                从 0 开始。c 为 32 位的颜色值
      1.原型:void setPixelColor(uint16_t n, uint32_t c)
    4.fill()函数:使用一种颜色填充新像素条的全部或部分。c 为 32 位的颜色值。first 为要
                        填充的第一个像素的第一个索引,从 0 开始,如果未指定,则默认从 0 索引开始。
                        count 为要填充的像素数,为正值。当是 0 或未指定将填充到条形图的末尾
      1.原型:void fill(uint32_t c, uint16_t first, uint16_t count)
    5.begin()函数:配置 WS1280 输入引脚(即对应单片机的引脚)
      1.原型:void begin(void)
    6.show()函数:将 RAM 中的像素数据传输到新像素。
      1.注:在大多数体系结构中,中断是暂时禁用的以便实现正确的新像素信号定时。这意味着                      Arduino millis()和micros()函数,它们需要中断时,会丢失一小段时间间隔函数被调用                      (大约每 30微秒一 RGB 像素,每 40 微秒一 RGBW 像素)
      2.原型:void show(void)
    7.ColorHSV()函数:将色调、饱和度和亮度转换为压缩的 32 位 RGB 颜色,可将该函数返回值                                       传递给setPixelColor()或其他与 rgb 作为输入的函数
      1.原型:uint32_t ColorHSV(uint16_t hue, uint8_t sat, uint8_t val)
      2.参数:1.hue,色调,为一个无符号的 16 位值,从 0 到 65535,表示一个完整色轮的回路
                    2.sat 为饱和度,8 位值,范围为 0 到 255,默认值为 255;
                    3.val,亮度,8 位值,0 到 255(最大或全亮度)。如果未指定,默认值为 255。
16.RTC实时时钟实验
  1.简介:用开发板来制作一个属于自己的电子时钟。
  2.函数使用
    1.安装ESP32Time
    2.实例化ESP32Time类:ESP32Time rtc();
    3.ESP32Time()函数
      1.原型:ESP32Time(long offset);
    4.setTime()函数
      1.原型:void setTime(int sc,int mn, int hr,int dy,int mt,int yr, int ms=0)
      2.参数:从左到右分别为秒,分,时,日,月,年,毫秒
      3.用法:设置当前时间日期
    5.getTime()函数
      1.意义:获取时间
      2.原型:String getTime(String format);
      3.参数:时间格式
      4.时间格式参考可到http://www.cplusplus.com/reference/ctime/strftime/查看
    6.getDateTime()函数
      1.作用:获取当前日期,并以字符串形式返回
      2.原型:String getDateTime(bool mode=false);
                    rtc.getDate(true)-->仅获取年月日
                   rtc.getDateTime(true)-->获取年月日和时分秒
    7.getTimeDate()
     1.作用:获取当前日期和时间,并以字符串形式返回(先时间再日期)
      2.原型:String getTimeDate(bool mode=false)
                    rtc.getDate()-->仅获取年月日(缩写)
                   rtc.getDateTime(true)-->获取年月日和时分秒
    8.getDate()函数
      1.作用:返回日期
      2.原型:String getDate(bool mode=false);
                    rtc.getDate()(缩写)
                    rtc.getDate(true)
    9.getAmPm()函数
      1.作用:返回上午下午
      2.原型:String getAmPm(bool lowercase=false);(改成true则返回小写)
    10.getEpoch()函数
      1.作用:从过去特定时间到现在返回所差毫秒和秒
      2.原型:unsigned long getEpoch();
    11.getMullis()函数
      1.作用:返回当前毫秒数
      2.原型:unsigned long getMillis();
    12.getMicros()函数
      1.作用:返回当前微秒
      2.原型:unsigned long getMicros();
    13.getSecond/getMinute/getHour()函数
      1.作用:获取当前秒,分,小时
      2.原型:int getSecond();
                   int getMinute();
                   int getHour(bool mode=false);
注:mode=false返回12小时制,true返回24小时制
    14.getDay()函数
       1.作用:获取日期
       2.原型:int .getDay();
    15.getDayofWeek ()函数
      1.作用:获取当前日期是星期几
      2.原型:int getDayofWeek()
    16.getDayYear()函数
      1.作用:返回当前日期在这一年中的天数
      2.原型:int getDayYear();
    17.getMonth()函数
      1.作用:获取当前月份
      2.原型:int .getMonth();
    18.getYear()函数
      1.作用:返回当前年份
      2.原型:getYear()
    19.getLocalEpoch()函数
      1.作用:获取unix时间戳(从1970年1月1日到现在的秒数)
      2.原型:unsigned long getLocalEpoch();
17.DS18B20温度传感器实验
  1.安装OneWrie和Dallas Temperature Contrrol库文件
  2.函数使用
    1.begin
      1.用途:初始化传感器
      2.原型:void begin(void)
    2.getDeviceCount()函数
      1.用途:获取单种线上所有连接器线的总数
      2.原型:uint8_t getDeviceCount(void)
    3.vaildAdress()函数
      1.用途:验证指定地址器件是否存在
      2.原型:bool vaildAdress(uint8_t*,uint8_t)
      3.返回值含义:true为存在,false为不存在
    4.getAdress()函数
      1.用途:验证器件地址与索引值是否匹配
      2.原型:bool getAdress(uint8_t*,uint8_t)
      3.返回值含义:输入的地址属于哪单种线(从0开始)
    5.getResolution()函数
      1.用途:获取指定期间的精度
      2.原型:uint8_t getResolution()
    6.setResolution()函数
      1.用途:设置器件精度
      2.原型:bool setResolution(xonst uint8_t*,uint8_t,bool                                                                                    skipGlobalBitResolutionCalculation=false)
                    void setResolution(uint8_t)
    7.requstTemperatures()函数
      1.用途:发送温度转换请求
      2.原型:void requestTemperatures(void)
    8.requestTemperaturesByAddress()函数
      1.用途:指定传感器并返回一个布尔类型参数
      2.原型:bool requstTemperaturesByAddress(const uint8_t*)
    9.requestTemperaturesByIndex()函数
      1.用途:向单种线发送温度转换请求
      2.原型:bool requestTemperaturesByIndex(uint8_t*)
    10.getTempC()函数
      1.用途:根据器件地址获取摄氏度温度转换值
      2.原型:float .getTempC(const uint8_t*)
    11.getTempF()函数
      1.用途:根据器件地址获取华氏度温度转换值
      2.原型:float .getTempF(const uint8_t*)
    12.getTempCByIndex()函数
      1.用途:通过索引获取摄氏温度
      2.原型:float getTempCByIndex(uint8_t)
    13.getTempFByIndex()函数
      1.用途:通过索引获取华氏温度
      2.原型:float getTempFByIndex(uint8_t)
18.DHT11温湿度传感器实验
   1.安装dht-master库文件
    可用:DHT dht创建对象
   2.函数使用
    1.setup()函数
      1.作用:初始化传感器
      2.原型:void setup(uint8_t pin DHTMODEL_t model=AUTO_DETECT)
      3.参数含义:1.uint8_t pin:管脚
                           2. DHTMODEL_t model=AUTO_DETECT:开发板型号
    2.getTemperarure()函数
      1.作用:获取温度
      2.原型:flaot getTemperature()
    3.getHumidity()函数
      1.作用:获取湿度值
      2.原型:float getHumidity() 
19.超声波测距实验
  1.需安装HCSR04-master.zip
  2.函数使用
    1.头文件名:#include <afstandsseneor.h>
    2.AfastandSensor afstandsseneor()函数
      1.作用:创建trig和echo引脚
      2.原型:AfastandSensor afstandsseneor(trig_pin,echo_pin)
      3.参数含义:1.trig_pin-->trig引脚
                           2.echo_pin-->echo引脚  
    3.afstandCM()函数
      1.作用:得到距离
      2.原型:afstandCM()
20.红外遥控
  1.组成
    1.红外发射装置
    2.红外接受设备
  2.函数使用
    1.需安装IRremoteESP8266包
    2.需添加#include <IRremoteESP8266.h>
    3.需调用解码规则库,需添加#include <IRrecv.h>和#include <IRutils.h>头文件
    4.IRrecv irrecv(kRecvPin)函数
      1.作用:接受红外信号
      2.原型:IRrecv irrecv(kRecvPin)
      3.参数含义:引脚编号
      4.需创建decode_results rersults对象
    5.enableIRIN()函数
      1.作用:启动红外接收器
      2.原型:void enableIRIN(const_bool,pullup=false)
      3.参数作用:是否使用上拉电阻
    6.decode()函数
      1.作用:获取解码数据
      2.原型:
           bool decode(decode_results*results,itparams_t*save=NULL,uint8_tmax_skip=0,uint16_t                                     noise_floor=0)
      3.参数含义(返回true):1.decode_results*results:获取解码信息
                                                2.itparams_t*save(可选):保存解码器,若不需要传NULL
                                                3.uint8_tmax_skip(可选):可跳过最大间隔码,不用则传0
                                                4.uint16_t  noise_floor(可选):噪声阈值:不用则传0
    7.resume()函数
      1.作用:恢复红外接收器状态,在下一次重新进行解码
      2.原型:void resume(void)
21.舵机
  1.基础参数
    1.供电范围:4.8-6v
    2.角度:0-180
  2.函数使用
    1.需安装ESP32S3-AnalogWrite
    2.需导入#include <Servo.h>头文件
    3.需创建对象:Servo myservo=Servo();
    4.write()函数
      1.作用:将指定舵机连接到指定引脚,并指定设置旋转角度
      2.原型:float write(int pin,float value)
      3.参数含义:
        1.int pin:引脚号
        2.float value:指定旋转角度
21.OELD液晶显示实验
  1.特点
    1.0.96 寸 OLED 有黄蓝,白,蓝三种颜色可选;其中黄蓝是屏上 1/4 部分 为黄光,下 3/4 为             蓝;而且是固定区域显示固定颜色,颜色和显示区域均不能修改;白光则为纯白,也就是黑           底白字;蓝色则为纯蓝,也就是黑底蓝字。
    2.分辨率为 128*64
    3.多种接口方式;OLED 裸屏总共种接口包括:6800、8080 两种并行接口方 式、3 线或 4 线           的串行 SPI 接口方式、 IIC 接口方式(只需要 2 根线就可以 控制 OLED),这五种接口是通         过屏上的 BS0-BS2 来配置的。
  2.IIC接口
    1.管脚功能介绍
      1.GND:电源地
      2.VDD:电源正(3-5.5V);
      3.SCK:I2C 时钟管脚;
      4.SDA:I2C 数据管脚
  3.函数使用
    1.需安装esp8266-oled-ssd1306-master库
    2.需实例化SSD1306Wire display(0x3c, SDA, SCL);类
    3.init()函数
      1.作用:初始化 SSD1306 OLED 显示器。这个函数会设置显示器的寄存器和参数
      2.原型:bool init();
    4.clear()函数
      1.作用:清除整个显示器上的所有文本和图像,将其恢复为空白状态
      2.原型:void clear(void);
    3.clearPixel函数
      1.作用:清楚oled显示器特定位置的一个像素
      2.原型:void clearPixel(int16_t x,int16_t y);
      3.参数含义:坐标位置
    4.display函数
      1.作用:将图像或文本显示在液晶显示屏上
      2.原型:void display(void);
    5.displayOff()/displayOn()函数
      1.作用:用于打开和关闭显示器显示功能
      2.原型:void displayOff(void);
                    void displayOn(void);
    6.end函数
      1.作用:用于结束与显示屏的通信
      2.原型:void end();
    7.flipScreenVertically()函数
      1.作用:用于垂直反转显示器内容
      2.原型:void flipScerenVertically();
    8.mirrorScreen()函数
      1.作用水平翻转显示器内容
      2.原型:void mirrorSceren();
    9.invertdisplay()函数
      1.作用:反转缓冲区内容(亮,暗转换)
      2.原型:void invertDisplay(void);
    10.nomalDisplay()函数
      1.作用:将显示屏转为正常显示模式
      2.原型:void nomalDisplay(void);
    11.setBrightness()函数
      1.作用:设置显示屏亮度
      2.原型:void setBrightness(uint8_t);
    12.setPixel()函数
      1.作用:在显示屏上进行像素点设置
      2.void .setPixel(int16_t x,int16_t y);
      3.参数含义:像素点位置
    13.drawCircle()函数
      1.作用:在oled显示屏绘制一个圆形
      2.原型:void .drawCircle(int16_t x,int16_t y,int16_t radius);
      3.参数含义:1.int16_t x,int16_t y:圆心横纵坐标
                           2.int16_t radius圆的半径
    14.fillCircle()函数
      1.作用:在oled上填充一个圆形
      2.原型:void fillCircle(int16_t x,int16_t y,int16_t radius);
    15.drawCircleQuads()函数
      1.作用:绘制四个象限组成的圆形
      2.原型:void .drawCircleQuads(int16_t x,int16_t y,int16_t radius,uint8_t quads);
      3.参数含义:uint8_t quads:象限
    16.drawHorizontalLine()函数
      1.作用:在oled绘制一条水平线
      2.原型:void drawHorizontalLine(int16_t x,int16_t y,int16_t lenth);
      3.参数含义:int16_t lenth:长度
    17.drawVerticalLine()函数
      1.作用:在oled绘制一条垂直线
      2.原型:void drawVerticalLine(int16_t x,int16_t y,int16_t lenth);
      3.参数含义:1.int16_t x,int16_t y:起始坐标位置
                           2.int16_t lenth:长度
    18.drawLine()函数
      1.作用:绘制一条直线
      2.原型:void drawLine(int16_t x0,int16_t y0,int16_t x1,int16_t y1);
      3.参数含义:1.int16_t x0,int16_t y0:起始坐标
                           2.int16_t x1,int16_t y1:终点坐标
    19.drawRect()函数
      1.作用:在oled绘制一个矩形
      2.原型:void drawRect(int16_t x,int16_t y,int16_t width,int16_t height);
      3.参数含义:1.int16_t x,int16_t y:起始坐标
                           2.int16_t width,int16_t height:矩形宽度和高度
    20.fillRect()函数
      1.作用:填充一个矩形
      2.原型:void drawRect(int16_t x,int16_t y,int16_t width,int16_t height);
    21.drawProgressBar()函数
      1.作用:在oled绘制进度条
      2.原型:void drawProgressBar(int16_t x,int16_t y,int16_t width,int16_t height,uint8_t                                progress);
      3.参数含义:1.int16_t x,int16_t y:进度条左上角坐标
                           2.int16_t width,int16_t height:进度条宽度和高度
                           3.uint8_tprogress:进度条进度值
    22.setFont()函数
      1.作用:选择在oled字体
      2.原型:void setFont(const uint8_t *fontData);
    23.setTextAlignment()函数
      1.作用:选择oled文本对齐方式
      2.原型:void setTextAlignment(OELDDISPLAY_TEXT_ALIGENT textAlignment);
    24.drawString()函数
      1.作用:在oled绘制字符串
      2.原型:uint16_t drawString(int16_t c,int16_t y ,constString &text);
      3.参数含义:1.int16_t c,int16_t y:起始位置
                           2.constString &text:字符串内容
    25.drawStringMaxWidth()函数
      1.作用:指定字符串最大宽度
      2.原型:uint16_t drawStringMaxWidth(int16_t c,int16_t y ,constString &text);
    26.drawIcol16x16()函数
      1.作用:在oled上绘制16*16的图标
      2.原型:void drawIcol16x16(int16_t x,int16_t y,const uint8_t *ico,bool inverse=false);
      3.参数含义:1.int16_t x,int16_t:起始坐标
                           2.const uint8_t *ico:图标数据指针
                           3.bool inverse=false:是否反向显示
    27.drawXbm()函数
      1.作用:在oled上绘制xbm图形
      2.原型:void drawXbm(int16_t x,int16_t y,int16_t width,int16_t height,uint8_t  *xbm);
      3.参数含义:1.uint8_t  *xbm:对应图像数据
    28.drawFastImage()函数
      1.作用:在oled快速绘制图像
      2.原型:void drawFastImage(int16_t x,int16_t y,int16_t width,int16_t height,uint8_t  *image);
  4.ESP32屏幕
    引脚作用:
  • GND:电源地。

  • 3V3:3.3V电源正极。

  • CLK:SPI通信时钟信号

  • RST:复位引脚(低电平有效)
  • DC / RS:数据 / 命令选择引脚
  • CS:片选引脚(低电平有效)
  • MI / SO / MISO你要找的 SO 引脚,主设备输入 / 从设备输出
  • PEN1 / T_IRQ:触摸中断引脚
  • MOSI/SDA数据线主设备输出 / 从设备输入,ESP32 向屏幕发送显示数据
  • BLK/BL背光控制控制屏幕背光,可接 3.3V 常亮,或接 PWM 引脚实现亮度调节

22.SD卡实验

  1.简介:SPI 接口一般使用 4 条线通信,事实上只需 3 条线也可以进行 SPI 通信(单 向传输时),其中3 条为 SPI 总线(MISO、MOSI、SCLK),一条为 SPI 片选信号线(CS)。 ESP32 有 4 个硬件SPI 通道,其中 2 个已被内部使用,另外 2 个可供外部使 用,允许更高速率传输(到达80MHz)。也可以配置成任意引脚,但相关引脚要 符合输入输出的方向性。通过自定义引脚而非默认引脚,会降低传输速度,上限为40MHz。

  2.函数使用

    1.需安装ESP32-AnalogWrite-main.zip

      需引入#include<SPI.h>,#include<SD.h>头文件

    2.创建对象:SPIClass spi=SPIClass(HSPI(高速模式,需指定管脚和片选信号));

    3.spi.begin(SCK,MISO,MOSI,SS);函数

      1.作用:初始化spi管脚

      2.参数:可以指定任意引脚传参

    4.SD.begin函数

      1.作用:传递spi对象

      2.原型:SD.begin(SS,spi,80000000);

      3.参数含义:SS:片选信号线,spi:spi对象,80000000传输速度(80000000为上限)

    5.用文件库创建文件对象:File myFile;

    6.begin()函数

      1.作用:初始化SD卡

      2.原型:bool begin(uint8_t,ssPin=SS,SPIClass &spi=SPI,uint32_t frequency=4000000,constchar * mountpoint="/sd",uint8_t max_file=5,bool foramt_if_empty=false)

      3.参数含义:1.uint8_t,ssPin=SS:指定SD卡模块片选信号

                           2.SPIClass &spi=SPI:对象引用

                           3.uint32_t frequency=4000000:指定微控制器频率

                           4.constchar * mountpoint="/sd":指定SD卡在文件中的挂载点(把sd当根目录处                                 理)

                          5.uint8_t max_file=5,:SD卡可以同时打开最大文件数量

                         6.bool foramt_if_empty=false:当SD卡为空时是否进行格式化

    7.cardType()函数

      1.作用:获取SD卡类型

      2.原型:sdcard_type_t_cardType();

      3.返回值为sd卡类型(None,SDSC,SDHC,SDXC)

    8.cardSizse()函数

      1.作用:获取sd卡容量

      2.原型:uint64_t cardSize();(单位是字节)

    9.totalBytes()函数

      1.作用:获取sd卡总字节数

      2.uint64_t totalBytes()

    10.usedBytes()函数

      1.作用:获取已使用的字节数

      2.原型:uinit64_t usedBytes()

    11.open()函数

      1.作用:打开一个文件并以写入模式进行打开,若没有对应文件,则自动创建

      2.原型:File open(const charr* path,const char*mode=FILE_READ,const bool creat=false)

      3.参数含义:1.const charr* path:指定文件路径的字符串

                           2.const char*mode=FILE_READ:指定文件打开模式

                          3.const bool creat=false:是否创建新文件

    12.close()函数

      1.作用:关闭文件

      2.原型:void close();

    13.available()函数

      1.作用:在清理文件时检查文件是否有可读取的数据

      2.原型:int available()override;

23.wifi实验

  1.简介:ESP32 的 WIFI 有三种工作模式,分别为:AP,STA,AP 混合 STA。

    1.模式介绍:1.AP模式:AP,也就是无线接入点,是一个无线网络的创建者,是网络的中心节                                  点。一般家庭或办公室使用的无线路由器就一个 AP。 

                         2.STA模式:STA 是 Station 的简称,类似于无线终端,STA 本身并不接受无线的                              接入,它可以连接到 AP,简单来说就是和手机连接 WIFI 热点的工作状态相                                    同,可以连 接其它的热点。

                           3.AP+STA 模式:了解了前两个概念,AP 混合 STA 模式就不难理解了,就是既                               可以连接到其它 的 WIFI 热点,也可以让别的无线终端连接,这两个过程能同                                 时进行。

  2.函数使用

    1.需引入:#include <WIFI.h>头文件

    2.设置WIFI工作模式的函数

      1.原型:static bool mode(wifi_mode_t)

      2.参数含义:模式

      3.参数类型

    2.获取WIFI工作模式

      1.原型:static wifi_mode_t getMode();

    3.使能STA/AP模式函数

      1.原型:bool enableSTA(bool enable);

                   bool enableAP(bool enable);

    4.使能WIFI休眠函数

      1.原型:bool setSleep(bool enabled);

    5.使用AP模式相关API

      1.AP热点建立函数

        1.原型:bool softAP(const char* ssid,const chat*passphrase=NULL,int channel=1,int ssid_hidden=0,int max_connection=4,bool ftm_responder=false);

        2.参数含义:1.onst char* ssid,const chat*passphrase=NULL:账号和密码

                           2.int channel=1:指定AP的工作信道(1-13)

                           3.int ssid_hidden=0:AP是否隐藏账号(隐藏值为1)

                           4.int max_connection=4:设置WIFI同时连接的最大数量

                           5.bool ftm_responder=false:设置ftm响应器是否启动

      3.配置AP热点函数

        1.原型:bool softAPConfig(IPAddress local_ip,IPAddress gateway,IPAddress subnet,IPAddress dhcp_lease_start=(uint32_t)0)

        2.参数含义:1.IPAddress local_ip:地址

                            2.IPAddress gateway:网关

                            3.IPAddress subnet:子网掩码

                            4.IPAddress dhcp_lease_start=(uint32_t)0:dhcp(默认值为0)

      4.断开AP热点函数

        1.原型:bool softAPdisconnect(bool wifioff=false)

        2.参数含义:true为断开连接,且关闭WIFI模块,false仅会关闭连接

      5.设置主机名称函数

        1.原型:bool softAPsetHostname(const chae *hostname)

    6.STA模式相关API

      1.开始WIFI连接函数

        1.原型:wl_status_t begin(char *ssid, char *passphrase=NULL,int32_t channel=0,const uint8_t*bssid=NULL,bool connect=true)

        2.参数含义:1.char *ssid, char *passphrase=NULL:账号和密码

                             2.,int32_t channel=0,:指定对应信道

                            3.,const uint8_t*bssid=NULL:基本服务及标识符

                            4.bool connect=true:尝试连接网络

      2.WIFI配置函数

        1.原型:bool config(IPAddress lozal_ip,IPAddress getaway,IPAddress subnet,IPAddress dnsl=(uint32_t)0x00000000,IPAddress dns2=(uint32_t)0x00000000)

        2.参数含义:1.IPAddress lozal_ip,IPAddress getaway,IPAddress subnet:ip地址,网关,                                  子网掩码

                             2.IPAddress dnsl=(uint32_t)0x00000000,IPAddress dns2=(uint32_t)0x00000000:dns服务器地址,省略则使用默认服务器

      3.WIFI关闭和重新连接函数

        1.原型:bool reconnect();-->重新连接

                     bool disconnect(bool wifioff=false,bool eraseap=false)-->断开连接

        2.参数含义:1.bool wifioff:true会关闭连接同时退出WIFI模块,false尽管比模块

                             2. bool eraseap:true为断开连接同时清楚AP,省略或false仅清楚配置

      4.自动连接和自动重连函数

         1.原型:bool setAutoConnect(bool autoConnect)

                      bool setAutoReconnect(bool autoReconnect)

        2.参数含义:若设置为true,启动时esp32会自动连接到已知网络

      5.获取连接状态函数

        1.原型:static wl_status_t status();

        2.联网状态

    7.WIFIServer相关API

      1.通过WiFiServer.server(80);创建对象(括号内为端口)用于处理来自客户端的连接请求以及           与客户端的数据交互

      2.可通过server.begin()来启动服务器

      3.可通过server.available()来检查是否有新的客户端连接,若有新客户端连接,调用此方法后会返回一个客户端对象,通过WiFiClient接收

      4.启动服务器函数

        1.原型:void begin(uint16_t port=0)

        2.参数含义:指定监听端口

      5.检查客户端有无连接函数

        1.原型:WiFiClient available();

        2.注:有无客户端会返回一个对象,通过WiFiClient接收(有返回true,无返回false)

      6.WiFiClient相关API(可在esp32创建一个客户端,可连接到其它网络,并通过该网络与其他设备进行通信)

        1.检查客户端连接成功函数

          1.原型:uint8_t connected();

          2.返回0则为连接成功,否则为1

        2.检查可用数据量函数(在连接后有没有数据传输,有数据则返回对应字节数)

          1.原型:int available();

        3.读取数据函数

          1.原型:int read();

          2.作用:读取到数据返回下一个字节,若无可读数据则返回-1

24.蓝牙实验

  1.简介:经典蓝牙我们一般说的是 BT,低功耗蓝牙一般说成 BLE。当设备支持蓝牙 4.0 时,还                    得进一步确认设备是支持 BT 单模、BLE 单模还是 BT 和 BLE 都支持的双模。

  2.分类

    1.低功耗蓝牙(BLE):支持蓝牙协议 4.0 或更高的模块。主打低功耗,多用于物联网类型

    2.经典蓝牙(BT):指支持蓝牙协议在 4.0 以下的模块。主打短距离数据高速传 输,多用于蓝                                      牙耳机等。

      1.经典蓝牙可再细分为:传统蓝牙和高速蓝牙。

        ·传统蓝牙:2004 年推出,蓝牙 2.0/2.1 协议。

       ·高速蓝牙:2009 年推出,蓝牙 3.0 协议,速率提高到约 24Mbps,是传统 蓝牙模块的八倍。
    3.双模蓝牙:即兼容 BLE 和 BT,如手机,使用分时机制来达到同时与低功耗蓝牙和经典蓝牙                             设备通信
  3.蓝牙技术:蓝牙协议包括两种技术:Basic Rate(BR) 和 Low Energy(LE)。
      1.Basic Rate 又包括可选的 EDR(Enhanced Data Rate)技术,以及交替使用的                            (Alternate)的 MAC(Media Access Control)层和 PHY 层扩展(简称 AMP)。
      2.在蓝牙 4.0 及后面规格中,SIG 定义了四种蓝牙技术:BR,EDR,AMP 和 LE,由于 LE 是           2010 年才提出的,比较新,所以人们把之前的 BR/EDR/AMP 技术称之为经典蓝牙。
        1.经典蓝牙:·BR(Basic Rate): 蓝牙基础速率技术。
                             ·EDR(Enhanced Data Rate) : 蓝牙增强速率技术。
                             ·AMP (Alternate MAC/PHYs): 蓝牙核心系统的次要控制器,可切换的媒体
                              访问控制器(Media Access Controller)和物理层(Physical Layer)。
        2.低功耗蓝牙:·LE(Low Energy): 蓝牙低功耗技术。
        注意事项:1.EDR 是在 BR 技术基础上升级,所以两者可以同时使用。但是 AMP 技术是使                               用的 802.11(WIFI)规范,所以和原有的技术差异过大,所以 BR/EDR 和 AMP                             只能二选一进行使用。
                          2.LE 技术相比 BR 技术,差异非常大,可以说就是两种不同的技术。经典蓝牙和                               低功耗蓝牙两者物理层调制解调方式是不一样的,所以低功耗蓝牙设备和经典
                             蓝牙设备两者之间是不能相互通信的。
  4.函数使用
    1.BT蓝牙使用   
      1.需引入:#include"BluetoothSerial.h"
      2.通过类创建对象BluetoothSerial SerialBT创建一个蓝牙串口
      3.SerialBT.begin():开启蓝牙
      4.SerialBT.available():返回蓝牙串口缓冲区中当前剩余的字符个数
      5.SerialBT.print():蓝牙串口发送的是字符
      6.SerialBT.write():蓝牙串口发送到字节
      7.SerialBT.read():返回蓝牙串口接收的字符
    2.BLE蓝牙使用:
      1.需引入#include<BLEDevice.h>,#include<BLEServer.h>,#include <BLEUtils.h>,
          #include <BLE2902.h>头文件
      2.GATT协议:GATT 全称 Generic Attribute Profile, GATT 代表通用属性,它定义了暴露给连                                 接的 BLE 设备的分层数据结构。这意味着,GATT 定义了两个 BLE 设备,发送                               和接收标准通讯的方式。
      1.UUID:ble 的服务和 characteristic 是通过 UUID 来进行识别的。创建 uuid
可以使用这么一个网站:Online UUID Generator Tool。
      2.notify:如果这个主机的一个特征值 characteristic 发生改变,就可以通
过 notify 来告诉我们
    3.创建BLE服务器代码流程
      
      1、初始化 BLE 设备:首先需要初始化 BLE 设备,这通常包括配置设备的蓝
牙硬件和相关参数,以便能够与外部设备进行通信。
      2、创建 BLE 服务器:使用 BLEDevice 类创建 BLE 服务器对象,例如 pServer
= BLEDevice::createServer();
       3、设置回调函数:通过调用 pServer->setCallbacks(new
MyServerCallbacks()),可以设置一个回调函数来处理服务器上发生的各种事
件,例如连接、断开连接、收到数据等。
      4、创建 BLE 服务:使用 pServer->createService(SERVICE_UUID)创建一个
新的 BLE 服务,并指定服务的 UUID。UUID 是在广播时用于识别服务的唯一标识符
      5、配置服务和特征:在创建服务之后,需要配置服务和特征,以便外部设
备能够正确地与服务器进行通信。这通常包括设置服务和特征的 UUID、数据长
度、数据类型等。
      6、开始广播:通过调用 pServer->start()开始广播,使外部设备能够发现
并连接到服务器。
      7、处理连接和数据传输:一旦有外部设备连接到服务器,回调函数将被调
用以处理连接和数据传输。在回调函数中,可以处理接收到的数据、发送数据等
操作。
      8、停止广播和清理资源:当服务器不再需要时,应该停止广播并释放相关
资源,例如删除回调对象等
    3.函数使用
      1.创建一个BLE设备:BLEDevice::init (ble_name)-->参数含义:设备名称
      2.创建一个BLE服务
        1.原型:pServer=BLEDvice::createServer();
                      pServer-->setCallbacks(new MyServerCallbacks());
                      BLEService *pService=pSerrver-->createService(SERVICE_UUID);
      3.创建一个BLE特征
        1.原型:
pTxCharacteristic = pService->createCharacteristic(CHARACTERISTIC_UUID_TX,
BLECharacteristic::PROPERTY_NOTIFY);
pTxCharacteristic->addDescriptor(new BLE2902());
BLECharacteristic *pRxCharacteristic =
pService->createCharacteristic(CHARACTERISTIC_UUID_RX,
BLECharacteristic::PROPERTY_WRITE);
pRxCharacteristic->setCallbacks(new MyCallbacks()); 
      4.开始服务和广播
        1.原型:pService-->start();
                     pServer-->getAdvertising()-->start();
                     Serial.println("等待一个客户端连接,且发送通知")
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐