Raspberry Pi 筆記(77):傳送BMP180溫度氣壓感器值到 Line Notify

上一篇透過樹莓派讀取 BMP180的溫度、大氣壓力及海拔高度等感測值:Raspberry Pi 筆記(77):溫度氣壓傳感器模組 BMP180 (GY68)。本篇延續前一篇的讀取感測值結果送到 Line Notify中,直接從 Line  中看到溫度氣壓等相關感測值。

[設定Line Notify]

(1) 先到 Line官方網站,申請一個 Line帳號。有了 Line帳號後,進入 Line Notify 頁面,輸入帳號密碼登入後,可以看到以下畫面:

(2) 選擇 [個人頁面],按下[發行權杖]

(3) 輸入權杖名稱及選擇要通知的群組,按下發行


(4) 出現已發行的權杖,需先複製下來存放在筆記本或其他地方,離開頁面後,無法再看到此權杖。

[材料]

  • 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 GPIO2SDA
Pin 5 SCL GPIO3SCL

[程式]

# !/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)

[執行結果]


[參考資料]

Post a Comment

較新的 較舊