(2)Arduino参考开源代码
- /*
- 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
- 程序九:点阵屏加速度仪
- */
-
- #include <LedControl.h> //导入点阵屏驱动库
- #include <Wire.h>
-
- #define DEVICE (0x53) //ADXL345设备地址
- #define TO_READ (6) //我们要读取的字节数(每个轴两个字节)
-
- byte buff[TO_READ] ; //6字节缓冲区,用于保存从设备读取的数据
- char str[512]; //字符串缓冲区在发送数据之前对其进行转换
-
- int MATRIX_WIDTH = 8;
- LedControl lc = LedControl(12, 10, 11, 1); // 点阵屏接脚:DIN, CLK, CS, NRDEV
- unsigned long delaytime = 50;
- int x_key = A1;
- int y_key = A0;
- int x_pos;
- int y_pos;
-
- // 表示单个灯光位置的对象
- // 未来的重力更新
- class Grain
- {
- public:
- int x = 0;
- int y = 0;
- int mass = 1;
- };
- Grain *g;
-
- void setup() {
- //设置一个grain对象
- g = new Grain();
-
- ClearDisplay();
-
- Wire.begin(); // 加入 i2c 总线(主机地址可选)
- Serial.begin(9600); // 启动串口输出
-
- //开启ADXL345
- writeTo(DEVICE, 0x2D, 0);
- writeTo(DEVICE, 0x2D, 16);
- writeTo(DEVICE, 0x2D, 8);
- }
-
- void loop() {
- // 第一个轴加速度数据寄存器
- int regAddress = 0x32;
- int x, y, z;
-
- readFrom(DEVICE, regAddress, TO_READ, buff); //从ADXL345读取加速度数据
-
- // 合并每个方向的两个字节
- // 最低有效位在前
- x = (((int)buff[1]) << 8) | buff[0];
- y = (((int)buff[3]) << 8) | buff[2];
- z = (((int)buff[5]) << 8) | buff[4];
-
- // 将值转换为可以在矩阵上表示的值
- x = map(x, -300, 300, 0, 8);
- y = map(y, -300, 300, 0, 8);
- z = map(z, -300, 300, 0, 8);
-
- //我们将x y z值作为字符串发送到串口
- Serial.print("X: ");
- Serial.print(x);
- Serial.print(" Y: ");
- Serial.print(y);
- Serial.print(" Z: ");
- Serial.print(z);
- Serial.print("\n");
-
- ClearDisplay();
- //将grain分配到这个位置
- g->x = x;
- g->y = y;
- lc.setLed(0, g->x, g->y, true);
-
- //在每次更新之间添加一些延迟
- delay(10);
- }
-
- void ClearDisplay() {
- //设置液晶显示器
- int devices = lc.getDeviceCount();
-
- for (int address = 0; address < devices; address++)
- {
- lc.shutdown(address, false);
- lc.setIntensity(address, 1);
- lc.clearDisplay(address);
- }
- }
-
- //将val写入设备上的地址寄存器
- void writeTo(int device, byte address, byte val)
- {
- Wire.beginTransmission(device); //开始传输到设备
- Wire.write(address); // 发送寄存器地址
- Wire.write(val); // 发送要写入的值
- Wire.endTransmission(); //结束传输
- }
-
- //从设备上的地址寄存器开始读取num字节到buff数组
- void readFrom(int device, byte address, int num, byte buff[])
- {
- Wire.beginTransmission(device); //开始传输到设备
- Wire.write(address); //发送要读取的地址
- Wire.endTransmission(); //结束传输
-
- Wire.beginTransmission(device); //开始传输到设备
- Wire.requestFrom(device, num); // 从设备请求 6 个字节
-
- int i = 0;
- while (Wire.available()) //设备发送的数据可能少于请求的数据(异常)
- {
- buff[i] = Wire.read(); // 接收一个字节
- i++;
- }
- Wire.endTransmission(); //结束传输
- delay(300);
- }
复制代码
|