第二章 点亮LED灯(Arduino边做边学:从点亮Led到物联网)

本系列文章为作者原创,未经作者书面同意,不得转载!

几乎所有的编程学习都是从“hello,world”程序开始的,这几乎已经成为学习编程的一个传统,既然本系列文章的标题是《Arduino项目实战:从点亮Led到物联网》,那么我们还是从点亮Led来开始我们的Arduino项目实战之旅。

作为本系列的第一个项目,其实实现起来非常的简单,您几乎不用设计任何电路和做任何的连线,甚至都不需要编写任何代码,可以直接从Arduino IDE的示例代码中找到一个例程,然后完成程序的上传即可。

但本文对于初学者来说非常重要,它会告诉你怎么通过数据线连接Arduino电路板、Arduino程序的基本结构、怎么上传程序到Arduino电路板,还有几个重要的函数,也许是Arduino中最常用的函数。所以如果你是一个初学者,请跟着本文完成您的第一个项目。

1 项目介绍

点亮LED灯,并让LED灯闪动。
在这个项目中,我们先不用自己准备LED灯,我们先使用Arduino UNO电路板上面集成的LED灯,如下图红箭头所示的位置。


UNO-01.jpg

在Arduino系列的电路板上,有不少型号都集成了一个可控制的LED灯,但是它们的引脚PIN并不完全相同,Ardunio Uno, MEGA, ZERO是PIN13,而Ardunio MKR1000是PIN6。本文使用的是UNO电路板,如果您手上的电路板不是UNO,还请确认一下它是否集成有可控LED,然后它的引脚是哪一个。

2 所需元器件

元器件 型号 数量 备注
主控板 arduino Uno 1
数据线 Uno数据线 1

3 设备连接

您只需要将Arduino UNO电路板通过数据线跟电脑的USB口连接即可,如下图所示,数据线一端插入UNO电路板的数据接口,另一端插入电脑USB接口。


UNO-02.jpg

当UNO电路板跟电脑连接上后,如果您使用的是WIN10操作系统,电脑会自动安装USB转串口驱动程序。Arduino电路板是通过串口跟电脑进行通信的,目前大部分的电脑都不再配备串口,老式的电脑会有,串口是长这个样子的:


COM04.jpg

现在的个人电脑一般不会配置串口(如果它不是上个世纪购买的话),所以我们使用USB口跟Arduino电路板进行通信,这时候我们就需要实现USB口跟串口的转换,Arduino电路板上都集成了USB转串口的芯片,我们只需要安装驱动即可。如果您的电脑安装驱动成功,在电脑的设备管理(鼠标点击电脑桌面“我的电脑”-点击鼠标右键-在弹出菜单中选择“管理”)中会看到USB串行设备,如下图所示:


COM 02.png

如果您的电脑没有自动安装驱动,您可能需要手动安装一下。详情请见附录《Arduino电路板USB转串口驱动安装方法》链接地址

4 程序代码

前面介绍过,我们的第一个项目并不需要您敲任何代码,在Arduino IDE的文件菜单---示例---01. Basics---Blink,打开Blink文件,如下图所示:


程序 01.png

下面是Blink程序的代码:

/*
  Blink

  Turns an LED on for one second, then off for one second, repeatedly.

  Most Arduinos have an on-board LED you can control. On the UNO, MEGA and ZERO
  it is attached to digital pin 13, on MKR1000 on pin 6. LED_BUILTIN is set to
  the correct LED pin independent of which board is used.
  If you want to know what pin the on-board LED is connected to on your Arduino
  model, check the Technical Specs of your board at:
  https://www.arduino.cc/en/Main/Products

  modified 8 May 2014
  by Scott Fitzgerald
  modified 2 Sep 2016
  by Arturo Guadalupi
  modified 8 Sep 2016
  by Colby Newman

  This example code is in the public domain.

  http://www.arduino.cc/en/Tutorial/Blink
*/

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);                       // wait for a second
}

在上面的程序中,我们发现其实大部分内容都被“ /* ”和“ */ ”包裹,这部分内容是程序中的注释,注释并不是程序的一部分,在程序编译时,这部分内容会被编译器忽略,注释的目的是解释某一小段或者某一行代码的功能,便于今后自己或者别人读到这段代码时能够很快的理解。

在Arduino程序中,有两种形式的注释:

  • 单行注释:以 // 开始,直到行末为止;
  • 多行注释:以 /* 开始,以 */ 终止。

所以我们去掉上面代码中注释的部分,程序如下:

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);  
  delay(1000);           
  digitalWrite(LED_BUILTIN, LOW); 
  delay(1000);  
}

是不是看起来清爽了许多,不过如果你不熟悉Arduino编程的话,这段代码看起来就不知所云了,带注释的代码看起来冗余,但我们大体能够读明白程序的功能。好吧,下面我们对上面的程序做一个解释。

4.1 程序结构

Arduino程序结构主要包含两部分:setup()函数和loop()函数。

setup()函数

Arduino程序启动时会调用 setup()函数。在程序中一般使用它来初始化变量,引脚模式,启用库等。setup函数只能在Arduino电路板每次上电或复位后运行一次。

loop()函数

loop() 函数,正如它的函数名称所指,这个函数会在Arduino上电或者复位并调用完setup()函数后连续循环的调用执行。loop()函数是Arduino程序的主体,允许你的程序连续循环的获得外部输入、进行程序处理和向外输出。这句话您目前理解起来也许有点费劲,没关系,我们可以暂时放一放,随着学习的深入,您慢慢就会理解,现在您需要了解的是:loop()函数中的语句,会被Arduino电路板一遍又一遍的从头到尾的反复执行,直到Arduino电路板复位或者掉电关闭。

4.2 代码讲解

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}

setup()函数中就一条语句:

  pinMode(LED_BUILTIN, OUTPUT);

这条语句的作用是告诉Arduino主控板将LED_BUILTIN(这是一个宏,在Arduino的核心库文件“pins_arduino.h”中已经定义,它代表13)引脚,即13引脚,设置为输出模式。

请注意Arduino的语法规则,每条语句都必须以分号结束,必须是英文字符的分号";",请一定跟中文字符的分号“;”区分开,请在英文输入法下进行输入,否则程序编译时会出错。

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);  
  delay(1000);           
  digitalWrite(LED_BUILTIN, LOW); 
  delay(1000);  
}

loop()函数中有四条语句:

  digitalWrite(LED_BUILTIN, HIGH); 

这条语句的作用是向第13引脚写入HIGH值,由于该引脚已在setup()函数中通过pinMode()配置为OUTPUT,其电压将被设置为相应的值:HIGH为5V,LOW为0V(接地),这条语句执行后,13引脚的电压将设置为5V。

由于UNO板载LED灯的正极接着13引脚,负极接着GND(0V),根据电路原理,当13引脚的电压为5V时,LED灯将被点亮。

 delay(1000);     

这条语句的作用是告诉Arduino电路板,在执行下一条语句之前先等待1000毫秒(1秒等于1000毫秒)。

digitalWrite(LED_BUILTIN, LOW); 

这条语句的作用是向第13引脚写入LOW值,其电压将被设置为0V,根据前面的说明,如果13引脚电压为0V,板载LED灯将熄灭。

 delay(1000);     

这条语句的作用是告诉Arduino电路板,在执行下一条语句之前再等待1000毫秒。

由于这是loop()函数,所以Arduino在执行完第四条语句后,又开始重复执行loop()函数的第一条语句,如此反复。

这个时候,我们再来一条一条的回顾这段代码:

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);  
  delay(1000);           
  digitalWrite(LED_BUILTIN, LOW); 
  delay(1000);  
}

您是不是觉得它已经变得非常简单,它所实现的功能也非常清晰了,那就是:让板载LED灯按照亮一秒、熄一秒的频率闪烁。

5 执行效果

当您完成上面的一切,您是不是有点迫不及待的想上传程序到Arduino电路板上看看程序的执行效果了?好吧,开始上传吧,按照本文之前介绍的,先确认电路板跟电脑的连接,如果没问题,选择好COM通信端口,点击“上传”按钮。

当程序上传成功后,Arduino电路板会自动重启,如果一切正常,您会看到UNO的板载LED开始按照1秒1次的频率闪烁了。

恭喜您,您的第一个Arduino项目完成了,虽然简单,但是意义非凡。您已经推开了一扇窗,一扇从虚拟的软件世界到真实的物理世界的窗户,窗户那一侧的世界无疑非常精彩,等待着您一起来探索!

如果您喜欢本文,您可以点击一下下面的喜欢按钮,您也可以关注我,谢谢您的支持!

推荐阅读更多精彩内容