Skip to main content
deleted 8 characters in body
Source Link
toolic
  • 9.8k
  • 9
  • 27
  • 35

`#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_RxData1 * 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 }`

#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
}

Kindly help me to solve this problem !!!

Thank you.

`#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_RxData1 * 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 }`

Kindly help me to solve this problem !!!

Thank you

#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
}

Kindly help me to solve this problem.

Source Link

ACS71020-I2C data read problem

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_RxData1 * 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 !!!

Thank you