diff --git a/src/Engine/Buses.h b/src/Engine/Buses.h
index 3efddfc129ebf1099094bf534cfcc9626cd9c751..08d2283f59b3f654be38d9de664b6711d44932a6 100644
--- a/src/Engine/Buses.h
+++ b/src/Engine/Buses.h
@@ -39,6 +39,7 @@ public:
     Boardcore::SPIBus& getLIS2MDL() { return spi3; }
     Boardcore::SPIBus& getLSM6DSRX() { return spi3; }
     Boardcore::SPIBus& getADS131M08() { return spi4; }
+    Boardcore::SPIBus& getThermocouple() { return spi1; }
 
     Boardcore::USART& getHILUart() { return usart4; }
 
diff --git a/src/Engine/Configs/SensorsConfig.h b/src/Engine/Configs/SensorsConfig.h
index fe21e84b378fa883ec212d847bd723b485278ca5..19bbf69de2a4b110ffa591148be03341ff144fec 100644
--- a/src/Engine/Configs/SensorsConfig.h
+++ b/src/Engine/Configs/SensorsConfig.h
@@ -173,6 +173,12 @@ constexpr float TANK_P1_TEMP    = 34.0f;
 
 }  // namespace Kulite
 
+namespace MAX31856
+{
+constexpr Hertz PERIOD = 10_hz;
+constexpr bool ENABLED = true;
+}  // namespace MAX31856
+
 namespace InternalADC
 {
 constexpr Boardcore::InternalADC::Channel VBAT_CH =
diff --git a/src/Engine/Sensors/Sensors.cpp b/src/Engine/Sensors/Sensors.cpp
index 657c256fd2b64b415bfb8e9b9bb9518138db9e3d..360dab1f76408d9ed3fdf494d4fd7314c62b2a11 100644
--- a/src/Engine/Sensors/Sensors.cpp
+++ b/src/Engine/Sensors/Sensors.cpp
@@ -55,6 +55,9 @@ bool Sensors::start()
         tankTempInit();
     }
 
+    if (Config::Sensors::MAX31856::ENABLED)
+        thermocoupleInit();
+
     if (Config::Sensors::InternalADC::ENABLED)
         internalAdcInit();
 
@@ -141,6 +144,11 @@ TemperatureData Sensors::getTankTempLastSample()
     return tankTemp ? tankTemp->getLastSample() : TemperatureData{};
 }
 
+TemperatureData Sensors::getThermocoupleLastSample()
+{
+    return thermocouple ? thermocouple->getLastSample() : TemperatureData{};
+}
+
 VoltageData Sensors::getBatteryVoltageLastSample()
 {
     auto sample   = getInternalADCLastSample();
@@ -196,6 +204,9 @@ std::vector<SensorInfo> Sensors::getSensorInfos()
         if (tankTemp)
             infos.push_back(manager->getSensorInfo(tankTemp.get()));
 
+        if (thermocouple)
+            infos.push_back(manager->getSensorInfo(thermocouple.get()));
+
         return infos;
     }
     else
@@ -507,6 +518,25 @@ void Sensors::tankTempInit()
 
 void Sensors::tankTempCallback() { sdLogger.log(getTankTempLastSample()); }
 
+void Sensors::thermocoupleInit()
+{
+    SPIBusConfig spiConfig = MAX31856::getDefaultSPIConfig();
+    spiConfig.clockDivider = SPI::ClockDivider::DIV_32;
+
+    thermocouple = std::make_unique<MAX31856>(
+        getModule<Buses>()->getThermocouple(),
+        sensors::thermocouple::cs::getPin(), spiConfig,
+        MAX31856::ThermocoupleType::K_TYPE);  // TODO: verify the type
+}
+
+void Sensors::thermocoupleCallback()
+{
+    if (!thermocouple)
+        return;
+
+    sdLogger.log(getThermocoupleLastSample());
+}
+
 bool Sensors::sensorManagerInit()
 {
     SensorManager::SensorMap_t map;
@@ -606,6 +636,13 @@ bool Sensors::sensorManagerInit()
         map.emplace(std::make_pair(tankTemp.get(), info));
     }
 
+    if (thermocouple)
+    {
+        SensorInfo info("MAX31856", Config::Sensors::MAX31856::PERIOD,
+                        [this]() { thermocoupleCallback(); });
+        map.emplace(std::make_pair(thermocouple.get(), info));
+    }
+
     manager = std::make_unique<SensorManager>(map, &getSensorsScheduler());
     return manager->start();
 }
diff --git a/src/Engine/Sensors/Sensors.h b/src/Engine/Sensors/Sensors.h
index 7294874e85454ff237f8719d9352f5f4cdbce582..73bb192eb2ab4ffad34d002bea38adeee187e90e 100644
--- a/src/Engine/Sensors/Sensors.h
+++ b/src/Engine/Sensors/Sensors.h
@@ -32,6 +32,7 @@
 #include <sensors/LIS2MDL/LIS2MDL.h>
 #include <sensors/LPS22DF/LPS22DF.h>
 #include <sensors/LSM6DSRX/LSM6DSRX.h>
+#include <sensors/MAX31856/MAX31856.h>
 #include <sensors/SensorManager.h>
 #include <sensors/analog/TrafagPressureSensor.h>
 #include <utils/DependencyManager/DependencyManager.h>
@@ -64,6 +65,7 @@ public:
     Boardcore::PressureData getCCPressLastSample();
     Boardcore::TemperatureData getTankTempLastSample();
     Boardcore::VoltageData getBatteryVoltageLastSample();
+    Boardcore::TemperatureData getThermocoupleLastSample();
 
     std::vector<Boardcore::SensorInfo> getSensorInfos();
 
@@ -80,6 +82,7 @@ protected:
     std::unique_ptr<Boardcore::LSM6DSRX> lsm6dsrx1;
     std::unique_ptr<Boardcore::ADS131M08> ads131m08;
     std::unique_ptr<Boardcore::InternalADC> internalAdc;
+    std::unique_ptr<Boardcore::MAX31856> thermocouple;
 
     // Analog sensors
     std::unique_ptr<Boardcore::TrafagPressureSensor> oxTopTankPressure;
@@ -112,6 +115,9 @@ private:
     void internalAdcInit();
     void internalAdcCallback();
 
+    void thermocoupleInit();
+    void thermocoupleCallback();
+
     void oxTopTankPressureInit();
     void oxTopTankPressureCallback();