Mục lục:

Theo dõi và ghi lại nhiệt độ với Bluetooth LE và RaspberryPi: 9 bước (có hình ảnh)
Theo dõi và ghi lại nhiệt độ với Bluetooth LE và RaspberryPi: 9 bước (có hình ảnh)

Video: Theo dõi và ghi lại nhiệt độ với Bluetooth LE và RaspberryPi: 9 bước (có hình ảnh)

Video: Theo dõi và ghi lại nhiệt độ với Bluetooth LE và RaspberryPi: 9 bước (có hình ảnh)
Video: 5 Dự Án Nổi Bật với Raspberry Pi trong năm 2022 2024, Tháng bảy
Anonim
Theo dõi và ghi lại nhiệt độ với Bluetooth LE và RaspberryPi
Theo dõi và ghi lại nhiệt độ với Bluetooth LE và RaspberryPi
Theo dõi và ghi lại nhiệt độ với Bluetooth LE và RaspberryPi
Theo dõi và ghi lại nhiệt độ với Bluetooth LE và RaspberryPi

Tài liệu hướng dẫn này là về cách kết hợp một hệ thống theo dõi nhiệt độ nhiều nút với lỗi cảm biến Bluetooth LE từ Blue Radios (BLEHome) và RaspberryPi 3BT. Nhờ sự phát triển của tiêu chuẩn Bluetooth LE, hiện đã có sẵn các cảm biến không dây công suất thấp trên thị trường với chi phí rất thấp và có thể chạy trên một ô đồng xu trong nhiều tháng tại một thời điểm. Một trong những cảm biến mà tôi nhặt được là từ Blue Radio có tên là Sensor Bugs. Có giá khoảng 25 đô la trên Amazon, đây là một thiết bị Bluetooth LE với cảm biến Nhiệt độ, cảm biến ánh sáng và cảm biến đo độ ẩm, tất cả đều được xây dựng thành một thiết bị nhỏ có thể giao tiếp không dây..

Bước 1: Thiết lập Raspberry Pi

Bước đầu tiên là thiết lập Raspberry Pi đang hoạt động. Làm theo hướng dẫn từ trang web của Raspberry Pi, tải Raspbian vào thẻ SD, lắp vào Raspberry Pi và khởi động nó. múi giờ thành múi giờ hiện tại thay vì UTC. Bạn có thể thực hiện việc này thông qua lệnh: $ sudo dpkg-recfigure tzdata Kiểm tra lại hướng dẫn giả sử quá trình thiết lập được thực hiện thông qua giao diện dòng lệnh.

Bước 2: Thiết lập MySQL trên Raspberry Pi

Sẽ rất hữu ích nếu có một cơ sở dữ liệu được cài đặt cục bộ để lưu trữ tất cả các dữ liệu đã chụp. Cài đặt MySQL trên Raspberry Pi rất dễ dàng. Cũng không khó để sửa đổi script để kết nối với máy chủ SQL bên ngoài, bạn có thể bỏ qua bước này nếu muốn sử dụng máy chủ SQL trên mạng. Có rất nhiều hướng dẫn trên mạng, tôi đề xuất như sau: https:// www.stewright.me/2014/06/tutorial-install-…

Sau khi máy chủ SQL được cài đặt, bạn có thể sử dụng máy khách MySQL CLI để tạo người dùng, cơ sở dữ liệu và bảng. Để nhập MySQL CLI, hãy sử dụng lệnh:

$ sudo mysql -uroot-p Đầu tiên, tạo người dùng cục bộ để chèn dữ liệu đã chụp:> TẠO NGƯỜI DÙNG 'datasrc' @ 'localhost' ĐƯỢC XÁC ĐỊNH BẰNG 'datasrc000'; Tiếp theo, tạo cơ sở dữ liệu và bảng:> TẠO CƠ SỞ DỮ LIỆU Bộ cảm biến; Thiết lập người dùng quyền:> CẤP TẤT CẢ QUYỀN RIÊNG TƯ TRÊN SensorBug. * ĐẾN 'datasrc' @ 'localhost'; Bây giờ hãy thêm một bảng mới vào cơ sở dữ liệu. Đối với ví dụ này, tôi sẽ thêm một bảng với các cột sau: NGÀY, THỜI GIAN, ĐỊA CHỈ, VỊ TRÍ, NHIỆT ĐỘ và KHÁCH HÀNG

  • DATE / TIME - Đây là ngày và giờ dữ liệu được ghi lại
  • ĐỊA CHỈ - Đây là MAC của SensorBug mà tin nhắn được chụp từ
  • VỊ TRÍ - Một chuỗi con người có thể đọc được để chỉ ra vị trí đặt cảm biến
  • TEMPERATURE - Đây là nhiệt độ được ghi lại
  • ACCELE - Đây là giá trị của đầu ra gia tốc kế, hữu ích để ghi lại vị trí cảm biến (nếu được bật)

Lệnh thực hiện việc này là:> USE SensorBug; > TẠO dữ liệu BẢNG (ngày DATE, thời gian TIME, địa chỉ TINYTEXT, vị trí TINYTEXT, nhiệt độ FLOAT, tốc độ INT); Bây giờ cơ sở dữ liệu đã sẵn sàng, chúng ta có thể chuyển sang thiết lập sensorBugs.

Bước 3: Thiết lập SensorBugs

Các lỗi cảm biến là những thiết bị nhỏ khá gọn gàng. Thật không may, nhà sản xuất chỉ cung cấp ứng dụng IOS để lập trình nó. Không bao giờ ít hơn, bạn vẫn có thể làm việc với nó nếu bạn chỉ có thiết bị Android. Bước đầu tiên, hãy ghép nối thiết bị với điện thoại. Nếu không ghép nối thiết bị, SensorBug sẽ không quảng cáo dữ liệu. Tôi đã thử xem liệu tôi có thể thực hiện việc này trực tiếp với RaspberryPi hay không, rất tiếc, có vẻ như trình điều khiển Bluetooth LE trên RaspberryPi vẫn đang thử nghiệm và có lỗi để ngăn nó ghép nối với các thiết bị Bluetooth LE. Phiên bản trình điều khiển blueZ trong tương lai có thể khắc phục điều này, nhưng theo cách viết hiện tại, không có cách nào để ghép nối SensorBug với RaspberryPi. May mắn thay, chúng tôi không cần phải ghép nối thiết bị để thu thập dữ liệu được quảng cáo của nó. Thứ duy nhất chúng ta cần là một chiếc điện thoại để cấu hình SensorBug. Theo mặc định, SensorBug sẽ bắt đầu quảng cáo dữ liệu nhiệt độ ở khoảng thời gian 1 giây sau khi nó được ghép nối với một thiết bị. Để nắm bắt dữ liệu nhiệt độ, đó là tất cả những gì cần thiết. Nếu bạn định mở rộng để sử dụng vị trí hoặc cảm biến ánh sáng, thiết bị sẽ cần thiết hơn cấu hình. Đối với người mới bắt đầu, chúng tôi sẽ ghép nối thiết bị và ngắt kết nối. Điều này sẽ đủ tốt cho mục đích chụp nhiệt độ. Bắt đầu bằng cách nhấn cả hai nút trên SensorBug. Đèn LED màu xanh lam / xanh lục sẽ nhấp nháy cho biết nó đã được bật nguồn. Nhấn một trong các nút, đèn LED màu xanh lá cây sẽ sáng lên, cho biết nguồn đã được bật. Nếu đèn LED màu xanh lục không sáng, hãy nhấn cả hai nút để thử bật lại thiết bị. Nhấn và giữ một trong các nút cho đến khi đèn LED màu xanh lam bắt đầu nhấp nháy. Thao tác này sẽ đưa thiết bị vào chế độ ghép nối. Hãy vào menu cấu hình Bluetooth trên điện thoại và tìm thiết bị SensorBug. Sau khi nó hiển thị, hãy chọn nó để ghép nối với thiết bị. Vậy là xong, SensorBug đã được cấp nguồn và quảng cáo dữ liệu nhiệt độ

Bước 4: Cài đặt Bluetooth LE Python Wrapper

Tiếp theo, chúng ta cần cài đặt thư viện cho python để nói chuyện với ngăn xếp Bluetooth LE. Bạn có thể tìm thấy hướng dẫn tại đây: https://github.com/IanHarvey/bluepy Đối với Python 2.7, chỉ cần nhập các lệnh sau:

$ sudo apt-get install python-pip libglib2.0-dev $ sudo pip install bluepy

Bước 5: Quét và tìm ra địa chỉ của SensorBug

Để tìm ra địa chỉ MAC của SensorBug, hãy sử dụng lệnh này: $ sudo hcitool lescan Bạn sẽ thấy đầu ra như:

EC: FE: 7E: 10: B1: 92 (không xác định) Nếu xung quanh bạn có nhiều thiết bị bluetooth LE, có thể khó tìm ra thiết bị bạn đang nói chuyện với. Bạn có thể thử bluetoothctl để biết thêm chi tiết:

$ sudo bluetoothctl [bluetooth] # quét trên [MỚI] Thiết bị EC: FE: 7E: 10: B1: 92 Cảm biếnBug10B192 [CHG] Thiết bị EC: FE: 7E: 10: B1: 92 Nhà sản xuất Khóa dữ liệu: 0x0085 [CHG] Thiết bị EC: FE: 7E: 10: B1: 92 Nhà sản xuất Giá trị dữ liệu: 0x02 [CHG] Thiết bị EC: FE: 7E: 10: B1: 92 Nhà sản xuất Giá trị dữ liệu: 0x00 [CHG] Thiết bị EC: FE: 7E: 10: B1: 92 Nhà sản xuất Giá trị dữ liệu: 0x3c [CHG] Thiết bị EC: FE: 7E: 10: B1: 92 Nhà sản xuất Giá trị dữ liệu: 0x25 [CHG] Thiết bị EC: FE: 7E: 10: B1: 92 Nhà sản xuất Giá trị dữ liệu: 0x09 [CHG] Thiết bị EC: FE: 7E: 10: B1: 92 Nhà sản xuất Giá trị dữ liệu: 0x41 [CHG] Thiết bị EC: FE: 7E: 10: B1: 92 Nhà sản xuất Giá trị dữ liệu: 0x02 [CHG] Thiết bị EC: FE: 7E: 10: B1: 92 Nhà sản xuất Giá trị dữ liệu: 0x02 [CHG] Thiết bị EC: FE: 7E: 10: B1: 92 Nhà sản xuất Giá trị dữ liệu: 0x43 [CHG] Thiết bị EC: FE: 7E: 10: B1: 92 Nhà sản xuất Giá trị dữ liệu: 0x0b [CHG] Thiết bị EC: FE: 7E: 10: B1: 92 Nhà sản xuất Dữ liệu Giá trị: 0x01 [CHG] Thiết bị EC: FE: 7E: 10: B1: 92 Nhà sản xuất Giá trị dữ liệu: 0x6f

Ghi lại địa chỉ MAC, địa chỉ này sẽ cần được nhập vào tập lệnh python để lọc ra các thiết bị Bluetooth LE không mong muốn

Bước 6: Thêm tập lệnh Python

Một bản sao của tập lệnh Python có sẵn từ:

drive.google.com/open?id=10vOeEAbS7mi_eXn_…

Đây là cùng một tệp, hãy chú ý đến phần thụt lề khi sao chép:

Ngoài ra, hãy cập nhật địa chỉ MAC trong tệp python để khớp với địa chỉ cảm biến thu được từ kết quả quét.

# Chương trình này là phần mềm miễn phí: bạn có thể phân phối lại nó và / hoặc sửa đổi

# nó theo các điều khoản của Giấy phép Công cộng GNU như được xuất bản bởi

# Tổ chức Phần mềm Miễn phí, phiên bản 3 của Giấy phép, hoặc

# (theo tùy chọn của bạn) bất kỳ phiên bản nào mới hơn.

#

# Chương trình này được phân phối với hy vọng rằng nó sẽ hữu ích, # nhưng KHÔNG CÓ BẤT KỲ BẢO HÀNH NÀO; mà không có bảo hành ngụ ý

# KHẢ NĂNG HOẶC PHÙ HỢP VỚI MỤC ĐÍCH CỤ THỂ. Xem

# Giấy phép Công cộng GNU để biết thêm chi tiết.

#

# Bạn nên nhận được một bản sao của Giấy phép Công cộng GNU

# cùng với chương trình này. Nếu không, hãy xem.

# bscan.py - Máy quét và trích xuất dữ liệu bluetooth LE đơn giản

từ bluepy.btle import Scanner, DefaultDelegate

thời gian nhập khẩu

nhập pymysql

nhập cấu trúc

hostname = 'localhost'

tên người dùng = 'datasrc'

password = 'datasrc000'

database = 'SensorBug'

# Nhập địa chỉ MAC của cảm biến từ máy quét

SENSOR_ADDRESS = ["ec: fe: 7e: 10: b9: 92", "ec: fe: 7e: 10: b9: 93"]

SENSOR_LOCATION = ["Nhà để xe", "Ngoại thất"]

lớp DecodeErrorException (Ngoại lệ):

def _init _ (self, value):

self.value = giá trị

def _str _ (bản thân):

trả về repr (self.value)

lớp ScanDelegate (DefaultDelegate):

def _init _ (bản thân):

DefaultDelegate._ init _ (self)

def handleDiscovery (self, dev, isNewDev, isNewData):

nếu isNewDev:

print "Thiết bị đã phát hiện", dev.addr

elif isNewData:

print "Đã nhận dữ liệu mới từ", dev.addr

def doQueryInsert (conn, addr, loc, temp, accero):

Bảng #blesensor là ngày, giờ, addr, vị trí, tạm thời, accero

cur = conn.cursor ()

dostr = 'CHÈN VÀO GIÁ TRỊ dữ liệu (CURRENT_DATE (), NOW (),% s,% s,% s,% s);'

cur.execute (dostr, (addr, loc, temp, accero))

conn.commit ()

máy quét = Máy quét (). withDelegate (ScanDelegate ())

myConnection = pymysql.connect (máy chủ = tên máy chủ, người dùng = tên người dùng, passwd = mật khẩu, db = cơ sở dữ liệu)

ManuDataHex =

ReadLoop = True

cố gắng:

trong khi (ReadLoop):

thiết bị = scanner.scan (2.0)

ManuData = ""

dành cho nhà phát triển trong các thiết bị:

entry = 0

AcceroData = 0

AcceroType = 0

TempData = 0

cho saddr trong SENSOR_ADDRESS:

mục nhập + = 1

if (dev.addr == saddr):

in "Thiết bị% s (% s), RSSI =% d dB"% (dev.addr, dev.addrType, dev.rssi)

CurrentDevAddr = saddr

CurrentDevLoc = SENSOR_LOCATION [entry-1]

for (adtype, desc, value) trong dev.getScanData ():

in "% s =% s"% (desc, value)

if (desc == "Nhà sản xuất"):

ManuData = giá trị

if (ManuData == ""):

in "Không nhận được dữ liệu, kết thúc giải mã"

tiếp tục

#print ManuData

cho i, j trong zip (ManuData [:: 2], ManuData [1:: 2]):

ManuDataHex.append (int (i + j, 16))

# Bắt đầu giải mã dữ liệu thô của Nhà sản xuất

if ((ManuDataHex [0] == 0x85) và (ManuDataHex [1] == 0x00)):

print "Đã tìm thấy byte tiêu đề 0x0085"

khác:

in "Không tìm thấy byte tiêu đề 0x0085, dừng giải mã"

tiếp tục

#Skip Major / Minor

#Index 5 là 0x3c, cho biết mức pin và # cấu hình

if (ManuDataHex [4] == 0x3c):

BatteryLevel = ManuDataHex [5]

ConfigCounter = ManuDataHex [6]

idx = 7

#print "TotalLen:" + str (len (ManuDataHex))

while (idx <len (ManuDataHex)):

#print "Idx:" + str (idx)

#print "Dữ liệu:" + hex (ManuDataHex [idx])

if (ManuDataHex [idx] == 0x41):

# Dữ liệu đại kế

idx + = 1

AcceleroType = ManuDataHex [idx]

AcceleroData = ManuDataHex [idx + 1]

idx + = 2

elif (ManuDataHex [idx] == 0x43):

# Dữ liệu nhiệt độ

idx + = 1

TempData = ManuDataHex [idx]

TempData + = ManuDataHex [idx + 1] * 0x100

TempData = TempData * 0,0625

idx + = 2

khác:

idx + = 1

print "Địa chỉ thiết bị:" + CurrentDevAddr

print "Vị trí thiết bị:" + CurrentDevLoc

in "Mức pin:" + str (BatteryLevel) + "%"

print "Bộ đếm cấu hình:" + str (Bộ đếm cấu hình)

in "Accelero Data:" + hex (AcceleroType) + "" + hex (AcceleroData)

print "Temp Data:" + str (TempData)

doQueryInsert (myConnection, CurrentDevAddr, CurrentDevLoc, TempData, AcceleroData)

ReadLoop = Sai

ngoại trừ DecodeErrorException:

đi qua

Bước 7: Kiểm tra tập lệnh Python

Tập lệnh phải được chạy trong root, vì vậy:

$ sudo python bscan.pyThiết bị đã phát hiện ec: 6e: 7e: 10: b1: 92 Thiết bị ec: 6e: 7e: 10: b1: 92 (công khai), RSSI = -80 dB Cờ = 06 Dịch vụ 16b chưa hoàn chỉnh = 0a18 Nhà sản xuất = 850002003c25094102024309016f Đã tìm thấy byte tiêu đề 0x0085 Địa chỉ thiết bị: ec: 6e: 7e: 10: b1: 92 Vị trí thiết bị: Nhà để xe Mức pin: 37% Bộ đếm cấu hình: 9 Dữ liệu Accero: 0x2 0x2 Dữ liệu nhiệt độ: 16.5625

Bước 8: Thêm Python Scrip vào Crontab

Tập lệnh python phải được chạy trong root, vì vậy nếu bạn muốn thu thập dữ liệu tự động, nó sẽ cần phải được thêm vào crontab của root. Đối với ví dụ này, tôi chạy tập lệnh 20 phút một lần. Sử dụng lệnh:

$ sudo crontab -e

# Chỉnh sửa tệp này để giới thiệu các tác vụ sẽ được chạy bởi cron.

# # Mỗi tác vụ cần chạy phải được xác định thông qua một dòng duy nhất # cho biết các trường khác nhau khi nào tác vụ sẽ được chạy # và lệnh nào sẽ chạy cho tác vụ # # Để xác định thời gian, bạn có thể cung cấp các giá trị cụ thể cho # phút (m), giờ (h), ngày trong tháng (dom), tháng (thứ), # và ngày trong tuần (giảm) hoặc sử dụng '*' trong các trường này (đối với 'bất kỳ'). # # Lưu ý rằng các tác vụ sẽ được bắt đầu dựa trên khái niệm thời gian và múi giờ của hệ thống cron # daemon. # # Đầu ra của các công việc crontab (bao gồm cả lỗi) được gửi qua email # tới người dùng có tệp crontab thuộc về (trừ khi được chuyển hướng). # # Ví dụ: bạn có thể chạy bản sao lưu tất cả các tài khoản người dùng của mình # lúc 5 giờ sáng hàng tuần với: # 0 5 * * 1 tar -zcf /var/backups/home.tgz / home / # # Để biết thêm thông tin, hãy xem các trang thủ công của crontab (5) và cron (8) # # mh dom mon dow command 0 * * * * python /home/pi/bscan.py 20 * * * * python /home/pi/bscan.py 40 * * * * python /home/pi/bscan.py

Đó là nó. Tập lệnh python sẽ được chạy trong khoảng thời gian đều đặn và mã hóa lại đầu ra vào cơ sở dữ liệu SQL

Bước 9: Thêm: Định cấu hình Bộ cảm biến cho Đầu ra Cảm biến Vị trí

Thêm: Định cấu hình Bộ cảm biến cho Đầu ra Cảm biến Vị trí
Thêm: Định cấu hình Bộ cảm biến cho Đầu ra Cảm biến Vị trí
Thêm: Định cấu hình Bộ cảm biến cho Đầu ra Cảm biến Vị trí
Thêm: Định cấu hình Bộ cảm biến cho Đầu ra Cảm biến Vị trí

Có thể định cấu hình SensorBug trên Android cho đầu ra cảm biến vị trí Đối với cảm biến thay đổi vị trí, được gọi là cửa nhà để xe. Cảm biến, SensorBug sẽ phát hiện xem thiết bị đang đứng thẳng hay đặt xuống. Khi thiết bị bằng phẳng, giá trị được ghi là 0x20 trong khi nếu thiết bị đang đứng thẳng, giá trị là 0x02 Không phân biệt vị trí X hay Y ở trên, miễn là trục Z không lên hay xuống. Cách dễ nhất để làm điều này là sử dụng Ứng dụng LightBlue. SensorBug sẽ hiển thị trong menu quét. Chọn thiết bị bạn muốn định cấu hình, đi tới đặc điểm GATT cho cấu hình Gia tốc kế UUID: 9DC84838-7619-4F09-A1CE-DDCF63225B11

Xem hình ảnh: Viết một chuỗi cấu hình mới:

010d3f02020000002d00000002 Đọc lại chuỗi cấu hình để xác nhận việc ghi. Điều này cho phép gia tốc kế phát hiện vị trí.

Đề xuất: