Arduino Due and TMP175 sensor

Another sensor or module to cross our path, this time we will look at the TMP175 digital temperature sensors

The TMP175 devices is a digital temperature sensors ideal for NTC and PTC thermistor replacement. The device offers a typical accuracy of ±1°C without requiring calibration or external component signal conditioning. IC temperature sensors are highly linear and do not require complex calculations or look-up tables to derive the temperature. The on-chip 12-bit ADC offers resolutions down to 0.0625°C.

The TMP175  feature SMBus, Two-Wire, and I2C interface compatibility. The TMP175 device allows up to 27 devices on one bus. . The TMP175  feature an SMBus Alert function.

The TMP175 are ideal for extended temperature measurement in a variety of communication, computer, consumer, environmental, industrial, and instrumentation applications.

Features

  • TMP175: 27 Addresses
  • Digital Output: SMBus™, Two-Wire™, and I2C
    Interface Compatibility
  • Resolution: 9 to 12 Bits, User-Selectable
  • Accuracy:
    • ±1°C (Typical) from –40°C to 125°C
    • ±2°C (Maximum) from –40°C to 125°C
  • Low Quiescent Current: 50-µA, 0.1-µA Standby
  • Wide Supply Range: 2.7 V to 5.5 V
  • Small 8-Pin MSOP and 8-Pin SOIC Packages

 

Connection

 

Module Connection Arduino Due Connection
VCC 3v3
GND Gnd
SDA SDA
SCL SCL

 

Code

#include <Wire.h> 
 
byte TempHi;              // Variable hold data high byte
byte TempLo;              // Variable hold data low byte
boolean P_N;              // Bit flag for Positive and Negative
unsigned int Decimal;     // Variable hold decimal value
 
void Cal_Temp();
/*******************************************************************************
                      Setup
*******************************************************************************/ 
void setup() 
{ 
  Serial.begin(9600);
  Wire.begin();             // join i2c bus (address optional for master) 
  delay(1000);
} 
 
/*******************************************************************************
                      Main Loop
*******************************************************************************/  
void loop() 
{
  const int I2C_address = 0x37;  // I2C write address 
 
  delay(100);
  Wire.beginTransmission(I2C_address);
  Wire.write(1);             // Setup configuration register
  Wire.write(0x60);          // 12-bit
  Wire.endTransmission(); 
 
  Wire.beginTransmission(I2C_address);
  Wire.write(0);             // Setup Pointer Register to 0
  Wire.endTransmission(); 
 
  while (1)
  {
    delay(1000);
 
    // Read temperature value
    Wire.requestFrom(I2C_address, 2);
    while(Wire.available())          // Checkf for data from slave
    {                                
      TempHi = Wire.read();       // Read temperature high byte
      TempLo = Wire.read();       // Read temperature low byte
    } 
    Cal_Temp ();
 
    // Display temperature
    Serial.print("The temperature is ");
    if (P_N == 0)
      Serial.print("-");
    Serial.print(TempHi,DEC);
    Serial.print(".");
    Serial.print(Decimal,DEC);
    Serial.println(" degree C");
  }  
}
 
void Cal_Temp()
{
  if (TempHi&0x80)          // If bit7 of the TempHi is HIGH then the temperature is negative
    P_N = 0;
  else                      // Else the temperature is positive
    P_N = 1;
 
  TempHi = TempHi & 0x7F;   // Remove sign
  TempLo = TempLo & 0xF0;   // Filter out last nibble
  TempLo = TempLo >>4;      // Shift right 4 times
  Decimal = TempLo;
  Decimal = Decimal * 625;  // Each bit = 0.0625 degree C
 
}

 

Output

Open up the trusty serial monitor and you will see something like this all going well

The temperature is 18.6250 degree C
The temperature is 18.6250 degree C
The temperature is 18.6250 degree C
The temperature is 18.6250 degree C
The temperature is 19.1250 degree C
The temperature is 22.5000 degree C
The temperature is 24.1250 degree C
The temperature is 25.3125 degree C
The temperature is 26.3125 degree C

 

Link

1pcs CJMCU-175 TMP175 27 Address Digital Temperature Sensor

Share

Arduino Due and MPL3115A2 example

In this example we connect a MPL3115A2 to an Arduino Due

The MPL3115A2 is a compact, piezoresistive, absolute pressure sensor with an I2C digital interface. MPL3115A2 has a wide operating range of 20 kPa to 110 kPa, a range that covers all surface elevations on earth. The MEMS is temperature compensated utilizing an on-chip temperature sensor. The pressure and temperature data is fed into a high resolution ADC to provide fully compensated and digitized outputs for pressure in Pascals and temperature in °C.

The compensated pressure output can then be converted to altitude, utilizing the formula stated in Section 9.1.3 “Pressure/altitude” provided in meters.The internal processing in MPL3115A2 removes compensation and unit conversion load from the system MCU, simplifying system design

• Operating range: 20 kPa to 110 kPa absolute pressure
• Calibrated range: 50 kPa to 110 kPa absolute pressure
• Calibrated temperature output: −40 °C to 85 °C
• I2C digital output interface
• Fully compensated internally
• Precision ADC resulting in 0.1 meter of effective resolution
• Direct reading
– Pressure: 20-bit measurement (Pascals) 20 to 110 kPa
– Altitude: 20-bit measurement (meters) –698 to 11,775 m
– Temperature: 12-bit measurement (°C) –40 °C to 85 °C
• Programmable interrupts
• Autonomous data acquisition
– Embedded 32-sample FIFO
– Data logging up to 12 days using the FIFO
– One-second to nine-hour data acquisition rate
• 1.95 V to 3.6 V supply voltage, internally regulated
• 1.6 V to 3.6 V digital interface supply voltage
• Operating temperature from −40 °C to +85 °C

Parts List

 

Amount Part Type
1 MPL3115A2 I2C Intelligent Temperature Pressure Altitude Sensor V2.0 For Arduino
1 Compatible DUE R3 Board SAM3X8E 32-bit ARM Cortex-M3

 

Schematics/Layout

 

arduino due and mpl3115a2

arduino due and mpl3115a2

 

Code

Again we use a library and again its an adafruit one – https://github.com/adafruit/Adafruit_MPL3115A2_Library

#include <Wire.h>
#include <Adafruit_MPL3115A2.h>
 
// Power by connecting Vin to 3-5V, GND to GND
// Uses I2C - connect SCL to the SCL pin, SDA to SDA pin
// See the Wire tutorial for pinouts for each Arduino
// http://arduino.cc/en/reference/wire
Adafruit_MPL3115A2 baro = Adafruit_MPL3115A2();
 
void setup() {
  Serial.begin(9600);
  Serial.println("Adafruit_MPL3115A2 test!");
}
 
void loop() {
  if (! baro.begin()) {
    Serial.println("Couldnt find sensor");
    return;
  }
 
  float pascals = baro.getPressure();
  // Our weather page presents pressure in Inches (Hg)
  // Use http://www.onlineconversion.com/pressure.htm for other units
  Serial.print(pascals/3377); Serial.println(" Inches (Hg)");
 
  float altm = baro.getAltitude();
  Serial.print(altm); Serial.println(" meters");
 
  float tempC = baro.getTemperature();
  Serial.print(tempC); Serial.println("*C");
 
  delay(250);
}

 

Output

Open the serial monitor – here are my results

 

 

Links

https://www.nxp.com/docs/en/data-sheet/MPL3115A2.pdf

 

Share

Arduino Due and MLX90615 example

The MLX90615 is a miniature infrared thermometer for non-contact temperature measurements. Both the IR sensitive thermopile detector chip and the signal conditioning ASIC are integrated in the same miniature TO-46 can.

The infrared thermometer comes factory calibrated with a digital SMBus output giving full access to the measured temperature in the complete temperature range(s) with a resolution of 0.02 °C. The sensor achieves an accuracy of ±0.2°C within the relevant medical temperature range. The user can choose to configure the digital output to be PWM.

Features and benefits

Factory calibrated in wide temperature range: -20 to 85°C for sensor temperature and -40 to 115°C for object temperature
High accuracy of 0.5°C over wide temperature range (0..+50 C for both Ta and To)
Medical accuracy of 0.2°C in a limited temperature range
Measurement resolution of 0.02°C
SMBus compatible digital interface for fast temperature readings and building sensor networks
Customizable PWM output for continuous reading
3V supply voltage with power saving mode

 

Parts List

 

 

Amount Part Type
1 1PCS MLX90615 Digital Infrared Temperature Sensor for Arduino
1 Compatible DUE R3 Board SAM3X8E 32-bit ARM Cortex-M3

 

Layout

 

 

Code Example

This particular example comes from the following library which I installed – https://github.com/skiselev/MLX90615

I had issues with one of the other libraries – this one works just fine

#include <Wire.h>
#include <mlx90615.h>
MLX90615 mlx = MLX90615();
void setup()
{
Serial.begin(9600);
Serial.println("Melexis MLX90615 infra-red temperature sensor test");
mlx.begin();
Serial.print("Sensor ID number = ");
Serial.println(mlx.get_id(), HEX);
}
void loop()
{
Serial.print("Ambient = ");
Serial.print(mlx.get_ambient_temp());
Serial.print(" *C\tObject = ");
Serial.print(mlx.get_object_temp());
Serial.println(" *C");
delay(500);
}

 

Output

Open the serial monitor and you should see something like this. I moved a hot object near the sensor when the second value increased

 

 

Links

https://www.melexis.com/-/media/files/documents/datasheets/mlx90615-datasheet-melexis.pdf

Share

STM32 Nucleo and TSL2561 Luminosity Sensor example

This TSL2561 is an I2C light-to-digital converter TSL2561 that transforms light intensity to a digital signal. The TSL2561 features a selectable light spectrum range due to its dual light sensitive diodes: infrared and full spectrum. You can switch among three detection modes to take your readings. They are infrared mode, full spectrum and human visible mode.

When running under the human visible mode, this sensor will give you readings just close to your eye feelings.

Features

Selectable detection modes
High resolution 16-Bit digital output at 400 kHz I2C Fast-Mode
Wide dynamic range: 0.1 – 40,000 LUX
Wide operating temperature range: -40°C to 85°C
Programmable interrupt function with User-Defined Upper and lower threshold settings

Here is a typical module that makes it easier to work with the sensor

tsl2561

Layout and Connection

 

Code

We use this as a basis – https://os.mbed.com/users/anhnt2407/code/TSL2561_Light_sensor/

Update the tsl2561.h for STM32 nucleo

#define TSL2561_I2C_PINNAME_SDA PB_9
#define TSL2561_I2C_PINNAME_SCL PB_8

 

#include "mbed.h"
#include "TSL2561.h"
Serial PC(USBTX, USBRX);
#define PC_PRINTX(z,x) if(z==1) PC.printf(x);
#define PC_PRINTLNX(z,x) if(z==1) {PC.printf(x); PC.printf("\r\n");}
#define PC_PRINTXY(z,x, y) if(z==1) PC.printf(x, y);
#define PC_PRINTLNXY(z,x, y) if(z==1) {PC.printf(x, y); PC.printf("\r\n");}
DigitalOut myled(LED1);
TSL2561 tsl2561(TSL2561_ADDR_FLOAT);
Timer setuptimer;
Timer executetimer;
void setup(void){
if (tsl2561.begin()) {
PC_PRINTLNX(1,"TSL2561 Sensor Found");
} else {
PC_PRINTLNX(1,"TSL2561 Sensor not Found");
}
// You can change the gain on the fly, to adapt to brighter/dimmer tsl2561 situations
tsl2561.setGain(TSL2561_GAIN_0X); // set no gain (for bright situtations)
tsl2561.setTiming(TSL2561_INTEGRATIONTIME_402MS); // longest integration time (dim tsl2561)
// Now we're ready to get readings!
}
int main() {
PC_PRINTLNX(1,"----------START-------------");
setuptimer.start();
setup();
setuptimer.stop();
PC_PRINTLNXY(1,"Setup time: %f",setuptimer.read());
setuptimer.reset();
uint16_t x,y,z;
while(1) {
executetimer.start();
x = tsl2561.getLuminosity(TSL2561_VISIBLE);
y = tsl2561.getLuminosity(TSL2561_FULLSPECTRUM);
z = tsl2561.getLuminosity(TSL2561_INFRARED);
executetimer.stop();
PC_PRINTLNXY(1,"Visible: %d",x);
PC_PRINTLNXY(1,"Full Spectrum: %d",y);
PC_PRINTLNXY(1,"Infrared: %d",z);
PC_PRINTLNXY(1,"Execution Time: %f",executetimer.read());
executetimer.reset();
// wait(1);
PC_PRINTLNX(1,"----------COMPLETE-------------");
}
}

Testing

Using a terminal program like teraterm you should see something like this

tsl2561 output

tsl2561 output

 

Links

Free Shipping 1pcs GY-2561 TSL2561 Luminosity Sensor Breakout infrared Light Sensor module integrating sensor AL

Share

STM32 Nucleo and LM75 temperature sensor example

In this example we connect an LM75 to a STM32 Nucleo and we will use the MBEd compiler

The LM75 temperature sensor includes a delta-sigma analog-to-digital converter, and a digital overtemperature detector. The host can query the LM75 through its I²C interface to read temperature at any time. The open-drain overtemperature output (OS) sinks current when the programmable temperature limit is exceeded.

The OS output operates in either of two modes, comparator or interrupt. The host controls the temperature at which the alarm is asserted (TOS) and the hysteresis temperature below which the alarm condition is not valid (THYST). Also, the LM75’s TOS and THYST registers can be read by the host.

The address of the LM75 is set with three pins to allow multiple devices to work on the same bus. Power-up is in comparator mode, with defaults of TOS = +80°C and THYST = +75°C. The 3.0V to 5.5V supply voltage range, low supply current, and I²C interface make the LM75 ideal for many applications in thermal management and protection.

Key Features

SO (SOP) and µMAX® (µSOP) Packages
I²C Bus Interface
Separate Open-Drain OS Output Operates as Interrupt or Comparator/Thermostat Input
Register Readback Capability
Power-Up Defaults Permit Stand-Alone Operation as a Thermostat
3.0V to 5.5V Supply Voltage
Low Operating Supply Current 250µA (typ), 1mA (max)
4µA (typ) Shutdown Mode Minimizes Power Consumption
Up to Eight LM75s Can Be Connected to a Single Bus

 

Layout

I2C device you can power it from 3.3 or 5v

 

stm32nucleo and lm75

stm32nucleo and lm75

 

Code

I used this library – https://os.mbed.com/users/chris/code/LM75B/

 

#include "mbed.h"
#include "LM75B.h"
LM75B tmp(I2C_SDA, I2C_SCL);
Serial pc(SERIAL_TX, SERIAL_RX);
int main ()
{
while (1) {
pc.printf("%.2f celsius\r\n",tmp.read());
wait(1.0);
}
}

 

Output

Using a serial terminal program you should see something like this

lm75 output

lm75 output

 

Links

LM75 temperature sensor high speed I2C interface high precision development board module

Share