NodeMCU ESP8266 外设的 Arduino API 接口介绍
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++ 的
new
和delete
运算符绝不能在 ISR 中使用。他们的调用路径不在 IRAM 中。
数字IO
Arduino 中的引脚编号直接对应于 ESP8266 GPIO 引脚编号。
pinMode
、digitalRead
、 和digitalWrite
函数可以工作;
如果要读取 GPIO2
,就可以调用digitalRead(2)
;数字引脚 0—15 可以是INPUT
、OUTPUT
、 或INPUT_PULLUP
。
引脚 16 可以是INPUT
,OUTPUT
或INPUT_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_DRAINOUTPUTanalogWriteFreq(new_frequency)
:PWM 频率默认为 1K 赫兹,这个函数可以更改频率。有效值从 100Hz 到 40000Hz。
注意:如果没有硬件PWM,PWM输出是通过软件实现的。1 个 40KHz 的 PWM 输出,CPU 的负载已经相当大了。
使用的 PWM 输出越多,其频率越高,就越接近 CPU 限制,导致可用于主函数执行的 CPU 资源就越少。
延时
millis()
和micros()
分别返回复位后经过的毫秒数和微秒数。delay(ms)
将系统延时给定的毫秒数,但是允许WiFi
和TCP/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接口,在这里可以简单了解一下,后面章节会深入进行介绍。
由于作者能力有限,文章中难免存在错误和纰漏,请大胆指正,如果对于文章中存在疑惑或者问题,欢迎在评论区进行留言。
如果文章帮到了你,请帮忙点赞,三连支持👍👍👍。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!