-1
\$\begingroup\$

I recently working on ACS71020 with I2C communication .I will attach my module details, code and my results. The slave address of the I2C keeps changing and even If I turn on the supply the measured value results in Zero only. The module I use is "https://evelta.com/7semi-acs71020-hall-effect-power-monitoring-and-overcurrent-detection-breakout/?srsltid=AfmBOoo0baz4ilb7G6Y9t-tkbQXozkOPd_ICJHRfQM0b-1pBC21zOAw_".

#include <Wire.h>~

#define I2C_ADDRESS 97 // Default I2C address for ACS71020

// Full-scale voltage and current constants
#define FULL_SCALE_V 230.0 // Example: Full-scale voltage
#define FULL_SCALE_I 30.0  // Example: Full-scale current

// Register definitions
#define REG_IRMS_VRMS 0x20
#define REG_IRMS_VRMS_PROM 0x21
#define REG_ACTPWR_PROM 0x22
#define REG_APPPWR 0x23
#define REG_REAPWR 0x24
#define REG_PFACTOR 0x25

uint8_t acs_RxData[4];
uint8_t currentAddress = I2C_ADDRESS;

void setup() {
  Wire.begin(); // Initialize I2C
  Serial.begin(115200); // Initialize Serial for debugging
  delay(1000); // Allow peripherals to stabilize

  // Check initial connection
  if (!acs71020_check_connection()) {
    Serial.println("ERROR: ACS71020 not detected! Check wiring and power.");
    while (true) {
      delay(1000); // Halt program if the sensor is not detected
    }
  }

  Serial.println("ACS71020 connected and ready.");
}

bool acs71020_check_connection() {
  Wire.beginTransmission(currentAddress);
  uint8_t error = Wire.endTransmission();
  return (error == 0); // Returns true if the device is detected
}

void acs71020_read(uint8_t reg) {
  Wire.beginTransmission(currentAddress);
  Wire.write(reg);
  if (Wire.endTransmission(false) != 0) {
    Serial.println("ERROR: Failed to communicate with ACS71020!");
    return;
  }
  Wire.requestFrom(currentAddress, (uint8_t)4); // Request 4 bytes

  for (int i = 0; i < 4; i++) {
    if (Wire.available()) {
      acs_RxData[i] = Wire.read();
    } else {
      acs_RxData[i] = 0; // Fill with zero if no data available
    }
  }
}

float acs71020_get_voltage() {
  float aux_v = 0;

  acs71020_read(REG_IRMS_VRMS);
  aux_v = ((float)(acs_RxData[1] * 256 + acs_RxData[0])) / 0x8000;
  aux_v = aux_v * FULL_SCALE_V;

  return aux_v;
}

float acs71020_get_current() {
  float aux_i = 0;

  acs71020_read(REG_IRMS_VRMS_PROM);
  aux_i = ((float)(acs_RxData[3] * 256 + acs_RxData[2]));
  aux_i = aux_i * FULL_SCALE_I / 0x4000;

  return aux_i;
}

void check_and_update_i2c_address() {
  uint8_t newAddress = 0;
  bool deviceFound = false;

  // Scan for the ACS71020 device
  for (uint8_t address = 1; address < 127; address++) {
    Wire.beginTransmission(address);
    if (Wire.endTransmission() == 0) {
      newAddress = address;
      deviceFound = true;
      break;
    }
  }

  if (!deviceFound) {
    Serial.println("ERROR: ACS71020 not detected on I2C bus!");
    delay(1000); // Pause to avoid flooding the Serial Monitor
    return;
  }

  if (newAddress != currentAddress) {
    Serial.printf("ALERT: ACS71020 I2C address changed from 0x%X to 0x%X!\n", currentAddress, newAddress);
    currentAddress = newAddress; // Update the current address
  }
}

void loop() {
  // Check for I2C address changes
  check_and_update_i2c_address();

  // Get sensor values
  float voltage = acs71020_get_voltage();
  float current = acs71020_get_current();

  // Display the readings
  Serial.printf("Voltage (Vrms): %.2f V\n", voltage);
  Serial.printf("Current (Irms): %.2f A\n", current);
  Serial.println();

  delay(1000); // Delay 1 second
}

The result is This is the result !!!

Kindly help me to solve this problem.

\$\endgroup\$

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.