# AD7747 Arduino Uno Capacitance Measurement

**URL:** <https://forum.arduino.cc/t/ad7747-arduino-uno-capacitance-measurement/577905>\
**Category:** Sensors\
**Created:** [March 5, 2019, 11:33pm UTC](https://forum.arduino.cc/t/ad7747-arduino-uno-capacitance-measurement/577905 "2019-03-05T23:33:39Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![bme33](https://avatars.discourse-cdn.com/v4/letter/b/ebca7d/32.png) [@bme33](https://forum.arduino.cc/u/bme33)\
**Post date:** [March 5, 2019, 11:33pm UTC](https://forum.arduino.cc/t/ad7747-arduino-uno-capacitance-measurement/577905/1 "2019-03-05T23:33:39Z")

</div>

Hello,

I'm attempting to use the AD7747 to read capacitance from a sensor. For now, I'm just trying to get it to work though. I'm not familiar with I2C at all, this is my first attempt.

I know from using the I2C Scanner that the register is at 0x48. Sadly, the code below, which I got from this forum, keeps returning a capacitance value 8.19pF even when a known capacitor is connected.

Any help is greatly appreciated.

#include \<Wire.h\> //include the library for i2c communication

int capreadybit = (bitRead(TWDR,0)); //initialize variable readybit to be two wire data register's lsb

void setup()  
{  
Wire.begin(); //sets up i2c for operation  
Serial.begin(9600); // we will monitor this via serial cable  
Wire.beginTransmission(0x48);  
Wire.write(0xBF);  
Wire.write(0x00);  
Wire.endTransmission();  
delay(4);  
Wire.beginTransmission(0x48); // begins write cycle  
Wire.write(0x07); //address pointer for cap setup register  
Wire.write(0xA0); //b'10100000' found from datasheet page 16  
Wire.endTransmission(); //ends write cycle  
delay(4); // Wait for data to clock out? I'm not 100% sure why this delay is here (or why it's 4ms)  
Wire.beginTransmission(0x48); //begins transmission again  
Wire.write(0x09); //address pointer for capacitive channel excitation register  
Wire.write(0x0E); //recommended value from datasheet  
Wire.endTransmission();  
delay(4);  
Wire.beginTransmission(0x48);  
Wire.write(0x0A); //address pointer for the configuration register  
Wire.write(0x21); //b'00100001' for continuous conversion, arbitrary VTF setting, and mid-range capacitive conversion time  
Wire.endTransmission();  
Wire.beginTransmission(0x48);  
Wire.write(0x0B); //CAP DAC A Register address (Positive pin data)  
Wire.write(0x80); //b'10111111' for enable Cap DAC A  
Wire.endTransmission();  
Serial.println("Hello!"); //test to make sure serial connection is working  
}

void loop()  
{  
Wire.beginTransmission(0x0B); //talking to chip  
Wire.write(byte(0x00)); //status register address  
Wire.endTransmission();  
Wire.requestFrom(0x0B,1); //request status register data  
int readycap;  
readycap=Wire.read();  
//if((readycap&0x1)==0){ // ready?  
Serial.println("Data Ready");  
delay(500);  
Wire.beginTransmission(0x48); //arduino asks for data from ad7747  
Wire.write(0x01); //set address point to capacitive DAC register 1

Wire.endTransmission(); //pointer is set so now we can read the

Serial.println("Data Incoming");  
delay(500);  
Wire.requestFrom(0x0B,3); //reads data from cap DAC registers 1-3

//while(Wire.available()){  
unsigned char hi,mid,lo; //1 byte numbers  
long capacitance; //will be a 3byte number  
float pf; //scaled value of capacitance  
hi=Wire.read();  
mid=Wire.read();  
lo=Wire.read();  
capacitance=(hi\<\<16)+(mid\<\<8)+lo-0x800000;  
pf=(float)capacitance\*-1/(float)0x800000\*8.192f;  
Serial.print(pf, DEC); //prints the capacitance data in decimal through serial port

Serial.print(",");  
//}  
Serial.println();  
//}  
Serial.println("Loop Done");  
Serial.println(" ");  
delay(1000);  
}

[ad7747\_CDC.ino](https://forum.arduino.cc/uploads/short-url/1ch8VXBeJH6EWjqaOvo1CplW1y4.ino) (3.19 KB)

---

<div class="post-metadata">

**Author:** ![pylon](https://avatars.discourse-cdn.com/v4/letter/p/59ef9b/32.png) [@pylon](https://forum.arduino.cc/u/pylon)\
**Post date:** [March 7, 2019, 5:51pm UTC](https://forum.arduino.cc/t/ad7747-arduino-uno-capacitance-measurement/577905/2 "2019-03-07T17:51:49Z")

</div>

First: Always use code tags to post code!

```cpp
      Wire.beginTransmission(0x0B);  //talking to chip
      Wire.write(byte(0x00));                  //status register address
      Wire.endTransmission();
      Wire.requestFrom(0x0B,1);      //request status register data
      int readycap;
      readycap=Wire.read();
      //if((readycap&0x1)==0){                // ready?
        Serial.println("Data Ready");
        delay(500);
        Wire.beginTransmission(0x48); //arduino asks for data from ad7747

```

It's not very clever to use different addresses to communicate with the chip. Define a constant for the address and use that constant to eliminate such errors!

---

<div class="post-metadata">

**Author:** ![system](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/system/32/1140315_2.png) [@system](https://forum.arduino.cc/u/system)\
**Post date:** [May 6, 2021, 10:24am UTC](https://forum.arduino.cc/t/ad7747-arduino-uno-capacitance-measurement/577905/3 "2021-05-06T10:24:48Z")

</div>

Closed on May 6, 2021, 10:24am UTC


