Arduino第零弹(一):部分常用库函数整理
本文说明
注,本文部分内容源自:
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完全一致。见下图:
<全文完>
--end--
声明:本文章由网友投稿作为教育分享用途,如有侵权原作者可通过邮件及时和我们联系删除:freemanzk@qq.com