// 2 plaques d'aluminium séparées par un isolant mince branchées entre A0 et A2
const int OUT_PIN = A2;
const int IN_PIN = A0;
float seuil= 300;
int openPin=8 ;
//Capacité internet du microcontroleur à calibrer (méthode petites capacités <1nF)
const float capacite_microcontroleur = 28;
const float R_PULLUP = 34.8; //en k ohms
const int tension_max = 1023;
void setup()
{
pinMode(OUT_PIN, OUTPUT);
pinMode(IN_PIN, OUTPUT);
Serial.begin(9600);
}
void loop()
{
// On mesure la tension aux bornes du condensateur
pinMode(IN_PIN, INPUT);
digitalWrite(OUT_PIN, HIGH);
int val = analogRead(IN_PIN);
digitalWrite(OUT_PIN, LOW);
if (val < 1000)
{
//Pour les petites capacités inférieures à 1 nF
pinMode(IN_PIN, OUTPUT);
//Calcul de la capacité
float capacite = (float)val * capacite_microcontroleur / (float)(tension_max - val);
Serial.print(F("Valeur de la capacité = "));
Serial.print(capacite, 3);
Serial.print(F(" pF ("));
Serial.print(val);
Serial.println(F(") "));
}
else
{
//Pour les grandes capacités supérieures à 1 nF
//décharge du condensateur
pinMode(IN_PIN, OUTPUT);
delay(1);
//On débute la charge du condensateur pour le dipole RC
pinMode(OUT_PIN, INPUT_PULLUP);
unsigned long u1 = micros();
unsigned long t;
int digVal;
do
{
digVal = digitalRead(OUT_PIN);
unsigned long u2 = micros();
t = u2 > u1 ? u2 - u1 : u1 - u2;
} while ((digVal < 1) && (t < 400000L));
// On stoppe la charge lorsque les conditions sont remplies
pinMode(OUT_PIN, INPUT);
//On lit la valeur
val = analogRead(OUT_PIN);
//On décharge le condensateur pour la mesure
digitalWrite(IN_PIN, HIGH);
int dischargeTime = (int)(t / 1000L) * 5;
delay(dischargeTime);
pinMode(OUT_PIN, OUTPUT);
digitalWrite(OUT_PIN, LOW);
digitalWrite(IN_PIN, LOW);
//On calcule la capacité
float capacite = -(float)t / R_PULLUP
/ log(1.0 - (float)val / (float)tension_max);
Serial.print(F("Valeur de la capacité = "));
if (capacite > 1000.0)
{
Serial.print(capacite / 1000.0, 2);
Serial.println(F(" uF"));
}
else
{
Serial.print(capacite, 2);
Serial.println(F(" nF"));
}
}
delay(1000);
}