
Arduino Project - Capacitor Meter
Capacitor Meter
Each capacitance meter has an RC circuit with known resistor values and an unknown capacitor value. The Arduino will measure the voltage at the capacitor and record the time it takes to reach 63.2% of its voltage when fully charged (the time constant).
// #include <LiquidCrystal.h>
//LiquidCrystal lcd(8,9,10,11,12,13);
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);
const int analog_charge = A2;
const int analogPin = A0;
float ck=24.42;
int voltage;
float cu;
void setup()
{
lcd.init(); // initialize the lcd
lcd.init();
lcd.backlight();
Serial.begin(9600);
lcd.begin(16, 2);
lcd.print(" 20pF <to> 1000nF ");
lcd.setCursor(0,1);
lcd.print("Input Capacitor ");
pinMode(analogPin,OUTPUT);
pinMode(analog_charge,OUTPUT);
}
void loop()
{
abc:
pinMode(analogPin,INPUT);
digitalWrite(analog_charge,HIGH);
voltage=analogRead(analogPin);
digitalWrite(analog_charge,LOW);
//analog_charge = 998 || 999 || 1000 || 1001 and ! 1024
pinMode(analogPin,OUTPUT);
if(voltage<1000)
{
cu=((ck*voltage)/(1024.0-voltage));
if(cu>20.0)
{
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(cu,2);
lcd.print(" pF");
}
else
{
lcd.setCursor(0,1);
lcd.print("Input Capacitor ");
delay(200);
lcd.setCursor(0,1);
lcd.print(" ");
delay(500);
goto abc;
}
}
else
{
voltage=0;
pinMode(analogPin,OUTPUT);
delay(1);
pinMode(analog_charge,INPUT_PULLUP);
unsigned long start_time = micros();
unsigned long final_time=0;
while((voltage < 1) && (final_time < 400000L))
{
voltage = digitalRead(analog_charge);
unsigned long stop_time = micros();
final_time = stop_time > start_time ? stop_time - start_time : start_time - stop_time;
}
pinMode(analog_charge, INPUT);
voltage = analogRead(analog_charge);
digitalWrite(analogPin, HIGH);
int delay_T = (int)(final_time / 1000L) * 5;
delay(delay_T);
pinMode(analog_charge, OUTPUT);
digitalWrite(analog_charge, LOW);
digitalWrite(analogPin, LOW);
cu = -(float)final_time / 34.8 ;
cu /= log(1.0 - (float)voltage / (float)1023);
if(cu < 1000.0)
{
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(cu,2);
lcd.print(" nF");
}
else
{
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("**Out of Range**");
}
}
delay(1000);
}
- use the video
No comments: