23 ACS37800(uint8_t address = 0x60, TwoWire * bus = &Wire)
24 : bus(bus), address(address) {}
51 this->address = address;
122 calculateApproximation(riso + rsense, 110 * rsense,
123 vcodesMult, vcodesShift);
124 calculateApproximation(2 * isense_range, 55,
125 icodesMult, icodesShift);
126 calculateApproximation(
127 (uint64_t)isense_range * (riso + rsense) * 5, rsense * 462,
128 pinstantMult, pinstantShift);
156 if (count > 1023) { count = 1023; }
160 if (count) { reg |= ((uint32_t)1 << 24) | ((uint32_t)count << 14); }
171 uint16_t vrms = (uint16_t)reg;
172 uint16_t irms = (uint16_t)(reg >> 16);
173 rmsVoltageMillivolts = (int32_t)vrms * vcodesMult >> vcodesShift >> 1;
174 rmsCurrentMilliamps = (int32_t)irms * icodesMult >> icodesShift >> 1;
183 int16_t pactive = (int16_t)reg;
184 uint16_t pimag = (uint16_t)(reg >> 16);
185 activePowerMilliwatts = (int32_t)pactive * pinstantMult >> pinstantShift;
186 reactivePowerMilliwatts = (int32_t)pimag * pinstantMult >> pinstantShift >> 1;
195 uint16_t papparent = (uint16_t)reg;
196 apparentPowerMilliwatts = (int32_t)papparent * pinstantMult >> pinstantShift >> 1;
197 return apparentPowerMilliwatts;
206 int16_t vcodes = (int16_t)reg;
207 int16_t icodes = (int16_t)(reg >> 16);
208 instVoltageMillivolts = (int32_t)vcodes * vcodesMult >> vcodesShift;
209 instCurrentMilliamps = (int32_t)icodes * icodesMult >> icodesShift;
216 int16_t pinstant = (int16_t)
readReg(0x2C);
217 instPowerMilliwatts = (int32_t)pinstant * pinstantMult >> pinstantShift;
218 return instPowerMilliwatts;
229 return rmsVoltageMillivolts;
240 return rmsCurrentMilliamps;
251 return activePowerMilliwatts;
262 return reactivePowerMilliwatts;
273 return instVoltageMillivolts;
284 return instCurrentMilliamps;
300 reg = (reg & ~(uint32_t)0x3FC) | (1 << 9) | ((address & 0x7F) << 2);
307 bus->beginTransmission(address);
309 lastError = bus->endTransmission();
312 uint8_t byteCount = bus->requestFrom(address, (uint8_t)4);
319 uint32_t value = bus->read();
320 value |= (uint32_t)bus->read() << 8;
321 value |= (uint32_t)bus->read() << 16;
322 value |= (uint32_t)bus->read() << 24;
329 bus->beginTransmission(address);
331 bus->write(value & 0xFF);
332 bus->write(value >> 8 & 0xFF);
333 bus->write(value >> 16 & 0xFF);
334 bus->write(value >> 24 & 0xFF);
335 lastError = bus->endTransmission();
338 uint16_t vcodesMult = 1, icodesMult = 1, pinstantMult = 1;
339 uint8_t vcodesShift = 0, icodesShift = 0, pinstantShift = 0;
341 int32_t instVoltageMillivolts;
342 int32_t instCurrentMilliamps;
343 int32_t instPowerMilliwatts;
345 int32_t rmsVoltageMillivolts;
346 int32_t rmsCurrentMilliamps;
347 int32_t activePowerMilliwatts;
348 int32_t reactivePowerMilliwatts;
349 int32_t apparentPowerMilliwatts;
355 static void calculateApproximation(
356 uint64_t numerator, uint64_t denominator,
357 uint16_t & outputMult, uint8_t & outputShift)
359 float k = (float)numerator / denominator;
362 for (uint8_t shift_candidate = 0; shift_candidate < 32; shift_candidate++)
364 uint32_t mult_candidate = round(k * ((uint32_t)1 << shift_candidate));
365 if (mult_candidate > 0x7FFF) {
break; }
366 mult = mult_candidate;
367 shift = shift_candidate;
369 while ((mult & 1) == 0)
381 uint8_t lastError = 0;
int32_t readRMSVoltageMillivolts()
uint8_t getAddress()
Returns the 7-bit I2C address that this object is configured to use.
int32_t readInstCurrentMilliamps()
void readActiveAndReactivePower()
int32_t readApparentPowerMilliwatts()
Reads the apparent power from the sensor and returns it in mW.
void setAddress(uint8_t address)
int32_t readReactivePowerMilliwatts()
void writeReg(uint8_t reg, uint32_t value)
Writes to a sensor register.
void setBoardParameters(uint8_t isense_range, uint32_t riso, uint32_t rsense)
void readInstVoltageAndCurrent()
int32_t readInstVoltageMillivolts()
void readRMSVoltageAndCurrent()
void writeEepromI2CAddress(uint8_t address)
int32_t readInstPowerMilliwatts()
void setSampleCount(uint16_t count)
ACS37800(uint8_t address=0x60, TwoWire *bus=&Wire)
int32_t readRMSCurrentMilliamps()
void setBus(TwoWire *bus)
void setBoardPololu(uint8_t rsense_kohm)
uint32_t readReg(uint8_t reg)
Reads a sensor register and returns its value.
int32_t readActivePowerMilliwatts()