/* Détermination de la valeur de la capacité d'un condensateur à partir de la constante de temps d'un circuit RC */

// Définition de l'entrée numérique utilisée
const int alimentation = 2;  // La broche numérique 2 alimente le circuit RC

// Définition de l'entrée analogique utilisée et des variables décimales
int Lecture = A0; // La broche analogique A0 permet la mesure de la tension aux bornes du condensateur
float tau;  // "tau" est une variable décimale
float capa; // "capa" est une variable décimale

// Définition et mise à zéro des durées mesurées et intervenant dans le calcul de "tau"
unsigned long tempsDebut = 0; // unsigned long : variable de type long non signé 
unsigned long tempsFin = 0;  

// Définition de la constante R
const int R = 10000; // Valeur de la résistance R exprimée en Ohm

// BOUCLE D'INITIALISATION : exécutée une seule fois
void setup() {
  Serial.begin(9600) ; // Ouvre le port série et fixe le debit de communication à 9600 bauds
  pinMode(alimentation, OUTPUT); // "alimentation" est une broche de sortie
  digitalWrite(alimentation, LOW);  // A l'état initial "alimentation" est à l'état BAS
  pinMode(Lecture, INPUT); // "Lecture" est une broche d'entrée
}

// BOUCLE PRINCIPALE : exécutée à l'infini
void loop() {
  digitalWrite(alimentation, LOW);
  Serial.println("Décharge du condensateur");
  Serial.println("Pressez le bouton poussoir de court-circuit si la décharge trop longue");
  while (analogRead(Lecture) > 0) {    // On s'assure que le condensateur se décharge
    float Vmesuree = analogRead(Lecture);
    float Ucapa = (Vmesuree/1023)*5 ; // On convertit "Vmesuree" en une tension comprise entre 0 et 5V
    Serial.print("La tension aux bornes du condensateur est égale à : ");
    Serial.print(Ucapa);  // On lit la tension aux bornes du condensateur (valeur entre 0 et 1023)
    Serial.println(" V");
    delay(500); // Temporisation de 500 ms
  }
  Serial.println("Nouvelle mesure dans 5 secondes");
  Serial.println("Lachez l'interrupteur de court-circuit");
  delay(5000);
  digitalWrite(alimentation, HIGH);  // On alimente le circuit RC avec une tension de 5V
  tempsDebut = micros();  // Mémorisation du temps au début de l'alimentation du circuit RC
  while (analogRead(Lecture) < 647) {  // Tant que le niveau lu est inférieur à 647 (i.e. 63.2% de la valeur numérique 1023)
  // Ne rien faire
  }
  tempsFin = micros();  // Durée écoulée depuis le début du lancement du programme
  tau = (tempsFin - tempsDebut) * 1e-6;  // Calcul de tau exprimé en s
  Serial.print("La constante de temps du circuit RC est égale à : ");
  Serial.print(tau, 3); // "tau" avec 3 décimales
  Serial.println(" s");
  capa = (tau/R)*1e6; // Calcul de C exprimé en micro Farad
  Serial.print("La capacité du condensateur est égale à : ");
  Serial.print(capa, 1); // "capa" avec 1 décimale
  Serial.println(" uF");
  delay(5000);
}
