目录
一、ADXL3xx 实验测试
1.1 硬件接线方式
1.2 中文注释代码
1.3 测试结果
1.4 核心原理
二、Knock 实验测试
2.1 硬件接线方式
2.2 中文注释代码
2.3 核心原理
三、Memsic2125 实验测试
3.1 硬件接线方式
3.2 中文注释代码
3.3 核心原理
四、Ping 实验测试
4.1 硬件接线方式
4.2 中文注释代码
4.3 核心原理
本实验硬件平台为 Arduino Uno R3 主控板,核心主控芯片为 ATmega328P,具备多路数字与模拟引脚、串口通信接口,可通过 USB 直接供电和程序烧录。
软件开发环境为 Arduino IDE,本次测试代码为内置 06.Sensors 官方传感器采集示例,路径为文件→示例→06.Sensors,包含 ADXL3xx、Knock、Memsic2125、Ping 共 4 个范例,主要用于学习加速度传感器、震动敲击传感器、双轴倾角传感器、超声波测距传感器的模拟 / 数字信号采集、数据读取与串口解析等传感器信号检测技术。

一、ADXL3xx 实验测试
1.1 硬件接线方式
- X 轴输出 → 模拟引脚 A3
- Y 轴输出 → 模拟引脚 A2
- Z 轴输出 → 模拟引脚 A1
- 模块 VCC → 模拟引脚 A5(复用为数字输出高电平供电)
- 模块 GND → 模拟引脚 A4(复用为数字输出低电平接地)
- 自检引脚 → 模拟引脚 A0

下面是上图所示配置的引脚连接:
| Arduino模拟输入引脚 | 0 | 1 | 2 | 3 | 4 | 5 |
或者,如果你只是用加速度计的话:
| Arduino 引脚 | 无(未连接) | 模拟输入1 | 模拟输入2 | 模拟输入3 | GND | 5V |
注意,有些加速度计使用3.3V电源,5V可能会损坏它们。查阅供应商的文档以确定正确的电压。
1.2 中文注释代码
/*
ADXL3xx 三轴加速度传感器读取示例
读取ADI公司ADXL3xx系列加速度传感器三轴模拟输出,通过串口输出X/Y/Z轴加速度数值
复用模拟引脚作为供电引脚,可直接直插连接传感器分线板
电路说明:
– 模拟引脚A3:X轴输出
– 模拟引脚A2:Y轴输出
– 模拟引脚A1:Z轴输出
– 模拟引脚A4:复用为接地
– 模拟引脚A5:复用为电源供电
*/
// 引脚常量定义
const int groundpin = 18; // 模拟引脚4编号,用作接地
const int powerpin = 19; // 模拟引脚5编号,用作供电
const int xpin = A3; // X轴加速度输入
const int ypin = A2; // Y轴加速度输入
const int zpin = A1; // Z轴加速度输入(仅三轴型号支持)
void setup() {
// 初始化串口通信,波特率9600
Serial.begin(9600);
// 复用模拟引脚作为数字IO,为传感器提供电源和地
// 若直接接Arduino原生5V和GND引脚,可删除以下四行
pinMode(groundpin, OUTPUT);
pinMode(powerpin, OUTPUT);
digitalWrite(groundpin, LOW);
digitalWrite(powerpin, HIGH);
}
void loop() {
// 打印X轴加速度原始数值
Serial.print(analogRead(xpin));
Serial.print("\\t"); // 制表符分隔
// 打印Y轴加速度原始数值
Serial.print(analogRead(ypin));
Serial.print("\\t");
// 打印Z轴加速度原始数值并换行
Serial.print(analogRead(zpin));
Serial.println();
delay(100); // 采样间隔延时
}
1.3 测试结果
这里是一些加速度计的读数,是通过将 ADXL322 2g 加速度计的 y 轴以不同角度相对于地面放置收集的。其他轴的数值应该相同,但会根据设备的灵敏度有所不同。当轴水平(即与地面平行或 0°)时,加速度计的读数应该在 512 左右,但其他角度的数值对于不同的加速度计(例如 ADXL302 5g)会有所不同。
1.4 核心原理
二、Knock 实验测试
2.1 硬件接线方式
- 压电片正极引脚接模拟输入 A0
- 压电片负极引脚直接接 GND
- 1MΩ 电阻并联在 A0 与 GND 之间,用于泄放电荷、稳定电压

2.2 中文注释代码
/*
Knock Sensor 压电敲击震动检测示例
通过压电陶瓷片采集敲击震动产生的模拟电压信号,设置阈值判断是否发生敲击;
检测到敲击后翻转D13板载LED状态,并通过串口打印"Knock!"提示
电路说明:
– 压电元件正极接模拟引脚A0,负极接GND
– 1MΩ电阻并联在A0与GND之间,释放压电产生的电荷
创建:2007.3.25 by David Cuartielles
修改:2011.8.30 by Tom Igoe
*/
// 固定常量定义
const int ledPin = 13; // 板载LED引脚
const int knockSensor = A0; // 压电震动传感器模拟输入引脚
const int threshold = 100; // 敲击判断阈值
// 可变全局变量
int sensorReading = 0; // 存储压电传感器采样数值
int ledState = LOW; // 记录LED当前电平状态,用于翻转
void setup() {
pinMode(ledPin, OUTPUT); // 设置LED引脚为输出模式
Serial.begin(9600); // 初始化串口通信
}
void loop() {
// 读取压电传感器模拟电压采样值
sensorReading = analogRead(knockSensor);
// 采样值超过阈值,判定为有效敲击
if (sensorReading >= threshold) {
ledState = !ledState; // 翻转LED状态(取反)
digitalWrite(ledPin, ledState); // 更新LED引脚电平
Serial.println("Knock!"); // 串口输出敲击提示
delay(100); // 消抖延时,防止频繁触发
}
}
2.3 核心原理
三、Memsic2125 实验测试
3.1 硬件接线方式
- 传感器 X 脉冲输出 → 数字引脚 D2
- 传感器 Y 脉冲输出 → 数字引脚 D3
- 传感器 VCC 引脚 → Arduino +5V
- 传感器 GND 引脚 → Arduino GND

3.2 中文注释代码
/*
Memsic2125 双轴脉冲型加速度传感器读取示例
读取Memsic2125输出的X、Y轴脉冲宽度,通过公式换算为毫g单位加速度值并串口打印
1g重力等于1000毫g,通过脉冲宽度判断传感器倾斜、受力状态
电路说明:
– 加速度计X脉冲输出接数字引脚2
– 加速度计Y脉冲输出接数字引脚3
– 传感器电源接+5V,地接GND
*/
// 引脚常量定义
const int xPin = 2; // 加速度计X轴脉冲输出引脚
const int yPin = 3; // 加速度计Y轴脉冲输出引脚
void setup() {
Serial.begin(9600); // 初始化串口通信
pinMode(xPin, INPUT); // 设置X轴引脚为输入模式
pinMode(yPin, INPUT); // 设置Y轴引脚为输入模式
}
void loop() {
int pulseX, pulseY; // 存储读取到的X、Y轴脉冲宽度
int accelerationX, accelerationY; // 存储换算后的加速度值
// pulseIn函数测量高电平脉冲持续时间(单位:微秒)
pulseX = pulseIn(xPin, HIGH);
pulseY = pulseIn(yPin, HIGH);
// 将脉冲宽度换算为毫g加速度,1g = 1000 milli-g
accelerationX = ((pulseX / 10) – 500) * 8;
accelerationY = ((pulseY / 10) – 500) * 8;
// 制表符分隔打印双轴加速度数据
Serial.print(accelerationX);
Serial.print("\\t");
Serial.print(accelerationY);
Serial.println();
delay(100); // 采样间隔延时,稳定输出数据
}
3.3 核心原理
四、Ping 实验测试
4.1 硬件接线方式
- 传感器 VCC 引脚 → Arduino +5V
- 传感器 GND 引脚 → Arduino GND
- 传感器 SIG 信号引脚 → 数字引脚 D7

4.2 中文注释代码
/*
Ping))) Sensor 超声波测距传感器示例
驱动Parallax Ping超声波模块,通过单引脚完成发射触发与回波脉冲接收
根据声波往返脉冲时长,换算出障碍物距离,分别输出英寸、厘米两种单位
电路说明:
– Ping模块VCC接+5V,GND接GND
– Ping模块SIG信号脚接数字引脚7
*/
// 传感器信号引脚常量
const int pingPin = 7;
void setup() {
// 初始化串口通信,波特率9600
Serial.begin(9600);
}
void loop() {
long duration, inches, cm;
// duration:声波往返总微秒时长
// inches:英寸距离,cm:厘米距离
// 第一步:配置引脚为输出,发送触发脉冲启动超声波发射
pinMode(pingPin, OUTPUT);
digitalWrite(pingPin, LOW);
delayMicroseconds(2); // 先拉低保证干净触发脉冲
digitalWrite(pingPin, HIGH);
delayMicroseconds(5); // 至少5微秒高电平触发模块发射声波
digitalWrite(pingPin, LOW);
// 第二步:切换引脚为输入,读取回波高电平脉冲宽度
pinMode(pingPin, INPUT);
duration = pulseIn(pingPin, HIGH);
// 把脉冲时长换算为距离
inches = microsecondsToInches(duration);
cm = microsecondsToCentimeters(duration);
// 串口打印两种单位测距结果
Serial.print(inches);
Serial.print("in, ");
Serial.print(cm);
Serial.print("cm");
Serial.println();
delay(100); // 100ms间隔,稳定测距刷新频率
}
// 微秒时间转换为英寸距离
long microsecondsToInches(long microseconds) {
// 声速对应每英寸往返耗时74微秒,除以2得到单程距离
return microseconds / 74 / 2;
}
// 微秒时间转换为厘米距离
long microsecondsToCentimeters(long microseconds) {
// 声速对应每厘米往返耗时29微秒,除以2得到单程距离
return microseconds / 29 / 2;
}
4.3 核心原理
参考链接 :https://docs.arduino.cc/built-in-examples
