Temerature with the MAX6675
SPI
From the data sheet I find the following info:
- Serial Clock Frequency Maximum 4.3 MHz
- A complete serial interface read requires 16 clock cycles.
- Read the 16 output bits on the falling edge of the clock.
- The first bit, D15, is a dummy sign bit and is always zero.
- Bits D14-D3 contain the converted temperature in the order of MSB to LSB.
Setting up the SPI in the Uno
The Includes and Defines
#include <SPI.h> // The SPI library #define CS_MAX 10 // MAX6675 CS (Chip Select) Line
The Temperature Function
int GetTemperature (void)
{
unsigned int temp_reading;
// stop any conversion process
delay(5);
digitalWrite(CS_MAX,LOW); // Set MAX7765 /CS Low
delay(5);
// initiate a new conversion
digitalWrite(CS_MAX,HIGH); // Set MAX7765 /CS High
delay(250); // wait for conversion to finish..
// read result
digitalWrite(CS_MAX,LOW); // Set MAX7765 /CS Low
delay(1);
temp_reading = SPI.transfer(0xff) << 8;
temp_reading += SPI.transfer(0xff);
digitalWrite(CS_MAX,HIGH); // Set MAX7765 /CS High
delay(1);
// Bit D2 is normally low and goes high if the thermocouple input is open.
if(bitRead(temp_reading,2) == 1) // No Connection
{
return(-1); // No Connection Error
}
else
{
return((int)(temp_reading >> 5)); //Convert to Degc
}
}
SPI shifts 8 bits out and 8 bits in at the same time. To read a byte you need to send a byte. The 0xff is a hexadecimal (base 16) constant equivalent to 255. Depending on the slave device, the value being sent when reading data may or may not be important.
<< 8 means "shift left 8 bits". This is to put the received byte in the upper 8 bits of a 16-bit word. += means "add the value on the right to the variable on the left. It puts the received byte in the lower half of the 16-bit word.
All together it reads two 8-bit bytes from the SPI device and stores them as a 16-bit integer.
The Setup
void setup()
{
Serial.begin(9600);
pinMode(CS_MAX,OUTPUT); // MAX6675/6674 /CS Line must be an output for hardware SPI
digitalWrite(CS_MAX,HIGH); // Set MAX7765 /CS High
SPI.begin(); // Init SPI
SPI.setBitOrder(MSBFIRST); // Set the order of the bits shifted out of and into the SPI bus
SPI.setDataMode(SPI_MODE1); // Capture data on clock's falling edge.
SPI.setClockDivider(SPI_CLOCK_DIV4); // Set SPI data rate to 4mhz.
}
Reading the Temperature
void loop()
{
int temperature = 0;
while(1)
{
delay(1000);
temperature = GetTemperature();
if(temperature == -1)
{
Serial.println("No Connection");
}
else
{
Serial.print(temperature,DEC);
Serial.println(" DegC");
}
}
}