Definition
Capacitance is defined as the ability of a body to store an electric charge. The SI unit of capacitance is the farad (symbol: F), named after the English physicist Michael Faraday. A 1 farad capacitor, when charged with 1 coulomb of electrical charge, has a potential difference of 1 volt between its plates.
Capacitance Measurement
Each Arduino capacitance meter relies on the same basic property of capacitors- the time constant. The time constant of a capacitor is defined as the time it takes for the voltage across the capacitor to reach 63.2% of its voltage when fully charged. Larger capacitors take longer to charge, and therefore have larger time constants. An Arduino can measure capacitance because the time a capacitor takes to charge is directly related to its capacitance by the equation:
TC = R x C
TC is the time constant of the capacitor (in seconds).
R is the resistance of the circuit (in Ohms).
C is the capacitance of the capacitor (in Farads).
Algorithm for capacitance measurement code
- Set discharge pin to INPUT (so it can’t discharge the capacitor)
- Set charge pin to OUTPUT and make it HIGH
- Record the start time with millis()
- Check the voltage repeatedly in a loop until it gets to 63.2% of total voltage.
- After the cap is charged, subtract the current time from the start time to find out how long the capacitor took to charge.
- Divide the Time in seconds by the charging Resistance in ohms to find the Capacitance.
- Report the value with print on Serial monitor.
- Discharge the capacitor. To do this:
- Set the charge pin to Input
- Set the discharge pin to OUTPUT and make it LOW
- Read the voltage to make sure the capacitor is fully discharged
- Loop and do it again
Capacitance Measurement Circuit


Arduino Code for Capacitance Measurement
/* Capacitance Measurement
* Theory A capacitor will charge, through a resistor, in one time constant, defined as T seconds where
* TC = R * C
* TC = time constant period in seconds
* R = resistance in ohms
* C = capacitance in farads (1 microfarad (ufd) = .0000001 farad = 10^-6 farads)
*
* The capacitor's voltage at one time constant is defined as 63.2% of the charging voltage.
*/
#define analogPin 0 // analog pin for measuring capacitor voltage
#define chargePin 13 // pin to charge the capacitor - connected to one end of the charging resistor
#define dischargePin 11 // pin to discharge the capacitor
#define resistorValue 10000.0F // 10K change this to whatever resistor value you are using
// F formatter tells compiler it's a floating point value
unsigned long startTime;
unsigned long elapsedTime;
float microFarads; // floating point variable to preserve precision, make calculations
float nanoFarads;
void setup(){
pinMode(chargePin, OUTPUT); // set chargePin to output
digitalWrite(chargePin, LOW);
Serial.begin(9600); // initialize serial transmission for debugging
}
void loop(){
digitalWrite(chargePin, HIGH); // set chargePin HIGH and capacitor charging
startTime = millis();
while(analogRead(analogPin) < 648){ // 647 is 63.2% of 1023, which corresponds to full-scale voltage
}
elapsedTime= millis() - startTime;
// convert milliseconds to seconds ( 10^-3 ) and Farads to microFarads ( 10^6 ), net 10^3 (1000)
microFarads = ((float)elapsedTime / resistorValue) * 1000;
Serial.print(elapsedTime); // print the value to serial port
Serial.print(" mS "); // print units and carriage return
if (microFarads > 1){
Serial.print((long)microFarads); // print the value to serial port
Serial.println(" microFarads"); // print units and carriage return
}
else
{
// if value is smaller than one microFarad, convert to nanoFarads (10^-9 Farad).
// This is a workaround because Serial.print will not print floats
nanoFarads = microFarads * 1000.0; // multiply by 1000 to convert to nanoFarads (10^-9 Farads)
Serial.print((long)nanoFarads); // print the value to serial port
Serial.println(" nanoFarads"); // print units and carriage return
}
/* dicharge the capacitor */
digitalWrite(chargePin, LOW); // set charge pin to LOW
pinMode(dischargePin, OUTPUT); // set discharge pin to output
digitalWrite(dischargePin, LOW); // set discharge pin LOW
while(analogRead(analogPin) > 0){ // wait until capacitor is completely discharged
}
pinMode(dischargePin, INPUT); // set discharge pin back to input
}
Result of Capacitance Measurement
The code will wait on this line If there is no capacitance Connected
“ while(analogRead(analogPin) < 648) // 647 is 63.2% of 1023, which corresponds to full-scale voltage”
Connect the capacitor between test terminals and observe the serial monitor will show the result. If no capacitance is connected serial terminal will not show anything.
