Rohan Barnwal
Published © GPL3+

Portable Digital Thermometer Project Using Arduino

We’ve built a portable digital thermometer using an Arduino Nano, an MLX90614 infrared sensor, and a compact OLED display

BeginnerFull instructions provided6
Portable Digital Thermometer Project Using Arduino

Things used in this project

Hardware components

Arduino Nano R3
Arduino Nano R3
×1
MLX90614 Temperature Sensor
×1
OLED 0.96
×1

Software apps and online services

Arduino IDE
Arduino IDE

Story

Read more

Code

Code

Arduino
/*
  MLX90614 (0x5A) + SH1106 OLED (0x3C)
  - Shows ONLY Object temperature (C)
  - Small text (setTextSize(1))
  - Serial Monitor at 9600 baud
*/

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH110X.h>

// ---------- I2C ADDRESSES ----------
#define MLX90614_ADDR  0x5A
#define OLED_ADDR      0x3C

// ---------- MLX90614 REGISTERS ----------
#define MLX_OBJECT_REG   0x07  // TOBJ1

// ---------- OLED SETUP (SH1106 128x64) ----------
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SH1106G display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

// ---------- MLX90614 LOW-LEVEL READ ----------
uint16_t mlxRead16(uint8_t reg) {
  Wire.beginTransmission(MLX90614_ADDR);
  Wire.write(reg);
  if (Wire.endTransmission(false) != 0) { // repeated start
    return 0xFFFF;
  }
  if (Wire.requestFrom((int)MLX90614_ADDR, 3) != 3) {
    return 0xFFFF;
  }
  uint8_t low = Wire.read();
  uint8_t high = Wire.read();
  (void)Wire.read(); // PEC ignored
  return (uint16_t)high << 8 | low;
}

float mlxRawToCelsius(uint16_t raw) {
  // Temp(K) = raw * 0.02 -> C = K - 273.15
  return (raw * 0.02f) - 273.15f;
}

bool readObjectTempC(float &tObjectC) {
  uint16_t rawO = mlxRead16(MLX_OBJECT_REG);
  if (rawO == 0xFFFF) return false;
  tObjectC = mlxRawToCelsius(rawO);
  return true;
}

void setup() {
  Wire.begin();
  Serial.begin(9600);
  while (!Serial) { delay(5); } // for native-USB boards

  if (!display.begin(OLED_ADDR, true)) { // addr, reset=true
    Serial.println(F("OLED init failed"));
    for (;;) {}
  }
  display.clearDisplay();
  display.display();

  display.setTextSize(1);                 // smallest text
  display.setTextColor(SH110X_WHITE);
  display.setCursor(0, 0);
  display.println(F("MLX90614 -> Object Temp"));
  display.display();
  delay(500);
}

void loop() {
  float tObjC;
  bool ok = readObjectTempC(tObjC);

  display.clearDisplay();
  display.setTextSize(1);                 // keep it small
  display.setTextColor(SH110X_WHITE);
  display.setCursor(0, 0);

  if (ok) {
    // OLED
    display.println(F("Object Temperature:"));
    display.setCursor(0, 16);
    display.print(tObjC, 2);
    display.println(F(" C"));

    // Serial (9600)
    Serial.print(F("Object: "));
    Serial.print(tObjC, 2);
    Serial.println(F(" C"));
  } else {
    display.println(F("I2C Read Error"));
    Serial.println(F("I2C read error from MLX90614"));
  }

  display.display();
  delay(500); // update twice per second
}

Credits

Rohan Barnwal
33 projects • 35 followers
Rohan Barnwal - maker, hacker, tech enthusiast. I explore new tech & find innovative solutions. See my projects on hackster.io!

Comments