Temperature Sensor

written by hek
For temperature measurements we've selected the standard Dallas DS18B20.

It's accurate, inexpensive and you can connect many of them in parallel without using more than one digital input on the Arduino board.

They come in several variants: probe, individual, brick and a waterproof version.

You will also need a small pull-up resistor to make the circuit work. It is usually around 4,7kOhm.

Wiring Things Up

Start by connecting the radio module.

Sensor Arduino Comment
GND (left pin) GND Marked black
VCC (right pin) VCC (3.0-5.5V) Marked red
DQ (middle pin) Digital pin 3 Marked green

Mount a 4.7kOhm (4k7) resistor between VCC and Digital pin 3

Example

This example uses a modified version of the external DallasTemperature library, which is included in the MySensors external examples. Please install it and restart the Arduino IDE before trying to compile.

/**
 * The MySensors Arduino library handles the wireless radio link and protocol
 * between your home built sensors/actuators and HA controller of choice.
 * The sensors forms a self healing radio network with optional repeaters. Each
 * repeater and gateway builds a routing tables in EEPROM which keeps track of the
 * network topology allowing messages to be routed to nodes.
 *
 * Created by Henrik Ekblad <[email protected]>
 * Copyright (C) 2013-2015 Sensnology AB
 * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
 *
 * Documentation: http://www.mysensors.org
 * Support Forum: http://forum.mysensors.org
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * version 2 as published by the Free Software Foundation.
 *
 *******************************
 *
 * DESCRIPTION
 *
 * Example sketch showing how to send in DS1820B OneWire temperature readings back to the controller
 * http://www.mysensors.org/build/temp
 */


// Enable debug prints to serial monitor
//#define MY_DEBUG 

// Enable and select radio type attached
#define MY_RADIO_RF24
//#define MY_RADIO_RFM69

#include <MySensors.h>  
#include <DallasTemperature.h>
#include <OneWire.h>

#define COMPARE_TEMP 1 // Send temperature only if changed? 1 = Yes 0 = No

#define ONE_WIRE_BUS 3 // Pin where dallase sensor is connected 
#define MAX_ATTACHED_DS18B20 16
unsigned long SLEEP_TIME = 30000; // Sleep time between reads (in milliseconds)
OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
DallasTemperature sensors(&oneWire); // Pass the oneWire reference to Dallas Temperature. 
float lastTemperature[MAX_ATTACHED_DS18B20];
int numSensors=0;
bool receivedConfig = false;
bool metric = true;
// Initialize temperature message
MyMessage msg(0,V_TEMP);

void before()
{
  // Startup up the OneWire library
  sensors.begin();
}

void setup()  
{ 
  // requestTemperatures() will not block current thread
  sensors.setWaitForConversion(false);
}

void presentation() {
  // Send the sketch version information to the gateway and Controller
  sendSketchInfo("Temperature Sensor", "1.1");

  // Fetch the number of attached temperature sensors  
  numSensors = sensors.getDeviceCount();

  // Present all sensors to controller
  for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {   
     present(i, S_TEMP);
  }
}

void loop()     
{     
  // Fetch temperatures from Dallas sensors
  sensors.requestTemperatures();

  // query conversion time and sleep until conversion completed
  int16_t conversionTime = sensors.millisToWaitForConversion(sensors.getResolution());
  // sleep() call can be replaced by wait() call if node need to process incoming messages (or if node is repeater)
  sleep(conversionTime);

  // Read temperatures and send them to controller 
  for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {
 
    // Fetch and round temperature to one decimal
    float temperature = static_cast<float>(static_cast<int>((getControllerConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;
 
    // Only send data if temperature has changed and no error
    #if COMPARE_TEMP == 1
    if (lastTemperature[i] != temperature && temperature != -127.00 && temperature != 85.00) {
    #else
    if (temperature != -127.00 && temperature != 85.00) {
    #endif
 
      // Send in the new temperature
      send(msg.setSensor(i).set(temperature,1));
      // Save new temperatures for next compare
      lastTemperature[i]=temperature;
    }
  }
  sleep(SLEEP_TIME);
}

Datasheets

NameSize# Downloads
DS18B20.pdf333.51 kB3673

Shopping Guide

100pcs 4k7 Pull-up Resistors
Used for Dallas temperature sensors.
1 available - $5.99   Buy
undefined   Buy
10pcs DS18B20 Dallas Temperature Sensors
Use this for measuring room temperature. You'll also need a pull up resistor
1 available - $9.99 ($1.00 / Count)   Buy
undefined   Buy
DS18B20 Waterproof Dallas Temperature Sensors
About 100 cm cable length. Good when you want to measure the temperature in a freezer or on pipes. You'll also need a pull up resistor.
Unavailable   Buy
undefined   Buy
DS18b20 Dallas Temperature Sensors Module
Easy to connect. Built in pull up resistor.
Unavailable   Buy
undefined   Buy

Gateways

Sensors & Actuators

Related Content

Comments