NodeMCU ESP8266 外设的 Arduino API 接口介绍

2023-12-13 13:26:25

NodeMCU ESP8266 外设的 Arduino API 接口介绍

前言

Arduino在硬件上做了相应的封装,新的硬件需要兼容Arduino的接口。比如NodeMCU ESP8266的底层硬件做一次封装,对用户需要开放出来规定好的接口。

下面Arduino的官方接口;

/**
	地址如下:
*/
https://www.arduino.cc/reference/en/

在这里插入图片描述

本文简单介绍一下ESP8266 Arduino Core库,相应拆分为几个常用的模块;

  • Interrupts:中断;
  • Digital IO :数字IO;
  • Analog input:模拟输入;
  • Analog output:模拟输出;
  • Timing and delays:定时和延迟;
  • Serial:串口;

下面我们进一步介绍。

模块

中断

ESP8266上使用中断,但必须谨慎使用,并且有几个限制:

  • 中断回调函数必须位于 IRAM 中,因为它们发生时闪存可能正在执行其他操作。IRAM_ATTR通过在函数定义上添加属性来完成此操作。如果此属性不存在,则草图在尝试执行此操作时将会崩溃 attachInterrupt并显示错误消息。
IRAM_ATTR void gpio_change_handler(void *data) {...
  • 中断不得调用delay()yield(),或调用任何内部使用delay()的例程yield()

  • 中断中长时间运行(>1ms)的任务会导致不稳定或崩溃。

  • 如果中断被长时间运行的中断阻止,WiFi 和核心的其他部分可能会变得不稳定。

  • 堆 API 操作可能很危险,应在中断中避免。

  • 应尽量减少对 的调用malloc,因为如果内存碎片,它们可能需要很长的运行时间。

  • C++ 的 newdelete运算符绝不能在 ISR 中使用。他们的调用路径不在 IRAM 中。

数字IO

Arduino 中的引脚编号直接对应于 ESP8266 GPIO 引脚编号。
pinModedigitalRead、 和digitalWrite函数可以工作;

如果要读取 GPIO2,就可以调用digitalRead(2);数字引脚 0—15 可以是INPUTOUTPUT、 或INPUT_PULLUP

引脚 16 可以是INPUT,OUTPUTINPUT_PULLDOWN_16

启动时,引脚配置为INPUT。

引脚还可以用于其他功能,例如串行、I2C、SPI。

这些功能通常由相应的库激活。下图显示了流行的 ESP-12 模块的引脚映射。


数字引脚 6-11 未在此图中显示,因为它们用于连接大多数模块上的闪存芯片。尝试将这些引脚用作 IO 可能会导致程序崩溃。

请注意,某些板和模块(ESP-12ED、NodeMCU 1.0)也会断开引脚 9 和 11。如果闪存芯片工作在 DIO 模式(与默认的 QIO 模式相反),则这些引脚可用作 IO。

attachInterrupt通过, 函数支持引脚中断detachInterrupt。中断可以附加到除 GPIO16 之外的任何 GPIO 引脚。支持标准 Arduino 中断类型: CHANGE、RISING、FALLING。ISR 需要位于 IRAM_ATTR函数定义之前。

模拟输入

ESP8266 有一个可供用户使用的 ADC 通道,即模数转换器,将模拟信号转换成数字信号。
具体的作用如下;

  • 可用于读取 ADC 引脚的电压,或读取模块电源电压 (VCC);
  • 要读取施加到 ADC 引脚的外部电压,请使用analogRead(A0)

ESP8266 的输入电压范围为 0~1.0V,但有些开发板板可能会在硬件上增加分压电路,从而增大测量范围。

为了安全起见,可以测试<1.0V的输入电压;

例如,因为10 bit精度的ADC,范围是0~1024,1024是2的10次幂,可以计算读取数值的大小反推输入电压的量程;

  • 那么测量0.5V电压,ADC会读取到 512 左右的值,则最大电压很可能为 1.0V,而 3.3V 可能会损害 ESP8266;

  • 如果测量0.5V电压,大约读取到 150 左右的值,则表明最大可以测量电压为 3.3V;

要读取VCC电压,使用ESP.getVcc()ADC引脚必须保持断开状态。

此外,必须将以下行添加到主程序中:

ADC_MODE(ADC_VCC);

注意:
调用analogRead()过于频繁会导致 WiFi 停止工作。
当 WiFi 运行时,analogRead()调用的有效结果可能会被缓存至少 5 毫秒。

模拟输出

analogWrite(pin, value)在给定引脚上启用软件 PWM。PWM 可用于引脚 0 至 16。调用以禁用引脚上的 PWM。

  • analogWrite(pin, value) :value范围可能是 0 到 255(这是 Arduino 的默认值);
  • analogWriteRange(new_range):可以通过调用或 来 更改 PWM 范围,new_range可能是从 15~65535
  • analogWriteResolution(bits):或bits可能是从 4~16
  • analogWriteMode(pin, value, openDrain):OUTPUT_OPEN_DRAINOUTPUT
  • analogWriteFreq(new_frequency):PWM 频率默认为 1K 赫兹,这个函数可以更改频率。有效值从 100Hz 到 40000Hz。

注意:如果没有硬件PWM,PWM输出是通过软件实现的。1 个 40KHz 的 PWM 输出,CPU 的负载已经相当大了。
使用的 PWM 输出越多,其频率越高,就越接近 CPU 限制,导致可用于主函数执行的 CPU 资源就越少。

延时

  • millis()micros()分别返回复位后经过的毫秒数和微秒数。
  • delay(ms)将系统延时给定的毫秒数,但是允许 WiFiTCP/IP 任务后台运行。
  • delayMicroseconds(us)将系统暂停给定的微秒数。

注意:当WiFi 连接时,除了主程序之外,芯片上还需要运行很多代码。
如果我们的程序中某处有一个循环,在不调用delay的情况下,需要花费大量时间(>50ms),我们可以考虑调用delay函数,以保证 WiFi 堆栈可以顺利运行。

  • delay(0)yield()函数等效 。

  • delayMicroseconds 该函数不会让出其他任务,因此不建议将其用于延迟超过 20 毫秒的情况。

串口

ESP8266 中 Serial对象的工作方式与常规 Arduino 上的工作方式非常相似。

  • 额外硬件 FIFO(128 字节用于 TX 和 RX);
  • 额外的可定制 256 字节 RX 缓冲区;

我们可以更改该软件缓冲区的大小。

setRxBufferSize(size_t size)函数可以设置我们所需的RX缓冲区大小;

在更高的接收速度下建议使用更大的缓冲区空间;

通常串口的使用如下的程序;

// Set Baud rate to 57600
Serial.begin(57600);

// Get current baud rate
int br = Serial.baudRate();

// Will print "Serial is 57600 bps"
Serial.printf("Serial is %d bps", br);

这个后面我们还会详细介绍。

总结

本文介绍了NodeMCU ESP8266外设的常用API接口,在这里可以简单了解一下,后面章节会深入进行介绍。

由于作者能力有限,文章中难免存在错误和纰漏,请大胆指正,如果对于文章中存在疑惑或者问题,欢迎在评论区进行留言。

如果文章帮到了你,请帮忙点赞,三连支持👍👍👍。

文章来源:https://blog.csdn.net/u010632165/article/details/133637124
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。