本想买个类似树莓派那种的开发板,但正好朋友说手头有个开发板,于是便借用着学习一下,收到后发现竟然是类似单片机式的,arduino 开发板。正好也趁此机会学学 C/C++,于是就便有了这篇文章。

这应该算是我第一个 C/C++ 语言的作品了,望不吝赐教。

前言

先来看一下官网的第一个 Blink 实例。

1
2
3
4
5
6
7
8
9
10
11
12
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() {
digitarite(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
}

其中 setup 是只执行一次的函数,一般用来初始化参数;loop 是永久循环的函数,主要代码一般放这里。

首先设定 pinMode ,将所需的 LED 端口设定为输出。

然后想让它亮,只需将其设定为高电平即可,灯灭则是低电平,delay() 函数是延迟,括号内是延迟的毫秒数,相当于 pythontime.sleep()

主菜

setup

先放一下摩斯电码的 setup 函数

1
2
3
4
5
void setup() {
Serial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);

}

一开始需要给一个波特率,一般是 9600。

loop

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
void loop() {
// 想要显示的文本
String text = "sos";
// 莫斯电码不区分大小写,需全转换为大/小写
text.toUpperCase();
// 分割文本
String moss;
for(int i=0; i<text.length(); i++){
char word = text.charAt(i);
// 根据字母选择输出指定的莫斯电码
switch (word){
case 'A' :moss = ".-";break;
// 太长了,这里就不放了,后面有完整代码
}
// terminal打印看一下对不对
Serial.println(moss);
// ·短亮(100ms);-长亮(500ms);亮灯与亮灯间隔100ms
for (int j=0;j<moss.length();j++){
if (moss.charAt(j) == '-'){
digitalWrite(LED_BUILTIN, HIGH);
delay(500);
digitalWrite(LED_BUILTIN, LOW);
}
else{
digitalWrite(LED_BUILTIN, HIGH);
delay(100);
digitalWrite(LED_BUILTIN, LOW);
}
delay(100);
}
}
// 字符与字符间隔1000ms
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
}

实现效果

SOS信号(三短三长三短)
SOS 信号(三短三长三短)

总结

arduino 的编程语言虽说用的是 C/C++,但也有一些 “独有” 的函数,比如我这里用到的 charAt() 用于提取字符串指定位置的字符。编程的时候需要看看文档,有没有更简单的实现方式,毕竟着块板子的内存容量就 32k。

完整代码

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
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);

}

void loop() {
// 想要显示的文本
String text = "sos";
// 莫斯电码不区分大小写,需全转换为大/小写
text.toUpperCase();
// 分割文本
String moss;
for(int i=0; i<text.length(); i++){
char word = text.charAt(i);
// 根据字母选择输出指定的莫斯电码
switch (word){
case 'A' :moss = ".-";break;
case 'B' :moss = "-...";break;
case 'C' :moss = "-.-.";break;
case 'D' :moss = "-..";break;
case 'E' :moss = ".";break;
case 'F' :moss = "..-.";break;
case 'G' :moss = "--.";break;
case 'H' :moss = "....";break;
case 'I' :moss = "..";break;
case 'J' :moss = ".---";break;
case 'K' :moss = "-.-";break;
case 'L' :moss = ".-..";break;
case 'M' :moss = "--";break;
case 'N' :moss = "-.";break;
case 'O' :moss = "---";break;
case 'P' :moss = ".--.";break;
case 'Q' :moss = "--.-";break;
case 'R' :moss = ".-.";break;
case 'S' :moss = "...";break;
case 'T' :moss = "-";break;
case 'U' :moss = "..-";break;
case 'V' :moss = "...-";break;
case 'W' :moss = ".--";break;
case 'X' :moss = "-..-";break;
case 'Y' :moss = "-.--";break;
case 'Z' :moss = "--..";break;
case '0' :moss = "-----";break;
case '1' :moss = ".----";break;
case '2' :moss = "..---";break;
case '3' :moss = "...--";break;
case '4' :moss = "....-";break;
case '5' :moss = ".....";break;
case '6' :moss = "-....";break;
case '7' :moss = "--...";break;
case '8' :moss = "---..";break;
case '9' :moss = "----.";break;
case '.' :moss = ".-.-.-";break;
case ':' :moss = "---...";break;
case ',' :moss = "--..--";break;
case ';' :moss = "-.-.-.";break;
case '?' :moss = "..--..";break;
case '=' :moss = "-...-";break;
// case ''' :moss = ".----.";break;
case '/' :moss = "-..-.";break;
case '!' :moss = "-.-.--";break;
case '-' :moss = "-....-";break;
case '_' :moss = "..--.-";break;
case '"' :moss = ".-..-.";break;
case '(' :moss = "-.--.";break;
case ')' :moss = "-.--.-";break;
case '$' :moss = "...-..-";break;
case '&' :moss = "....";break;
case '@' :moss = ".--.-.";break;
}
Serial.println(moss);
// ·短亮(100ms);-长亮(500ms);亮灯与亮灯间隔100ms
for (int j=0;j<moss.length();j++){
if (moss.charAt(j) == '-'){
digitalWrite(LED_BUILTIN, HIGH);
delay(500);
digitalWrite(LED_BUILTIN, LOW);
}
else{
digitalWrite(LED_BUILTIN, HIGH);
delay(100);
digitalWrite(LED_BUILTIN, LOW);
}
delay(100);
}
}
// 字符与字符间隔1000ms
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
}

网站地图 | 状态监测 | 图片加密&解密 | File Server | 博友圈 | 博客说
Copyright 2022-2025 | Powered by Hexo 7.3.0 & Stellar 1.29.1
总访问量次 |