今天我们先来学习ESP12系列的基础功能和应用。
中断功能
基于ESP8266的NodeMcu的数字IO的中断功能是通过attachInterrupt,detachInterrupt函数所支持的。除了D0/GPIO16,中断可以绑定到任意GPIO的引脚上。所支持的标准中断类型有:CHANGE(改变沿,电平从低到高或者从高到低)、RISING(上升沿,电平从低到高)、FALLING(下降沿,电平从高到低)。

1.attachInterrupt() 该功能用于在将指定引脚设置为响应中断。
函数: attachInterrupt(pin, function, mode);
参数:
pin:要设置中断的端口编号,注意,这里不是引脚编号。
function:中断发生时运行的函数, 这个函数不带任何参数,不返回任何内容。
Interrupt type/mode:它定义中断被触发的条件方式。
CHANGE:改变沿,引脚电平从低变为高或者从高变为低时触发中断。
RISING:上升沿,引脚电平从低变为高时触发中断。
FALLING:下降沿,引脚电平从高变为低时触发中断。
返回值: 无;
2.detachInterrupt() 该功能用于禁用指定GPIO引脚上的中断。
函数: detachInterrupt(pin)
参数:
pin:要禁用的中断的GPIO引脚。
返回值: 无;
3.digitalPinToInterrupt() 该功能用于获取指定GPIO引脚的中断号。
函数: digitalPinToInterrupt(pin)
参数:
pin:要获取中断号的GPIO引脚。
void setup() { Serial.begin(115200);//设置串口波特率 attachInterrupt(digitalPinToInterrupt(D2), InterruptFunc, RISING);//设置中断号、响应函数、触发方式 } void loop() { } / 中断响应函数 / void InterruptFunc(){ Serial.println(\"Hello ESP8266\"); }
模拟输入(ADC)
1.测量外部电压:analogRead(A0),用于读取施加在模块的ADC引脚上的外部电压;
输入电压范围:0 - 1.0V之间;
测量精度:由于ADC具有10位分辨率,因此会给出0-1023的值范围;
注意点: 为了支持外部电压范围(0-3.3v),NodeMcu做了一个电阻分压器,如图所示:
编写一个读取NodeMcu的ADC引脚上的模拟电压。我们这里使用电位器在ADC引脚上提供0-3.3V的可变电压。如下图连接线:
void setup() { Serial.begin(115200);//配置波特率}void loop() { Serial.print(\"ADC Value: \"); Serial.println(analogRead(A0));//输出0-1023 对应 外部输入电压 0-1.0v //延时1s delay(1000);}
2 测量系统电压
ESP.getVcc(),读取NodeMCU模块的VCC电压,单位是mV;
注意点
ADC引脚必须保持悬空;在读取VCC电源电压之前,应更改ADC模式以读取系统电压。
在#include行后面使用ADC_MODE(mode)
模式是ADC_TOUT(对于外部电压),ADC_VCC(对于系统电压)。默认情况下,它读取外部电压。
例程
编写ESP8266读取系统电压,代码如下:
ADC_MODE(ADC_VCC);//设置ADC模式为读取系统电压void setup() { Serial.begin(115200);}void loop() { Serial.print(\"ESP8266当前系统电压(mV): \"); Serial.println(ESP.getVcc()); delay(1000);}
模拟输出(PWM)
NodeMcu PWM引脚:基本上数字IO都可以作为PWM复用引脚,除了D0。不过需要注意的是,D3尽量不用,它内部连接ESP8266 GPIO0。
NodeMcu PWM有关Arduino函数
1.analogWrite()不解释
2.analogWriteRange() 该功能用于改变PWMRANGE数值。可以理解为PWM精度范围。同样的PWM频率下,默认占空数值0-123。如果你改变PWMRANGE为2047,那么占空数值就变成0-2047。精度高了一倍。
函数: analogWriteRange(new_range)
analogWriteFreq()该功能用于改变PWM频率。默认是1kHZ。可控PWM频率范围应该是100Hz-40KHz。
函数: analogWriteFreq(new_frequency)
串口通信(Serial)
NodeMcu上有两组串口,Serial和Serial1。Serial使用UART0,默认对应引脚是GPIO1(TX)和GPIO3(RX)。在Serial.begin执行之后,调用Serial.swap()可以将Serial重新映射到GPIO15(TX)和GPIO13(RX)。再次调用Serial.swap()将Serial重新映射回GPIO1和GPIO3。不过,一般情况下,默认就好。
void setup() { // 这里开始写初始化代码,只会执行一次 Serial.begin(115200); Serial.println(\"GPIO1(TX),GPIO3(RX)\"); //调用映射方法 Serial.swap(); Serial.println(\"GPIO15(TX),GPIO13(RX)\"); //重新映射回来 Serial.swap(); Serial.println(\"GPIO1(TX),GPIO3(RX)\");}void loop() { //这里写运行代码,重复执行}
Serial1使用UART1,默认对应引脚是GPIO2(TX)。Serial1不能用于接收数据,因为它的RX引脚被用于flash芯片连接。要使用Serial1,请调用Serial.begin(baudrate)。代码如下:
void setup() { // 这里开始写初始化代码,只会执行一次 Serial.begin(115200); Serial.println(\"Hello Serial\"); Serial1.begin(115200); Serial1.println(\"Hello Serial1\");}void loop() { //这里写运行代码,重复执行}
如果不使用Serial1并且不映射串口,可以将UART0的TX映射到GPIO2,具体操作是:在Serial.begin()之后调用Serial.set_tx(2)或者直接调用Serial.begin(baud,config,mode,2)。
默认情况下,当调用Serial.begin后,将禁用WiFi库的诊断输出。要想再次启动调试输出,请调用Serial.setDebugOutput(true)。要将调试输出映射到Serial1时,需要调用Serial1.setDebugOutput(true)。
调用Serial.setRxBufferSize(size_t size)允许定义接收缓冲区的大小,默认值是256(缓冲区也是使用内存,意味着不能一味地去增大这个值)。
Serial和Serial1对象都支持5,6,7,8个数据位,奇数(O)、偶数(E)和无(N)奇偶校验,以及1或者2个停止位。要设置所需的模式,请调用Serial.begin(baudrate, SERIAL_8N1), Serial.begin(baudrate, SERIAL_6E2)等。
Serial和Serial1都实现了一种新方法用来获取当前的波特率设置。要获取当前的波特率,请调用Serial.baudRate(),Serial1.baudRate()。代码如下:
void setup() { // 这里开始写初始化代码,只会执行一次 // 设置当前波特率为57600 Serial.begin(57600); // 获取当前波特率 int br = Serial.baudRate(); // 将打印 \"Serial is 57600 bps\" Serial.printf(\"Serial is %d bps\", br);}void loop() { //这里写运行代码,重复执行}
Serial和Serial1都属于硬件串口(HardwareSerial)的实例,如果读者需要使用ESP8266 软件串口的功能,请参考以下库:https://github.com/plerup/espsoftwareserial。