Arduino 知识速查表
基础语法
程序结构
void setup() {
// 初始化代码,只执行一次
}
void loop() {
// 主循环代码,重复执行
}
数据类型
| 类型 | 大小 | 范围 | 说明 |
|---|---|---|---|
byte | 1字节 | 0-255 | 无符号整数 |
int | 2字节 | -32768~32767 | 整数 |
unsigned int | 2字节 | 0-65535 | 无符号整数 |
long | 4字节 | -2147483648~2147483647 | 长整数 |
float | 4字节 | -3.4E+38~3.4E+38 | 浮点数 |
double | 4字节 | 同 float | 双精度(Uno 上与 float 相同) |
char | 1字节 | -128~127 | 字符 |
bool | 1字节 | true/false | 布尔值 |
String | 可变 | - | 字符串对象 |
常量
| 常量 | 值 | 说明 |
|---|---|---|
HIGH | 1 | 高电平(5V) |
LOW | 0 | 低电平(0V) |
INPUT | 0 | 输入模式 |
OUTPUT | 1 | 输出模式 |
INPUT_PULLUP | 2 | 输入上拉模式 |
LED_BUILTIN | 13 | 板载 LED 引脚 |
true | 1 | 真 |
false | 0 | 假 |
数字 I/O
函数
pinMode(pin, mode); // 设置引脚模式
pinMode(13, OUTPUT);
digitalWrite(pin, value); // 数字输出
digitalWrite(13, HIGH);
int value = digitalRead(pin); // 数字输入
int buttonState = digitalRead(2);
引脚模式
| 模式 | 说明 |
|---|---|
INPUT | 高阻抗输入 |
OUTPUT | 输出模式 |
INPUT_PULLUP | 内部上拉电阻输入 |
模拟 I/O
函数
int value = analogRead(pin); // 模拟输入(0-1023)
int sensorValue = analogRead(A0);
analogWrite(pin, value); // PWM 输出(0-255)
analogWrite(9, 128); // 50% 占空比
// 参考电压设置
analogReference(type); // 设置 ADC 参考电压
// DEFAULT: 5V (默认)
// INTERNAL: 1.1V (内部参考)
// EXTERNAL: AREF 引脚电压
// 数值映射
map(value, fromLow, fromHigh, toLow, toHigh);
int pwm = map(sensorValue, 0, 1023, 0, 255);
// 限制范围
constrain(value, min, max);
int safe = constrain(sensorValue, 0, 255);
ADC 分辨率
| 开发板 | ADC 分辨率 | 电压范围 |
|---|---|---|
| Uno, Nano | 10 位 (0-1023) | 0-5V |
| Mega | 10 位 (0-1023) | 0-5V |
| Due | 12 位 (0-4095) | 0-3.3V |
| Zero | 12 位 (0-4095) | 0-3.3V |
PWM 引脚
Arduino Uno 的 PWM 引脚:D3, D5, D6, D9, D10, D11
PWM 频率
| 引脚 | 默认频率 |
|---|---|
| D5, D6 | 980Hz |
| D3, D9, D10, D11 | 490Hz |
时间函数
delay(ms); // 延时(毫秒)
delay(1000); // 延时 1 秒
delayMicroseconds(us); // 延时(微秒)
delayMicroseconds(100); // 延时 100 微秒
unsigned long ms = millis(); // 运行时间(毫秒)
unsigned long us = micros(); // 运行时间(微秒)
串口通信
初始化与发送
Serial.begin(baudrate); // 初始化串口
Serial.begin(9600);
Serial.print(data); // 打印数据(不换行)
Serial.println(data); // 打印数据(换行)
Serial.write(byte); // 写入字节
接收
int available = Serial.available(); // 可读字节数
char incoming = Serial.read(); // 读取一个字节
String data = Serial.readString(); // 读取字符串
String line = Serial.readStringUntil('\n'); // 读取到换行
常用波特率
| 波特率 | 用途 |
|---|---|
| 9600 | 默认,最常用 |
| 115200 | 高速传输 |
| 57600 | 蓝牙模块常用 |
数学函数
// 基本运算
min(x, y); // 最小值
max(x, y); // 最大值
abs(x); // 绝对值
constrain(x, a, b); // 限制在范围内
map(x, a, b, c, d); // 数值映射
// 高级运算
sqrt(x); // 平方根
pow(base, exp); // 幂运算
sq(x); // 平方
// 三角函数(弧度)
sin(rad); // 正弦
cos(rad); // 余弦
tan(rad); // 正切
// 随机数
random(max); // 0 到 max-1
random(min, max); // min 到 max-1
randomSeed(seed); // 设置随机种子
位操作
// 位运算
& // 与
| // 或
^ // 异或
~ // 非
<< // 左移
>> // 右移
// 位操作宏
bitRead(value, bit); // 读取位
bitWrite(value, bit, bitvalue); // 写入位
bitSet(value, bit); // 设置位为 1
bitClear(value, bit); // 清除位为 0
bit(bitNum); // 获取位掩码
中断
外部中断
// 定义中断服务函数
void myISR() {
// 中断处理代码(要短要快)
}
void setup() {
// 附加中断
attachInterrupt(digitalPinToInterrupt(pin), myISR, mode);
// 分离中断
detachInterrupt(digitalPinToInterrupt(pin));
}
中断模式
| 模式 | 说明 |
|---|---|
LOW | 低电平触发 |
CHANGE | 状态变化触发 |
RISING | 上升沿触发 |
FALLING | 下降沿触发 |
Uno 中断引脚
| 中断号 | 引脚 |
|---|---|
| 0 | D2 |
| 1 | D3 |
中断注意事项
- ISR 中的变量必须声明为
volatile - ISR 中不能使用
delay() - 保持 ISR 简短,只做必要的操作
EEPROM(存储)
#include <EEPROM.h>
// 写入
EEPROM.write(address, value); // 写入字节
EEPROM.put(address, value); // 写入任意类型
// 读取
byte value = EEPROM.read(address); // 读取字节
EEPROM.get(address, variable); // 读取任意类型
// 更新(只在值变化时写入)
EEPROM.update(address, value);
// 获取大小
int size = EEPROM.length();
常用库
舵机
#include <Servo.h>
Servo myServo;
myServo.attach(pin); // 连接舵机
myServo.write(angle); // 设置角度(0-180)
myServo.detach(); // 断开连接
步进电机
#include <Stepper.h>
Stepper myStepper(stepsPerRev, pin1, pin2, pin3, pin4);
myStepper.setSpeed(rpm); // 设置转速
myStepper.step(steps); // 转动步数
软件串口
#include <SoftwareSerial.h>
SoftwareSerial mySerial(rxPin, txPin);
mySerial.begin(baudrate);
mySerial.print(data);
I2C
#include <Wire.h>
Wire.begin(); // 以主设备加入 I2C 总线
Wire.beginTransmission(address);
Wire.write(data);
Wire.endTransmission();
Wire.requestFrom(address, quantity);
while (Wire.available()) {
char c = Wire.read();
}
SPI
#include <SPI.h>
SPI.begin();
SPI.transfer(data);
SPI.end();
Arduino Uno 引脚说明
数字引脚
| 引脚 | 特殊功能 | 说明 |
|---|---|---|
| D0 | RX | 串口接收(上传程序时断开) |
| D1 | TX | 串口发送(上传程序时断开) |
| D2 | INT0 | 外部中断 0 |
| D3 | INT1, PWM | 外部中断 1,PWM 输出 |
| D4 | - | 通用数字引脚 |
| D5 | PWM | PWM 输出 |
| D6 | PWM | PWM 输出 |
| D7 | - | 通用数字引脚 |
| D8 | - | 通用数字引脚 |
| D9 | PWM | PWM 输出 |
| D10 | PWM, SS | PWM 输出,SPI 片选 |
| D11 | PWM, MOSI | PWM 输出,SPI 数据输出 |
| D12 | MISO | SPI 数据输入 |
| D13 | SCK, LED | SPI 时钟,板载 LED |
模拟引脚
| 引脚 | 特殊功能 | 说明 |
|---|---|---|
| A0 | - | 模拟输入 |
| A1 | - | 模拟输入 |
| A2 | - | 模拟输入 |
| A3 | - | 模拟输入 |
| A4 | SDA | I2C 数据线 |
| A5 | SCL | I2C 时钟线 |
电源引脚
| 引脚 | 说明 |
|---|---|
| VIN | 外部电源输入(7-12V) |
| 5V | 稳压 5V 输出 |
| 3.3V | 稳压 3.3V 输出 |
| GND | 地线(多个) |
| AREF | 模拟参考电压输入 |
| RESET | 复位引脚 |
引脚布局
PWM 引脚
Arduino Uno 有 6 个 PWM 引脚:D3, D5, D6, D9, D10, D11
PWM 频率:
- D5, D6:约 980Hz
- D3, D9, D10, D11:约 490Hz
常用传感器接线速查
DHT11/DHT22 温湿度
VCC → 5V
DATA → D2(需 10kΩ 上拉)
GND → GND
HC-SR04 超声波
VCC → 5V
Trig → D9
Echo → D10
GND → GND
HC-SR501 人体红外
VCC → 5V
OUT → D2
GND → GND
I2C 设备(LCD/OLED/BMP280)
VCC → 3.3V 或 5V(根据设备)
GND → GND
SCL → A5
SDA → A4
MPU6050 六轴传感器
VCC → 3.3V 或 5V
GND → GND
SCL → A5
SDA → A4
AD0 → GND(地址 0x68)或 VCC(地址 0x69)
红外接收模块
VCC → 5V
GND → GND
OUT → D11(或其他数字引脚)
继电器模块
VCC → 5V
GND → GND
IN → D7(或其他数字引脚)
COM → 公共端
NO → 常开触点
NC → 常闭触点
代码片段
按钮消抖(非阻塞)
int lastButtonState = HIGH;
int buttonState = HIGH;
unsigned long lastDebounceTime = 0;
const unsigned long DEBOUNCE_DELAY = 50;
void loop() {
int reading = digitalRead(BUTTON_PIN);
if (reading != lastButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > DEBOUNCE_DELAY) {
if (reading != buttonState) {
buttonState = reading;
if (buttonState == LOW) {
// 按钮按下
}
}
}
lastButtonState = reading;
}
检测按钮边沿
int lastButtonState = HIGH;
void loop() {
int currentButtonState = digitalRead(BUTTON_PIN);
// 检测下降沿(按下)
if (currentButtonState == LOW && lastButtonState == HIGH) {
// 按钮刚被按下
}
// 检测上升沿(释放)
if (currentButtonState == HIGH && lastButtonState == LOW) {
// 按钮刚被释放
}
lastButtonState = currentButtonState;
}
平滑传感器读数
int smoothRead(int pin, int samples = 10) {
long sum = 0;
for (int i = 0; i < samples; i++) {
sum += analogRead(pin);
delayMicroseconds(100);
}
return sum / samples;
}
非阻塞延时
unsigned long previousMillis = 0;
const long interval = 1000;
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
// 执行定时任务
}
}
故障排除
上传失败
- 检查端口选择
- 检查开发板型号
- 检查驱动安装
- 断开 D0/D1 外部连接
程序不运行
- 检查电源连接
- 检查引脚编号
- 检查
pinMode()设置
串口乱码
- 检查波特率设置
- 检查串口监视器波特率
传感器读数异常
- 检查接线
- 检查电源稳定性
- 添加去耦电容
- 使用滤波算法