跳到主要内容

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

// 参考电压设置
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, Nano10 位 (0-1023)0-5V
Mega10 位 (0-1023)0-5V
Due12 位 (0-4095)0-3.3V
Zero12 位 (0-4095)0-3.3V

PWM 引脚

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

PWM 频率

引脚默认频率
D5, D6980Hz
D3, D9, D10, D11490Hz

时间函数

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

中断注意事项

  • 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 引脚说明

数字引脚

引脚特殊功能说明
D0RX串口接收(上传程序时断开)
D1TX串口发送(上传程序时断开)
D2INT0外部中断 0
D3INT1, PWM外部中断 1,PWM 输出
D4-通用数字引脚
D5PWMPWM 输出
D6PWMPWM 输出
D7-通用数字引脚
D8-通用数字引脚
D9PWMPWM 输出
D10PWM, SSPWM 输出,SPI 片选
D11PWM, MOSIPWM 输出,SPI 数据输出
D12MISOSPI 数据输入
D13SCK, LEDSPI 时钟,板载 LED

模拟引脚

引脚特殊功能说明
A0-模拟输入
A1-模拟输入
A2-模拟输入
A3-模拟输入
A4SDAI2C 数据线
A5SCLI2C 时钟线

电源引脚

引脚说明
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() 设置

串口乱码

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

传感器读数异常

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

资源链接