MAX6675目前看到有三种库文件,两种是以IO口模拟SPI总线的。一种是
*MAX6675 thermocouple library by E. Kremer*的SPI总线通讯,实际调用SCK,MISO两条总线,和一个CS脚位。查阅它的MAX6675.h和MAX6675.opp两个文件,可以追查到它是调用了SPI.h以及其它的库文件。
实际测试中,发现,这种方式不浪费SPI总线脚位,可以发挥SPI的优势。在sample文件中,对于CS_PIN做了一个全局声明,在使用多组MAX6675的时候,需要修订,另外添加一个循环数和数组用于存储温度。
上三个文件的代码供参考:
MAX6675.h
-------------
#include <SPI.h>
#define MAX6675_Settings (SPISettings(1000000, MSBFIRST, SPI_MODE1))
#define MAX6675_THERMOCOUPLE_OPEN_BIT 0x04
#define MAX6675_THERMOCOUPLE_OPEN -1.0
#define MAX6675_READ_PERIOD 250
#define MAX6675_CONVERSION_RATIO 0.25
class MAX6675
{
private:
uint32_t _lastCallTime;
int16_t _SSPin;
uint16_t _incomingMessage;
float _currentTemp;
public:
MAX6675 (int16_t SSPin);
float readTempC() = 0.0;
// float readTempF();
};
MAX6676.opp
-------------
#include <MAX6675.h>
MAX6675::MAX6675(int16_t SSPin)
{
_SSPin = SSPin;
pinMode(_SSPin, OUTPUT);
digitalWrite(_SSPin, HIGH);
SPI.begin();
_lastCallTime = 0;
}
float MAX6675::readTempC()
{
if (millis() - _lastCallTime >= MAX6675_READ_PERIOD)
{
SPI.beginTransaction(MAX6675_Settings);
digitalWrite(_SSPin, LOW);
_incomingMessage = SPI.transfer16(0x00);
digitalWrite(_SSPin, HIGH);
SPI.endTransaction();
_lastCallTime = millis();
if (_incomingMessage & MAX6675_THERMOCOUPLE_OPEN_BIT)
return MAX6675_THERMOCOUPLE_OPEN;
_currentTemp = (_incomingMessage >> 3) * MAX6675_CONVERSION_RATIO;
return _currentTemp;
}
return _currentTemp;
}
//float MAX6675::readTempF()
//{
// return readTempC() * 9.0/5.0 + 32;
//}
TempViaSPI.ino
--------------
#include <MAX6675.h>
float Temp[4];
int CS_PIN;
void setup()
{
Serial.begin(38400);
Serial.println("4CH MAX6675 connected via SPI");
Serial.println("OK...");
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
digitalWrite(2,HIGH);
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
delay(500);
}
void loop()
{
for ( int i=0; i<=3; ++i)
{
int CS_PIN = i+2;
MAX6675 tcouple(CS_PIN);
float celsius = tcouple.readTempC();
Temp[i] = celsius;
Serial.print("Temp of pin");
Serial.print(CS_PIN);
Serial.print(": ");
Serial.println(Temp[i]);
celsius = 0;
delay(50);
}
Serial.println();
delay(2000);
} |