/* Détermination de la valeur de la capacité d'un condensateur à partir de la constante de temps d'un circuit RC
 * Ce script a été écrit par Cristophe BELLESSORT (académie de Normandie)
 * Mme Marie-Anne DEJOAN (académie de Guyane) a apporté quelques modifications
 * Le programme effectue 100 mesures successives de la capacité d'un condensateur.*/

// 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 de la constante R
const int R = 10000; // Valeur de la résistance R exprimée en Ohm

// 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;  

int compteur = 0; // Initialisation du Compteur de mesures

// 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
  pinMode(Lecture, INPUT); // "Lecture" est une broche d'entrée
  Serial.print("n°");
  Serial.print("\t"); // Ajout d'un espace
  Serial.println("C en uF");
}

// BOUCLE PRINCIPALE : exécutée à l'infini
void loop() {
  while (compteur < 100){
    digitalWrite(alimentation, LOW);
    compteur++; // Incrémente "compteur" de un
    while (analogRead(Lecture) > 0) { // Décharge du condensateur
      // Ne rien faire
      }
    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
      }
    // Une fois sorti de la boucle on mesure tempsFin
    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
    capa = (tau/R)*1e6; // Calcul de C exprimé en micro Farad
    Serial.print(compteur);
    Serial.print("\t"); // Ajout d'un espace
    Serial.println(capa,4); // Affichage de tau avec 3 décimales
    if (compteur == 100) {
      Serial.println("Fin des 100 mesures");
    }
  }
}
