Code de recherche

Utilisation d’un thermomètre infrarouge Melexis MLX90614 avec un Arduino LCD1602

Utilisation d’un thermomètre infrarouge Melexis MLX90614 avec un Arduino LCD1602

Mesurer la température sans contact physique est une capacité fascinante qui ouvre la porte à de nombreux projets pratiques et créatifs. Le thermomètre infrarouge Melexis MLX90614 rend cela possible en détectant le rayonnement thermique émis par les objets, vous permettant de mesurer la température à distance de sécurité. Ce guide vous montrera comment connecter ce capteur polyvalent à un Arduino et afficher à la fois les températures de l'objet et ambiante sur un écran LCD I2C (soit un affichage de caractères 16x2 ou 20x4).

Ce projet est parfait pour une large gamme d'applications, telles que :

  • Construire un poste de dépistage de fièvre sans contact pour une clinique ou un point d'entrée de bureau.
  • Surveiller la température d'un lit d'imprimante 3D ou d'une buse chaude sans interférer avec l'impression.
  • Créer un vérificateur de température alimentaire sûr et sans contact pour la cuisine ou le brassage.
  • Développer un simple détecteur de présence humaine en mesurant les signatures de chaleur corporelle.
  • Vérifier la température de pièces de machines en mouvement ou de panneaux électriques à distance de sécurité.

Le capteur MLX90614 communique via le protocole I2C, ce qui signifie qu'il ne nécessite que deux broches de données (SDA et SCL) plus l'alimentation et la masse. Cela rend le câblage simple et laisse de nombreuses broches libres pour d'autres composants. À la fin de ce tutoriel, vous aurez un affichage de température fonctionnel qui peut montrer les lectures en Celsius, Fahrenheit ou Kelvin, et vous comprendrez comment personnaliser le code pour vos besoins spécifiques.

Matériel requis

Pour construire ce projet, vous aurez besoin des composants suivants :

  • Carte Arduino (Uno, Nano, Mega, etc.)
  • Module capteur de température infrarouge MLX90614
  • Écran LCD I2C (16x2 ou 20x4 caractères)
  • Fils de connexion
  • Plaque d'essai (optionnelle, pour des connexions plus faciles)

Guide de câblage

Le câblage pour ce projet est simple car le capteur MLX90614 et l'écran LCD utilisent tous deux le protocole de communication I2C. Cela signifie qu'ils peuvent partager les deux mêmes lignes de données (SDA et SCL), qui sont connectées en parallèle. Le capteur fonctionne à une logique de 3,3 V, mais il peut être alimenté à partir de la sortie 3,3 V de l'Arduino. Le module LCD, cependant, nécessite généralement 5 V pour son rétroéclairage et sa logique (dans la vidéo à 03:15).

Voici la répartition des connexions :

  • MLX90614 VCC → Arduino 3,3 V
  • MLX90614 GND → Arduino GND
  • MLX90614 SCL → Arduino A5 (SCL)
  • MLX90614 SDA → Arduino A4 (SDA)
  • LCD VCC → Arduino 5 V
  • LCD GND → Arduino GND
  • LCD SCL → Arduino A5 (SCL)
  • LCD SDA → Arduino A4 (SDA)

Comme I2C est un protocole de bus, vous pouvez connecter jusqu'à 128 dispositifs sur les deux mêmes lignes (dans la vidéo à 03:44). Si vous utilisez un Arduino Uno ou Nano, les broches SDA et SCL sont situées sur A4 et A5 respectivement. Pour d'autres cartes comme la Mega, ces broches sont à des emplacements différents (20 et 21), alors assurez-vous de vérifier le brochage de votre carte.

MLX90614 LCD wiring

Configuration des bibliothèques

Avant de téléverser le code, vous devez installer deux bibliothèques essentielles. La première est la bibliothèque Adafruit MLX90614, qui gère la communication avec le capteur de température. La seconde est la bibliothèque LiquidCrystal I2C, qui simplifie le contrôle de l'écran LCD via le bus I2C. Ces bibliothèques peuvent être installées via le gestionnaire de bibliothèques Arduino en recherchant leurs noms.

Après l'installation des bibliothèques, vous devez déterminer les adresses I2C de vos dispositifs connectés. C'est une étape critique car le capteur et l'écran ont chacun leurs propres adresses uniques. Le code fourni inclut un croquis spécial "I2C Scanner" que vous pouvez téléverser sur votre Arduino pour trouver ces adresses. Lorsque vous exécutez le scanner avec les deux dispositifs connectés, il imprimera deux adresses sur le moniteur série. Dans la vidéo, l'écran a été trouvé à 0x3F et le capteur MLX90614 à 0x5A (dans la vidéo à 06:28). Vos dispositifs peuvent avoir des adresses différentes, il est donc essentiel d'exécuter le scanner et de noter les valeurs.

Explication du code

Le code est conçu pour être flexible, vous permettant de personnaliser facilement les unités de température affichées et la manière dont les informations sont présentées sur l'écran LCD. Voici les parties clés du code configurables par l'utilisateur (dans la vidéo à 04:31) :

Configuration de l'écran LCD

En haut du code, vous trouverez les paramètres pour votre écran LCD spécifique. Vous devez ajuster ces valeurs pour correspondre à votre matériel :

const uint8_t I2C_ADDRESS = 0x3f;  // Adresse I2C de votre écran LCD
const uint8_t LCD_CHAR = 16;       // Nombre de caractères par ligne (16 ou 20)
const uint8_t LCD_ROW = 2;         // Nombre de lignes sur l'affichage (2 ou 4)

Changez I2C_ADDRESS pour l'adresse que vous avez trouvée avec le scanner I2C. Si vous utilisez un écran LCD 20x4, définissez LCD_CHAR sur 20 et LCD_ROW sur 4.

Affichage des unités de température

Le code utilise un système astucieux de lettres pour représenter différentes lectures de température. La fonction principale printTemp('X') prend un argument de caractère unique pour déterminer quoi afficher. La correspondance est la suivante :

  • 'C' - Température de l'objet en Celsius
  • 'D' - Température ambiante en Celsius
  • 'F' - Température de l'objet en Fahrenheit
  • 'G' - Température ambiante en Fahrenheit
  • 'K' - Température de l'objet en Kelvin
  • 'L' - Température ambiante en Kelvin

Dans la fonction loop(), vous pouvez choisir quelles lectures afficher en décommentant les lignes nécessaires. Par exemple, pour afficher uniquement les lectures en Celsius pour la température de l'objet et la température ambiante, votre boucle ressemblerait à ceci :

void loop() {
  printTemp('C'); // température de l'objet en C
  delay(2000);
  printTemp('D'); // température ambiante en C
  delay(2000);
}

Si vous souhaitez afficher à la fois Fahrenheit et Celsius, décommentez simplement les lignes supplémentaires. Le délai de 2000 millisecondes (2 secondes) entre les lectures vous laisse le temps de lire l'affichage.

Personnalisation des étiquettes d'affichage

Vous pouvez modifier les étiquettes de texte qui apparaissent sur l'écran LCD. Le tableau typeName[] contient les étiquettes pour les températures de l'objet et ambiante :

char *typeName[]={"Objet:","Ambiante:"};

Vous pouvez modifier ces chaînes pour afficher le texte dans la langue de votre choix, tant qu'il utilise des caractères latins (dans la vidéo à 05:08).

Ajout d'actions conditionnelles

Le code inclut également une fonction utile getTemp('X') qui renvoie la température sous forme de nombre à virgule flottante. Cela vous permet d'effectuer des actions en fonction de seuils de température. Par exemple, vous pourriez activer un relais ou un buzzer si la température dépasse une certaine valeur :

if( getTemp('C') > 40)
{
  // faire quelque chose ici, comme activer un relais ou un buzzer
}

Cela est particulièrement utile pour créer des systèmes d'alarme ou des réponses automatisées aux changements de température.

Démonstration

Une fois le code téléversé et le câblage correct, l'écran LCD commencera à afficher les lectures de température. Dans la démonstration, le capteur a été pointé vers différents objets pour montrer comment il réagit. Lorsqu'il est pointé vers le front d'une personne, le capteur a mesuré une température corporelle d'environ 33-34°C (dans la vidéo à 09:39). Lorsqu'il est pointé vers une surface plus froide, les lectures ont chuté à environ 26°C pour l'objet et 28°C pour la température ambiante (dans la vidéo à 09:52).

Le capteur est assez stable et fournit des lectures cohérentes. La vidéo montre également comment modifier le code pour afficher uniquement les lectures en Celsius en commentant les lignes pour Fahrenheit et Kelvin. Cela se fait en sélectionnant les lignes et en utilisant la fonction de commentaire de l'IDE Arduino (Ctrl+/ ou Cmd+/), qui ajoute des doubles barres obliques (//) au début de chaque ligne.

Par défaut, le code affiche les lectures en Celsius pour la température de l'objet et la température ambiante. Vous pouvez facilement passer à Fahrenheit ou Kelvin en décommentant les lignes appropriées dans la fonction loop(). L'écran LCD alternera alors entre les lectures de l'objet et ambiantes toutes les deux secondes.

Chapitres

  • [00:00] Introduction au projet MLX90614 avec LCD
  • [01:20] Options d'affichage : LCD2004 et LCD1602
  • [02:29] Câblage expliqué
  • [04:28] Code expliqué
  • [04:53] Recherche des adresses I2C
  • [08:35] Démonstration
  • [10:47] Remarques finales et crédits

Images

MLX90614 LCD wiring
MLX90614 LCD wiring
MLX90614 4
MLX90614 4
MLX90614 3
MLX90614 3
MLX90614 2
MLX90614 2
MLX90614 1 ESF
MLX90614 1 ESF
335-Using MLX90614 Infrared Temperature Sensor with LCD1602
Langue: C++
++
/*************************************************** 
  This is a library example for the MLX90614 Infrared Temperature Sensor with LCD1602 
Original Library and code source: https://github.com/adafruit/Adafruit-MLX90614-Library

This code has been mostly updated.
It displays the temperature on LCD1602 or LCD2004 in C, F, and K for object and for ambient.

 * 
 * Watch video instructions for this code:  https://youtu.be/_iO2L4P_irw
Updated/written by Ahmad Shamshiri on June 28, 2020 
 
 * in Ajax, Ontario, Canada. www.robojax.com

Introduction to MLX90614 Infrared Temperature Sensor: https://youtu.be/cFDSqiEIunw

 * Get this code and other Arduino codes from Robojax.com
Learn Arduino step by step in a structured course with all material, wiring diagrams, and libraries
all in one place. Purchase My course on Udemy.com http://robojax.com/L/?id=62

If you found this tutorial helpful, please support me so I can continue creating 
content like this. 

or make a donation using PayPal http://robojax.com/L/?id=64

 *  * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
 * This code has been downloaded from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.

Origin
  Written by Limor Fried/Ladyada for Adafruit Industries.  
  BSD license, all text above must be included in any redistribution
 ****************************************************/

#include <Wire.h>
#include <Adafruit_MLX90614.h>
char *typeName[]={"Object:","Ambient:"};

Adafruit_MLX90614 mlx = Adafruit_MLX90614();

#include <LiquidCrystal_I2C.h>
const uint8_t I2C_ADDRESS =0x3f;
const uint8_t LCD_CHAR= 16;
const uint8_t LCD_ROW= 2;
LiquidCrystal_I2C lcd(I2C_ADDRESS, LCD_CHAR,LCD_ROW);


void setup() {
  Serial.begin(9600);

  Serial.println("Robojax MLX90614 test");  

   if (!mlx.begin()) //Begin returns 0 on a good init
  {
      lcd.print("MLX90614 Failed");
      lcd.setCursor(0,1);
      lcd.print("check wiring!");      
    while (1)
      ;
  }  
  Wire.begin();
  lcd.begin();
  lcd.backlight();  
      lcd.print("Robojax MLX90614");
      lcd.setCursor(0,1);
      lcd.print("Infrared Temp.");          
      delay(2000);       
      clearCharacters(LCD_ROW-1,0, LCD_CHAR-1);
       
  
}//setup() end

void loop() {
  //Robojax Example for MLX90614 with LCD
  printTemp('C');//object temperature in C
  delay(2000);
  
  printTemp('D');//ambient temperature in C
  delay(2000);
//    
//  printTemp('F'); //object temperature in F
//  delay(2000);
//     
//  printTemp('G'); //ambient temperature in F
//  delay(2000);  
//  if( getTemp('C')>40)
//  {
//    //do something here
//  }
//  
//  printTemp('K'); //object temperature in K
//  delay(2000);    
//  printTemp('L');//ambient temperature in K  
//  delay(2000);  


  //Robojax Example for MLX90614
}

/*
 * @brief returns temperature or relative humidity
 * @param "type" is a character
 *     C = Object Celsius
 *     D = Ambient Celsius
 *     
 *     K = Object Kelvin
 *     L = Ambient Kelvin
 *     
 *     F = Object Fahrenheit
 *     G = Ambient Fahrenheit

 * @return returns one of the values above
 * Usage: to get Fahrenheit type: getTemp('F')
 * to print it on serial monitor Serial.println(getTemp('F'));
 * Written by Ahmad Shamshiri on March 30, 2020. 
 * in Ajax, Ontario, Canada
 * www.Robojax.com 
 */
float getTemp(char type)
{
   // Robojax.com MLX90614 Code
  float value;
    float tempObjec = mlx.readObjectTempC();//in C object
    float tempAmbient = mlx.readAmbientTempC();
   if(type =='F')
   {
    value = mlx.readObjectTempF(); //Fahrenheit Object
   }else if(type =='G')
   {
    value = mlx.readAmbientTempF();//Fahrenheit Ambient
   }else if(type =='K')
   {
    value = tempObjec + 273.15;// Object Kelvin
   }else if(type =='L')
   {
    value = tempAmbient + 273.15;//Ambient Kelvin
   }else if(type =='C')
   {
    value = tempObjec;
   }else if(type =='D')
   {
    value = tempAmbient;
   }
   return value;
    // Robojax.com MLX90614 Code
}//getTemp

/*
 * @brief nothing
 * @param "type" is a character
 *     C = Object Celsius
 *     D = Ambient Celsius
 *     
 *     K = Object Kelvin
 *     L = Ambient Kelvin
 *     
 *     F = Object Fahrenheit
 *     G = Ambient Fahrenheit

 * @return prints temperature value in serial monitor
 * Usage: to get Fahrenheit type: getTemp('F')
 * to print it on serial monitor Serial.println(getTemp('F'));
 * Written by Ahmad Shamshiri on March 30, 2020 at 21:51
 * in Ajax, Ontario, Canada
 * www.Robojax.com 
 */
void printTemp(char type)
{
 clearCharacters(1,0, LCD_CHAR-1 );  
  // Robojax.com MLX90614 Code
  float tmp =getTemp(type);
      lcd.setCursor(0,1);
      
  if(type =='C')
  {

      lcd.print(typeName[0]);  
      lcd.print(" ");
      lcd.print(tmp);        
      lcd.print((char)223);// 
      lcd.print("C");      
              

  }else if(type =='D')
  {
      lcd.print(typeName[1]); 
      lcd.print(" ");
      lcd.print(tmp);        
      lcd.print((char)223);// 
      lcd.print("C");        
  }else if(type =='F')
  {
      lcd.print(typeName[0]); 
      lcd.print(" ");
      lcd.print(tmp);        
      lcd.print((char)223);// 
      lcd.print("F");        
  }else if(type =='G')
  {
      lcd.print(typeName[1]);
      lcd.print(" ");
      lcd.print(tmp);        
      lcd.print((char)223);// 
      lcd.print("F");        
  }

  else if(type =='K')
  {
      lcd.print(typeName[0]); 
      lcd.print(" ");
      lcd.print(tmp);        
      lcd.print((char)223);// 
      lcd.print("K");        
  }  
  else if(type =='L')
  {
      lcd.print(typeName[1]);
      lcd.print(" ");
      lcd.print(tmp);        
      lcd.print((char)223);// 
      lcd.print("K");        

  }

// Robojax.com MLX90614 Code
}//printTemp(char type)


/*
   clearCharacters(uint8_t row,uint8_t start, uint8_t stop)
 * @brief clears a line of display (erases all characters)
 * @param none
 * @return does not return anything
 * Written by Ahmad Shamshiri
 * www.Robojax.com code May 28, 2020 at 16:21 in Ajax, Ontario, Canada
 */
void clearCharacters(uint8_t row,uint8_t start, uint8_t stop )
{
    for (int i=start; i<=stop; i++)
    {
    lcd.setCursor (i,row); //  
    lcd.write(254);
    } 

}//clearCharacters

Ce dont vous pourriez avoir besoin

Ressources et références

Fichiers📁

Autres fichiers