|
主题设置

卡片式面板通常用于非白色背景色的主体内

Arduino 函数

Arduino 的函数可以帮助用户控制硬件和实现各种功能。

设置引脚

// OUTPUT 的作用是设置 Arduino 的 LED 灯所在的引脚为输出模式,一般UNO 开发板的 LED_BUILTIN 所在的引脚为 13
pinMode(LED_BUILTIN,OUTPUT); 

// INPUT 的作用是设置 Arduino 的 pushButton 按钮所在的引脚为输入模式,一般 UNO 开发板的 pushButton 所在的引脚为 2
pinMode(pushButton,INPUT);

// 设置 5 号引脚为输出模式,此时可识别两种状态:HIGH(高电平) LOW(低电平)
pinMode(5,OUTPUT);

// 设置 5 号引脚为输入模式,此时可识别两种状态:HIGH(高电平) LOW(低电平)
pinMode(5,INPUT);

// 设置 2 号引脚为 “输入上拉” 模式(如果正负极之间没有添加电阻而直接电线相连,容易烧坏开发板,所以 “上拉” 指的是加大电线之间的电阻,Arduino 开发板内部自带内部上拉电阻)
// 在输入上拉模式下,按钮的逻辑状态是反的,即:开关断开时(未连接到 GND)引脚读取到高电平;开关被按下后(连接到了 GND)引脚读取到低电平
pinMode(2, INPUT_PULLUP); 

数字读写

使用 digitalWrite() 函数控制引脚的时候,必须对要控制的引脚用 pinMode() 先设置为 output

// 设置 LED_BUILTIN 所在的引脚输出电流,HIGH(Arduino 开发板一般为5 伏特)
digitalWrite(LED_BUILTIN, HIGH);

// 设置 LED_BUILTIN 所在的引脚不输出电流,即断电,LOW(0伏特)
digitalWrite(LED_BUILTIN, LOW);

// 读取数字引脚的状态(高电平HIGH=1 或者 低电平LOW=0)
int buttonState = digitalRead(pushButton); 

模拟数值

// 将一个模式数值写进 Arduino 的引脚,输出 PWM 信号。
// PWM 信号可以控制 ledPin 所在引脚上 LED 灯的亮度,也可以控制电机的转速。
// 在 Arduino UNO 开发板中,只有 3/5/6/9/10/11 这几个引脚可以进行 analogWrite 输出(旁边有波浪线标记的引脚)。
// 输出模拟输入值
analogWrite(ledPin,brightness);

// Arduino UNO 开发板的控制器有多个 10 位数模转换通道,这意味着 Arduino 可以将 0-5 伏特的电压输入信号映射到数值 0-1023
// 当模拟输入引脚的电压为 2.5 伏特的时候,该引脚的数值为 512。(2.5V / 5V = 0.5,1024 * 0.5 = 512)
// Arduino 控制器读取每一次模拟输入需要消耗 100 微妙的时间,最大频率是每秒 1 万次。
// 读取模拟输入值
int analogInputVal = analogRead(A0);

// 当输入的电压不是 0~5V,而是 0~3.3V,或者其他电压范围时,引脚的输入范围以及解析度可以使用 analogReference() 指令进行调整
// 具体使用方法这里未记录,后续学习后再记录
analogReference();

// 将模拟输入值(0~1023)等比映射到模拟输出
// map() 函数的作用是将 0~1023 映射到 0~255
int brightness = map(analogInputVal,0,1023,0,255);

串口通信

// 串口通讯初始化,波特率为 9600。(波特率 9600 指每秒读取 9600 位字节的数据)
Serial.begin(9600);

// 将引脚状态输出到 “串口监视器” 当中,不换行
Serial.print(buttonState);

// 将引脚状态输出到 “串口监视器” 当中,换行
Serial.println(buttonState);

// 检查 Arduino 的 “串口接收缓存” 是否有数据等待传输,返回所有等待传输的字节的长度。
// 没有数据,返回 0;有 1 个字节的数据,返回1;有2个字节的数据,返回2;有3个字节的数据,返回3……
Serial.available();

// 读取 “串口接收缓存” 里等待传输的数据,读取之后会从等待传输的数据中,将本次读取到的数据清除掉
// 一次只从 “串口缓存” 中读取一个等待传输的字符,比如计算机向串口缓存中输入 123,会分 3 次读取,分别是 1,2,3
// 当 “串口缓存” 中没有数据了,再用 Serial.read() 读取的话,将返回 -1
// 返回值是字符类型,要用 char 类型接收
// 如果用 int 接收,会返回字符对应的的 ASCLL 码值
Serial.read(); 

// 配合使用
if(Serial.available() > 0){ // 检查串口缓存是否有数据等待传输
	char serialData = Serial.read(); // 读取串口缓存中的数据
	Serial.println(serialData); // 将串口缓存中的数据输出到串口监视器
}

// 分析串口缓存中的数据,得到整数
// 输入 123,得到 123
// 输入 asdfasdfasd123,得到 123
// 输入 acb123def456,得到 123 和 456
int pos = Serial.parseInt();

随机函数

// 产生随机整数,min 产生随机数的下限(包含此数值),max 产生随机数的上线(不包含此数值)
// 使用 random() 函数所产生的随机数,在每一次程序重新启动后,总是重复同一组随机数字,如果希望程序重新启动后产生的随机数与上一次的随机数不同,则需要使用 randomSeed() 函数
random(min,max);

// seedVal是随机种子数值,可以使用analogRead读取空引脚,作为随机种子数值,比如读取 A0 引脚:analogRead(A0)
randomSeed(seedVal);

伺服电机

#include <Servo.h> // 引入伺服电机操作库
Servo myservo; // 声明一个伺服电机对象(可以声明多个伺服电机对象)
int pos = 0; // 定义伺服电机的初始位置

void setup() {
	myservo.attach(9); // 将伺服电机连接到 9 号引脚上
	int currentPos = myservo.read(); // 获取伺服电机当前的位置
	Serial.println(currentPos); // 在串口监视器当中输出伺服电机当前的位置
}

void loop() {
	// goes from 0 degrees to 180 degrees,in steps of 1 degree
	for (pos = 0; pos <= 180; pos += 1) {
		myservo.write(pos); // tell servo to go to position in variable 'pos'
		Serial.println(pos); // 输出当前位置信息
		delay(7); // waits 7ms for the servo to reach the position
	}
	// goes from 180 degrees to 0 degrees
	for (pos = 180; pos >= 0; pos -= 1) {
		myservo.write(pos); // tell servo to go to position in variable 'pos'
		Serial.println(pos);  // 输出当前位置信息
		delay(7); // waits 7ms for the servo to reach the position
	}
}