Hello,一起学习Arduino的同伴们。作为一个刚刚开始学习Arduino的菜鸟,有一些东西想向大家分享,目的是结识更多和我一样的业余爱好者,大家共同讨论创意,快速提高水平和生产力。进入Arduino的第一课,最经典的就是利用Arduino点亮第一盏LED灯了。从这个实例的分享中,我们将收获以下内容:
- 电路的连接方法
- LED的使用
- Arduino编程基础
- 程序框架
- 针脚I/O设定
- 串口的使用
准备
- Arduino UNO开发板
- LED
- 1000Ω电阻
- 面包板、导线
- Arduino IDE
目的
用Arduino控制LED的亮灭,要求点亮1s、熄灭1s循环,并在串口监视器输出亮灭循环的次数。
电路连接

※需要注意的几个问题
-
LED的正负极判断
LED
- 看针脚:长者为正极,短者为负极
- 看电极:电极长者为负极,电极短者为正极
- LED导通的条件是电流由正极流向负极,也就是说正极电位高于负极时LED才会发光;反之则电阻很大,不能导通。由于LED导通时电阻很小,电流大,很容易烧毁,因此必须需要串联一个限流电阻,这个限流电阻的阻值可以公式
确定,其中
是供电电压,
是LED的电压降(管压降),
是点亮LED的电流。
与LED的颜色有关,红色为2.0-2.2V,黄色为1.8-2.0V,绿色3.0-3.2V,正常发光时的额定电流约为20mA。如果不想自己算也可以在网上搜计算器,输入个参数即可,或者干脆自己随便选一个,大约几百欧,只要不烧掉就可以了。我就是随便选了一个1000Ω的限流电阻。
编写程序
Arduino的编程是以C/C++为基础的。本项目的原理是当提高2号脚位(Pin 2)的电压时,LED导通则发光;当降低Pin 2电压时,LED熄灭。控制Pin 2高低电压的持续时间即可实现控制LED亮灭时间。
打开Arduino IDE,我们会看到两个函数,这是Arduino编程最基本的函数,任何Arduino程序都是根植于这两个函数。
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}
-
setup()
函数:最先被执行的函数,且在整个程序运行过程中只运行一次,主要用于初始化一些参数,例如脚位I/O设定、串口初始化等。 -
loop()
函数:函数体内的代码会在整个运行期间反复执行,这是程序的主体内容,所有业务逻辑代码都要放在这个函数中。
在这个案例中,我们在setup()
中要做的事情是定义需要的引脚Pin2为输出引脚,这样我们才可以通过控制Pin2输出的电平高低来决定LED的亮灭,同时串口的初始化操作也在此函数中完成。本案例还有一个小目标,就是要输出LED亮灭周期的次数,熟悉任何一门语言编程的人都知道需要定义一个计数变量并将其初值设为0,这个工作是否可以在setup()
函数中做呢?我们一会儿再分析。本例中我们需要用到两个函数:
-
pinMode(pin, mode)
:设置针脚I/O,第一个参数pin
指我们要设置哪个针脚,mode
是要设置的属性,有三个值可选,分别是OUTPUT
(输出)、INPUT
(输入)、INPUT_PULLUP
(上拉输入),本例中我们设置为OUTPUT
。 -
Serial.begin(speed)
:初始化串口,参数speed
指波特率,一般取9600即可,以后还会介绍。
loop()
函数中我们要做的事情是让Pin2输出高电平点亮LED并维持1min,再让Pin2输出低电平熄灭LED并维持1min,还要让计数变量计数循环次数,最后将其值打印到串口监视器上,这里需要用到三个函数:
-
digitalWrite(pin, signal)
:顾名思义为“数字写”,即只能输出0或1两个值,同样第一个参数为针脚,第二个参数可以直接写0
或1
,分别表示低电平和高电平,但我们常常写成LOW
和HIGH
更容易理解,要注意,这里的LOW
和HIGH
都是大写字母。 -
delay(time)
:作用是让整个程序保持目前状态停止运行一段时间,停止时间time
的单位是ms。 -
Serial.println(content)
:用于在串口监视器上打印信息,与C语言中println()
函数的用法一致。
讲了那么多,来看看我们最终的程序吧!
#define led 2
int i=0; //循环次数计数变量
void setup() {
pinMode(led,OUTPUT); //定义Pin2为输出脚位
Serial.begin(9600); //串口初始化
}
void loop() {
digitalWrite(led,HIGH); //Pin2设置为高电平
delay(1000); //延时1min
digitalWrite(led,LOW); //Pin2设置为低电平
delay(1000); //延时1min
i++; //循环次数加1
Serial.println(i); //串口输出循环次数
}
将这个程序烧录到Arduino板上,看看是否达到了我们预期的效果,打开串口监视器,是否在输出亮灭循环的次数。这个例子相当于Arduino入门的第一课,其价值类似与各种编程语言学习中的Hello world
。
最后还有一个问题没有解决,如果我们把技术变量i
的声明和赋初值放在setup()
函数里可以吗?
#define led 2
void setup() {
int i=0;
pinMode(led,OUTPUT);
Serial.begin(9600);
}
或者,把i
的声明放在setup()
前,而赋初值放在setup()
中是否可以?
#define led 2
int i;
void setup() {
i=0;
pinMode(led,OUTPUT);
Serial.begin(9600);
}
大家可以试一下。相信有过C/C++编程基础的小伙伴,都会脱口而出,那就在留言中回复我吧!
网友评论