Для измерения температуры в тяжелых условиях окружающей среды, например, в промышленных установках или научно-исследовательских приборах, зачастую используют такие устройства, как термопары. Сегодня существуют различные типы термопар (K, J, N, T, S, R, E), различающиеся своим составом и, как следствие, своими характеристиками.

Для того, чтобы электронная система (процессор, микроконтроллер) смогла считывать сигналы с термопар, применяются специальные микросхемы преобразователей сигналов термопар. Ярким представителем таких устройств является микросхема MAX31855. В данном материале будет рассмотрено взаимодействие одноплатного компьютера Raspberry Pi с преобразователем MAX31855, подключенного к термопаре.
MAX31855 способен преобразовывать сигналы термопар всех перечисленных выше типов в цифровую форму для дальнейшего использования в цифровой системе. Помимо этого он обеспечивает компенсацию опорных спаев этих термопар. Данные могут передаваться с помощью интерфейса SPI. Они представлены в 14-разрядном формате со знаком. Этот преобразователь имеет диапазон измеряемых температур от -270 °C до +1800 °C с разрешением 0.25 °C. Точность измерения составляет ±2°C для термопар K-типа при измерении температур в диапазоне от -200 °C до + 700 °C.
Для взаимодействия Raspberry Pi с MAX31855 и считывания значений температуры используется приведенный ниже код на Java.
import java.io.IOException;
import java.nio.ByteBuffer;
import com.pi4j.io.spi.SpiChannel;
import com.pi4j.io.spi.SpiDevice;
import com.pi4j.io.spi.SpiFactory;
public class MAX31855_Thermocouple {
public static SpiDevice spi = null;
public static void main(String args[]) throws InterruptedException, IOException {
System.out.println("Starting Thermocouple Application.");
spi = SpiFactory.getInstance(SpiChannel.CS0,SpiDevice.DEFAULT_SPI_SPEED,SpiDevice.DEFAULT_SPI_MODE);
while(true){
System.out.println(getConversionValue());
Thread.sleep(2000);
}
}
public static double getConversionValue() throws IOException {
byte data[] = new byte[] {0,0, 0, 0};// Информационная заглушка
byte[] result = spi.write(data); //Запрос данных из MAX31855 через SPI с информационной заглушкой
if((result[0] & 128)==0 && (result[1] & 1)==1 ) {//Знаковый бит это 0, и D16 в высоком логическом уровне, что означает, что термопара не подключена
System.out.println("Thermocouple is not connected");
return 0;
}
String stringResult=String.format("%32s",Integer.toString(ByteBuffer.wrap(result).getInt(), 2)).replace(' ', '0');
double valInt=0.0;
if(stringResult.charAt(0)=='1' ){ //Проверка знакового бита
StringBuilder onesComplementBuilder = new StringBuilder();
for(char bit : stringResult.substring(0, 12).toCharArray()) {
onesComplementBuilder.append((bit == '0') ? 1 : 0); // Если бит равен 0, добавляем 1. если бит равен 1, добавляем 0.
}
String onesComplement = onesComplementBuilder.toString();
valInt = -1*( Integer.valueOf(onesComplement, 2) + 1);.
}else{
valInt=Integer.parseInt(stringResult.substring(0, 12),2);
}
if(stringResult.charAt(12)=='1') //Проверка D18 и D19 на дробные значения
valInt+=0.5;
if(stringResult.charAt(13)=='1')
valInt+=0.25;
return valInt;
}
}