Comme sonde de température, j'ai décidé d'utiliser un LM35. L'avantage c'est qu'il fournit un signal calibré et linéaire dès l'origine (10mV par °C). Une sonde Pt100 ou Pt1000, c'est bien, mais il faut convertir la résistance en tension, et la progression n'est pas linéaire. Le LM35 est linéaire à 1% près, ce qui est suffisant pour le genre de mesures que je veux faire.
L'ampli opérationnel utilisé, le LM10 dispose d'une tension de sortie programmable (ici réglée pour avoir 2V). C'est une sortie qui peut aussi bien absorber que fournir du courant. Cette tension sert de référence à la sonde de température LM35.
La tension d'alimentation est de 12V stabilisée, fourni par un petit bloc secteur. Tous les composants sont alimentés en 12V, l'arduino via un 7805 externe (pour ne pas surcharger le régulateur intégré). La masse du LM35 n'est pas à 0V, mais à 2V.
La tension de 2V est nécessaire pour que la sonde puisse fournir une tension négative pour les températures négatives (la tension négative est référencée par rapport au 2V). Pour cela, la sortie de la sonde est reliée au négatif via une résistance de 39kΩ. Pour avoir une mesure optimale, il faut un courant de mesure de 50µA.
L'ampli opérationnel sert simplement à augmenter l'amplitude du signal pour pouvoir utiliser toute la précision du convertisseur de l'arduino.
Nous avons donc notre tension à la sortie du LM35 qui va de -0.2V à +0.3V pour une température de -20° à +30°C. Référencé à la masse, cela fait une tension de 1.8V à 2.3V. C'est une variation trop faible pour être enregistrée correctement avec l'arduino. Il faut que la tension aille de 0V (à -20°) à 5V (à +30°).
Nous avons un signal qui va de 0 à 5V. Il nous suffit maintenant de programmer l'arduino. Pour la conversion analogique vers numérique, l'arduino produit une valeur de 0 à 1023. Un pas correspond donc à 0.049°, ou un degré correspond à 20.48 pas. C'est pas très pratique, mais on va s'en sortir. Les valeurs de gain et d'offset (4.95 et 1850 dans l'exemple ci-dessous) pour convertir la valeur numérique en température doivent être adaptées.
Il faut effectuer une mesure de température toutes les secondes. Si la température varie significativement par rapport à l'ancienne température enregistrée, on enregistre la nouvelle température et on l'imprime. Une variation de température significative, c'est un changement de 10 pas ou plus, donc environ un demi degré.
Si la température ne change pas significativement, on l'imprime malgré tout toutes les 10 minutes et on mémorise cette nouvelle valeur.
Comme dans toutes les opérations de numérisation, je fais un léger lissage de le température. A la mise en marche et juste après une impression je n'effectue pas de mesure pendant quelques secondes pour éviter les mesures incorrectes.
Si la température a changé significativement ou si 10 minutes se sont écoulées, j'imprime une ligne de valeurs sur l'imprimante sérielle:
hh:mm:ss ±tt.tt
L'heure est indiquée depuis la mise en route de l'arduino, il n'y a pas de real time clock. C'est la fonction datalogger de l'ensemble.
L'arduino dispose de suffisamment de sorties numériques pour commander différents appareils si la température mesurée sort des limites (à programmer vous-même).
#include
#define TEMP 1 // Temperatuuringang
SoftwareSerial Prn(1,13, 1);
int c = -10;
void setup() {
Prn.begin(9600);
Serial.begin(9600);
}
void loop() {
static long mils, mil;
static byte ss, mm, hh, i, tt[4];
static int tempi, tempo, tempp;
static float tempf;
static bool pos, be = true;
mil = millis();
if (mil - mils > 1000) {
mils = mil;
ss++;
if (ss > 59) {
mm++; ss= 0;
if (mm > 59) {
hh++; mm = 0;
}
}
c++;
if (c > 0) {
tempi = analogRead(TEMP);
Serial.print(tempi);
if (be) {
be = false;
tempf = tempi;
}
tempf = 0.8 * tempf + 0.2 * tempi;
if ((c > 10 && abs(tempi - tempo) > 9) || c > 600) {
c = -5;
tempo = tempi;
tempp = (tempf * 4.95) - 1850;
Serial.print(" "); Serial.print(tempp);
pos = tempp < 0;
tempp = abs(tempp);
for (i = 0; i < 4; i++) {
tt[i] = tempp % 10;
tempp = tempp / 10;
}
if (hh < 10) Prn.print("0");
Prn.print(hh); Prn.print(":");
if (mm < 10) Prn.print("0");
Prn.print(mm); Prn.print(":");
if (ss < 10) Prn.print("0");
Prn.print(ss); Prn.print(" ");
if (pos) Prn.print("-");
else Prn.print("+");
if (tt[3] == 0) Prn.print(" ");
else Prn.print(tt[3]);
Prn.print(tt[2]); Prn.print(".");
Prn.print(tt[1]); Prn.print(tt[0]);
Prn.print(" ("); Prn.print(tempo); Prn.println(")");
}
Serial.println();
}
}
}
L'output vers la sortie serial standard permet de controler le fonctionnement du logiciel sur l'interface de développement, mais permet également par après de s'assurer que le logiciel ne s'est pas planté (allumage de la led serial out toutes les secondes).
A droite le datalogger pratiquement complet avec un module arduino et une imprimante. Dans quelques jours j'y ajouterai un module pour écrire les données sur une carte SD.
Il manque simplement le capteur LM35 et une petite plaquette qui contient un LM10 (op amp) et un 7805.
|