从本周开始,我们每一周推出一片arduino的实践课程。今天我们开始最基础的两个内容。
一、闪灯blink
这个程序我们只需要一个arduino板即可,在arduino的开发环境的example中直接可以找到。打开我们就可以在开发板上看到效果。对于有c语言基础的同学很容易看懂,但对于c语言没有基础的童鞋而言这里还是需要简单的做一些说明。
代码如下:
// 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
}
打开代码后,其实我们发现英文的注解已经说明得很清楚了。但这里还是详细说明以下几点:
1、arduino中的语法完完全全的c语言语法,只不过进行了函数的封装,多了些类和类库。
2、这里的setup和loop其实都是C语言中主函数中经过封装后的函数,loop调用的就是一个while无限循环。
3、对于需要调用硬件资源的嵌入式开发(这里指arduino),都必须对端口设置(输入或输出)状态。
4、pinMode就是arduino中特有的封装了的用来设置端口状态的专用函数。
5、digitalWrite是用来改变端口状态(高电平或低电平,或可理解为动态正负极的改变)的特用函数。
6、之所以有loop这样的无限循环,那是因为单片机一般都处于不停的工作状态,除非关键或重启。
我们可以看到,pinMode和digitalWrite两个函数都只有两个参数,而且一样。
第一个参数为管脚编号,这里的LED_BUILTIN=13,在arduino中已经被事先定义了,我们可以用13替代它。当然,我们也可以用我们喜欢的管脚来替代它,只不过你要在指定的管脚上接上LED。
第二个参数为状态如,LOW/HIGH,OUTPUT/INPUT,其实他们都可以用0或1来直接表示。
二、流水灯
在众多的嵌入式编程中,流水灯也几乎约定俗成的成为了和blink一样的入门必学课程。下面我们来看看它是如何编写的,说到底,它是很简单的,所用到的编码函数也和blink一样,所用到的硬件种类也几乎一样只不过数量增大了,前面是一个LED灯,流水灯则有多个LED灯,可能7个8个或者十多个几十个都是可以的。下面我们来看代码:
int LED0=1;
int LED0=2;
int LED0=3;
int LED0=4;
int LED0=5;
int LED0=6;
int LED0=7;
int LED0=8;
void setup()
{
//设置管及管脚的pinMode
pinMode(LED0,OUTPUT);
pinMode(LED1,OUTPUT);
pinMode(LED2,OUTPUT);
pinMode(LED3,OUTPUT);
pinMode(LED4,OUTPUT);
pinMode(LED5,OUTPUT);
pinMode(LED6,OUTPUT);
pinMode(LED7,OUTPUT);
}
void loop()
{
digitalWrite(LED0 , LOW);
delay(1000);
digitalWrite(LED0 , HIGH);
digitalWrite(LED1 , LOW);
delay(1000);
digitalWrite(LED1 , HIGH);
digitalWrite(LED2 , LOW);
delay(1000);
digitalWrite(LED2 , HIGH);
digitalWrite(LED3 , LOW);
delay(1000);
digitalWrite(LED3 , HIGH);
digitalWrite(LED4 , LOW);
delay(1000);
digitalWrite(LED4 , HIGH);
digitalWrite(LED5 , LOW);
delay(1000);
digitalWrite(LED5 , HIGH);
digitalWrite(LED6 , LOW);
delay(1000);
digitalWrite(LED6 , HIGH);
digitalWrite(LED7 , LOW);
delay(1000);
digitalWrite(LED7 , HIGH);
}
下面是实物连接图,我们发现只不过是数量增加了(红色线为正极,蓝色线为信号控制线)
2、使用循环
上面的代码只最简单的代码,下面我们利用for循环来实现它,我们发现使用for循环后代码更简洁了,代码如下:
void setup()
{
//设置管及管脚的pinMode
for(int i=0;i<8;i++)
pinMode(i,OUTPUT);
}
void loop()
{
for(int i=0;i<8;i++)
{
digitalWrite(i, HIGH);
delay(1000);
digitalWrite(i, LOW);
delay(1000);
}
}
3、学习使用数组
我们发现,在使用循环的时候对控制的端口我们直接使用了端口号,端口的名称用途就不那么清晰了。我们其实也可以使用数组,使端口名称依然可以清晰。代码如下:
int LED[8];
void setup()
{
//设置管及管脚的pinMode
for(int i=0;i<8;i++)
{
LED[i]=i;
pinMode( LED[i],OUTPUT);
}
}
void loop()
{
for(int i=0;i<8;i++)
{
digitalWrite( LED[i], HIGH);
delay(1000);
digitalWrite( LED[i], LOW);
delay(1000);
}
}
上面的代码实现的是逐一亮灭,也就是在某个时刻始终只有一盏灯亮。那么我们要实现逐个亮到逐个灭代码如何实现呢?我们继续下面的学习。
4、学习使用取反操作
这个亮后不灭,然后又逐个灭,这里我们可以用到取反操作。
int LED[8];
bool SIGN=1;
void setup()
{
for(int i=0;i<8;i++)
{
LED[i]=i;
pinMode( LED[i],OUTPUT);
}
}
void loop()
{
for(int i=0;i<8;i++)
{
digitalWrite( LED[i], SIGN);
delay(1000);
}
SIGN=!SIGN;//取反操作,意思是高电平经过取反就变成了低电平
}
那么到这里,我们就学会了arduino及C语言编程的最基本的知识了。
我们下周继续!