Arduino入门程序合集及解释

Arduino程序合集

数字、模拟端口

Arduino 控制器内带 Bootloader 程序,是系统上电后运行的第一段代码,就好比 PC 机 BIOS 中的程序,启动就进
行自检,配置端口等等,当然单片机就是靠烧写熔丝位来设定上电从 boot 区启动的,使用这个程序就可以直接把从串
口发来的程序存放到 flash 区中。我们在使用 Arduino 编译环境下载程序时,就先让单片机复位,启动 Bootloader 程序
引导串口发过来的程序顺利写入 flash 区中,flash 可以重复烧写,因此想更新软件就是这么的方便。

Digital Output 数字输出实验

功能 使 PIN13 脚上的 LED 闪烁

1
2
3
4
5
6
7
8
9
10
11
12
13
#define LED 13               /* 设定控制 LED 的数字 IO 脚 */

void setup(){
pinMode(LED, OUTPUT); /* 设定数字 IO 口的模式,OUTPUT 为输出 */
}

void loop(){
digitalWrite(LED, HIGH); /* 设定 PIN13 脚为 HIGH = 4V */
delay(1000); /* 设定延时时间,1000 = 1 秒 */
digitalWrite(LED, LOW); /* 设定 PIN13 脚为 LOW = 0V
*/
delay(1000);
}

功能 PWM 使 PIN11 脚上的 LED 逐渐变亮逐渐变暗

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#define LED 11             // 定义LED灯引脚, 此处必须为PWM引脚(带~号的引脚)
int val; // 存储最新数值变数,从上到下计数

void setup(){
pinMode(LED, OUTPUT); // 设定数字 IO 口的模式,OUTPUT 为输出
}

void loop(){
for(val = 0; val < 255; val ++){
analogWrite(LED, val); // PWM 输出,LED亮度
delay(50); // 延时50ms,因为analogWrite执行瞬间完成
}
for(val = 255; val > 0; val --){
analogWrite(LED, val);
delay(50);
}
}

Digital Input 数字输入实验

功能 闭合开关 SW,PIN13 脚上的 LED 亮,断开则灭

线路:

引脚号 引脚名 后续
3 D13 ->LED -> GND
9 D7 ->10K->5V
->SW->GND
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int ledPin = 13;
int switchPin = 7;
int val = 0;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(switchPin, INPUT);
}

void loop() {
// put your main code here, to run repeatedly:
val = digitalRead(switchPin);
if (HIGH == val)
digitalWrite(ledPin, LOW);
else
digitalWrite(ledPin, HIGH);
}

功能 调节电位器 RPot, 使输入模拟量大变化类改变 LED 闪烁的频率

引脚号 引脚名 后续
2 GND ->LED->D13
3 D13 <-
25 GND ->RPot A -> RPot C->
26 5V <-
17 A5 -> RPot B
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#define LED 13
#define RPOT A5
int val = 0;
void setup() {
pinMode(LED, OUTPUT); // 设定数字 IO 口的模式,OUTPUT 为输出

}

void loop()
{
val = analogRead(RPOT); // 读模拟 IO 口上的数据
digitalWrite(LED, HIGH); // 设定 PIN13 脚为 HIGH = 4V
delay(val); // 延时时间为模拟输入的值
digitalWrite(LED, LOW); // 设定 PIN13 脚为 LOW
delay(val); // 延时时间为模拟输入的值
}

串口通讯

Arduino 不但有 14 个数字接口和 6 个模拟接口外,还有 1 个更为常用的串口接口。在实际应用中串口以只需要少
量的几根线就能和其他串口设备通讯的优势被广应用。

串行接口按标准被分为 RS-232、RS-422、RS-485。RS-232 是在 1962 年发布的,也是目前 PC 机与通信工业中应用
最广泛的一种串行接口,RS-232 采取不平衡传输方式,即所谓单端通讯。典型的 RS-232 信号在正负电平之间摆动,
在发送数据时,发送端驱动器输出正电平在+5~+15V,负电平在-5~-15V 电平。我们的单片机使用的是 TTL 电平的串
行协议,因此单片机与 pc 通讯时需要进行 RS-232 电平和 TTL 电平的转换,最常用的电平转换芯片是 MAX232,单片机
与单片机通讯时则可以直接连接。

USB 版本的 Arduino 则是通过 USB 转成 TTL 串口下载程序的,数字口 PIN 0 和 PIN 1 就是 TTL 串口 RX 和 TX。

串口通讯中最重要的一点就的通讯协议,一般串口通讯协议都会有波特率、数据位、停止位、校验位等参数。大
家不会设置也不用怕,Arduino 语言中 Serial.begin()函数就能使大家轻松完成设置,我们只需要改变该函数的参数
即可,例如 Serial.begin(9600),则表示波特率为 9600bit/s(每秒比特数 bps),其余参数默认即可。
Arduino 语言中还提供了 Serial.available() 判断串口缓冲器状态、Serial.read()读串口、Serial.print()
口发送及 Serial.println()带换行符串口发送四个函数。

1602字符液晶显示

1602 字符液晶是最常用的一种,很具有代表性,1602 液晶分 4 总线和 8 总线 2 种驱动方式(关于该液晶的详细资
料,大家可以自己搜索,这里就不做详细说明了)。我们用单片机驱动 1602 液晶,使用并口操作很容易就驱动起来了,
但使用 Arduino 板驱动 1602 液晶,还真有点费劲,因为他只能位操作。根据官方网站提供的例程,很容易看出他们
使用的是最常用的 8 总线驱动方式,然而他巧妙的使用 for 循环语句完成了位操作的赋值。

arduino引脚名 LCD1602引脚号 LCD1602引脚名
D-GND 3 VEE
D12 4 D1
D11 5 RW
D10 14 D7
D9 13 D6
D8 12 D5
D7 11 D4
D6 10 D3
D5 9 D2
D4 8 D1
D3 7 D0
D2 6 E
5V 2 VCC
GND 1 GND
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
int DI = 12;
int RW = 11;
int DB[] = {3, 4, 5, 6, 7, 8, 9, 10};//使用数组来定义总线需要的管脚
int Enable = 2;
void LcdCommandWrite(int value) // poll all the pins
{
int i = 0;
for (i=DB[0]; i <= DI; i++) //总线赋值
{
digitalWrite(i,value & 01);
value >>= 1;
}
digitalWrite(Enable,LOW);
delayMicroseconds(1); // send a pulse to enable
digitalWrite(Enable,HIGH);
delayMicroseconds(1); // pause 1 ms according to datasheet
digitalWrite(Enable,LOW);
delayMicroseconds(1); // pause 1 ms according to datasheet
}
void LcdDataWrite(int value) // poll all the pins
{
int i = 0;
digitalWrite(DI, HIGH);
digitalWrite(RW, LOW);
for (i=DB[0]; i <= DB[7]; i++) {
digitalWrite(i,value & 01);
value >>= 1;
}
digitalWrite(Enable,LOW);
delayMicroseconds(1); // send a pulse to enable
digitalWrite(Enable,HIGH);
delayMicroseconds(1);
digitalWrite(Enable,LOW);
delayMicroseconds(1); // pause 1 ms according to datasheet
}
void setup (void) {
int i = 0;
for (i=Enable; i <= DI; i++)
{
pinMode(i,OUTPUT);
}
delay(100); // initiatize lcd after a short pause needed by the LCDs controller
LcdCommandWrite(0x38); // set: // 8-bit interface, 1 display lines, 5x7 font
delay(20);
LcdCommandWrite(0x06); // entry mode set: // increment automatically, no display shift
delay(20);
LcdCommandWrite(0x0E); // display control: // turn display on, cursor on, no blinking
delay(20);
LcdCommandWrite(0x01); // clear display, set cursor position to zero
delay(100);
LcdCommandWrite(0x80); // display control: // turn display on, cursor on, no blinking
delay(20);
}
void loop (void) {
LcdCommandWrite(0x02); // set cursor position to zero
delay(10); // Write the welcome message
LcdDataWrite('H');
LcdDataWrite('o');
LcdDataWrite('l');
LcdDataWrite('a');
LcdDataWrite(' ');
LcdDataWrite('C');
LcdDataWrite('a');
LcdDataWrite('r');
LcdDataWrite('a');
LcdDataWrite('c');
LcdDataWrite('o');
LcdDataWrite('l');
LcdDataWrite('a');
delay(500);
}

LED控制

四位数码管

利用Arduino的数字端口控制四位数码管内容(一一对应)

四位数码管解析:

使用的是共阴极数码管,位数选择为高电平显示,数字显示为低电平显示

引脚号 对应内容
上引脚 1 第一个数字
2 a
3 f
4 第二个数字
5 第三个数字
6 b
下引脚 7 e
8 d
9 h
10 c
11 g
12 第四个数字

代码对应接线

四位数码管 Arduino
1 2
2 3
3 4
4 5
5 6
6 8
7 12
8 9
9 10
10 7
11 13
12 11
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#define D1 2
#define D2 3
#define D3 4
#define D4 5

// 记录4位数码管与Arduino引脚的关系
int ledConnect[8] = {
// a b c d e f g h
6, 8, 12, 9, 10, 7, 13, 11
};

// 显示内容
int times = 0;
float floatTimes = 0;

// 记录数码管与显示数字的关系
unsigned char num[11][8] = {
//a b c d e f g h
{1, 1, 1, 1, 1, 1, 0, 0}, //0
{0, 1, 1, 0, 0, 0, 0, 0}, //1
{1, 1, 0, 1, 1, 0, 1, 0}, //2
{1, 1, 1, 1, 0, 0, 1, 0}, //3
{0, 1, 1, 0, 0, 1, 1, 0}, //4
{1, 0, 1, 1, 0, 1, 1, 0}, //5
{1, 0, 1, 1, 1, 1, 1, 0}, //6
{1, 1, 1, 0, 0, 0, 0, 0}, //7
{1, 1, 1, 1, 1, 1, 1, 0}, //8
{1, 1, 1, 1, 0, 1, 1, 0}, //9
{0, 0, 0, 0, 0, 0, 0, 1}, //.
// {1, 1, 1, 0, 1, 1, 1, 1}, //A
// {1, 1, 1, 1, 1, 1, 1, 1}, //B
// {1, 0, 0, 1, 1, 1, 0, 1}, //C
// {1, 1, 1, 1, 1, 1, 0, 1}, //D
// {1, 0, 0, 1, 1, 1, 1, 1}, //E
// {1, 0, 0, 0, 1, 1, 1, 1}, //F
};

void numShowFunction(int showNum){
// 对输入的数字进行判断
if( showNum >= 10000){
showNum = showNum %10000;
}

// 对输入的数据进行处理为使用数据
int numCache[4] = { showNum/ 1000, showNum%1000 /100,
showNum%100 /10, showNum %10
};

// 为每一位数码管进行显示
for(int i = 0; i <=3; i++){
// 对所有内容进行清空
for(int ij = 0; ij < 8; ij ++){
// 由于是低电平显示,此处高电平清空内容
digitalWrite(ledConnect[ij], HIGH);
}

// 对需要显示的数码管进行选择(此处为高电平有效)
// 对应了D1 D2 D3 D4
digitalWrite(i + 2, HIGH);

// 获取本位置上的数字
int number = numCache[i];

for(int j = 0; j < 8; j++){
if(num[number][j] == 1)
digitalWrite(ledConnect[j], LOW);
}

delay(1); // 拉长每次显示的时间
digitalWrite(i + 2, LOW);
}

Serial.print(num_cache[0]);
Serial.print(num_cache[1]);
Serial.print(num_cache[2]);
Serial.println(num_cache[3]);
}

void setup(){
for(int ij = 0; ij < 8; ij ++){
pinMode(ledConnect[ij], OUTPUT);
}

pinMode(D1, OUTPUT);
pinMode(D2, OUTPUT);
pinMode(D3, OUTPUT);
pinMode(D4, OUTPUT);

Serial.begin(9600);
}

void loop(){
floatTimes += 0.04;
times = int(floatTimes);

if(times > 10000)
floatTimes = 0;

Serial.print("show num : ");

numShowFunction(times);
// delay(5);
}

LED RGB 共阳极

V 接口只能接VCC , 其他的低电平有效
代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int led1 = 9;
int led2 = 10;
int led3 = 11;

void setup(){
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
}

void setColor(int red, int green, int blue){
analogWrite(led1, red);
analogWrite(led2, green);
analogWrite(led3, blue);
}

void loop(){
setColor(255,0,0);
delay(100);
setColor(0,255,0);
delay(100);
setColor(0,0,255);
delay(100);
}

HC-SR04 超声波传感器 测距

其模块,用Trig触发测距

会发出8 个 40khz的方波,自动检测是否有信号返回

有信号返回,通过echo输出高电平,高电平持续的时间就是距离的2倍

测量距离 = (高电平时间*声速)/ 2

主要技术参数
使用电压 DC—5V
静态电流 小于2mA
电平输出 高5V
电平输出 底0V
感应角度 不大于15度
探测距离 2cm-450cm
高精度 可达0.2cm
引脚说明
VCC – 供5V电源
TRIG – 触发控制信号输入
ECHO – 回响信号输出等四个接口端
GND – 为地线
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#define Trig 2 //引脚Tring 连接 IO D2
#define Echo 3 //引脚Echo 连接 IO D3

float cm; //距离变量
float temp; //

void setup() {
Serial.begin(9600);
pinMode(Trig, OUTPUT);
pinMode(Echo, INPUT);
}

void loop() {
//给Trig发送一个低高低的短时间脉冲,触发测距
digitalWrite(Trig, LOW); //给Trig发送一个低电平
delayMicroseconds(2); //等待 2微妙
digitalWrite(Trig,HIGH); //给Trig发送一个高电平
delayMicroseconds(10); //等待 10微妙
digitalWrite(Trig, LOW); //给Trig发送一个低电平

temp = float(pulseIn(Echo, HIGH)); //存储回波等待时间,
//pulseIn函数会等待引脚变为HIGH,开始计算时间,再等待变为LOW并停止计时
//返回脉冲的长度

//声速是:340m/1s 换算成 34000cm / 1000000μs => 34 / 1000
//因为发送到接收,实际是相同距离走了2回,所以要除以2
//距离(厘米) = (回波时间 * (34 / 1000)) / 2
//简化后的计算公式为 (回波时间 * 17)/ 1000

cm = (temp * 17 )/1000; //把回波时间换算成cm

Serial.print("Echo =");
Serial.print(temp);//串口输出等待时间的原始数据
Serial.print(" | | Distance = ");
Serial.print(cm);//串口输出距离换算成cm的结果
Serial.println("cm");
delay(100);
}

ck008触发型触摸传感器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
int sensorTouch = 8;

void setup(){
pinMode(sensorTouch, INPUT);
Serial.begin(9600);
}

void loop(){

if(digitalRead(sensorTouch) == LOW)
{
delay(100);
if (digitalRead(sensorTouch)== LOW)
{
Serial.println("not touched");
}
}else
{
delay(100);
if (digitalRead(sensorTouch) == HIGH)
{
Serial.println("touched");
}
}
}