Um resistor carrega 63,2% de um capacitor em 'TC' segundos, sendo
TC = R x C
Isto é, a tensão elétrica no capacitor após TC segundos de carga é igual à 63,2% da tensão elétrica de carga.
Na prática, pode-se considerar que o capacitor carrega-se totalmente após cinco constantes de tempo.
O esboço abaixo funciona porque os pinos do Arduino podem estar em um dos dois estados abaixo, que são eletricamente bem diferentes:
Além disso, os pinos podem estar em HIGH para carregar o capacitor e LOW para descarregá-lo.
/* Capacímetro_RC * Paul Badger 2008 * Demonstra uso da constante de tempo RC como meio de medir o valor do capacitor * * Theory * Um capacitor carregar-se-á, via um resistor, em uma * constante de tempo, definida como TC segundos onde * TC = R * C * * TC = constante de tempo expressa em segundos * R = resistência em ohms * C = capacitância em farads (1 microfarad (ufd) = .0000001 farad = 10^-6 farads ) * * A tensão no capacitor em uma constante de tempo * é definida como 63.2% da tensão de carga. * * Montagem do hardware * O capacitor a testar fica entre o ponto comum e o terra * (não se esqueça: ligue o + do capacitor ao ponto comum) * O resistor a testar fica entre o pino de carga * (chargePin) e o ponto comum * Um resistor de 220 ohms entre o pino de descarga * (dischargePin) e o ponto comum * Um fio entre o ponto comum e o pino analógico * (analogPin, entrada A/D) */ #define analogPin 0 // pino analógico a medir tensão no capacitor #define chargePin 13 // pino a carregar o capacitor #define dischargePin 11 // pino a descarregar o capacitor #define resistorValue 10000.0F // mude esse valor para o valor do seu resistor // o "F" informa o compilador que trata-se de um ponto flutuante unsigned long startTime; unsigned long elapsedTime; float microFarads; // variável ponto flutuante para efetuar os cálculos float nanoFarads; void setup(){ pinMode(chargePin, OUTPUT); // ajuste chargePin como saída digitalWrite(chargePin, LOW); Serial.begin(9600); // inicializa a comunicação serial para fins de depuração de erros } void loop(){ digitalWrite(chargePin, HIGH); // ponha HIGH em chargePin startTime = millis(); while(analogRead(analogPin) < 648){ // 647 = 63.2% de 1023, que corresponde ao fim de escala } elapsedTime= millis() - startTime; // converta milissegundos a segundos ( 10^-3 ) e farads a microfarads ( 10^6 ), líquidos 10^3 (1000) microFarads = ((float)elapsedTime / resistorValue) * 1000; Serial.print(elapsedTime); // imprima à saída serial Serial.println(" mS "); // imprima unidade e retorno de carro if (microFarads > 1){ Serial.print((long)microFarads); // imprima à saída serial Serial.println(" microFarads"); // imprima unidade e retorno de carro } else { // se o valor for menor que um microfarad, converta // a nanofarads (10^-9 farad). // trata-se de um artifício para que Serial.print imprima pontos flutuantes nanoFarads = microFarads * 1000.0; // multiplique por 1000 para converter a nanofarads (10^-9 farads) Serial.print((long)nanoFarads); // imprima à saída serial Serial.println(" nanoFarads"); // imprima unidade e retornod de carro } /* descarregue capacitor */ digitalWrite(chargePin, LOW); // ponha LOW em chargePin pinMode(dischargePin, OUTPUT); // ajuste dischargePin como saída digitalWrite(dischargePin, LOW); // ponha LOW while(analogRead(analogPin) > 0){ // espere até esvaziar capacitor } pinMode(dischargePin, INPUT); // ajuste de novo o pino para entrada }