/* * TP Pendule - Mesure de la Période Moyenne et Écart-type (Non Biaisé) */ // --- Configuration --- const int pinCapteur = A0; const int seuil = 400; // Ajuster selon mesures (environ 2V) const int nbMesuresPourMoyenne = 10; // Nombre de périodes à moyenner // --- Variables de calcul --- unsigned long tempsPrecedent = 0; bool obstaclePresent = false; int compteurPassages = 0; float sommePeriodes = 0; float sommePeriodesCarre = 0; int nbPeriodesCalculees = 0; void setup() { Serial.begin(9600); Serial.println("========================================"); Serial.println("TP PENDULE : MESURE DE LA PERIODE T"); Serial.println("========================================"); Serial.println("En attente du premier passage..."); } void loop() { int lecture = analogRead(pinCapteur); // Détection du passage (le pendule coupe le laser) if (lecture < seuil && !obstaclePresent) { unsigned long tempsActuel = millis(); if (tempsPrecedent != 0) { // Calcul de la période T (intervalle entre deux passages * 2) float intervalle = (tempsActuel - tempsPrecedent) / 1000.0; float periodeT = intervalle * 2; sommePeriodes += periodeT; sommePeriodesCarre += (periodeT * periodeT); nbPeriodesCalculees++; // Affichage du résultat instantané Serial.print("Oscillation n°"); Serial.print(nbPeriodesCalculees); Serial.print(" | T instantanee = "); Serial.print(periodeT, 3); Serial.println(" s"); // Si on a atteint le nombre de mesures souhaitées if (nbPeriodesCalculees >= nbMesuresPourMoyenne) { float moyenne = sommePeriodes / nbPeriodesCalculees; // Calcul de la variance classique (biaisée); théorème de Koenig-Huygens float varianceBiaisee = (sommePeriodesCarre / nbPeriodesCalculees) - (moyenne * moyenne); // MODIFICATION : Correction du biais en multipliant par n / (n - 1) float varianceNonBiaisee = varianceBiaisee * ((float)nbMesuresPourMoyenne / (nbMesuresPourMoyenne - 1)); if (varianceNonBiaisee < 0) varianceNonBiaisee = 0; float ecartType = sqrt(varianceNonBiaisee); Serial.println("----------------------------------------"); Serial.print(">>> PERIODE MOYENNE (T) = "); Serial.print(moyenne, 4); Serial.println(" s <<<"); // Affichage de l'écart-type non biaisé Serial.print(">>> ECART-TYPE sexp = "); Serial.print(ecartType, 4); Serial.println(" s <<<"); Serial.println("----------------------------------------"); // Réinitialisation pour une nouvelle série de mesures sommePeriodes = 0; sommePeriodesCarre = 0; nbPeriodesCalculees = 0; Serial.println("Nouvelle serie de mesures en cours..."); } } tempsPrecedent = tempsActuel; obstaclePresent = true; } // Réinitialisation quand le pendule quitte le faisceau if (lecture > (seuil + 50)) { obstaclePresent = false; } }