/* Etude qualitative de la charge d'un condensateur
 * Marie-Anne Déjoan - Académie de la Guyane - Mai 2020
 */

// 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 temps;  // "temps" est une variable décimale

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

// 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 Vc = (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(Vc);  // On lit la tension aux bornes du condensateur (valeur entre 0 et 1023)
    Serial.println(" V");
    delay(500); // Temporisation de 500 ms
  }
  Serial.println("Etude de la charge du condensateur 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
  Serial.print("Vc");
  Serial.print("\t"); // Ajout d'un espace
  Serial.println("Temps");
  Serial.print("V");
  Serial.print("\t"); 
  Serial.println("s");
  while (analogRead(Lecture) < 1023) {  // Tant que le niveau lu est inférieur à 1023
    tempsFin = micros();  // Durée écoulée depuis le début du lancement du programme
    temps = (tempsFin - tempsDebut) * 1e-6;  // Calcul de "temps" exprimé en s
    float Vmesuree = analogRead(Lecture);
    float Vc = (Vmesuree/1023)*5;
    Serial.print(Vc, 3); // "Vc" avec 3 décimales
    Serial.print("\t"); 
    Serial.println(temps, 3); // "temps" avec 3 décimales
    delay(100);
  }
  Serial.println("Fin de la charge du condensateur");
  delay(10000);
}
