資料介紹
描述
介紹
世界某些地區(qū)的學校資源非常有限,健康問題并未優(yōu)先考慮地方預算決定。
這些學校的孩子可能正在處理由病毒感染引發(fā)的發(fā)燒,并且在與其他孩子分享病毒后無法被識別。
該設備是一種廉價、移動、節(jié)能的方式,可以獲取兒童的生命體征并將重要信息傳輸到中央指揮部健康中心以采取進一步行動。
動機
從更國際化的角度來看,“無國界醫(yī)生”是緊急情況、流行病和自然災害的全球第一響應者。他們可以受益于可以鏈接到網絡的設備,該設備可以像 SigFox 這樣快速、輕松地部署。對流行病爆發(fā)的信息的快速共享可能是在當地遏制或更廣泛傳播疾病方面的區(qū)別。
我們希望該設備的簡單性能夠收集空間、時間和生命體征數據,以便在受影響的學校迅速部署醫(yī)療資源。
請注意,我們使用手指溫度來識別發(fā)燒的兒童。這可能很棘手,我們還沒有找到正確的參數來自信地觸發(fā)發(fā)燒警報。我們希望進一步的研究和與社區(qū)的互動可以使我們的設置更接近可靠的系統。
材料
以下是我們用于設備的材料的快照。考慮到我們使用 MikroE 板時沒有合適的接口平臺板。電路板的緊湊格式和 I2C 接口便于連接。
SIGFOX 網絡
對于無法建設大規(guī)模基礎設施的地區(qū),SigFox 網絡是明智的選擇。使用 SigFox Access Station Micro SMBS-T4 可以輕松實現網絡部署。
我們使用 PyCom LoPy 4 板與 SigFox 網絡連接。首先,我們必須按照此處的說明在網絡上注冊設備。
注冊后,您必須將第一個有效負載發(fā)送到網絡才能激活設備。在我們的案例中很困難,因為我們當地的城鎮(zhèn)沒有 SigFox 網關。必須開車 80 英里才能到達最近的網關服務區(qū)。
現在設備已被激活,您可以使用 SigFox 后端服務器訪問消息和設置。
為了通過 REST Api 訪問您的設備組,您需要設置適當的權限以允許訪問,您可以通過在后端服務器界面中選擇組來執(zhí)行此操作。
在左右菜單中選擇 API 訪問選項。
該頁面將更新并在右上角顯示一個新鏈接。點擊它。
Api 訪問創(chuàng)建表單將顯示您可以授予應用程序訪問權限的配置文件。我們允許通過 REST API 訪問設備和消息。
按確定后,表單將刷新并顯示訪問組設置。在里面,您將看到分配的登錄名和密碼,這與您的后端服務器不同。使用 SigFoxApi 函數時將需要這些憑據。
我們可以在 SigFox -- 訪問數據部分訪問我們的設備消息。
我們都準備好了,現在讓我們開發(fā)我們的設備和前端接入點。
設備
該設備將體溫讀取為心率,將數據保存在 SD 卡中,顯示數據并將信息發(fā)送到 SigFox 網絡,安裝在一個緊湊的移動外殼中。目前,我們使用來自 5 折扣店的 USB 充電電池為設備供電。
洛皮 4
Pycom LoPy 4是一款支持四重承載 MicroPython 的開發(fā)板,支持 SigFox 網絡。
使用 SigFox 網絡需要按照 SigFox 網絡部分中的說明注冊設備。激活后,您可以使用以下類創(chuàng)建通信套接字。
下面的類使用適當的區(qū)域和頻率初始化 SigFox 無線電,然后創(chuàng)建通信套接字,最后將傳輸方向設置為上行鏈路。該類包括用于發(fā)送數據和關閉通信套接字的函數。
from network import Sigfox
import socket
import pycom
import time
class mySigFox():
def __init__(self):
self.loadSocket = False
def loadSigFox(self):
try:
# init Sigfox for RCZ1 (Europe) RCZ2 (America, Mexico and Brazil)
self.sigfox = Sigfox(mode=Sigfox.SIGFOX, rcz=Sigfox.RCZ2)
# create a Sigfox socket
self.s = socket.socket(socket.AF_SIGFOX, socket.SOCK_RAW)
# make the socket blocking
self.s.setblocking(True)
# configure it as uplink only
self.s.setsockopt(socket.SOL_SIGFOX, socket.SO_RX, False)
self.loadSocket = True
except Exception as e:
print(e)
def sendMsg(self, data):
self.s.send(data)
def closeSigFox(self):
self.s.close()
self.loadSocket = False
The
SigFox 網絡每天允許 140 條 12 字節(jié)的消息。我們傳輸 GPS、患者人數、溫度、BPM、患者編號和消息塊代碼。數據被編碼在兩個連續(xù)的消息中,格式如下:
第 1 塊,PACKAGE_REPORT
緯度(浮點數:4 字節(jié)) 經度(浮點數:4 字節(jié)) 患者人數(短:2 字節(jié)) 塊碼(短:2 字節(jié))
塊 2,PACKAGE_PATIENT:
我們使用 Python 的 struct 庫將數據格式化為要發(fā)送的字節(jié)數組,如下面的代碼所示。
#Encode GPS and number of patients
ba = bytearray(struct.pack('f',float(0.0)) + struct.pack('f',float(0.0)) + struct.pack('h',patCounter) + struct.pack('h',PACKAGE_REPORT))
#Encode patient temperature and BPM
ba = bytearray(struct.pack("f", max.hr_avg)+struct.pack("f", float(txtTemp))+struct.pack("h", patCheck)+ struct.pack('h',PACKAGE_PATIENT))
There
根據 SigFox 的建議,發(fā)送消息之間有 30 秒的延遲。
PyTrack
PyTrack是Pycom多網絡模塊的擴展板,帶有 GPS、加速度計和 MicroSD 卡。
PyTrack 有一個 I2C 總線,可與支持的內部傳感器(GPS、加速度計、MicroSD)進行通信,還有一個使用引腳 9 和 10(P9、P10)在外部 IO 接頭中定義的 I2C 總線。下面的代碼將第二條 I2C 總線初始化為主機和 400k 的波特率(注意連接到此總線的傳感器支持此波特率速度)
#Initialize the I2C bus
i2c = I2C(2, I2C.MASTER, baudrate=400000,pins=('P9','P10'))
We
通過允許參數使用活動 I2C 總線對象初始化內部屬性,更新了連接到電路板的傳感器的類。此外,還具有掃描 I2C 端口并確認設備已找到并連接的功能。在下面的代碼中,它恰好是顯示器。
def __init__(self, i2c):
if (i2c != None):
self.temperature = 0.00
self.i2c = i2c
self.isConnected()
def isConnected(self):
if self.i2c != None:
print("Scanning...")
# Check I2C devices
devices = self.i2c.scan() # returns list of slave addresses
print(devices)
for d in devices:
print(d)
if d == SSD1306_I2C_ADDRESS:
print("found display")
return True
print("Not found")
return False
else:
# No check for SPI
return True
The
擴展板管理 MicroSD 設備。我們初始化SD對象,掛載它并打開日志文件,如下圖。
#Initialize the SD card and file
sd = SD()
os.mount(sd, '/sd')
f = open('/sd/gps-record.txt', 'a')
最后,擴展板控制 GPS 傳感器。我們初始化傳感器,查詢坐標,格式化并將它們寫入日志文件,如下面的代碼所示。
l76 = L76GNSS(timeout=30)
coord = l76.coordinates()
f.write("{} - {}\n".format(coord, rtc.now()))
顯示的一些代碼發(fā)生在程序的不同部分,我們只是聚集在一起以了解每個傳感器的過程。
溫度
我們使用來自 Adafruit 的 python 驅動程序,它支持 MAX30205 溫度傳感器,并更新為使用來自 Pycom 的 I2C 功能。
更改如下所示。
readRaw = self.i2c.readfrom_mem(MAX30205_ADDRESS,MAX30205_TEMPERATURE,2)
#I2CreadBytes(MAX30205_ADDRESS,MAX30205_TEMPERATURE, &readRaw[0] ,2); //read two bytes
#I2CwriteByte(MAX30205_ADDRESS, MAX30205_CONFIGURATION, reg | 0x80);
self.i2c.writeto_mem(MAX30205_ADDRESS, MAX30205_CONFIGURATION, bytearray([(reg | 0x80)]))
Adafruit 庫使用不同的函數來支持 I2C,我們更新調用以使用 Pycom I2C 實現,如上所示。該函數允許設置寄存器的基地址,然后從設備寄存器寫入或讀取偏移值。
然后我們使用下面的函數調用循環(huán)收集當前讀取的溫度。
txtTemp = temp.getTemperature()
心率
我們從https://github.com/zerynth/lib-maxim-max30101獲取 Python 庫并更新為使用 Pycom I2C。我們沒有更改對 I2C 庫上寫入和讀取函數的每次調用,而是重載這些函數并從內部調用活動的 I2C 庫。
def write_read(self, reg, nbytes):
self.i2c.writeto(MAX30101_I2CADDR, bytearray([reg]))
# data = self.i2c.readfrom_mem(MAX30101_I2CADDR, MAX30205_TEMPERATURE,1)
data = self.i2c.readfrom(MAX30101_I2CADDR, nbytes)
# write_read(MAX30101_REV_ID,1)
return data
def write_bytes(self, addr, reg):
self.i2c.writeto_mem(MAX30101_I2CADDR, addr, bytearray([reg]))
以下調用該函數來檢查脈搏信號并更新每分鐘節(jié)拍 (BPM) 值的類屬性。
detect_pulse(max)
展示
起始代碼取自 Adafruit python SSD1306,我們創(chuàng)建了一個類并更新了 128x64 像素案例的代碼。該類更新 I2C 調用以使用 Pycom 接口。我們還為原始驅動程序添加了大字體支持。
該類用作以下代碼。顯示數據的循環(huán)包括清除當前緩沖區(qū)、添加內容(addString、addString2),然后將緩沖區(qū)繪制到顯示器上。
lopyLCD.clearBuffer()
lopyLCD.addString(0, 0, "GPS:{} VisteliLabs".format(txtGPS))
lopyLCD.addString(0, 1, "P Check {} P Count {}".format(patCheck,patCounter))
if (tryHeartRate):
lopyLCD.addString2(0,2,"{:0.2f} C".format(txtTemp))
lopyLCD.addString2(0,5,"{:0.2f} BPM".format(max.hr_avg))
else:
lopyLCD.addString2(0,3,"{:0.2f} C".format(txtTemp)) #2
lopyLCD.addString(0, 7, "Package: {}".format(packageCounter))
lopyLCD.drawBuffer()
通過顯示來自心率傳感器的動畫圖標和其他信息,可以改進顯示格式。
外殼
附件取自 Thingiverse:Lopy 的簡單案例。從快照中可以看出,我們做了一些改動。外殼左上角的切口用于安裝顯示器,底座上的孔用于支撐 Pycom 板和 I2C 集線器。蓋子也被剪掉了,以便 MikroE 針穿過。使用高速鉆進行修改。
把它們放在一起。
現在有趣的部分開始了。下面的快照顯示了組裝 MoBitals 設備所采取的步驟。
步驟是
- 使用外部 IO 接頭(P9、P10、3V3 Pymodule、GND)將電纜連接到 PyTrack 板,以啟用 I2C 總線 2 服務。
- 將電路板和 I2C 集線器安裝到外殼中。
- 連接 LoPy 4 板。確保正確對齊電路板。
- 將溫度和心率 4 click 板連接到外殼蓋上。銷釘應該穿過切割。
- 將原理圖所示的相應電纜連接到點擊板上。
- 將 I2C Grove 電纜連接到集線器,
- 用蓋子關閉外殼。在這個原型上,我們使用橡皮筋固定。外殼不夠深,無法處理我們獲得的 I2C Grove 電纜。這可以通過使用較短的電纜來解決。
您的機箱應該看起來像下面的最后兩個快照。
一旦設備連接到電源(我們使用 USB 充電電池),心率傳感器中的 LED 燈就會將一根手指放在 LED 上方,另一根手指放在溫度傳感器上方(黑色小方塊)。
顯示屏將顯示以下格式:
顯示屏顯示
- 左上角第一行:GPS傳感器狀態(tài);如果傳感器鎖定在某個位置,它將顯示 OK,如果它沒有顯示 NG(不好)。
- 右上角第一行:商標 VisteliLabs :)
- 左上角第二行:檢查的患者人數(有無發(fā)熱的總和)。
- 右上角第二行:檢測到發(fā)燒或出現疾病跡象的患者人數。
- 中央第一行:當前讀取的攝氏溫度
- 中央第二行:當前每分鐘節(jié)拍讀數。
- 右下角:發(fā)送的包裹數量。此屏幕中的一個包意味著發(fā)送了兩個有效負載(報告和患者)
每次讀取心率傳感器時屏幕都會刷新。
一旦達到發(fā)燒條件(在我們的例子中為 29 攝氏度),就會開始向 SigFox 網絡傳輸有效載荷。傳輸由兩個包(每個 12 字節(jié))組成,它們之間有 30 秒的等待時間。第一個有效載荷包含 GPS 坐標和病人計數器;第二個有效載荷包含當前患者的體溫和心跳率。
該設備將繼續(xù)測量生命體征,直到手指從傳感器上移開;等待下一位患者的到來。
SigFoxApi——訪問數據
第一步是安裝 SigFox 庫以訪問 REST API 接口。使用以下命令
pip install sigfoxapi
您可以在此處找到文檔。
我們使用 sigfoxapi 與 REST API 服務器進行通信,使用 Tk API 作為用戶界面,使用 tkinterTable 顯示消息數據,使用 webbrowser 鏈接到用于 GPSlocation 的 Google 地圖服務。
import tkinter as tk
from tkinter.ttk import *
from sigfoxapi import Sigfox
from webbrowser import *
from tkintertable.Tables import TableCanvas
from tkintertable.TableModels import TableModel
然后我們使用在 SigFox 網絡部分獲得的登錄名和密碼連接到 SigFox 后端服務器。該函數返回一個用作連接器的對象。使用此對象,我們查詢后端以向組返回已注冊設備的列表。
#Connect to sigfox backend server
s = Sigfox('login', 'password')
#get a list of the available devices
listDevices = s.devicetype_list()
然后,我們使用列出的設備的 id 元素來獲取已注冊設備的設備唯一名稱。
devices = {}
devCounter =0
#Extract the device id
for dev in listDevices:
devices[devCounter] = s.device_list(dev['id'])
devCounter+=1
然后我們檢索第一個注冊設備收到的所有消息。我們的程序只支持兩個設備,因為這就是我們所有的項目預算。如有必要,該程序可以適應更多適配器。
#Get the messages from first device
mes=s.device_messages(devices[0][0]['id'])
data,data1 = createDataSigFox(mes)
The
以下代碼不是完整版本。為了顯示接收數據的解碼,它已被最小化。
此函數接收來自已注冊設備的消息并解碼有效負載。我們使用 struct 包來幫助解碼。接收到的數據為字符串格式,使用bytearray.fromhex函數轉換為字節(jié)數組。然后我們使用 LoPy 4 部分中解釋的數據格式。
# PACKAGE_REPORT = 1
# PACKAGE_PATIENT = 2
def createDataSigFox(sfData):
data = {}
data1 = {}
b = bytearray.fromhex(c['data'])
dataCode = struct.unpack_from('h', b[10:12], 0)
if (dataCode[0] != 0):
for key, value in c.items():
if (key == 'data'):
a = bytearray.fromhex(value)
if (dataCode[0] == 1):
data[rowName]['Latitude']=struct.unpack_from('f', a[0:4], 0)
data[rowName]['Longitude'] = struct.unpack_from('f', a[4:8], 0)
data[rowName]['NumPat'] = struct.unpack_from('h', a[8:10], 0)
elif (dataCode[0] == 2):
data1[rowName]['BPM'] = struct.unpack_from('f', a[0:4], 0)
data1[rowName]['Temperature'] = struct.unpack_from('f', a[4:8],0)
data1[rowName]['Patient'] = struct.unpack_from('h', a[8:10], 0)
The
收到的時間戳也具有挑戰(zhàn)性。時間戳作為包含在字符串中的長整數接收。我們將字符串值轉換為整數,并使用datetime.fromtimestamp函數來獲取時間戳對象。然后為了將值顯示為正常的日期/時間格式,我們使用 strftime 函數。
elif (key =='time'):
mydate = datetime.fromtimestamp(int(value))
if (dataCode[0] == 1):
data[rowName]['TImestamp'] = mydate.strftime("%Y-%m-%d %H:%M:%S")
elif (dataCode[0] == 2):
data1[rowName]['TImestamp'] = mydate.strftime("%Y-%m-%d %H:%M:%S")
最后,我們使用 tkinterTable 庫來顯示表格上的數據。
一個挑戰(zhàn)是添加一個鏈接以在地圖中顯示來自設備的 GPS 坐標。我們使用谷歌地圖來顯示位置。
以下代碼顯示了如何將按鈕附加到表格單元格以執(zhí)行 Web 鏈接并顯示地圖。
x1, y1, x2, y2 = table.getCellCoords(counter, 5)
btnText = "Btn{}".format(counter)
print(btnText)
linkGMaps[btnText] = tk.Button(table,,,cursor="hand2")
linkGMaps[btnText].pack()
print(linkGMaps)
linkText = "https://www.google.com/maps/?q="+mydata[c]['GPS']
print(linkText)
linkGMaps[btnText].bind("<Button-1>", lambda e,a=linkText: callback(a))
table.create_window(((x1 + x2) // 2, (y1 + y2) // 2), window=linkGMaps[btnText])
真正的時候到了,在執(zhí)行程序時,我們會為每個設備獲得一個帶有兩個數據表的單獨窗口。設備名稱顯示在窗口標題中。
第一個數據表顯示時間戳、GPS 坐標(請注意,出于隱私目的,我們已刪除坐標)、有效載荷時記錄的發(fā)燒患者數量、接收到的原始數據(有效載荷)和一個按鈕觸發(fā)網絡瀏覽器會話并在 Google 地圖上顯示位置。
第二個表顯示了時間戳、每分鐘的心跳次數、測量時記錄的溫度和患者人數,以及接收到的原始數據。
下面的快照顯示了 Google 地圖上位置 0.0、0.0(緯度、經度)的示例。
得到教訓。意識到!
雖然我們希望有一條清晰的發(fā)展道路,但我們沒有那么幸運。這是我們必須處理的幾件事。
在pymakr.conf上,我們有時在將腳本上傳到 LoPy 4 板時遇到超時錯誤。我們發(fā)現將 safe_boot_on_upload 設置更改為 true。
{
"address": "COM26",
"username": "",
"password": "",
"sync_folder": "",
"open_on_start": true,
"safe_boot_on_upload": true,
"py_ignore": [],
"fast_upload": false
}
我們最初的設計包括 LED 燈和可愛的熊爪,以吸引孩子們的注意力,同時檢查他們的生命體征。但是,LED 所需功率的增加會在 LoPy 設備上產生反饋,從而觸發(fā) I2C 總線嚴重錯誤。我們發(fā)現不僅是功耗,而且我們使用 RMT 庫來控制 LED 的脈沖會干擾 I2C 時序,或者至少我們是這么認為的。
最后,點擊板需要特殊的連接才能正常工作。Fever click 要求接地引腳連接到與 I2C 連接相同的原始引腳上。而且,Heart Rate 4 Click 板需要連接 5 V 和 3V3 電源引腳,否則 LED 將不亮,這就是我們使用 I2C 電源連接器添加滿足額外需求的原因。
未來的工作
添加壓力按鈕以允許進行個人設置、實時溫度閾值和 BPM 刷新率。
通過這個項目,我們學到了很多東西。從需要像無國界醫(yī)生這樣的第一響應者到將 MikroE 板連接到不合規(guī)板的復雜性。
我們希望這個項目可以激發(fā)更多應急人員和當地學校可以用來幫助兒童的設備。
謝謝閱讀。
- GSM移動電話應用控制環(huán)路設計白皮書
- 詳解分析手機SIM卡的安全缺陷 8次下載
- 如何使用OpenBTS項目自行搭建移動電話網絡
- 移動電話的電磁輻射簡介和應該如何進行資料防護措施
- 淺談Linux操作系統在移動電話上的應用 0次下載
- 能源收集推動偏遠地區(qū)的移動電話技術 7次下載
- 移動電話電磁輻射性能要求與測試方法 0次下載
- 廣東省移動電話機維修員中級技能考核復習題 0次下載
- 移動電話機維修員高級技能考核復習題 1次下載
- 基于MEMS的運動傳感器在移動電話中的應用 33次下載
- MEMS運動傳感器在移動電話中的應用 76次下載
- 德州儀器(TI)推出針對移動電話的新型OMAP 3架構 78次下載
- HG-V720彩屏GSM/GPRS數字移動電話使用手冊
- 電源提升電路為移動電話手機供電
- 移動電話便攜通話裝置的按鍵掃描設計
- 電子芯片膠在移動通訊領域的應用有哪些? 285次閱讀
- 移動SoC的時鐘驗證 631次閱讀
- SIM卡在GSM系統中的應用 3096次閱讀
- 新唐科技ISD4002芯片簡介 2355次閱讀
- 淺析手機移動通信的無線技術 1442次閱讀
- 計算機視覺開源庫集錦 5084次閱讀
- SIM卡GPRS模塊知識詳解 淺談SIM卡GPRS之原理模塊 4w次閱讀
- 傳感器讓手機更加方便的使用 723次閱讀
- 如何設置手機SIM卡PIN密碼 7.7w次閱讀
- 移動通信領域的內置天線設計技術介紹 2218次閱讀
- 電磁輻射強度與天線架設方式關系解析 1748次閱讀
- 通信測試中的功率放大器的基本概念分析 1.8w次閱讀
- 一文看懂5G移動通信的趨勢 1656次閱讀
- 采用C8051F330移動電話防盜報警系統電路設計 5371次閱讀
- 基于內置天線實現手機FM無線電接收 6693次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數據手冊
- 1.06 MB | 532次下載 | 免費
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費
- 5元宇宙深度解析—未來的未來-風口還是泡沫
- 6.40 MB | 227次下載 | 免費
- 6迪文DGUS開發(fā)指南
- 31.67 MB | 194次下載 | 免費
- 7元宇宙底層硬件系列報告
- 13.42 MB | 182次下載 | 免費
- 8FP5207XR-G1中文應用手冊
- 1.09 MB | 178次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33566次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21549次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537798次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191187次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183279次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論
查看更多