计算机‎ > ‎软件‎ > ‎Linux‎ > ‎

Arduino 闪烁 LED 程序解释

发布者:guo rue,发布时间:2016年3月23日 下午11:43   [ 更新时间:2016年3月24日 上午12:08 ]
int ledPin=10; //设定控制LED的数字IO脚
void setup()
{
    pinMode(ledPin,OUTPUT);//设定数字IO口的模式,OUTPUT 为输出
}
void loop()
{  
    digitalWrite(ledPin,HIGH); //设定PIN8脚为HIGH = 5V左右
    delay(1000); //设定延时时间,1000 = 1秒
    digitalWrite(ledPin,LOW); //设定PIN8脚为LOW = 0V
    delay(1000); //设定延时时间,1000 = 1秒

// 之后的文字为注释。
另外一种注释方法是这样的 /*注释文字*/

这一行就是变量声明
int ledPin=10;
变量是用来存储数据的。

int 为变量类型
int 型变量,又称为整形变量,可以表示一个 -32768 到 32767 之间的数。
还有其他很多变量类型,使用什么样的变量类型是由你存储的内容来决定的。
这里存储的是 10 这个整数。所以用 int。

ledPin 为变量名
变量名字可以随便取得,但是为了符合约定俗成的规则一般用英文单词或者英文单词缩写,有多个类似的变量名的时候可以在 英文单词或者英文单词缩写 后面加数字 1234567890 来区分。一般老司机都会建议你变量名根据变量的功能来定名。
ledPin 这里说明,这个变量表示 LED 和 Arduino 的数字引脚 10 相连。

在声明的最后用一个“;”来表示这句语句的结束。
分号必不可少!
必须切换到英文输入法中的分号。

接下来是 setup() 函数:
void setup() {}

void 无返回值函数
() 空括号
在这个程序里有两个函数,一个叫做 setup,它的目的主要的 loop 函数运行之前为程序做必要的设置。
在 Arduino 中程序运行时将首先调用 setup() 函数。用于初始化变量、设置针脚的输出/输入类型、配置串口等等。
每次 Arduino 上电或重启后,setup 函数只运行一次。
函数内部被花括号括起来的部分将会被依次执行,从“ { ”开始,“ } ”结束。两个符号之间的语句都属于这个函数。

setup() 函数内只有一条语句,那就是 pinMode 函数
pinMode(ledPin, OUTPUT);
这个函数是用来设置 Arduino 数字引脚的模式的,只用于数字引脚定义是输入(INPUT)还是输出(OUTPUT)。在函数的括号内包含两个参数,引脚号以及引脚的模式。

函数格式如下:
pinMode(pin,mode);

pin 引脚号
mode 模式 (OUTPUT/INPUT)

pinMode 就是一个函数的调用,只是这个函数已经在 Arduino 软件内部编写好了,所以我们也只需直接调用就可以了。
在函数的括号内包含两个参数,就是需设定引脚号及引脚的模式,引脚号是 ledPin ,在我们程序的第一句话就声明过了,ledPin 代表 10,之后用到 ledPin 的地方,都可以理解为 10 的代名词。
这条语句想告诉 Arduino ,数字引脚 10 被设置为 OUTPUT 模式。

接着往下看,程序现在进行到我们的主函数 loop():
void loop() {
digitalWrite(ledPin,HIGH);
delay(1000);
digitalWrite(ledPin,LOW);
delay(1000);
}

Arduino 程序必须包含 setup() 和 loop() 两个函数,否则不能正常工作。在 setup() 函数中初始化和定义了变量后,就开始执行 loop() 函数。

loop 顾名思义,该函数在程序运行过程中不断的循环,loop() 函数中的每条语句都逐次进行,直到函数的最后,然后再从 loop 函数的第一条语句再次开始,三次、四次......一直这样循环下去,直到关闭 Arduino 或者按下重启按钮。

loop()函数内的第一条语句,涉及到了另外一个函数 digitalWrite()
digitalWrite(ledPin,HIGH);

digitalWrite(pin,value);

pin 引脚号
value 值 HIGH/LOW

这个函数的意义是:
引脚 pin 在 pinMode() 的中被设置为 OUTPUT 模式时,其电压将被设置为相应的值,HIGH 为 5V(3.3V控制板上为3.3V),LOW为0V。
我们这里就是给引脚 10(ledPin) 一个 5V 的高电平,点亮了引脚 10 这个LED。
这里 pinMode() 被设置为 OUTPUT 时,才用到 digitalWrite()。这是为什么呢?

pinMode()
digitalWrite()
digitalRead()
的关系

前面说了pinMode()中的INPUT与OUTPUT设置是有讲究的,是由器件本身的功能决定的。然而,前面设置INPUT和OUTPUT与之后程序需要如何执行也有着紧密关系的。既然pin是OUTPUT的话,那势必是控制器Arduino要给外界信号,所以需要Arduino给引脚先写入信号——digitalWrite()。我们这里还没用到digitalRead(),就先说了吧!如果pin是INPUT的话,是外界给了控制器Arduino信号,所以需要Arduino读取引脚信号——digitalRead()。

对于初学者来说,可以先学着用,再慢慢弄明白里面的原由。pinMode()设置为OUTPUT,对应使用digitalWrite()。INPUT对应使用digitalRead()。下表是一张对应表:

比如:LED、蜂鸣器
pinMode(pin,OUTPUT)
digitalWrite(pin,HIGH/LOW)

比如:按键控制
pinMode(pin,INPUT)
digitalRead(pin)



接着的一句语句:
delay(1000);

delay()函数,用于延时等待。
等待1000毫秒(1000毫秒也就是1秒,以此类推吧!)。我们举一反三一下,如果我们需要延时2秒呢?答案:delay(2000);

接着看下一句是:
digitalWrite(ledPin,LOW);

这句话意思为,为引脚10一个0V的低电平,也就是熄灭LED。
然后再延时1秒。之后回到loop()函数开始部分,循环运行。

补充知识

变量

我们做个这样的比方,变量好比一个盒子,盒子的空间用来存放东西的,想要放的东西一定要比盒子小,那样才放的下,否则会溢出。变量也是一样,你存储的数据一定要在变量的范围内,否则会出现溢出。

之所以叫变量,是因为程序运行过程中,可以改变它的值。程序中,有时候会对变量值进行数字计算,变量的值也会随之发生变化。在以后的项目中,我们会有深入的了解。

在给变量起名字时,还需要强调的一点。在C语言中,变量名必须以一个字母开头,之后可以包含字母、数字、下划线。注意C语言认为大小写字母是不同的。C语言中还有一些特定的名称也是不能使用的,比如main,if,while等。为了避免这些特定名称作为变量名,所有这些名称在程序中显示为橙色。

函数

函数通常为具有一个个功能的小模块,通过这些功能的整合,就组成了我们的整段代码,一个完整的功能实现。这些功能块也能被反复运用。这时,就体现函数的好处了。在程序运行过程中,有些功能可能会被重复使用,所以只需程序中调用一下函数名就可以了,无需重复编写。而setup()和loop()比较特殊,不能反复调用。

还有一个概念我们需要了解一下,就是函数的返回值,我们可以理解为是一种反馈。在函数中是如何体现有无返回值的呢?就是,函数的声明,比如“ void ”就是函数无返回值的信号,并且后面的括号内为空,我们之后会经常用到。带返回值的函数,我们先不做说明了,有兴趣的可以去网上了解一下。

然而 setup 和loop 函数比较特殊,一段代码中只能使用一次。

INPUT 与 OUTPUT 的区别

我是这么理解的,INPUT 是输入的信号,是外部给控制器的信号,根据外部环境变化才给到控制器信号。比如像我们之后会用到的按钮,它就是典型的 INPUT 模式,它需要我们按下按键后,控制器才能接收到外部给它的指令。

OUTPUT 是输出信号,你需要让控制器能反应出某些特征,向外界发出信号,典型的就是LED,它闪烁的过程就是向外部发出信号的过程。又比如我们后面会用到的蜂鸣器,一个会发出声音的玩意儿,发声的过程就是向外界发出信号的过程,所以它也是OUTPUT。