跳到主要内容

Arduino 知识速查表

基础语法

程序结构

void setup() {
// 初始化代码,只执行一次
}

void loop() {
// 主循环代码,重复执行
}

数据类型

类型大小范围说明
byte1字节0-255无符号整数
int2字节-32768~32767整数
unsigned int2字节0-65535无符号整数
long4字节-2147483648~2147483647长整数
float4字节-3.4E+38~3.4E+38浮点数
double4字节同 float双精度(Uno 上与 float 相同)
char1字节-128~127字符
bool1字节true/false布尔值
String可变-字符串对象

常量

常量说明
HIGH1高电平(5V)
LOW0低电平(0V)
INPUT0输入模式
OUTPUT1输出模式
INPUT_PULLUP2输入上拉模式
LED_BUILTIN13板载 LED 引脚
true1
false0

数字 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% 占空比

// 数值映射
map(value, fromLow, fromHigh, toLow, toHigh);
int pwm = map(sensorValue, 0, 1023, 0, 255);

PWM 引脚

Arduino Uno 的 PWM 引脚:D3, D5, D6, D9, D10, D11

时间函数

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 中断引脚

中断号引脚
0D2
1D3

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)

                    ┌─────────────────┐
RESET ─┤● ●├─ 5V
3.3V ─┤ ●├─ GND
5V ─┤● ●├─ Vin
GND ─┤ ●├─ A0
Vin ─┤● ●├─ A1
│ │
A0 ─┤● ●├─ A2
A1 ─┤ ●├─ A3
A2 ─┤● ●├─ A4 (SDA)
A3 ─┤ ●├─ A5 (SCL)
A4 ─┤● ●├─ D0 (RX)
A5 ─┤ ●├─ D1 (TX)
│ ARDUINO │
D0 ─┤● UNO ●├─ D2
D1 ─┤ ●├─ D3 (~PWM)
D2 ─┤● ●├─ D4
D3 (~) ─┤ ●├─ D5 (~PWM)
D4 ─┤● ●├─ D6 (~PWM)
D5 (~) ─┤ ●├─ D7
D6 (~) ─┤● ●├─ D8
D7 ─┤ ●├─ D9 (~PWM)
D8 ─┤● ●├─ D10 (~PWM)
D9 (~) ─┤ ●├─ D11 (~PWM)
D10(~) ─┤● ●├─ D12
D11(~) ─┤ ●├─ D13 (LED)
D12 ─┤● ●├─ GND
D13 ─┤ ●├─ AREF
GND ─┤● ●├─ SDA
AREF ─┤ ●├─ SCL
SDA ─┤● ●├─
SCL ─┤ ●├─
└─────────────────┘

(~) = PWM 支持

常用传感器接线速查

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)

VCC  → 5V
GND → GND
SCL → A5
SDA → A4

代码片段

按钮消抖

bool debounce(int pin) {
static unsigned long lastTime = 0;
static int lastState = HIGH;

int reading = digitalRead(pin);
if (reading != lastState) {
lastTime = millis();
}

if (millis() - lastTime > 50) {
return reading == LOW;
}

lastState = reading;
return false;
}

平滑传感器读数

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() 设置

串口乱码

  • 检查波特率设置
  • 检查串口监视器波特率

传感器读数异常

  • 检查接线
  • 检查电源稳定性
  • 添加去耦电容
  • 使用滤波算法

资源链接