Introduction: Infrared Sensor With ESP8266
Our objective this time is to create a program that will read the ambient temperature of any object pointing toward our sensor. To do this, we will use in this project an ESP8266 nodeMCU, an MLX90614 infrared sensor, and an OLED 96 "display, which will display the temperature data.
Step 1: WiFi ESP8266 NodeMcu ESP-12E
Step 2: Infrared Sensor
The MLX90614 infrared sensor used in this setup is actually a type of camcorder. It captures images via the CCD (Charged Coupled Device), a system very similar to that used in still digital cameras. Thus, it records the amount of infrared coming out of the object, and with this amount, it calculates the temperature. It’s very precise.
Step 3: Display OLED
Step 4: Assembly
This is a very simple scheme. I have a table here that allows for easy visualization.
ESP8266 - OLED
D5 - SCL
D7 - SDA
D3 - RES
D4 - DC
D8 - CS
3,3v - VCC
GND - GND
MLX90614
D1 - SCL
D2 - SDA
3,3v - VCC
GND - GND
Step 5: Libraries
To use the OLED display, add the following "Adafruit-GFX-Library-master" library.
Simply access "Sketch >> Include Libraries >> Manage Libraries ..."
Also, add the following "Adafruit Unified Sensor" library.
The download links for the libraries are in the PDF, available just below.
Step 6: Source Code
We'll start by defining the libraries and constants we'll use during our code.
#include <Wire.h> //Biblioteca para I2C
#include <SparkFunMLX90614.h> //Biblioteca para comunicação com o sensor #include <Adafruit_GFX.h> //Biblioteca para propriedades gráficas #include <Adafruit_SSD1331.h> //Biblioteca para comunicação com dipsplay OLED // pinagem para o NodeMCU ESP8266 #define sclk D5 #define mosi D7 #define cs D8 #define rst D3 #define dc D4 // definição das cores que serão utilizadas #define BLACK 0x0000 #define WHITE 0xFFFF //definição da coordenada onde escreveremos cada um dos dados #define POS_X_AMBIENTE 2 #define POS_Y_AMBIENTE 35 #define POS_X_OBJETO 2 #define POS_Y_OBJETO 55 #define POS_X_TITULO 10 #define POS_Y_TITULO 4 // construtor do objeto para comunicar com o display OLED Adafruit_SSD1331 display = Adafruit_SSD1331(cs, dc, mosi, sclk, rst); //objeto responsável pela comunicação com o sensor infravermelho IRTherm sensor; //variáveis que armazenarão o valor das temperaturas lidas float tempAmbiente; float tempObjeto;
Setup
In the setup () function, we will initialize our object of communication with the sensor, as well as the object of communication with the display. Here are some settings for each of them.
void setup()
{ //Inicializa sensor de temperatura infravermelho sensor.begin(); //Seleciona temperatura em Celsius sensor.setUnit(TEMP_C);//podemos ainda utilizar TEMP_F para Fahrenheit //ou TEMP_K para Kelvin //inicializa o objeto para comunicarmos com o display OLED display.begin(); //pinta a tela toda de preto display.fillScreen(BLACK); //configura o tamnaho do texto que escreveremos em tela display.setTextSize(0); //configura a cor branca para o texto display.setTextColor(WHITE); //os comandos abaixo posicionam o cursor no (x,y) desejado para a seguir escrevermos em tela display.setCursor(POS_X_TITULO, POS_Y_TITULO); display.print("TEMPERATURA"); display.setCursor(POS_X_TITULO+20, POS_Y_TITULO+15); display.print("("); display.print((char)247); //símbolo de graus display.print("C)"); display.setCursor(POS_X_AMBIENTE, POS_Y_AMBIENTE); display.print("AMB:"); //AMBIENTE display.setCursor(POS_X_OBJETO, POS_Y_OBJETO); display.print("OBJ:"); //OBJETO }
Loop
In the loop () function, let's read the sensor data, and then display them on the OLED display.
//chamamos o método "read" do sensor para realizar a leitura da temperatura
//read retornará 1 caso consiga realizar a leitura, ou 0 caso contrário if (sensor.read()) { //recupera a leitura da temperatura do ambiente tempAmbiente = sensor.ambient(); //recupera a leitura da temperatura do objeto apontado pelo sensor tempObjeto = sensor.object(); //limpa a área onde colocamos o valor da temperatura do ambiente e do objeto display.fillRect(POS_X_AMBIENTE+35, POS_Y_AMBIENTE, 35, 10, BLACK); display.fillRect(POS_X_OBJETO+35, POS_Y_OBJETO, 35, 10, BLACK); //posiciona o cursor e escreve a temperatura ambiente display.setCursor(POS_X_AMBIENTE+35, POS_Y_AMBIENTE); display.print(tempAmbiente); display.print((char)247); //simbolo de graus //posiciona o cursor e escreve a temperatura do objeto que o sensor está apontando display.setCursor(POS_X_OBJETO+35, POS_Y_OBJETO); display.print(tempObjeto); display.print((char)247); //simbolo de graus } delay(1000); //intervalo de 1 segundo para a próxima leitura }