Arduino第零弹(一):部分常用库函数整理

网友投稿 2019-09-29 13:40

本文说明

注,本文部分内容源自:

https://www.arduino.cc/reference/en/#functions

并进行了一定量的简化。如有兴趣可参考原网页。

简介本文是小车或者智能家居验证性项目常用的一些函数。尽管不全,但很实用。

输入输出

digitalRead(int pinNum):

①功能:读取pinNum引脚上的电平高或者低,返回值为1或者0,分别代表高和低。

②引脚:任何IO口都支持这个函数。

注意:对这类“要求很低”的函数,尽可能使用没有其他功能的IO口,以减少对其他宝贵资源,如串口、IIC的占用。

analogRead(int pinNum):

①功能:读取pinNum号引脚上电压的高低,返回值为将5V分成1023份中的0~1023,0代表0V,1023代表5V。

②引脚:一般而言,只有以A开头的引脚才支持这个功能。对于Arduino Mega,是A0-A15十六个引脚。

digitalWrite(pin,value);

①功能:将pin号引脚的电平置为Value(HIGH或者LOW,也可以分别用1和0替代这两个单词,分别代表高和低。)。

②引脚:任何一个IO口均支持。

analogWrite(pin,value)

①功能:在pin号引脚上发出占空比为256分之value的PWM(脉冲宽度调制)波。比如value=127的时候,占空比差不多为50%。这样,电压有效值应该是2.5V。

②引脚:对于ArduinoMega2560,2-13号标有“PWM”字样,支持PWM输出;另有44,45,46三个引脚也是支持PWM输出的。

第一节的小问号:

1、我尝试将Arduino正在发出PWM波的引脚接到模拟引脚A0上,代码是这样的(未给出setup函数):

void loop(){

AnalogWrite(6,127);

while(1){

    a=AnalogRead(A0);

    Serial.println(a);

    delay(20);

    }

}

为什么我的串口监视器里面出现的是一堆0和1023,而不是512附近的数?(虽然这个问题有些沙雕,但是,谁试谁知道……)

2、为什么我只让1中analogWrite执行了一次,而后面的死循环中,也还是能检测的到高低电平的变化?难道,不断高-低-高-低的变化,是无需处理器干预,一旦设定占空比,便可以自动执行的吗?

3、analogWrite()可以设定占空比,那么可以设定PWM波形的频率吗?

答案:1、略 2、是 

3、Arduino不支持通过库函数设定,如有需求,则需进行寄存器操作。

第二部分:时间篇delay(t)

①作用:延时t毫秒

delayMicroSeconds(t)

①作用:延时t微秒

millis()

①作用:获取开发板自上电或重启*以来所经历的毫秒数。返回值为一个整数。

②提示:建议使用long或者unsigned long接收——假若使用int型,则32秒后即溢出,很可能造成系统瘫痪。(Arduino上int型数据的长度为2Byte,亦即16位,范围是-32768~32767。)

micros()

①作用:获取开发板自上电或者重启以来所经历的微秒数,返回值为一个整数。

②提示:一定要用long或者unsigned long 接受返回值。如果用int的话,这个函数近似于一个-32768~32767之间的随机数生成器。

pulseIn(pin,value,timeout=1)

①作用:获取某个引脚pin上脉冲的时间(微秒),返回值为整数。pin为引脚号,value为引脚上电平高或低,timeout为超时,默认为1秒。假如一秒内没有任何电平变化,则返回0。

②提示:对任何一个引脚均可使用这个函数。具体安排执行这个函数的引脚时,请遵循“digitalRead”这个函数下所述的原则。

③文字表达:这个函数的名字被广为诟病,原因是倒数第二个字母是大写的“i”。很多人第一次写的时候,会不小心把倒数第二位写成小写“L”。(幸而Arduino IDE会对它语法高亮)。

*:对于一般的Arduino开发板,上电、烧录程序或者打开串口监视器,都会引起重启,即从头开始执行程序。

第二部分聪明小屋:1、某Arduino程序中有全局变量a:

int a=0;

void setup(){

Serial.begin(9600);

}

void loop(){

a=a+1;

delay(1000);

Serial.println(a);

}

假如我们在串口监视器中看到a=15出现时,时间过去了多少秒?如果此时切断Arduino的电源,再一次上电,那么串口监视器中第一次打印出的a值等于多少?

答案:15秒;a等于1。

解析:所有变量除非写进EEPROM或SD卡(SD卡需要外接扩展模块)中,否则重启时均会丢失。

第三部分:串口通信

串口是一个C++对象,print等,都是对象的方法。

Serial.begin(baud)

①以baud的波特率开始串口通信。这个方法多用在setup函数里,在程序的一开始执行。

Serial.print(a)

Serial.println(a)

①作用:a可以是整数,浮点数,字母或者字符串。后者的意思是打印出内容之后自动换行,前者不换行。

②文字表达:"println"的倒数第二位是小写“L”,不是大写“i”。

Serial.read()

①作用:从串口缓冲区读取一个字符。返回值为char

Serial.available()

①作用:判断串口缓冲区有没有内容。返回值为0(没有)或者1(有)。

Serial.parseInt()

Serial.parseFloat()

①作用:分别将串口缓冲区中的字符串中的第一个整数或者浮点数提取出来。返回值分别为整数和浮点数。

第三章思考题

Arduino Mega2560除了Serial以外还有Serial1,Serial2,Serial3三个串口。这些串口也可以使用以上方法吗?

答案:是。使用方法与Serial完全一致。见下图:

https://cdn.china-scratch.com/timg/191001/1340442057-0.jpg

<全文完>

--end--

声明:本文章由网友投稿作为教育分享用途,如有侵权原作者可通过邮件及时和我们联系删除:freemanzk@qq.com