How to add (and remove) Tmp102 sensor to Raspberry Pi 4
將TMP102温度感測器連接到Raspberry Pi (R-pi), 之後就可以利用R-pi來監測環境温度。只是簡單的把環境温度記錄到log檔, 或者儲存到雲端讓人們隨時可透過網路查詢; 或者加上觸發條件在温度高於或低於特定值時可進行通知的動作。這些都是可以做的。本文先嘗試踏出第一步, 將TMP102接上R-pi, 讓系統可以存取其感測到的温度值, 也讓我們可以寫Python程式來存取温度值。
Raspberry Pi temperature sensor using TMP102這篇貼文, 其實就在說明如何將TMP102連接到R-pi, 但因為Raspberry Pi出來很多年了, 出的板子種類也很多(2, 3, 4, Zero, Zero 2, etc), 同樣的在其上跑的OS也很多, 有官方的Raspberry Pi OS, Ubuntu, Freebsd, 等等。所以, 這文章以現在來說,有一些需要小修改的地方。
本文針對Raspberry Pi 4B, 使用官方Raspberry OS 64bit的環境,嘗試加入TMP102,基於以上所提文章做一些補充。
先進行以下設定:
1. Enable I2C
$ sudo raspi-config
選3 Interface Options
然後選I5 I2C, 接下來會問你要enable I2C嗎? 選是.
往下記得重開機!
2. 安裝以下套件:
$ sudo apt-get install lm-sensors (出現一些問題, 但不用管它!)
$ sudo apt-get install i2c-tools
==================
硬體接線
==================
TMP102模塊上的4支腳(VCC, SDA, SCL, GND), 分別接到Raspberry Pi GPIO的(1,3,5,9), 如上圖, 都在上面左方, 我打勾的4個腳位。記得接線前, 先把Raspberry Pi關機, 拔掉電源, 再接。
import time
import smbus
i2c_ch = 1
# TMP102 address on the I2C bus
i2c_address = 0x48
# Register addresses
reg_temp = 0x00
reg_config = 0x01
# Calculate the 2’s complement of a number
def twos_comp(val, bits):
if (val & (1 << (bits - 1))) != 0:
val = val - (1 << bits)
return val
# Read temperature registers and calculate Celsius
def read_temp():
# Read temperature registers
val = bus.read_i2c_block_data(i2c_address, reg_temp, 2)
temp_c = (val[0] << 4) | (val[1] >> 5)
# Convert to 2s complement (temperatures can be negative)
temp_c = twos_comp(temp_c, 12)
# Convert registers value to temperature (C)
temp_c = temp_c * 0.0625
return temp_c
# Initialize I2C (SMBus)
bus = smbus.SMBus(i2c_ch)
# Read the CONFIG register (2 bytes)
val = bus.read_i2c_block_data(i2c_address, reg_config, 2)
print("Old CONFIG:", val)
# Set to 4 Hz sampling (CR1, CR0 = 0b10)
val[1] = val[1] & 0b00111111
val[1] = val[1] | (0b10 << 6)
# Write 4 Hz sampling back to CONFIG
bus.write_i2c_block_data(i2c_address, reg_config, val)
# Read CONFIG to verify that we changed it
val = bus.read_i2c_block_data(i2c_address, reg_config, 2)
print("New CONFIG:", val)
# Print out temperature every second
while True:
temperature = read_temp()
print(round(temperature, 2), "C")
time.sleep(1)
留言