【ADXL357Z高精度3轴加速度传感器模块】HomeAssistant 远程显示的通信测试

【ADXL357Z高精度3轴加速度传感器模块】HomeAssistant 远程显示——通信测试

本文介绍了 DigiKey 和 EEWorld 共同举办的 你晒单我买单 活动的所选物料 —— ADXL357Z 高精度 3 轴加速度传感器模块 调用 Arduino Library 库函数采集 XYZ 三轴加速度值,结合 ESP8266 无线 WiFi 模块,通过 MQTT 协议远程传输数据至 Home Assistant 智能家居平台的项目设计。

准备工作

  • Windows 系统下安装 Docker 容器,以适应不同软件所需环境;
  • 安装和部署 EMQX 服务器平台,作为 MQTT Broker 端;
  • 安装 Home Assistant 智能家居平台,并获取配置文件 configuration.yaml 的路径;

部署方案详见:开发板通过 MQTT 协议接入 Home Assistant .

硬件连接

采用 IIC 通信方式,将传感器与 Arduino Nano 开发板(主控ATmega328P)连接

ADXL357 Arduino Nano
SCL (P2 - 2) SCL (A5)
SDA (P2 - 6) SDA (A4)
VSS (P1 - 5) GND
VDD (P1 - 3) 3V3

示意图

流程图

代码

新建 Arduino 工程,根据流程图设计,添加如下代码

#include <Wire.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include "Seeed_adxl357b.h"

// WiFi配置
const char* ssid = "xxx";
const char* password = "xxx";

// MQTT配置(带认证)
const char* mqtt_server = "192.168.1.121"; // 替换为你的MQTT服务器地址
const int mqtt_port = 1883;
const char* mqtt_user = "xxx";     // MQTT用户名
const char* mqtt_pass = "xxx";     // MQTT密码
const char* mqtt_client_id = "ESP8266_ADXL357B"; // ID
const char* mqtt_topic = "home/sensor/ADXL357Z";

WiFiClient espClient;
PubSubClient client(espClient);
Adxl357b adxl357b;

// 校准参数
float offsetX = 0, offsetY = 0, offsetZ = 0;
const int calibration_samples = 50;
unsigned long lastMsgTime = 0;
const long publishInterval = 1000; // 发布间隔1秒

void setup() {
  Serial.begin(115200);
  //Wire.begin(02,14); // 修改默认 IIC 通信引脚配置
  // 初始化传感器
  if(adxl357b.begin()) {
    Serial.println("[ERROR] ADXL357B初始化失败");
    while(1);
  }
  adxl357b.setAdxlRange(FOURTY_G);
  adxl357b.setPowerCtr(0); // 进入测量模式
  
  calibrate_sensor();
  setup_wifi();
  
  client.setServer(mqtt_server, mqtt_port);
  client.setCallback(mqtt_callback);
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  // 定时发布数据
  if (millis() - lastMsgTime > publishInterval) {
    lastMsgTime = millis();
    publish_accel_data();
  }
}

void publish_accel_data() {
  int32_t rawX, rawY, rawZ;
  if(adxl357b.checkDataReady() && !adxl357b.readXYZAxisResultData(rawX, rawY, rawZ)) {
    // 转换为g值并应用校准
    float accel[3] = {
      rawX * 0.0000385 - offsetX, // X轴
      rawY * 0.0000385 - offsetY, // Y轴
      rawZ * 0.0000385 - offsetZ  // Z轴
    };
    
    // 构建紧凑型JSON
    char json[128];
    snprintf(json, sizeof(json),
      "{\"x\":%.4f,\"y\":%.4f,\"z\":%.4f,\"unit\":\"g\"}",
      accel[0], accel[1], accel[2]);
    
    if (client.publish(mqtt_topic, json)) {
      Serial.printf("[MQTT] 发布成功: %s\n", json);
    } else {
      Serial.println("[ERROR] 发布失败");
    }
  }
}

void calibrate_sensor() {
  Serial.println("开始校准...保持设备水平静止10秒");
  
  int32_t samples[3] = {0};
  for(int i=0; i<calibration_samples; i++) {
    int32_t x, y, z;
    if(adxl357b.checkDataReady()) {
      adxl357b.readXYZAxisResultData(x, y, z);
      samples[0] += x;
      samples[1] += y;
      samples[2] += z;
      Serial.printf("校准进度 %d/%d\r", i+1, calibration_samples);
    }
    delay(200);
  }
  
  offsetX = samples[0] * 0.0000385 / calibration_samples;
  offsetY = samples[1] * 0.0000385 / calibration_samples;
  offsetZ = (samples[2] * 0.0000385 / calibration_samples) - 1.0; // 减去1g重力
  
  Serial.printf("\n校准完成\nX偏移:%.6fg\nY偏移:%.6fg\nZ偏移:%.6fg\n", 
               offsetX, offsetY, offsetZ);
}

void setup_wifi() {
  delay(10);
  Serial.printf("\n连接WiFi: %s", ssid);
  
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  
  Serial.printf("\nWiFi已连接\nIP地址: %s\n", WiFi.localIP().toString().c_str());
}

void mqtt_callback(char* topic, byte* payload, unsigned int length) {
  Serial.printf("收到消息 [%s]: ", topic);
  for (unsigned int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}

void reconnect() {
  while (!client.connected()) {
    Serial.print("尝试MQTT连接...");
    
    if (client.connect(mqtt_client_id, mqtt_user, mqtt_pass)) {
      Serial.println("已连接");
      
      // 订阅控制主题
      client.subscribe("sensors/adxl357b/control");
      Serial.println("已订阅控制主题");
      
    } else {
      Serial.printf("失败, rc=%d\n", client.state());
      Serial.println("10秒后重试...");
      delay(10000);
    }
  }
}

保存代码,编译和上传至开发板,复位运行程序。

效果

包括工程调试、Home Assistant 网页端和 APP 端展示。

工程调试

  • 下载并安装 MQTTX 软件;
  • 新建连接,自定义名称,输入配置参数(EMQX 服务器 ip 地址、用户名、密码等);
  • 添加话题 topic 名称为 home/sensor/ADXL357Z ,启动连接;

总结

本文介绍了 DigiKey 和 EEWorld 共同举办的 你晒单我买单 活动的所选物料 —— ADXL357Z 高精度 3 轴加速度传感器模块 调用 Arduino Library 库函数采集 XYZ 三轴加速度值,结合 ESP8266 无线 WiFi 模块,通过 MQTT 协议远程传输数据至 Home Assistant 智能家居平台的项目设计,展示了该传感器在物联网相关领域的应用前景,为精密设备研发和远程控制等方面的应用提供了参考。