Library for the DS1620 Digital Thermometer

Committer:
rybancr
Date:
Sun Mar 08 00:31:35 2015 +0000
Revision:
0:45c93163189a
Child:
2:35526d3a8a04
Original

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rybancr 0:45c93163189a 1 // Library for the DS1620 digital thermometer
rybancr 0:45c93163189a 2 // Copyright (C) <2015> Ryan Bancroft
rybancr 0:45c93163189a 3 //
rybancr 0:45c93163189a 4 // This program is free software: you can redistribute it and/or modify
rybancr 0:45c93163189a 5 // it under the terms of the GNU General Public License as published by
rybancr 0:45c93163189a 6 // the Free Software Foundation, either version 3 of the License, or
rybancr 0:45c93163189a 7 // (at your option) any later version.
rybancr 0:45c93163189a 8 //
rybancr 0:45c93163189a 9 // This program is distributed in the hope that it will be useful,
rybancr 0:45c93163189a 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
rybancr 0:45c93163189a 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
rybancr 0:45c93163189a 12 // GNU General Public License for more details.
rybancr 0:45c93163189a 13 //
rybancr 0:45c93163189a 14 // For copy of the GNU General Public License
rybancr 0:45c93163189a 15 // see <http://www.gnu.org/licenses/>.
rybancr 0:45c93163189a 16
rybancr 0:45c93163189a 17 #include "mbed.h"
rybancr 0:45c93163189a 18 #include "DS1620.h"
rybancr 0:45c93163189a 19
rybancr 0:45c93163189a 20 // Constructor
rybancr 0:45c93163189a 21 DS1620::DS1620(PinName dq, PinName clk, PinName rst) : _dq(dq), _clk(clk), _rst(rst)
rybancr 0:45c93163189a 22 {
rybancr 0:45c93163189a 23 // Initialize members
rybancr 0:45c93163189a 24 _dq.input();
rybancr 0:45c93163189a 25 _clk = 1;
rybancr 0:45c93163189a 26 _rst = 0;
rybancr 0:45c93163189a 27 _clockDelay = CLOCK_DELAY;
rybancr 0:45c93163189a 28 }
rybancr 0:45c93163189a 29
rybancr 0:45c93163189a 30 // Destructor
rybancr 0:45c93163189a 31 DS1620::~DS1620()
rybancr 0:45c93163189a 32 {
rybancr 0:45c93163189a 33
rybancr 0:45c93163189a 34 }
rybancr 0:45c93163189a 35
rybancr 0:45c93163189a 36 float DS1620::getTemperature()
rybancr 0:45c93163189a 37 {
rybancr 0:45c93163189a 38 float temp = 0.0;
rybancr 0:45c93163189a 39 unsigned short rawTemp = readTemperatureRaw();
rybancr 0:45c93163189a 40 temp = rawTemp / 2.0;
rybancr 0:45c93163189a 41 if (rawTemp >= 0x100) {
rybancr 0:45c93163189a 42 temp -= 256.0;
rybancr 0:45c93163189a 43 }
rybancr 0:45c93163189a 44 return temp;
rybancr 0:45c93163189a 45 }
rybancr 0:45c93163189a 46
rybancr 0:45c93163189a 47 float DS1620::getHighResolutionTemperature()
rybancr 0:45c93163189a 48 {
rybancr 0:45c93163189a 49 float temp = 0.0;
rybancr 0:45c93163189a 50 unsigned short rawTemp, counter, slope = 0;
rybancr 0:45c93163189a 51 rawTemp = readTemperatureRaw();
rybancr 0:45c93163189a 52 counter = readCounter();
rybancr 0:45c93163189a 53 loadSlope();
rybancr 0:45c93163189a 54 slope = readCounter();
rybancr 0:45c93163189a 55
rybancr 0:45c93163189a 56 temp = (rawTemp >> 1) - 0.25;
rybancr 0:45c93163189a 57 if (rawTemp >= 0x100) {
rybancr 0:45c93163189a 58 temp -= 256.0;
rybancr 0:45c93163189a 59 }
rybancr 0:45c93163189a 60 temp += ((float)slope - (float)counter) / (float)slope;
rybancr 0:45c93163189a 61 return temp;
rybancr 0:45c93163189a 62 }
rybancr 0:45c93163189a 63
rybancr 0:45c93163189a 64 unsigned short DS1620::readTemperatureRaw()
rybancr 0:45c93163189a 65 {
rybancr 0:45c93163189a 66 unsigned short temp = 0;
rybancr 0:45c93163189a 67 unsigned char tempLSB, tempMSB = 0;
rybancr 0:45c93163189a 68
rybancr 0:45c93163189a 69 _rst = 1;
rybancr 0:45c93163189a 70 shiftOut(READ_TEMPERATURE);
rybancr 0:45c93163189a 71 tempLSB = shiftIn();
rybancr 0:45c93163189a 72 tempMSB = shiftIn();
rybancr 0:45c93163189a 73 _rst = 0;
rybancr 0:45c93163189a 74 temp = tempMSB * 256;
rybancr 0:45c93163189a 75 temp += tempLSB;
rybancr 0:45c93163189a 76 return temp;
rybancr 0:45c93163189a 77 }
rybancr 0:45c93163189a 78
rybancr 0:45c93163189a 79 unsigned char DS1620::readConfig()
rybancr 0:45c93163189a 80 {
rybancr 0:45c93163189a 81 unsigned char data = 0;
rybancr 0:45c93163189a 82 _rst = 1;
rybancr 0:45c93163189a 83 shiftOut(READ_CONFIG);
rybancr 0:45c93163189a 84 data = shiftIn();
rybancr 0:45c93163189a 85 _rst = 0;
rybancr 0:45c93163189a 86 return data;
rybancr 0:45c93163189a 87 }
rybancr 0:45c93163189a 88
rybancr 0:45c93163189a 89 void DS1620::writeConfig(unsigned char config)
rybancr 0:45c93163189a 90 {
rybancr 0:45c93163189a 91 _rst = 1;
rybancr 0:45c93163189a 92 shiftOut(WRITE_CONFIG);
rybancr 0:45c93163189a 93 shiftOut(config);
rybancr 0:45c93163189a 94 _rst = 0;
rybancr 0:45c93163189a 95 wait(0.1); // Wait for write to complete
rybancr 0:45c93163189a 96 }
rybancr 0:45c93163189a 97
rybancr 0:45c93163189a 98 unsigned short DS1620::readTLRaw()
rybancr 0:45c93163189a 99 {
rybancr 0:45c93163189a 100 unsigned short temp = 0;
rybancr 0:45c93163189a 101 unsigned char tempLSB, tempMSB = 0;
rybancr 0:45c93163189a 102
rybancr 0:45c93163189a 103 _rst = 1;
rybancr 0:45c93163189a 104 shiftOut(READ_TL);
rybancr 0:45c93163189a 105 tempLSB = shiftIn();
rybancr 0:45c93163189a 106 tempMSB = shiftIn();
rybancr 0:45c93163189a 107 _rst = 0;
rybancr 0:45c93163189a 108 temp = tempMSB * 256;
rybancr 0:45c93163189a 109 temp += tempLSB;
rybancr 0:45c93163189a 110 return temp;
rybancr 0:45c93163189a 111 }
rybancr 0:45c93163189a 112
rybancr 0:45c93163189a 113 void DS1620::writeTLRaw(unsigned short temperature)
rybancr 0:45c93163189a 114 {
rybancr 0:45c93163189a 115 unsigned char tempMSB, tempLSB = 0;
rybancr 0:45c93163189a 116 tempLSB = temperature & 0xFF;
rybancr 0:45c93163189a 117 tempMSB = (temperature >> 8) & 0xFF;
rybancr 0:45c93163189a 118 _rst = 1;
rybancr 0:45c93163189a 119 shiftOut(WRITE_TL);
rybancr 0:45c93163189a 120 shiftOut(tempLSB);
rybancr 0:45c93163189a 121 shiftOut(tempMSB);
rybancr 0:45c93163189a 122 _rst = 0;
rybancr 0:45c93163189a 123 wait(0.1);
rybancr 0:45c93163189a 124 }
rybancr 0:45c93163189a 125
rybancr 0:45c93163189a 126
rybancr 0:45c93163189a 127 unsigned short DS1620::readTHRaw()
rybancr 0:45c93163189a 128 {
rybancr 0:45c93163189a 129 unsigned short temp = 0;
rybancr 0:45c93163189a 130 unsigned char tempLSB, tempMSB = 0;
rybancr 0:45c93163189a 131
rybancr 0:45c93163189a 132 _rst = 1;
rybancr 0:45c93163189a 133 shiftOut(READ_TH);
rybancr 0:45c93163189a 134 tempLSB = shiftIn();
rybancr 0:45c93163189a 135 tempMSB = shiftIn();
rybancr 0:45c93163189a 136 _rst = 0;
rybancr 0:45c93163189a 137 temp = tempMSB * 256;
rybancr 0:45c93163189a 138 temp += tempLSB;
rybancr 0:45c93163189a 139 return temp;
rybancr 0:45c93163189a 140 }
rybancr 0:45c93163189a 141
rybancr 0:45c93163189a 142 void DS1620::writeTHRaw(unsigned short temperature)
rybancr 0:45c93163189a 143 {
rybancr 0:45c93163189a 144 unsigned char tempMSB, tempLSB = 0;
rybancr 0:45c93163189a 145 tempLSB = temperature & 0xFF;
rybancr 0:45c93163189a 146 tempMSB = (temperature >> 8) & 0xFF;
rybancr 0:45c93163189a 147 _rst = 1;
rybancr 0:45c93163189a 148 shiftOut(WRITE_TH);
rybancr 0:45c93163189a 149 shiftOut(tempLSB);
rybancr 0:45c93163189a 150 shiftOut(tempMSB);
rybancr 0:45c93163189a 151 _rst = 0;
rybancr 0:45c93163189a 152 wait(0.1);
rybancr 0:45c93163189a 153 }
rybancr 0:45c93163189a 154
rybancr 0:45c93163189a 155 unsigned short DS1620::readCounter()
rybancr 0:45c93163189a 156 {
rybancr 0:45c93163189a 157 unsigned short temp = 0;
rybancr 0:45c93163189a 158 unsigned char tempLSB, tempMSB = 0;
rybancr 0:45c93163189a 159
rybancr 0:45c93163189a 160 _rst = 1;
rybancr 0:45c93163189a 161 shiftOut(READ_COUNTER);
rybancr 0:45c93163189a 162 tempLSB = shiftIn();
rybancr 0:45c93163189a 163 tempMSB = shiftIn();
rybancr 0:45c93163189a 164 _rst = 0;
rybancr 0:45c93163189a 165 temp = tempMSB * 256;
rybancr 0:45c93163189a 166 temp += tempLSB;
rybancr 0:45c93163189a 167 return temp;
rybancr 0:45c93163189a 168 }
rybancr 0:45c93163189a 169
rybancr 0:45c93163189a 170 unsigned short DS1620::readSlope()
rybancr 0:45c93163189a 171 {
rybancr 0:45c93163189a 172 unsigned short temp = 0;
rybancr 0:45c93163189a 173 unsigned char tempLSB, tempMSB = 0;
rybancr 0:45c93163189a 174
rybancr 0:45c93163189a 175 _rst = 1;
rybancr 0:45c93163189a 176 shiftOut(READ_SLOPE);
rybancr 0:45c93163189a 177 tempLSB = shiftIn();
rybancr 0:45c93163189a 178 tempMSB = shiftIn();
rybancr 0:45c93163189a 179 _rst = 0;
rybancr 0:45c93163189a 180 temp = tempMSB * 256;
rybancr 0:45c93163189a 181 temp += tempLSB;
rybancr 0:45c93163189a 182 return temp;
rybancr 0:45c93163189a 183 }
rybancr 0:45c93163189a 184
rybancr 0:45c93163189a 185 void DS1620::loadSlope()
rybancr 0:45c93163189a 186 {
rybancr 0:45c93163189a 187 _rst = 1;
rybancr 0:45c93163189a 188 shiftOut(LOAD_SLOPE);
rybancr 0:45c93163189a 189 _rst = 0;
rybancr 0:45c93163189a 190 }
rybancr 0:45c93163189a 191
rybancr 0:45c93163189a 192 void DS1620::startConversion()
rybancr 0:45c93163189a 193 {
rybancr 0:45c93163189a 194 _rst = 1;
rybancr 0:45c93163189a 195 shiftOut(START_CONVERT);
rybancr 0:45c93163189a 196 _rst = 0;
rybancr 0:45c93163189a 197 }
rybancr 0:45c93163189a 198
rybancr 0:45c93163189a 199 void DS1620::stopConversion()
rybancr 0:45c93163189a 200 {
rybancr 0:45c93163189a 201 _rst = 1;
rybancr 0:45c93163189a 202 shiftOut(STOP_CONVERT);
rybancr 0:45c93163189a 203 _rst = 0;
rybancr 0:45c93163189a 204 }
rybancr 0:45c93163189a 205
rybancr 0:45c93163189a 206 void DS1620::setSerialClockFrequency(clock_frequencies_t frequency)
rybancr 0:45c93163189a 207 {
rybancr 0:45c93163189a 208 _clockDelay = frequency;
rybancr 0:45c93163189a 209 }
rybancr 0:45c93163189a 210
rybancr 0:45c93163189a 211 unsigned char DS1620::shiftIn()
rybancr 0:45c93163189a 212 {
rybancr 0:45c93163189a 213 unsigned char temp = 0;
rybancr 0:45c93163189a 214 unsigned char data = 0;
rybancr 0:45c93163189a 215 _dq.input();
rybancr 0:45c93163189a 216 for(int x=0;x<8;x++) {
rybancr 0:45c93163189a 217 _clk = 0;
rybancr 0:45c93163189a 218 wait_us(_clockDelay);
rybancr 0:45c93163189a 219 temp = _dq;
rybancr 0:45c93163189a 220 temp = temp << 7;
rybancr 0:45c93163189a 221 data = data >> 1;
rybancr 0:45c93163189a 222 data = data | temp;
rybancr 0:45c93163189a 223 _clk = 1;
rybancr 0:45c93163189a 224 wait_us(_clockDelay);
rybancr 0:45c93163189a 225 }
rybancr 0:45c93163189a 226 return data;
rybancr 0:45c93163189a 227 }
rybancr 0:45c93163189a 228
rybancr 0:45c93163189a 229 void DS1620::shiftOut(unsigned char data)
rybancr 0:45c93163189a 230 {
rybancr 0:45c93163189a 231 _dq.output();
rybancr 0:45c93163189a 232 for(int x=0;x<8;x++){
rybancr 0:45c93163189a 233 _clk = 0;
rybancr 0:45c93163189a 234 _dq = data & 0x01;
rybancr 0:45c93163189a 235 wait_us(_clockDelay);
rybancr 0:45c93163189a 236 _clk = 1;
rybancr 0:45c93163189a 237 wait_us(_clockDelay);
rybancr 0:45c93163189a 238 data = data >> 1;
rybancr 0:45c93163189a 239 }
rybancr 0:45c93163189a 240 _dq.input();
rybancr 0:45c93163189a 241 }