从今天开始,我们一点点的学习ESP12系列的使用。从基础开始,到提高,到网络应用,到实例。过程可能有些枯燥,但是耐下性子学,肯定会有收获。而且有了arduino的基础,学习这些都不难。限于篇幅,我们只讲与arduino不同的地方。 今天我们先来学习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。 |
|