Auto search for All DS18B20 sensors on data bus

Dependencies:   mbed

Committer:
umairaftab
Date:
Sun Apr 13 10:06:52 2014 +0000
Revision:
0:a2a81f538133
Multiple Sensors Functionality Added to Peter Sudensikis Library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
umairaftab 0:a2a81f538133 1 /*
umairaftab 0:a2a81f538133 2 * OneWireThermometer. Base class for Maxim One-Wire Thermometers.
umairaftab 0:a2a81f538133 3 * Uses the OneWireCRC library.
umairaftab 0:a2a81f538133 4 *
umairaftab 0:a2a81f538133 5 * Copyright (C) <2010> Petras Saduikis <petras@petras.co.uk>
umairaftab 0:a2a81f538133 6 *
umairaftab 0:a2a81f538133 7 * This file is part of OneWireThermometer.
umairaftab 0:a2a81f538133 8 *
umairaftab 0:a2a81f538133 9 * OneWireThermometer is free software: you can redistribute it and/or modify
umairaftab 0:a2a81f538133 10 * it under the terms of the GNU General Public License as published by
umairaftab 0:a2a81f538133 11 * the Free Software Foundation, either version 3 of the License, or
umairaftab 0:a2a81f538133 12 * (at your option) any later version.
umairaftab 0:a2a81f538133 13 *
umairaftab 0:a2a81f538133 14 * OneWireThermometer is distributed in the hope that it will be useful,
umairaftab 0:a2a81f538133 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
umairaftab 0:a2a81f538133 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
umairaftab 0:a2a81f538133 17 * GNU General Public License for more details.
umairaftab 0:a2a81f538133 18 *
umairaftab 0:a2a81f538133 19 * You should have received a copy of the GNU General Public License
umairaftab 0:a2a81f538133 20 * along with OneWireThermometer. If not, see <http://www.gnu.org/licenses/>.
umairaftab 0:a2a81f538133 21 */
umairaftab 0:a2a81f538133 22
umairaftab 0:a2a81f538133 23 #include "OneWireThermometer.h"
umairaftab 0:a2a81f538133 24 #include "OneWireDefs.h"
umairaftab 0:a2a81f538133 25 //#include "DebugTrace.h"
umairaftab 0:a2a81f538133 26
umairaftab 0:a2a81f538133 27 //DebugTrace pc(OFF, TO_SERIAL);
umairaftab 0:a2a81f538133 28
umairaftab 0:a2a81f538133 29 // constructor specifies standard speed for the 1-Wire comms
umairaftab 0:a2a81f538133 30 // Used to have params for CRCon and useAddress, can't see why you wouldn't use CRC and you have to use address since there could be more than one.
umairaftab 0:a2a81f538133 31 OneWireThermometer::OneWireThermometer(PinName pin, int device_id) :
umairaftab 0:a2a81f538133 32 oneWire(pin, STANDARD), deviceId(device_id), resolution(twelveBit)
umairaftab 0:a2a81f538133 33 {
umairaftab 0:a2a81f538133 34 // NOTE: the power-up resolution of a DS18B20 is 12 bits. The DS18S20's resolution is always
umairaftab 0:a2a81f538133 35 // 9 bits + enhancement, but we treat the DS18S20 as fixed to 12 bits for calculating the
umairaftab 0:a2a81f538133 36 // conversion time Tconv.
umairaftab 0:a2a81f538133 37 deviceCount = 0;
umairaftab 0:a2a81f538133 38 }
umairaftab 0:a2a81f538133 39
umairaftab 0:a2a81f538133 40 bool OneWireThermometer::initialize()
umairaftab 0:a2a81f538133 41 {
umairaftab 0:a2a81f538133 42 // get all the device addresses for use in selectROM() when reading the temperature
umairaftab 0:a2a81f538133 43 // pc.traceOut("\r\n");
umairaftab 0:a2a81f538133 44 //pc.traceOut("New Scan\r\n");
umairaftab 0:a2a81f538133 45
umairaftab 0:a2a81f538133 46 oneWire.resetSearch();
umairaftab 0:a2a81f538133 47 while (oneWire.search(address)) // search for 1-wire device address
umairaftab 0:a2a81f538133 48 {
umairaftab 0:a2a81f538133 49 //pc.traceOut("Address = ");
umairaftab 0:a2a81f538133 50 for (int i = 0; i < ADDRESS_SIZE; i++)
umairaftab 0:a2a81f538133 51 {
umairaftab 0:a2a81f538133 52 //pc.traceOut("%x ", (int)address[i]);
umairaftab 0:a2a81f538133 53 devices[deviceCount][i] = address[i];
umairaftab 0:a2a81f538133 54 }
umairaftab 0:a2a81f538133 55 //pc.traceOut("\r\n");
umairaftab 0:a2a81f538133 56 deviceCount++;
umairaftab 0:a2a81f538133 57 }
umairaftab 0:a2a81f538133 58
umairaftab 0:a2a81f538133 59 if (OneWireCRC::crc8(address, ADDRESS_CRC_BYTE) != address[ADDRESS_CRC_BYTE]) // check address CRC is valid
umairaftab 0:a2a81f538133 60 {
umairaftab 0:a2a81f538133 61 //pc.traceOut("CRC is not valid!\r\n");
umairaftab 0:a2a81f538133 62 wait(2);
umairaftab 0:a2a81f538133 63 return false;
umairaftab 0:a2a81f538133 64 }
umairaftab 0:a2a81f538133 65
umairaftab 0:a2a81f538133 66 if (address[0] != deviceId)
umairaftab 0:a2a81f538133 67 {
umairaftab 0:a2a81f538133 68 // Make sure it is a one-wire thermometer device
umairaftab 0:a2a81f538133 69 if (DS18B20_ID == deviceId){}
umairaftab 0:a2a81f538133 70 //pc.traceOut("You need to use a DS1820 or DS18S20 for correct results.\r\n");
umairaftab 0:a2a81f538133 71 else if (DS18S20_ID == deviceId){}
umairaftab 0:a2a81f538133 72 //pc.traceOut("You need to use a DS18B20 for correct results.\r\n");
umairaftab 0:a2a81f538133 73 else{}
umairaftab 0:a2a81f538133 74 // pc.traceOut("Device is not a DS18B20/DS1820/DS18S20 device.\r\n");
umairaftab 0:a2a81f538133 75
umairaftab 0:a2a81f538133 76 wait(2);
umairaftab 0:a2a81f538133 77 return false;
umairaftab 0:a2a81f538133 78 }
umairaftab 0:a2a81f538133 79 else
umairaftab 0:a2a81f538133 80 {
umairaftab 0:a2a81f538133 81 if (DS18B20_ID == deviceId){} //pc.traceOut("DS18B20 present and correct.\r\n");
umairaftab 0:a2a81f538133 82 if (DS18S20_ID == deviceId){} //pc.traceOut("DS1820/DS18S20 present and correct.\r\n");
umairaftab 0:a2a81f538133 83 }
umairaftab 0:a2a81f538133 84
umairaftab 0:a2a81f538133 85 return true;
umairaftab 0:a2a81f538133 86 }
umairaftab 0:a2a81f538133 87
umairaftab 0:a2a81f538133 88 // NOTE ON USING SKIP ROM: ok to use before a Convert command to get all
umairaftab 0:a2a81f538133 89 // devices on the bus to do simultaneous temperature conversions. BUT can
umairaftab 0:a2a81f538133 90 // only use before a Read Scratchpad command if there is only one device on the
umairaftab 0:a2a81f538133 91 // bus. For purpose of this library it is assumed there is only one device
umairaftab 0:a2a81f538133 92 // on the bus.
umairaftab 0:a2a81f538133 93 void OneWireThermometer::resetAndAddress()
umairaftab 0:a2a81f538133 94 {
umairaftab 0:a2a81f538133 95 oneWire.reset(); // reset device
umairaftab 0:a2a81f538133 96 oneWire.matchROM(address); // select which device to talk to
umairaftab 0:a2a81f538133 97 }
umairaftab 0:a2a81f538133 98
umairaftab 0:a2a81f538133 99 bool OneWireThermometer::readAndValidateData(BYTE* data)
umairaftab 0:a2a81f538133 100 {
umairaftab 0:a2a81f538133 101 bool dataOk = true;
umairaftab 0:a2a81f538133 102
umairaftab 0:a2a81f538133 103 resetAndAddress();
umairaftab 0:a2a81f538133 104 oneWire.writeByte(READSCRATCH); // read Scratchpad
umairaftab 0:a2a81f538133 105
umairaftab 0:a2a81f538133 106 // pc.traceOut("read = ");
umairaftab 0:a2a81f538133 107 for (int i = 0; i < THERMOM_SCRATCHPAD_SIZE; i++)
umairaftab 0:a2a81f538133 108 {
umairaftab 0:a2a81f538133 109 // we need all bytes which includes CRC check byte
umairaftab 0:a2a81f538133 110 data[i] = oneWire.readByte();
umairaftab 0:a2a81f538133 111 // pc.traceOut("%x ", (int)data[i]);
umairaftab 0:a2a81f538133 112 }
umairaftab 0:a2a81f538133 113 //pc.traceOut("\r\n");
umairaftab 0:a2a81f538133 114
umairaftab 0:a2a81f538133 115 // Check CRC is valid
umairaftab 0:a2a81f538133 116 if (!(OneWireCRC::crc8(data, THERMOM_CRC_BYTE) == data[THERMOM_CRC_BYTE]))
umairaftab 0:a2a81f538133 117 {
umairaftab 0:a2a81f538133 118 // CRC failed
umairaftab 0:a2a81f538133 119 // pc.traceOut("CRC FAILED... \r\n");
umairaftab 0:a2a81f538133 120 dataOk = false;
umairaftab 0:a2a81f538133 121 }
umairaftab 0:a2a81f538133 122
umairaftab 0:a2a81f538133 123 return dataOk;
umairaftab 0:a2a81f538133 124 }
umairaftab 0:a2a81f538133 125
umairaftab 0:a2a81f538133 126 float OneWireThermometer::readTemperature(int device)
umairaftab 0:a2a81f538133 127 {
umairaftab 0:a2a81f538133 128 BYTE data[THERMOM_SCRATCHPAD_SIZE];
umairaftab 0:a2a81f538133 129 float realTemp = -999;
umairaftab 0:a2a81f538133 130
umairaftab 0:a2a81f538133 131 // need to select which device here.
umairaftab 0:a2a81f538133 132 for (int i = 0; i < ADDRESS_SIZE; i++)
umairaftab 0:a2a81f538133 133 {
umairaftab 0:a2a81f538133 134 address[i] = devices[device][i];
umairaftab 0:a2a81f538133 135 }
umairaftab 0:a2a81f538133 136
umairaftab 0:a2a81f538133 137 resetAndAddress();
umairaftab 0:a2a81f538133 138 oneWire.writeByte(CONVERT); // issue Convert command
umairaftab 0:a2a81f538133 139
umairaftab 0:a2a81f538133 140 // Removed the check for parasitic power, since we waited the same time anyway.
umairaftab 0:a2a81f538133 141 wait_ms(CONVERSION_TIME[resolution]);
umairaftab 0:a2a81f538133 142
umairaftab 0:a2a81f538133 143 if (readAndValidateData(data)) // issue Read Scratchpad commmand and get data
umairaftab 0:a2a81f538133 144 {
umairaftab 0:a2a81f538133 145 realTemp = calculateTemperature(data);
umairaftab 0:a2a81f538133 146 }
umairaftab 0:a2a81f538133 147
umairaftab 0:a2a81f538133 148 return realTemp;
umairaftab 0:a2a81f538133 149 }
umairaftab 0:a2a81f538133 150
umairaftab 0:a2a81f538133 151 int OneWireThermometer::getDeviceCount()
umairaftab 0:a2a81f538133 152 {
umairaftab 0:a2a81f538133 153 return deviceCount;
umairaftab 0:a2a81f538133 154 }