adc arduino 电压基准_ESP 12系列arduino环境开发基础

发布于:2021-09-20 12:34:13

从今天开始,我们一点点的学*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

相关推荐

最新更新

猜你喜欢