Here's a list of features:
Tiny Analog Temperature Sensor
Available Packages: TO-92, SC70-5, SOT-23-5
Wide Temperature Measurement Range:
-40°C to +125°C (Extended Temperature)
-40°C to +150°C (High Temperature) (MCP9700/9700A)
Accuracy:
±2°C (max.), 0°C to +70°C (MCP9700A/9701A)
±4°C (max.), 0°C to +70°C (MCP9700/9701)
Optimized for Analog-to-Digital Converters (ADCs):
10.0 mV/°C (typical) MCP9700/9700A
19.5 mV/°C (typical) MCP9701/9701A
Example Code
Here are some code snippets that would make interfacing with the MCP9700, MCP9700A, MCP9701 and MCP9701A devices very easy. The user module is listed at the end of this article, and here's an example of using the module:
(this example will sample the temperature sensor and display the result in Word and Integer format every 500mS)
Device = 18F2520
Clock = 32
Config MCLRE = OFF
Include "InternalOscillator.bas" // configures the internal oscillator
Include "Utils.bas" // used for the 'Digit' function
Include "ADC.bas" // ADC routines
Include "Convert.bas" // convert numbers to strings
Include "USART.bas" // for UART support
Include "MCP97.bas" // MCP97xxx sensor routines
// display the temperature via USART
Sub DisplayTemperature()
USART.Write("_____________________",13,10) // separate each output with a line
// this code demonstrates the use of various public variables that are
// pre-calculated by MCP97.ReadTemperature
USART.Write("Word Output: ")
If Temperature.Positive Then
USART.Write("+")
Else
USART.Write("-")
EndIf
USART.Write(DecToStr((Temperature.WordVal/10),3)) // write the first two digits of the temperature
USART.Write(".",DecToStr(Digit(Temperature.WordVal,1)), " C",13,10) // display the "." and decimal place, followed by " C"
// this code demonstrates use of the public integer variable pre-calculated
// by MCP97.ReadTemperature
// note - can't use 'Digit' as it does not support Integer type variables
USART.Write("Integer Output: ")
USART.Write(DecToStr((Temperature.IntVal),4),13,10) // write the whole integer value
End Sub
USART.SetBaudrate(br57600) // initialise UART for 57600 baud
ADCON1 = $E // configure AN0 as an input
// main program loop...
While True
MCP97.ReadTemperature(0) // sample the sensor on CH0 and calculate the results
DisplayTemperature() // display the temperature
DelayMS(500) // delay 500mS between samples
Wend
Notes
The pin connected from the PIC to Vout should be configured as analogue before calling the user module. I have done this in the above example with the statement "ADCON1 = $E".
Once "MCP97.ReadTemperature(pChannel)" has been called, the temperature results are stored in a public structure with multiple variable types. This makes it easy to quickly use the type of variable for different scenarios (for example, "Utils.Digit" can only parse byte, word and longword type variables - not integers.
Temperature.WordVal - stores the temperature result as a word type variable with a scale of 10 (-12.1 = 121, +25 = 250)
Temperature.Positive - if the WordVal is postive, then this flag is set true. Otherwise it is set false. (-12.1 = false, +25 = true)
Temperature.IntVal - stores the temperature result as an integer type variable with a scale of 10 (-12.1 = -121, +25 = 250)
You can use different devices by including the option definition like so: #option MCP97_Device = MCP9701A
Valid options are MCP9700, MCP9700A, MCP9701, MCP9701A.
User Module MCP9700/9700A/9701/9701A
Save the following code to the "UserLibrary" folder, and call it "MCP97.bas"
{
______________________________________________________________________________________________________________
MCP9700/9700A/9701/9701A Temperature Sensor Module
* Ensure the ADC Port.Pin is configured as analogue before calling ReadTemperature
______________________________________________________________________________________________________________
}
Module MCP97
#option MCP97_Device = MCP9701A
#if Not(MCP97_Device in (MCP9700, MCP9700A, MCP9701, MCP9701A))
#error MCP97_Device, "Unknown device. Please define either MCP9700, MCP9700A, MCP9701, MCP9701A"
#endif
Structure TTemperature
IntVal As Integer
WordVal As Word
Positive As Boolean
End Structure
// public structure to store different variable types of temperature results
Public Dim Temperature As TTemperature
Include "ADC.bas"
// convert the temperature result into various types for simple use in main
Sub LoadStructure(ByVal pResult As Integer)
Temperature.IntVal = pResult // store integer type result
If pResult < 0 Then // check if less than zero (negative)
Temperature.Positive = False // yes, clear positive flag
Temperature.WordVal = 65536 - Word(pResult) // and load word type variable
Else //
Temperature.Positive = True // no, set positive flag
Temperature.WordVal = Word(pResult) //and load word type variable
EndIf
End Sub
// read the ADC port + and convert to degrees C (scaled integer math)
// if temperature = 25.3 then it will calculate 253
// if temperature = -13.4 then it will calculate -134
Public Sub ReadTemperature(ByVal pChannel As Byte)
Dim tmpInt As Integer
Dim tmpLongInt As LongInt
tmpInt = (ADC.Read(pChannel)) // make a 10-bit sample of the ADC.0
#if MCP97_Device in (MCP9701, MCP9701A) // check which device is in use
tmpInt = tmpInt - 82 // calculate difference from zero offset
#else
tmpInt = tmpInt - 102 // calculate difference from zero offset
#endif
tmpLongInt = tmpInt * 1000 // scale up by 1,000
#if MCP97_Device in (MCP9701, MCP9701A) // check which device is in use
tmpInt = tmpLongInt / 400 // convert +/- degrees C
#else
tmpInt = tmpLongInt / 205 // convert +/- degrees C
#endif
LoadStructure(tmpInt)
End Sub