上一篇透過樹莓派讀取 BMP180的溫度、大氣壓力及海拔高度等感測值:Raspberry Pi 筆記(77):溫度氣壓傳感器模組 BMP180 (GY68)。本篇延續前一篇的讀取感測值結果送到 Line Notify中,直接從 Line 中看到溫度氣壓等相關感測值。
[設定Line Notify]
(1) 先到 Line官方網站,申請一個 Line帳號。有了 Line帳號後,進入 Line Notify 頁面,輸入帳號密碼登入後,可以看到以下畫面:(2) 選擇 [個人頁面],按下[發行權杖]
(3) 輸入權杖名稱及選擇要通知的群組,按下發行
[材料]
- Raspberry Pi x 1
- BMP180 (GY68) x 1
- 連接線 x 4條
[接線圖]
Raspberry Pi 與BMP180接腳的對應關係:
Pi 接腳 | BMP180 |
---|---|
Pin 1(+3.3V) | VCC |
Pin 6(GND) | GND |
Pin 3 SDA GPIO2 | SDA |
Pin 5 SCL GPIO3 | SCL |
[程式]
# !/usr/bin/python # coding:utf-8 import smbus import time import requests from ctypes import c_short DEVICE = 0x77 # Default device I2C address #bus = smbus.SMBus(0) # Rev 1 Pi uses 0 bus = smbus.SMBus(1) # Rev 2 Pi uses 1 def convertToString(data): # Simple function to convert binary data into a string return str((data[1] + (256 * data[0])) / 1.2) def getShort(data, index): # return two bytes from data as a signed 16-bit value return c_short((data[index] << 8) + data[index + 1]).value def getUshort(data, index): # return two bytes from data as an unsigned 16-bit value return (data[index] << 8) + data[index + 1] def readBmp180Id(addr=DEVICE): # Register Address REG_ID = 0xD0 (chip_id, chip_version) = bus.read_i2c_block_data(addr, REG_ID, 2) return (chip_id, chip_version) def readBmp180(addr=DEVICE): # Register Addresses REG_CALIB = 0xAA REG_MEAS = 0xF4 REG_MSB = 0xF6 REG_LSB = 0xF7 # Control Register Address CRV_TEMP = 0x2E CRV_PRES = 0x34 # Oversample setting OVERSAMPLE = 3 # 0 - 3 # Read calibration data # Read calibration data from EEPROM cal = bus.read_i2c_block_data(addr, REG_CALIB, 22) # Convert byte data to word values AC1 = getShort(cal, 0) AC2 = getShort(cal, 2) AC3 = getShort(cal, 4) AC4 = getUshort(cal, 6) AC5 = getUshort(cal, 8) AC6 = getUshort(cal, 10) B1 = getShort(cal, 12) B2 = getShort(cal, 14) MB = getShort(cal, 16) MC = getShort(cal, 18) MD = getShort(cal, 20) # 讀取溫度 bus.write_byte_data(addr, REG_MEAS, CRV_TEMP) time.sleep(0.005) (msb, lsb) = bus.read_i2c_block_data(addr, REG_MSB, 2) UT = (msb << 8) + lsb # 讀取壓力 bus.write_byte_data(addr, REG_MEAS, CRV_PRES + (OVERSAMPLE << 6)) time.sleep(0.04) (msb, lsb, xsb) = bus.read_i2c_block_data(addr, REG_MSB, 3) UP = ((msb << 16) + (lsb << 8) + xsb) >> (8 - OVERSAMPLE) # Refine temperature X1 = ((UT - AC6) * AC5) >> 15 X2 = (MC << 11) / (X1 + MD) B5 = X1 + X2 temperature = (B5 + 8) >> 4 # Refine pressure B6 = B5 - 4000 B62 = B6 * B6 >> 12 X1 = (B2 * B62) >> 11 X2 = AC2 * B6 >> 11 X3 = X1 + X2 B3 = (((AC1 * 4 + X3) << OVERSAMPLE) + 2) >> 2 X1 = AC3 * B6 >> 13 X2 = (B1 * B62) >> 16 X3 = ((X1 + X2) + 2) >> 2 B4 = (AC4 * (X3 + 32768)) >> 15 B7 = (UP - B3) * (50000 >> OVERSAMPLE) P = (B7 * 2) / B4 X1 = (P >> 8) * (P >> 8) X1 = (X1 * 3038) >> 16 X2 = (-7357 * P) >> 16 pressure = P + ((X1 + X2 + 3791) >> 4) # 計算高度 altitude = 44330.0 * (1.0 - pow(pressure / 101325.0, (1.0/5.255))) return (temperature/10.0,pressure/ 100.0,round(altitude,2)) def lineNotifyMessage(token, msg): headers = { "Authorization": "Bearer " + token,"Content-Type" : "application/x-www-form-urlencoded" } payload = {'message': msg} r = requests.post("https://notify-api.line.me/api/notify", headers = headers, params = payload) return r.status_code def main(): (chip_id, chip_version) = readBmp180Id() print "Chip ID :", chip_id print "Version :", chip_version,"\n" (temperature,pressure,altitude)=readBmp180() print "溫度 :", temperature, "C" print "壓力 :", pressure, "mbar" print "高度 :", altitude, "m\n" # 傳送訊息字串 message = "\n溫度 : "+ str(temperature)+ " ℃\n壓力 : "+ str(pressure)+ " mbar\n高度 : "+str(altitude)+ " m" # 修改成你的Token字串 token = 'A5AAAaAaAaA2AAAA81a1AAAaAaaaaaaAAaaaAa9AaAA' lineNotifyMessage(token, message) # time.sleep(2) if __name__=="__main__": main() time.sleep(2)
張貼留言