# MAX6675熱電偶晶片整合模組解析
[Datasheet](https://www.analog.com/media/en/technical-documentation/data-sheets/max6675.pdf)
### 運行原理(簡易說明,引用自*[這篇](https://blog.csdn.net/weixin_42580645/article/details/111056589)*)
* **溫度轉換:**
在將熱電電壓轉換為等效溫度值之前,必須補償熱電偶冷端(MAX6675環境溫度)與0°C虛擬基準之間的差異。對於K型熱電偶,電壓變化為41µV /°C,可通過以下線性方程式近似熱電偶特性,電壓變VOUT是熱電偶輸出電壓(µV)。TR是遠端熱電偶結的溫度(°C)。TAMB是環境溫度(°C)

* **冷端補償:**
檢測並校正環境溫度的變化用
* **數字化:**
ADC將冷端二極管的測量值與放大後的熱電偶電壓相加,並將12位結果讀出到SO引腳上。全零序列表示熱電偶讀數為0°C。全部為1的順序表示熱電偶讀數為+ 1023.75°C。
* **電源耦合雜訊:**
此晶片易受到電源耦合雜訊影響,應配置0.1pF電容可以最大限度減少雜訊影響(**模組已經整合進去)**

---
### **輸出腳位圖PINOUT**
 

CS腳位 : 高電位時開始採集,低電位時將轉換結果從SO輸出
SCK腳位 : CS為低電位時,提供CLK信號讀取SO處的結果
SO腳位 : 讀取及輸出熱電偶數據
---
### **Serial數據**

總計16bit資料
第2位元為熱電偶連接狀況0為正常,不正常反之為1
3到14位元,總計12位元為熱電偶資料,換算為十進制乘上0.25即為攝氏溫度
根據spec,採集週期應大於0.22秒且SPI端口速率要小於4.3MHz


---
### **程式實作Code**
程式設計如下,根據程式設計的資料量為:
正常運作時根據getsizeof()數值為xx.xx時佔用16個bytes
非正常運作時,會返回1的值,根據getsizeof()顯示占用14個bytes

max6675.py將需要功能寫成function
```
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
# 腳位設置
def set_pin (CS, SCK, SO, UNIT):
global sck
sck= SCK
global so
so = SO
global unit
unit = UNIT
GPIO.setup(CS, GPIO.OUT, initial = GPIO.HIGH)
GPIO.setup(SCK, GPIO.OUT, initial = GPIO.LOW)
GPIO.setup(SO, GPIO.IN)
# 讀取溫度(可調原始數據、攝氏、華氏)
def read_temp(cs_no):
GPIO.output(cs_no, GPIO.LOW)
time.sleep(0.002)
GPIO.output(cs_no, GPIO.HIGH)
time.sleep(0.22)
GPIO.output(cs_no, GPIO.LOW)
GPIO.output(sck, GPIO.HIGH)
time.sleep(0.001)
GPIO.output(sck, GPIO.LOW)
Value = 0
for i in range(11, -1, -1):
GPIO.output(sck, GPIO.HIGH)
Value = Value + (GPIO.input(so) * (2 ** i))
GPIO.output(sck, GPIO.LOW)
GPIO.output(sck, GPIO.HIGH)
error_tc = GPIO.input(so)
GPIO.output(sck, GPIO.LOW)
for i in range(2):
GPIO.output(sck, GPIO.HIGH)
time.sleep(0.001)
GPIO.output(sck, GPIO.LOW)
GPIO.output(cs_no, GPIO.HIGH)
if unit == 0:
temp = Value
if unit == 1:
temp = Value * 0.25
if unit == 2:
temp = Value * 0.25 * 9.0 / 5.0 + 32.0
if error_tc != 0:
return -cs_no
else:
return temp
GPIO.cleanup()
```
即可引入max6675.py使用
```
# before import the max6675, you must save the max6675.py file at "/usr/lib/python2.7/dist-packages"
# wiring
# Raspberry MAX6675
# GND ------ GND
# 5V ------ VCC
# pin 18 ------ SCK
# pin 22 ------ CS
# pin 16 ------ SO
# import max6675 module.
import max6675
# set the pin for communicate with MAX6675
cs = 24
sck = 23
so = 21
# max6675.set_pin(CS, SCK, SO, unit) [unit : 0 - raw, 1 - Celsius, 2 - Fahrenheit]
max6675.set_pin(cs, sck, so, 1)
try:
while 1:
# read temperature connected at CS 22
a = max6675.read_temp(cs)
# print temperature
print(a)
# when there are some errors with sensor, it return "-" sign and CS pin number
# in this case it returns "-22"
max6675.time.sleep(2)
except KeyboardInterrupt:
pass
```