Bonjour, bonsoir,
Je suis actuellement en première S et je dois faire une Expérience pour un projet sur le son, celle-ci doit avoir pour objectif de donner la vitesse du son à partir d'une seule variable : la température ambiante ( soit la température de la pièce ), pour cela j'ai réalisé le code suivant :
/* Calculer la vitesse du son en fonction de la température de la pièce
* R* = Constante de Gay Lussac = GayLussac
* y = coéfficient adiabatique du gaz = gamma
* T = température en Kelvin = tempKelvin
* Vc = Vitesse du son = vitSon
* M = Masse molaire = mMol
*
* Fréquence du son (Hz) = freqHz;
*/
// Ecran à cristaux liquides
#include <LiquidCrystal.h> // Bibliothèque de l'écran à cristaux liquide
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Initialisation des pins de l'écran
const float GayLussac = 8.314472; // (J/K)
const float gamma = 1.40; // dans un air pur / sec
const float mMol = 0.029; // 29.0 x 10^-3 kg/mol
double vitSon;
int tempKelvin;
int freqHz = 250; // Plus la fréquence est élevée plus le son est aigu
void setup() { // Initailisation du programme 1 fois
Serial.begin(9600); // initialisation de la communication série
// Améliore la précision de la mesure en réduisant la plage de mesure
analogReference(INTERNAL); // Pour Arduino UNO
//Ecran LCD display
lcd.begin(16, 2); // affichage 16x2
}
void loop() { // fonction de boucle qui refait tout le système entre parenthèses à l' "inifini".
// Temperature /!\ Malheureusement ne prend que des valeurs positives
// Mesure la tension sur la broche A1
int valeur_brute = analogRead(A1);
// Transforme la mesure (nombre entier) en température via un produit en croix
float temperature = (valeur_brute * (5.0 / 1024)) * 100;
// Envoi la mesure au PC pour affichage et attends 250ms
Serial.println(temperature);
//Transformation °C en °K
tempKelvin = temperature + 273.15;
//Calcul vitesse du son :
vitSon = sqrt((gamma * GayLussac * tempKelvin) / mMol);
//------------------------------------------------ Partie absolument inutile ----------------------------------
// Produit un son à freqHz Hertz.
// Freq du son
int keyVal = analogRead(A0);
// Serial.println(keyVal);
if(keyVal == 1023) {
tone(8, freqHz);
} else {
noTone(8); // Coupe le son actif si la valeur de keyVal est égale à 1023 (lorsque l'on relâche le bouton " sonore " ).
}
//-----------------------------------------------------------------------------------------------------------------------
// LCD affichage actif
lcd.setCursor(0, 0);
lcd.print("Temp : " + String(temperature) + " C");
lcd.setCursor(0, 1);
lcd.print("Vit : " + String(vitSon) + " m/s");
delay(1500); // Fait recommencer le système dès le début de la boucle jusqu'à ce que l'on coupe l'alimentation du programme.
}
Maintenant voilà le problème, mon programme affiche plusieurs valeurs de température (en Celsius), seulement elles sont toutes différentes les unes des autres, ce qui fait que ça fausse les résultats.
Dans une pièce de 20°C environ j'obtiens comme valeur : ( C = °C )
18.6 C
7.85 C
10.11 C
18.49 C
3.98 C
14.95 C
14.19 C
5.27 C
18.17 C
8.49 C
9.35 C
J'ai beau chercher à travers mon code mais il me semble que rien ne pose problème, c'est pour cette raison que je viens demander à la communauté, y aurait-il un problème dans le code, ou autre chose ?
J'espère avoir bien décrit la situation, merci d'avance,
Joyeux Noël, et Bonne année 2017.