Pretraži kod

Korištenje Melexis MLX90614 infracrvenog termometra sa Arduino LCD1602

Korištenje Melexis MLX90614 infracrvenog termometra sa Arduino LCD1602

Mjerenje temperature bez fizičkog kontakta je fascinantna mogućnost koja otvara vrata mnogim praktičnim i kreativnim projektima. Melexis MLX90614 infracrveni termometar to omogućava detektovanjem toplotnog zračenja koje emituju objekti, što vam omogućava da mjerite temperaturu sa sigurne udaljenosti. Ovaj vodič će vam pokazati kako povezati ovaj svestrani senzor na Arduino i prikazati i temperaturu objekta i ambijentalnu temperaturu na I2C LCD ekranu (bilo 16x2 ili 20x4 karaktera).

Ovaj projekat je savršen za širok spektar primjena, kao što su:

  • Izgradnja stanice za beskontaktni skrining temperature za ulaz u kliniku ili kancelariju.
  • Praćenje temperature platforme 3D štampača ili vrućeg dijela bez ometanja štampe.
  • Kreiranje sigurnog, beskontaktnog provjerivača temperature hrane za kuhanje ili kuhanje piva.
  • Razvijanje jednostavnog detektora prisustva ljudi mjerenjem toplotnih potpisa tijela.
  • Provjera temperature pokretnih dijelova mašina ili električnih panela sa sigurne udaljenosti.

MLX90614 senzor komunicira preko I2C protokola, što znači da zahtijeva samo dva podatkovna pina (SDA i SCL) plus napajanje i uzemljenje. To čini ožičenje jednostavnim i ostavlja dovoljno pinova slobodnih za druge komponente. Do kraja ovog tutorijala, imat ćete radni temperaturni displej koji može prikazati očitanja u Celzijusima, Farenhajtima ili Kelvinima, i razumjet ćete kako prilagoditi kod svojim specifičnim potrebama.

Potreban hardver

Za izgradnju ovog projekta trebat će vam sljedeće komponente:

  • Arduino ploča (Uno, Nano, Mega, itd.)
  • MLX90614 infracrveni temperaturni senzorski modul
  • I2C LCD displej (16x2 ili 20x4 karaktera)
  • Konektorski kablovi (jumper wires)
  • Breadboard (opciono, za lakše povezivanje)

Vodič za ožičenje

Ožičenje za ovaj projekat je jednostavno jer i MLX90614 senzor i LCD displej koriste I2C komunikacijski protokol. To znači da mogu dijeliti iste dvije podatkovne linije (SDA i SCL), koje su povezane paralelno. Senzor radi na 3.3V logici, ali se može napajati sa Arduinovog 3.3V izlaza. LCD modul, međutim, obično zahtijeva 5V za pozadinsko osvjetljenje i logiku (u videu na 03:15).

Evo pregleda povezivanja:

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

Pošto je I2C magistralni protokol, možete povezati do 128 uređaja na iste dvije linije (u videu na 03:44). Ako koristite Arduino Uno ili Nano, SDA i SCL pinovi se nalaze na A4 i A5. Za druge ploče poput Mega, ovi pinovi su na različitim lokacijama (20 i 21), pa provjerite pinout svoje ploče.

MLX90614 LCD wiring

Postavljanje biblioteka

Prije nego što prenesete kod, morate instalirati dvije bitne biblioteke. Prva je Adafruit MLX90614 biblioteka, koja upravlja komunikacijom sa temperaturnim senzorom. Druga je LiquidCrystal I2C biblioteka, koja pojednostavljuje upravljanje LCD displejom preko I2C magistrale. Ove biblioteke se mogu instalirati kroz Arduino Library Manager pretragom njihovih imena.

Nakon instalacije biblioteka, morate odrediti I2C adrese svojih povezanih uređaja. Ovo je kritičan korak jer i senzor i LCD imaju svoje jedinstvene adrese. Priloženi kod uključuje poseban "I2C Scanner" sketch koji možete prenijeti na svoj Arduino da pronađete ove adrese. Kada pokrenete skener sa oba povezana uređaja, ispisat će dvije adrese u Serial Monitor. U videu, LCD je pronađen na 0x3F, a MLX90614 senzor na 0x5A (u videu na 06:28). Vaši uređaji mogu imati različite adrese, pa je bitno pokrenuti skener i zabilježiti vrijednosti.

Objašnjenje koda

Kod je dizajniran da bude fleksibilan, omogućavajući vam lako prilagođavanje koje temperaturne jedinice se prikazuju i kako se informacije prezentiraju na LCD-u. Evo ključnih dijelova koda koje korisnik može konfigurisati (u videu na 04:31):

LCD konfiguracija

Na vrhu koda pronaći ćete postavke za vaš specifični LCD displej. Morate prilagoditi ove vrijednosti svom hardveru:

const uint8_t I2C_ADDRESS = 0x3f;  // I2C adresa vašeg LCD-a
const uint8_t LCD_CHAR = 16;       // Broj karaktera po liniji (16 ili 20)
const uint8_t LCD_ROW = 2;         // Broj linija na displeju (2 ili 4)

Promijenite I2C_ADDRESS u adresu koju ste pronašli pomoću I2C skenera. Ako koristite 20x4 LCD, postavite LCD_CHAR na 20 i LCD_ROW na 4.

Prikaz temperaturnih jedinica

Kod koristi pametan sistem slova za predstavljanje različitih temperaturnih očitanja. Glavna funkcija printTemp('X') uzima jedan karakter kao argument da odredi šta će se prikazati. Mapiranje je sljedeće:

  • 'C' - Temperatura objekta u Celzijusima
  • 'D' - Ambijentalna temperatura u Celzijusima
  • 'F' - Temperatura objekta u Farenhajtima
  • 'G' - Ambijentalna temperatura u Farenhajtima
  • 'K' - Temperatura objekta u Kelvinima
  • 'L' - Ambijentalna temperatura u Kelvinima

U loop() funkciji možete odabrati koja ćete očitanja prikazati tako što ćete ukloniti komentare sa linija koje su vam potrebne. Na primjer, da biste prikazali samo Celzijusova očitanja i za temperaturu objekta i za ambijentalnu temperaturu, vaša loop() funkcija bi izgledala ovako:

void loop() {
  printTemp('C'); // temperatura objekta u C
  delay(2000);
  printTemp('D'); // ambijentalna temperatura u C
  delay(2000);
}

Ako želite prikazati i Fahrenheit i Celzijus, jednostavno uklonite komentare sa dodatnih linija. Kašnjenje od 2000 milisekundi (2 sekunde) između očitanja daje vam vremena da pročitate prikaz.

Prilagođavanje oznaka na displeju

Možete promijeniti tekstualne oznake koje se pojavljuju na LCD-u. Niz typeName[] sadrži oznake za temperaturu objekta i ambijentalnu temperaturu:

char *typeName[]={"Objekt:","Ambijent:"};

Ove nizove možete modificirati da prikazuju tekst na vašem željenom jeziku, sve dok koristi latinične znakove (u videu na 05:08).

Dodavanje uslovnih akcija

Kod također uključuje korisnu funkciju getTemp('X') koja vraća temperaturu kao broj s pomičnim zarezom. Ovo vam omogućava da izvršite akcije na osnovu temperaturnih pragova. Na primjer, možete uključiti relej ili zujalicu ako temperatura pređe određenu vrijednost:

if( getTemp('C') > 40)
{
  // uradite nešto ovdje, poput uključivanja releja ili zujalice
}

Ovo je posebno korisno za kreiranje alarmnih sistema ili automatiziranih odgovora na promjene temperature.

Demonstracija

Nakon što je kod učitan i ožičenje ispravno, LCD će početi prikazivati očitanja temperature. U demonstraciji, senzor je bio usmjeren prema različitim objektima kako bi se pokazalo kako reagira. Kada je bio usmjeren prema nečijem čelu, senzor je izmjerio tjelesnu temperaturu oko 33-34°C (u videu na 09:39). Kada je bio usmjeren prema hladnijoj površini, očitanja su pala na oko 26°C za objekt i 28°C za ambijentalnu temperaturu (u videu na 09:52).

Senzor je prilično stabilan i pruža dosljedna očitanja. Video također demonstrira kako modificirati kod da prikazuje samo Celzijusova očitanja tako što ćete zakomentarisati linije za Fahrenheit i Kelvin. To se radi odabirom linija i korištenjem funkcije za komentare u Arduino IDE-u (Ctrl+/ ili Cmd+/), koja dodaje dvostruke kose crte (//) na početak svake linije.

Po zadanim postavkama, kod prikazuje očitanja u Celzijusima i za objekt i za ambijentalnu temperaturu. Lako možete prebaciti na Fahrenheit ili Kelvin tako što ćete ukloniti komentare sa odgovarajućih linija u loop() funkciji. LCD će tada naizmjenično prikazivati očitanja objekta i ambijenta svake dvije sekunde.

Poglavlja

  • [00:00] Uvod u MLX90614 sa LCD projektom
  • [01:20] Opcije displeja: LCD2004 i LCD1602
  • [02:29] Objašnjeno ožičenje
  • [04:28] Objašnjen kod
  • [04:53] Pronalaženje I2C adresa
  • [08:35] Demonstracija
  • [10:47] Završne napomene i zasluge

Slike

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
Jezik: 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

Stvari koje bi vam mogle zatrebati

Resursi i reference

Datoteke📁

Ostale datoteke