Skyduino:~#
Articles
arduino, programmation

[Arduino] Connaitre la température ambiante sans capteur de température

Bonjour tout le monde !

Aujourd’hui je vous propose un article axé arduino / AVR, au titre des plus mystérieux :
« Comment connaitre la température ambiante sans capteur de température »

Hein ? quoi ? comment ?
Mesurer une température sans capteur de température ? MER IL EST FOU !

Non pas la peine de crier c’est possible 🙂

Comment un tel miracle est-il possible ?

Récemment je travaillais sur un système de touches tactile utilisant les broches analogiques de l’ATmega328p.
Tout naturellement j’avais ouvert en arrière plan the FUCKING MANUAL de l’électronicien, à savoir le datasheet de l’ATmega328p 😉

Quand je suis tombé nez à nez avec une petite note à coté d’un tableau :

« For temperature sensor »

L’histoire aurait pu s’arrêter là, mais c’était sans compter ma curiosité sans limite 😉

Du coup j’ai cherché un peu partout dans le datasheet des info sur le sujet, et je suis tombé sur cette page :

Hummm … intéressant tout ça ! Très intéressant !

Et avec l’aide de l’ami google je suis tomber sur un article du playground arduino (c’est vraiment le bordel ce playground … bref)
http://arduino.cc/playground/Main/InternalTemperatureSensor

Cet article m’as permis de conclure deux choses :
– Le capteur de température interne n’est dispo que sur certain ATmega :
ATmega168A
ATmega168P
ATmega328
ATmega328P

(Pas de bol, il n’y as pas de capteur de température interne dans l’ATmega2560 … utilisateurs de cartes Mega2560, c’est foutu …)
– Le code est hyper simple à mettre en œuvre, mais l’auteur de l’article a quand même réussi l’exploit de faire un truc moche et incompréhensible

Bref, retour au datasheet. Après un peu de lecture, une cannette de soda voici un joli morceau de code tout beau, tout propre et commenté !

/* Mesure la température interne de l'ATmega */
float getInternalTemp(void){
  ADMUX = 0xC8;                // Sélectionne le port analogique 8 + référence interne 1v1
  ADCSRA |= (1 << ADEN);       // Active le convertisseur analogique -> numérique
  ADCSRA |= (1 << ADSC);       // Lance une conversion analogique -> numérique
  while(ADCSRA & (1 << ADSC)); // Attend la fin de la conversion
  uint16_t raw = ADCL | (ADCH << 8); // Récupère le résultat de la conversion
  return (raw - 324.31 ) / 1.22;     // Calcul la température
}

/* setup() */
void setup() {

  /* Initialise le port série à 115200 bauds */
  Serial.begin(115200);
  
  /* Message de bienvenue */
  Serial.println("-- AVR Temperature --");
}

/* loop() */
void loop() {

  /* Lit la température du capteur interne de l'ATmega */
  float temp = getInternalTemp();
  
  /* Affiche la température */
  Serial.print("Temperature : ");
  Serial.println(temp);
  
  /* Attend une seconde */
  delay(1000);
}

Et quelques clic plus tard :

(Arg ! Foutu accents …)
(Ps: la/les première mesure est toujours fausse … initialisation, temps de stabilisation, ou autre je sais pas trop …)

Elle est pas belle la vie ? 🙂

Voila maintenant vous saurez comment connaitre la température ambiante de votre circuit sans avoir à ajouter de capteur de température 😉
Bon ok la qualité et la précision de la mesure sont très relatives mais on ne peut pas tout avoir non plus.

Bon bricolage a tous 😉

Advertisements

Discussion

13 réflexions sur “[Arduino] Connaitre la température ambiante sans capteur de température

  1. 20.24 puis 21.06. Tu ne la fais pas vraiment bosser ton Arduino. Ou alors il neige encore ?
    😀
    Quel curieux ce Skywodd

    Publié par Barbudor | 22 mai 2012, 22 h 36 min
    • Un ATmega ça ne chauffe pas 😉
      J’ai collé l’arduino devant mon ventilateur d’ordinateur pour faire monter la température.

      PS: la température ambiante de ma chambre était de 20°C au moment du test.

      Publié par skywodd | 23 mai 2012, 14 h 28 min
  2. Slt
    J’ai testé le code ça marche nikel le seul bémol c’est que quand je mets ma carte arduino dans le réfrigérateur il devrait passer de 22° à -5° assez rapidement ben il faut attendre quelques minutes . Cela est du à quoi ?

    Publié par ahamedbacar | 22 mai 2012, 22 h 41 min
    • Il faut que le plastique (mauvais conducteur de chaleur par excellence) qui entoure la puce atteigne la température ambiante extérieur …

      Normalement on entoure les soudes de température de métal pour quel réagisse rapidement de température, mais là avec du plastique ça peut prendre plusieurs minutes 😉

      Publié par skywodd | 23 mai 2012, 14 h 32 min
  3. Ca marche niquel sur mon arduino uno ! j’ai remplacé le lm35 avec ca et ca libère en plus une input analogique !

    Publié par coliss | 24 mai 2012, 22 h 36 min
  4. pas mal. mais ici return (raw – 324.31 ) / 1.22; je fais /2.00; et j’ai une bonne température.
    Bon code !

    Publié par sscapa | 9 juin 2012, 16 h 07 min
    • C’est une question d’étalonnage, chaque CI possède un capteur avec une qualité variable (la qualité du capteur de température interne n’est pas quelque chose de critique pour un ATmega).

      Publié par skywodd | 9 juin 2012, 16 h 30 min
  5. Je pense mettre en oeuvre ce type de solution pour intégrer des sondes à pas cher dans mon installation domotique.
    Le but étant de s’appuyer sur un arduino mini pro et un émetteur 433Mhz pour transmettre les infos à mon contrôleur domotique. Pour alimenter cette « sonde », je vais certainement me servir d’un transfo pour smartphone que l’on trouve pour quelques €.
    Je me demandais, vu que je suis débutant en la matière, si une alim de ce type risquait d’influencer les valeurs remontées par la sonde du 328p ?
    Sachant que l’arduino ne travaillera pas beaucoup vu que je ne compte pas émettre plus d’une valeur par minute.

    Publié par Tom23 | 4 avril 2014, 17 h 22 min
    • >> Je me demandais, vu que je suis débutant en la matière, si une alim de ce type risquait d’influencer les valeurs remontées par la sonde du 328p ?

      Si tu ne filtres pas un peu l’alimentation avec un gros condensateur chimique style 470µF ça risque de donner des erreurs de mesure.

      Mais pour être franc, le capteur interne donne des mesures assez grossières donc même avec quelques parasites d’alimentation ça risque pas grand chose.

      Publié par skywodd | 9 avril 2014, 11 h 37 min
  6. Pour info, si ça peut compléter l’article, j’ai testé cette fameuse sonde su 2 arduino mini pro chinois.
    Les valeurs, comme on pouvait s’y attendre sont très mauvaises. Pour une température ambiante de 19°C, l’une me retourne 28°C et l’autre 9°C.

    Publié par akismet-562f09d860177154929748683cbd7687 | 23 avril 2014, 22 h 51 min
  7. Bonjour à tous,
    merci beaucoup pour ce code fort utile !

    j’ai fait quelques tests sur le problème de la première valeur erronnée ..
    en fait (et comme cité dans le playground) il faut bien attendre entre l’activation et la numérisation ..
    toutefois une attente de delay(1) semble très suffisant !

    voici une proposition de code :

    /* Mesure la référence interne à 1v1 de l’ATmega */
    unsigned int getInternal_1v1(void){
    ADMUX = 0x4E; // Sélectionne la référence interne à 1v1 comme point de mesure, avec comme limite haute VCC
    ADCSRA |= (1 < numérique
    delay(1); // Attente de la stabilisation de la tension de référence
    ADCSRA |= (1 < numérique
    while(ADCSRA & (1 << ADSC)); // Attend la fin de la conversion
    return ADCL | (ADCH << 8); // Récupère le résultat de la conversion
    }
    pour mes tests toutes les mesures sont alors correcte

    Publié par TFlorian | 27 avril 2014, 15 h 03 min

Rétroliens/Pings

  1. Pingback: [Arduino] Capteur de temperature interne de l’atmega - 23 mai 2012

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

Skyduino devient Carnet du Maker

Le site Carnet du Maker remplace désormais le blog Skyduino pour tout ce qui touche à l'Arduino, l'informatique et au DIY.