Arduino IDE 中有一些示例代码可以作为学习参考

【《别再找了!这是有史以来最棒的Arduino教程系列》感谢佑來老师的奉献无私!】

01 点灯

相关设备:ArduinoUno开发板、数据线(D口)、电脑
void setup(){}表示初始化函数,
void loop(){}表示循环函数,
setup()函数只会在程序开始运行时执行一次,
loop()函数会一直循环执行。

1
2
3
4
5
6
7
8
9
10
void setup(){
pinMode(13, OUTPUT); //设置13号针脚为输出模式
}
void loop(){
digitalWrite(13, HIGH); //13号针脚输出高电平(就是通电)
delay(1000);
digitalWrite(13, LOW); //13号针脚输出低电平(就是断电)
delay(1000);
}
//TRY: 通过变更delay的时间,可以调节闪烁的速度

02 点灯 加强版

相关设备:面包板、电阻、杜邦线(两头针)、红绿LED灯
开发板上有数字的针脚,都是正极。GND针脚是负极。
LED灯是电阻很小的元器件,需要串联一个电阻。否则过大的电流会烧坏LED灯(或烧坏开发板)。

1
2
3
4
5
6
7
8
9
10
11
12
13
void setup(){
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
}
void loop(){
digitalWrite(12, HIGH);
digitalWrite(11, LOW);
delay(1000);
digitalWrite(12, LOW);
digitalWrite(11, HIGH);
delay(1000);
}
//TRY: 改变delay的时间,可以调节闪烁的速度。同时添加多个LED灯串,按顺序控制多个LED灯。

03 按钮

相关设备:按钮
按钮不是通常的通断概念,应该用‘信号’的概念理解
若使用数字信号针脚读取变换,就在有信号(电压等)变换的地方接入读取(上拉、下拉的概念)
if(){}表示判断,==表示判断是否相等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int buttonState = 0;
void setup()
{
pinMode(13, OUTPUT);
pinMode(7, INPUT);
}
void loop()
{
buttonState = digitalRead(7);
if (buttonState == HIGH)
{
digitalWrite(13, HIGH);
}
else
{
digitalWrite(13, LOW);
}
}

04 串口输出

/* *///表示注释,注释的内容不会被编译,不会被执行。
println()print()的区别是,println()会换行,print()不会换行。

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
#include <Arduino.h>
/*
这是注释,可以写任意文字
*/
// 这也是注释

int pushButton = 7; // 按钮使用7号引脚
int buttonState = 0; // 按钮状态
int beforeState = 0; // 上一次状态
void setup()
{
Serial.begin(9600); //开启与电脑的通信,波特率9600
pinMode(pushButton, INPUT);
}
void loop()
{
buttonState = digitalRead(pushButton);
if (buttonState == 1 && beforeState == 0) //判断,实现按一下执行一次(防抖)
{
Serial.print("Hi~~");
Serial.println(buttonState);
}
if(buttonState!=beforeState){ //防抖用 Debounce
delay(50);
}
beforeState = buttonState;

delay(1);
}
// TRY: 尝试给按钮计数,并打印出来

05 按钮防抖

按钮在按下时,可能会出现“弹跳”,即不是理想状态下的信号变为5v,而是会在5v与0v之间弹跳几下。最后才稳定到5v。
防抖即在按下时就记录,之后一段时间内不在相应(设置delay)。如上例

06 模拟信号输入

相关设备:potentiometer(电位器),最小0 , 最大1023。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int sensor = A0;    // 设定sensor变量指向A0引脚
int sensorRead = 0; // 声明sensor 读到的值为0
int newData=0; // 新数据
void setup()
{
Serial.begin(9600);
}
void loop()
{
sensorRead = analogRead(sensor); // 读取sensor脚的 analog 值(模拟信号值)
newData=map(sensorRead,0,1023,0,255); //映射数值:0-1023 -> 0-255
Serial.println(newData);
analogWrite(3,newData); //需要找有~(波浪线)的引脚(PWM引脚)
delay(500);
}

07 舵机

相关设备:舵机。舵机可以转动指定的角度。
舵机信号线必须接到PWM引脚

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <Servo.h>
/*
电位器控制舵机角度
*/
Servo myServo; // 给定一个舵机对象
int sensor = 0; // 电位器的值
int angle = 0; // 舵机角度
void setup()
{
myServo.attach(9); // 9号引脚控制此舵机
}
void loop()
{
sensor = analogRead(A0); // 读取电位器的值
angle = map(sensor, 0, 1023, 0, 180);
myServo.write(angle); // 转动到制定角度(0~180)
delay(15);
}

08、09 74HC595 芯片

相关设备:74HC595。

  • 74HC595是一个8位串行输入、并行输出的位移缓存器
  • 此芯片可以帮助你高效率地扩充引脚。
  • 芯片缺角半圆表示引脚计数起始处。
  • Q0~Q7为输出引脚,DS“数据输入引脚”,OE“接地”,STCP“时钟引脚”(大平台),SHCP“时钟引脚”(活塞),MR“复位引脚”。
  • 工作逻辑(形象比喻):活塞将8个数据依次“推”进低电平的“大平台”,“大平台”再将数据输出到每一个Q引脚。
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
#include <Arduino.h>
/*
通过数组存储LED灯的亮暗状态,通过for循环依次写入,实现LED灯的亮灭切换
相当于将3个引脚,控制了8个LED灯的亮灭
*/
int big = 2; // 大平台定义为2号引脚 (ST)
int push = 3; // 活塞定义为3号引脚(SH)
int datain = 4; // 数据输入引脚4(DS)
int dataInput[8] = {1, 0, 0, 1, 0, 0, 0, 1}; // 8个LED灯的亮暗状态

void setup()
{
pinMode(big, OUTPUT);
pinMode(push, OUTPUT);
pinMode(datain, INPUT);
}
void loop()
{
digitalWrite(big, LOW); // 先放下大平台
for (int i = 0; i < 8; i++)
{
digitalWrite(push, LOW); // 拉回活塞
digitalWrite(datain, dataInput[i]); // 写入数据 (即串行输入)
digitalWrite(push, HIGH); // 推活塞
}
digitalWrite(big, HIGH); // 抬起大平台 (即并行输出)
}

10 步进电机

相关设备:步进电机、ULN2003芯片。

舵机 步进电机
转动 指定角度 转指定角度
线数 3条 4-6条

步进电机原理:步进电机的转动,是通过控制4个引脚的电平状态实现的。即4个引脚轮流接地、断开电平,使得其对应线圈产生磁场后转动转子。

ULN2003芯片原理:1-7引脚高电平,则对面的对应引脚(16-10)输出低电平。8号引脚为接地。
img

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
#include <Arduino.h>
/*
通过控制步进电机的四个引脚,控制步进电机的转动
若电机抽搐,可能是电机引脚连接不正确、顺序不对,或者delay时间太短
*/

int apin = 8; // 电机橙色线
int bpin = 9; // 电机黄色线
int cpin = 10; // 电机粉色线
int dpin = 11; // 电机蓝色线
int delaytime = 10; // 转动时间间距
void setup()
{
pinMode(apin, OUTPUT);
pinMode(bpin, OUTPUT);
pinMode(cpin, OUTPUT);
pinMode(dpin, OUTPUT);
}
void loop()
{
digitalWrite(apin, HIGH); // 橙色线GND
delay(delaytime);
digitalWrite(apin, LOW); // 断开橙色线

digitalWrite(bpin, HIGH);
delay(delaytime);
digitalWrite(bpin, LOW);

digitalWrite(cpin, HIGH);
delay(delaytime);
digitalWrite(cpin, LOW);

digitalWrite(dpin, HIGH);
delay(delaytime);
digitalWrite(dpin, LOW);
}

11 8x8 点阵LED面板

相关设备:8x8 LED面板。
点亮点阵的某个点,即使得对应行高电平(5v)、列低电平(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
#include <Arduino.h>
/*
点亮点阵灯
tip:0、1引脚在上传时需先拔出来,否则可能会引起上传错误
TODO: 此处直接使用开发板的引脚。开发板引脚不足不能完全控制,可使用7474HC595来扩充引脚
*/

int line[6] = {0, 1, 2, 3, 4, 5}; // 行的6个引脚
int col[6] = {8, 9, 10, 11, 12, 13}; // 列的6个引脚
int appear[6][6] = { // 想要呈现的亮点
{0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0},
{0, 0, 1, 1, 0, 0},
{0, 0, 1, 1, 0, 0},
{0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0}};
void setup()
{
for (int i = 0; i < 6; i++)
{
pinMode(line[i], OUTPUT);
pinMode(col[i], OUTPUT);
digitalWrite(line[i], LOW);
digitalWrite(col[i], HIGH); //接高电位即“无任何效果的断路?”
}
}
void loop()
{
for (int i = 0; i < 6; i++)
{
for (int j = 0; j < 6; j++)
{
if (appear[j][i] == 1)
{
digitalWrite(line[i], HIGH);
digitalWrite(col[j], LOW);
delay(1);
digitalWrite(line[i], LOW);
digitalWrite(col[j], HIGH);
}
}
}
}

12、13 WiFi 连接

可能是最常用的WiFi模块。也可独立作为微控制器使用。

相关设备:WiFi模块 ESP8266
将板子连接电脑后,在Arduino IDE中,选择NodeMCU (ESP-12E Module)

1
2
3
4
5
6
7
8
9
10
11
12
13
/*
ESP8266 可以看作是Arduino Uno的升级WiFi版*
先点灯,使用LED_BUILTIN 引脚确定板子连接成功
数字与引脚对照表:
数字 13=D7 16=D0;15=D8;14=D5;12=D6;4=D2;3=D9; 2=D4;1=D10;0=D3;

示例代码参考ArduinoIDE中的示例代码
基本逻辑:
1、根据SSID、密码,连接WiFi。
2、连接成功后,打印ESP8266的IP地址,并通过电脑、手机浏览器访问ESP8266的IP地址,即可看到网页
3、http://ip/gpio/1 可控制相关引脚的高低电平
*/

14 红外遥控

相关设备:Arduino Nano、红外遥控器、红外接收器。(任何的家用遥控器都可以拿来用)
基本逻辑:遥控器发送信号,接收器接收信号,Arduino Nano通过引脚控制引脚的高低电平。
红外接收器的引脚:信号线、GDN、5V

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
#include <Arduino.h>
#include <IRremote.h>
/*
* 对接发射器时,先获取发射器的每个按键对应的信号值,再根据信号值进行功能逻辑编码
*/

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN); // 创建红外实例,并设置引脚

decode_results results; // 接收到的红外信号

void setup()
{
Serial.begin(9600);
Serial.println("IR Receiver");
irrecv.enableIRIn(); // 启用红外线接收
Serial.println("IR Receiver Ready");
pinMode(7, OUTPUT);
}
void loop()
{
if (irrecv.decode(&results))
{
Serial.println(results.value, HEX); // 输出接收到的信号值
if (results.value == 0xFF6299) // 对应按键
{
digitalWrite(7, !digitalRead(7)); //取反
}

irrecv.resume(); // 恢复接收
}
delay(100);
}

15 ATtiny85

最小化的arduino 。可将arduino UNO程序烧录到ATtiny85,实现一些简单的功能。
三色LED,最长的引脚为GND,其余为RGB。