La CTN forme un pont diviseur avec une résistance R = 10 kΩ. Le pont est alimenté entre GND et 5 V.
La tension aux bornes de R est mesurée via l'entrée A0
Le débitmètre YF-S401 utilise l'entrée D2 et est alimenté entre GND et 5V.
Il s'agit de la version YF-S401-035007 pour laquelle f(Hz) = 43 × Dv(L/min).
Le moniteur série affiche la température et le débit en mL/s.
Sortie série
L’affichage de la sortie série peut se faire en utilisant le moniteur série de l’IDE arduino, accessible par CTRL+MAJ+M
Code à téléverser
/**
* mesure_temperature_debit.ino
* Ce sketch affiche la température mesurée par une CTN, et le débit par un capteur YF-S401-03507 (0.3 à 6 L/min)
*
* Pour la temperature : la CTN forme un pont diviseur (alimenté en 5 V) avec une résistance 10kΩ.
* Pour le débit : on compte les interruptions provoquées par le capteur pendant 1 s ie la fréquence
* La datasheet donne : f (Hz) = 43 × Dv (L/min)
*/
// 1. Déclarations des constantes et variables globales
// Capteur 5 V −− CTN −− R=10kΩ −− GND
const byte TEMP_SENSOR_PIN = A0; // Le Pin A0 est connecté au point milieu du pont diviseur
// La température est calculée grâce à une relation affine T (°C) = a × tension (V) + b
const float a = 18.31; // Coefficient directeur a (°C/V) – L'étalonnage a été effectué prédécemment
const float b = -19.67; // Ordonnée à l’origine b (°C) – L'étalonnage a été effectué prédécemment
// Débitmètre
const byte FLOW_PIN = 2; // Jaune D2, Noir GND et Rouge 5 V.
// Le débit volumique est calculé par la rélation linéaire Dv (L/min) = f (Hz) / K
const float CONSTANTE_CAPTEUR = 39.6; // K en Hz/(L/min) Déterminé par étalonnage × 2
// Variable de décompte des impulsions pour le débit
volatile unsigned int count = 0; // Variable volatile car modifiée durant une interruption
// 2. Setup − Exécuté une seule fois
void setup() {
// Fixe la vitesse de communication entre arduino et le PC
Serial.begin(9600);
// Active la résistance de pull-up interne. (Force à la valeur 5 V - HIGH)
pinMode(FLOW_PIN, INPUT_PULLUP); // Dispense du montage avec la résistance
// Associe l'interruption externe de la broche FLOW_PIN à la fonction flowISR()
attachInterrupt(digitalPinToInterrupt(FLOW_PIN), flowISR, RISING);
}
// 3. Loop − Boucle infinie
void loop() {
// Détermination de la température
int tempSensorRawValue = analogRead(TEMP_SENSOR_PIN); // Valeur numérique entre 0 et 1023
float tempSensorVoltage = tempSensorRawValue * 5.0 / 1023.0; // Valeur de la tension en volts
float temperature = a * tempSensorVoltage + b; // Calcul de la température
// Débitmètre
count = 0; // Remise à zéro
delay(1000); // Décompte durant une seconde afin de récupérer une fréquence
noInterrupts(); // Désactive les interruptions le temps de récupérer count
unsigned int frequency = count; // Fréquence du signal du capteur
interrupts(); // Réactive les interruptions (défaut arduino uno)
float flowRate = frequency / CONSTANTE_CAPTEUR; // Détermination du débit en L/min
float flowRateISUnit = flowRate / 60 * 1000; // Conversion en mL/s
// Affichage des valeurs
Serial.print(temperature, 1);
Serial.print('\t');
Serial.println(flowRateISUnit, 2);
}
// 4. Fonctions
/**
* Routine d'interruption (ISR : Interrupt Service Routine).
*
* Appelée automatiquement à chaque front montant produit
* par le capteur. Elle incrémente simplement le compteur d'impulsions.
*/
void flowISR() {
count++;
}