想象一下,你是一家智能農(nóng)業(yè)公司,使用物聯(lián)網(wǎng)傳感器幫助農(nóng)民優(yōu)化作物產(chǎn)量。你們出售各種傳感器,可以監(jiān)測農(nóng)田中的土壤濕度、溫度、濕度和光照水平。
為了幫助農(nóng)民充分利用他們的資源,你需要建立一個集中的系統(tǒng)。該系統(tǒng)收集來自所有田地的傳感器數(shù)據(jù),并提供對作物健康和生長的實時監(jiān)測。有了這些數(shù)據(jù),農(nóng)民可以在知情的情況下決定何時灌溉、施肥和收割作物。
使用Neo4j,一種圖形數(shù)據(jù)庫技術(shù),可以成為從收集的數(shù)據(jù)中釋放有價值監(jiān)測的關(guān)鍵。它還使智能農(nóng)業(yè)系統(tǒng)能夠充分發(fā)揮其潛力。
在這篇博客文章中,我們探討了如何使用Neo4j來構(gòu)建一個強大的智能農(nóng)業(yè)系統(tǒng)。我們首先討論什么是Neo4j,以及為什么它是存儲和查詢復(fù)雜、互連數(shù)據(jù)的理想選擇。然后,我們深入研究Neo4j在智能農(nóng)業(yè)中的具體用例,例如識別作物模式、預(yù)測作物產(chǎn)量和優(yōu)化資源利用。最后,我們將逐步介紹如何構(gòu)建基于Neo4j的智能農(nóng)業(yè)系統(tǒng),幫助農(nóng)民做出更好的決策,提高作物產(chǎn)量。
架構(gòu)
硬件組件
軟件組件
Jetson Nano開發(fā)套件SD卡固件:
https://developer.nvidia.com/embedded/l4t/r32_release_v7.1/jp_4.6.1_b110_sd_card/jeston_nano/jetson-nano-jp461-sd-card-image.zip
etcher:https://www.balena.io/etcher/
desktop Docker:
https://www.docker.com/products/docker-desktop/
Neo4j Aura數(shù)據(jù)庫實例:
https://neo4j.com/cloud/platform/aura-graph-database
步驟1:為操作系統(tǒng)安裝準備Jetson Nano SD卡映像
要將Jetson Nano SD卡映像閃存到SD卡,您可以按照以下步驟操作:
. 從NVIDIA(https://developer.nvidia.com/embedded/downloads)下載Jetson Nano SD卡映像。
. 將SD卡插入計算機的SD卡讀卡器。
. 從下載并安裝Etcher軟件https://www.balena.io/etcher/.
. 打開Etcher并選擇要閃存的Jetson Nano SD卡映像文件。
. 解壓縮從下載的SD卡映像https://developer.nvidia.com/embedded/downloads
. 選擇SD卡驅(qū)動器作為下載目標。
. 點擊“燒錄!”開始燒錄進程。
步驟2:連接傳感器
Seeed Studio的BME680傳感器是一款緊湊型環(huán)境傳感器,專為移動應(yīng)用和可穿戴設(shè)備設(shè)計。它可以高精度測量溫度、壓力、濕度和室內(nèi)空氣質(zhì)量,并且設(shè)計為功耗非常低。該傳感器與流行的微控制器平臺兼容,如樹莓派和Arduino,使其易于集成到項目中。
Grove Base Hat是一款40針Grove附加板,旨在與樹莓派板兼容。然而,通過將其連接到適當(dāng)?shù)腉PIO引腳,它也可以與NVIDIA Jetson Nano一起使用。它有15個Grove連接器,包括6個數(shù)字、4個模擬、3個I2C、1個UART和1個PWM。
該硬件模塊提供了一種將Grove傳感器和執(zhí)行器連接到Jetson Nano的簡單方便的方法。它支持各種Grove模塊,如溫度、濕度、光線和聲音傳感器,以及電機和顯示器等執(zhí)行器。
要將Grove Base Hat連接到Jetson Nano,您必須連接以下引腳:
. Jetson Nano上的VCC至3.3V引腳
. Jetson Nano上的GND到GND引腳
. SDA至Jetson Nano的引腳3(SDA1)
. SCL至Jetson Nano的引腳5(SCL1)
一旦您將Grove Base Hat連接到Jetson Nano,您就可以開始在Jetson Nano項目中使用Grove傳感器和執(zhí)行器。將傳感器連接到Grove后,建議使用i2cdetect命令運行I2C檢測,以驗證您是否看到設(shè)備:在我們的情況下,它顯示76。請注意,傳感器使用I2C或SPI通信協(xié)議與微控制器進行通信。
i2cdetect -r -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- 76 --
步驟3:編寫Python代碼以獲取傳感器值
以下是從BME680傳感器獲取傳感器值的Python腳本:
from bme680 import BME680
# Initialize BME680 sensor object
sensor = BME680()
# Check sensor is connected
if not sensor.begin():
print("Failed to initialize BME680 sensor.")
exit()
# Read and print sensor values
while True:
if sensor.get_sensor_data():
temperature = round(sensor.data.temperature, 2)
humidity = round(sensor.data.humidity, 2)
pressure = round(sensor.data.pressure, 2)
gas_resistance = round(sensor.data.gas_resistance, 2)
print("Temperature: {} C".format(temperature))
print("Humidity: {} %".format(humidity))
print("Pressure: {} hPa".format(pressure))
print("Gas Resistance: {} Ohms".format(gas_resistance))
else:
print("Error reading BME680 sensor data.")
time.sleep(1)
from bme680 import bme680語句導(dǎo)入bme680傳感器庫,該庫提供了從傳感器讀取環(huán)境數(shù)據(jù)的接口。傳感器變量初始化BME680傳感器對象。if not sensor.begin():語句檢查傳感器是否正確連接和初始化。如果初始化失敗,代碼將退出并打印一條錯誤消息。
代碼的主循環(huán)重復(fù)讀取BME680傳感器的傳感器數(shù)據(jù),并將值打印到控制臺。time.sleep(1)語句在循環(huán)的每次迭代之間暫停代碼執(zhí)行1秒。
此腳本使用BME680庫從連接到運行腳本的系統(tǒng)的BME680傳感器讀取溫度、濕度、壓力和氣體電阻值。結(jié)果以循環(huán)方式打印到控制臺,每次讀取之間有1秒的延遲。
假設(shè)BME680傳感器已連接并正常工作,則輸出如下所示:
溫度:26.68攝氏度
濕度:41.35%
壓力:1008.6 hPa
氣體電阻:3110.63歐姆
溫度、濕度和壓力值分別以攝氏度、百分比和百帕斯卡為單位,使用round()函數(shù)四舍五入到小數(shù)點后兩位。氣體電阻值以歐姆為單位,也可以四舍五入到小數(shù)點后兩位。
如果讀取BME680傳感器數(shù)據(jù)時出錯,腳本將在控制臺上打印消息“讀取BME680sensor data時出錯”
步驟4:編寫Python程序,將BME680傳感器值發(fā)送到Neo4j圖形數(shù)據(jù)庫
現(xiàn)在是時候編寫Python代碼,使用Neo4j驅(qū)動程序和BME680環(huán)境傳感器建立與Neo4j Graph數(shù)據(jù)庫的連接了。
from neo4j import GraphDatabase
from bme680 import BME680
import time
# Set up the Neo4j driver
uri = "neo4j+s://41275b2a.databases.neo4j.io"
driver = GraphDatabase.driver(uri, auth=("neo4j", "3DXXXXXXXXXXXXXXXaM"))
# Set up the BME680 sensor
sensor = BME680()
# Define a function to create a sensor reading node in Neo4j
def create_sensor_reading(tx, temperature, humidity, pressure, gas):
tx.run("CREATE (:SensorReading {temperature: $temperature, humidity: $humidity, pressure: $pressure, gas: $gas, timestamp: $timestamp})",
temperature=temperature, humidity=humidity, pressure=pressure, gas=gas, timestamp=int(time.time()))
# Generate and insert sensor readings into Neo4j every 5 seconds
while True:
if sensor.get_sensor_data():
temperature = round(sensor.data.temperature, 2)
humidity = round(sensor.data.humidity, 2)
pressure = round(sensor.data.pressure, 2)
gas = round(sensor.data.gas_resistance, 2)
with driver.session() as session:
session.write_transaction(create_sensor_reading, temperature, humidity, pressure, gas)
print(f"Inserted sensor reading - temperature: {temperature}, humidity: {humidity}, pressure: {pressure}, gas: {gas}")
else:
print("Error reading BME680 sensor data.")
time.sleep(5)
此Python代碼使用Neo4j驅(qū)動程序和BME680環(huán)境傳感器建立與Neo4j圖形數(shù)據(jù)庫的連接。然后,它定義了一個函數(shù),在圖形數(shù)據(jù)庫中創(chuàng)建一個傳感器讀取節(jié)點,其中包含當(dāng)前的溫度、濕度、壓力、氣體阻力和時間戳。代碼的主循環(huán)每5秒重復(fù)生成一次傳感器讀數(shù),并使用定義的函數(shù)將其插入圖形數(shù)據(jù)庫。
from neo4j import GraphDatabase語句導(dǎo)入neo4j驅(qū)動程序,該驅(qū)動程序允許Python代碼與neo4j數(shù)據(jù)庫交互。from bme680 import bme680語句導(dǎo)入bme680傳感器庫,該庫提供了從傳感器讀取環(huán)境數(shù)據(jù)的接口。
uri變量指定Neo4j數(shù)據(jù)庫的位置和訪問該數(shù)據(jù)庫的憑據(jù)。驅(qū)動程序變量使用指定的uri和憑據(jù)初始化Neo4j驅(qū)動程序。
傳感器變量初始化BME680傳感器對象。create_sensor_reading函數(shù)接收Neo4j事務(wù)對象(tx)和當(dāng)前傳感器讀數(shù)(溫度、濕度、壓力、氣體和時間戳)。然后使用給定的設(shè)備在圖形數(shù)據(jù)庫中創(chuàng)建一個新節(jié)點。
代碼的主循環(huán)重復(fù)讀取BME680傳感器的傳感器數(shù)據(jù),并使用Neo4j事務(wù)將讀數(shù)插入圖形數(shù)據(jù)庫。time.sleep(5)語句在循環(huán)的每次迭代之間暫停代碼的執(zhí)行5秒
步驟5:導(dǎo)入Neo4j Python模塊
gitclonehttps://github.com/collabnix/bme680-jetson-neo4j
cd bme680-jetson-neo4j
導(dǎo)入Neo4j Python模塊
您可以使用pip為Python安裝Neo4j驅(qū)動程序:
pip install neo4j
python3 sensorloader.py
結(jié)果
Inserted sensor reading - temperature: 26.68, humidity: 41.35, pressure: 1008.6, gas: 3110.63
Inserted sensor reading - temperature: 12.42, humidity: 49.71, pressure: 1149.34, gas: 4815.11
Inserted sensor reading - temperature: 27.73, humidity: 77.2, pressure: 1081.24, gas: 4737.95
Inserted sensor reading - temperature: 19.22, humidity: 50.17, pressure: 958.73, gas: 516.57
步驟6:設(shè)置Neo4j Docker擴展
Neo4j Aura是Neo4j提供的一種完全托管的云數(shù)據(jù)庫服務(wù)。它是一個數(shù)據(jù)庫即服務(wù)(DBaaS)產(chǎn)品,允許您在云中創(chuàng)建、部署和管理自己的圖形數(shù)據(jù)庫。這就不必擔(dān)心底層基礎(chǔ)設(shè)施和維護任務(wù)。假設(shè)您已經(jīng)安裝并配置了Neo4j Aura DB連接UI,下一步將安裝Neo4j Docker Desktop。
打開Docker Dashboard>Extensions>安裝Neo4j Docker Extension。
要允許Neo4 Docker Extension連接到遠程Neo4j Aura DB,您必須提供連接URL、身份驗證類型和憑據(jù)。一旦成功,您應(yīng)該能夠開始運行密碼查詢。
步驟7:測量氣體濃度
BME680傳感器測量幾種不同氣體的濃度,包括揮發(fā)性有機化合物(VOC)、一氧化碳(CO)和二氧化氮(NO2)。這是除了測量溫度、濕度和壓力之外的。要從傳感器中獲取這些氣體的濃度,可以使用BME680類的get_sensor_data()方法。這將返回一個包含最新傳感器讀數(shù)的BME680Data對象。然后,您可以使用以下屬性訪問BME680Data對象中的氣體濃度值:
. gas_reresistance:氣體傳感器的電阻,單位為歐姆,與空氣中揮發(fā)性有機物的濃度有關(guān)。
. gas(List):不同氣體的濃度,單位為百萬分之一(ppm),包括CO和NO2。
from neo4j import GraphDatabase
import time
import bme680
# Set up the Neo4j driver
uri = "neo4j+s://your-neo4j-instance-url-here"
driver = GraphDatabase.driver(uri, auth=("neo4j", "your-neo4j-instance-password-here"))
# Set up the BME680 sensor
sensor = bme680.BME680(bme680.I2C_ADDR_PRIMARY)
# Define a function to create a CO2 reading node in Neo4j
def create_co2_reading(tx, co2_concentration):
tx.run("CREATE (:CO2Reading {concentration: $concentration, timestamp: $timestamp})",
concentration=co2_concentration, timestamp=int(time.time()))
# Wait for the sensor to warm up
print("Warming up sensor...")
sensor.set_gas_status(bme680.ENABLE_GAS_MEAS)
time.sleep(300)
# Start retrieving CO2 concentration data and inserting it into Neo4j
print("Starting CO2 data collection...")
while True:
if sensor.get_sensor_data():
co2_concentration = round(sensor.data.gas_resistance / 10, 2)
with driver.session() as session:
session.write_transaction(create_co2_reading, co2_concentration)
print(f"Inserted CO2 reading - concentration: {co2_concentration}")
else:
print("Error retrieving sensor data")
time.sleep(60)
執(zhí)行腳本
python3 sensorloader_co2.py
結(jié)果
Warming up sensor... (takes 4-5 minutes)
Starting CO2 data collection...
Inserted CO2 reading - concentration: 1294686.
與典型的室內(nèi)二氧化碳水平相比,1294686.06ppm(百萬分之一)的二氧化碳濃度相當(dāng)高。在通風(fēng)良好的室內(nèi)環(huán)境中,二氧化碳濃度應(yīng)在400-1000ppm左右。二氧化碳含量超過1000ppm會導(dǎo)致嗜睡、頭痛和其他癥狀,而超過5000ppm會對健康造成嚴重影響,在極端情況下甚至死亡。
然而,對二氧化碳水平的解釋取決于測量的背景和環(huán)境。例如,在一些工業(yè)環(huán)境中,如啤酒廠或溫室,出于特定目的,CO2水平可能會故意升高。同樣重要的是要考慮可能影響室內(nèi)空氣質(zhì)量的其他因素,如濕度、通風(fēng)和其他污染物的存在。
步驟8:對BME680傳感器建模
以下是如何在Neo4j中對BME680傳感器及其讀數(shù)進行建模的示例。首先,您將創(chuàng)建一個“傳感器”節(jié)點來表示您的BME680傳感器。此節(jié)點可能具有“名稱”和“制造商”等屬性,以及您要存儲的有關(guān)傳感器的任何其他信息。
CREATE (:Sensor {name: 'BME680', manufacturer: 'Bosch'})
接下來,您將創(chuàng)建一個“時間戳”節(jié)點來表示讀取的特定時間點。此節(jié)點可能有一個“時間戳”屬性,用于存儲讀取的日期和時間。
CREATE (:Timestamp {timestamp: datetime()})
然后,您將在Sensor節(jié)點和Timestamp節(jié)點之間創(chuàng)建一個“READS”關(guān)系。“溫度”、“壓力”、“濕度”等財產(chǎn)表示當(dāng)時從傳感器讀取的值。例如,要創(chuàng)建溫度為25攝氏度、壓力為1000hPa、濕度為50%的讀數(shù),可以使用以下查詢:
MATCH (s:Sensor {name: 'BME680'}), (t:Timestamp)
CREATE (s)-[:READS {temperature: 37.0, pressure: 1168.83, humidity: 37.23}]->(t)
此查詢在傳感器節(jié)點和時間戳節(jié)點之間創(chuàng)建“READS”關(guān)系。溫度、壓力和濕度的財產(chǎn)分別設(shè)置為25、1000和50。然后,您可以使用Cypher查詢來:
. 從數(shù)據(jù)庫中檢索讀數(shù);
. 根據(jù)時間范圍或傳感器類型等標準對其進行篩選,以及
. 使用Neo4j Bloom等工具或其他可視化工具以各種方式可視化數(shù)據(jù)
步驟9:將其繪制到Grafana儀表板
Neo4j為Grafana提供了一個數(shù)據(jù)源插件,允許您直接在Grafana儀表板內(nèi)可視化和分析存儲在Neo4j圖形數(shù)據(jù)庫中的數(shù)據(jù)。要使用Neo4j數(shù)據(jù)源插件,您必須從Grafana插件庫安裝該插件。安裝插件后,您可以通過指定數(shù)據(jù)庫URL、用戶名和密碼將其配置為連接到Neo4j數(shù)據(jù)庫。一旦配置了數(shù)據(jù)源,就可以使用Neo4j查詢語言Cypher創(chuàng)建可視化。Cypher是一種功能強大的圖形查詢語言,允許您遍歷和操作存儲在Neo4j數(shù)據(jù)庫中的圖形數(shù)據(jù)。
您可以在幾秒鐘內(nèi)在Docker Desktop上打開Grafana來使用Grafana Docker擴展。訪問Grafana儀表板并使用默認的admin/admin作為用戶名/密碼登錄。
登錄后,單擊“設(shè)置”>“數(shù)據(jù)源”>“插件”,然后搜索Neo4j數(shù)據(jù)源
安裝Grafana數(shù)據(jù)源。
提供Neo4j Aura實例的連接URL、用戶名和密碼,然后連接。
Grafana使用Neo4j數(shù)據(jù)源插件的好處包括:
. 能夠在用戶友好的界面中可視化和分析復(fù)雜的圖形數(shù)據(jù)。
. 與Grafana中提供的各種其他數(shù)據(jù)源和插件集成。
. 具有動態(tài)、交互式可視化功能的可定制儀表板。
. 支持基于Neo4j數(shù)據(jù)庫事件的實時數(shù)據(jù)流和警報。
一旦連接到遠程Neo4j Aura數(shù)據(jù)庫,就應(yīng)該能夠?qū)鞲衅鲾?shù)據(jù)運行密碼查詢。
MATCH (sr:SensorReading)
WHERE sr.timestamp >= $timeFrom AND sr.timestamp <= $timeTo
RETURN sr.timestamp as time, sr.temperature as temp, sr.humidity as hum, sr.pressure as press, sr.gas as gas_res
ORDER BY sr.timestamp ASC
查詢使用MATCH子句指定節(jié)點標簽,并指定一個變量sr來表示具有該標簽的節(jié)點。WHERE子句使用變量$timeFrom和$timeTo指定一系列時間戳。RETURN子句指定每個傳感器讀數(shù)要返回的財產(chǎn)。ORDER BY子句按時間戳升序?qū)Y(jié)果進行排序。
最后,您應(yīng)該能夠創(chuàng)建所有四個儀表板——溫度、壓力、濕度和氣體阻力,如下所示:
結(jié)論
圖形數(shù)據(jù)庫能夠高效查詢復(fù)雜且相互關(guān)聯(lián)的數(shù)據(jù),使其成為數(shù)據(jù)往往相互關(guān)聯(lián)的環(huán)境監(jiān)測應(yīng)用程序的理想選擇。這與農(nóng)業(yè)尤其相關(guān),因為農(nóng)業(yè)需要這些數(shù)據(jù)來提高作物產(chǎn)量。
在這個博客中,我們討論了如何使用Python將BME680環(huán)境傳感器與Neo4j圖形數(shù)據(jù)庫接口。BME680傳感器能夠測量溫度、濕度、壓力和氣體阻力。這使其成為環(huán)境監(jiān)測應(yīng)用的理想傳感器,可以改善農(nóng)業(yè)行業(yè)的決策。
Ajeet S Raina是Docker的開發(fā)者倡導(dǎo)者,也是Arm開發(fā)者計劃的大使。
-
傳感器
+關(guān)注
關(guān)注
2553文章
51467瀏覽量
756961 -
物聯(lián)網(wǎng)
+關(guān)注
關(guān)注
2914文章
44978瀏覽量
377476 -
數(shù)據(jù)庫
+關(guān)注
關(guān)注
7文章
3852瀏覽量
64743
原文標題:將物聯(lián)網(wǎng)邊緣設(shè)備與云原生分析集成,以獲得更智能的監(jiān)測
文章出處:【微信號:Arm軟件開發(fā)者,微信公眾號:Arm軟件開發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
宇樹科技在物聯(lián)網(wǎng)方面
云原生AI服務(wù)怎么樣
物聯(lián)網(wǎng)就業(yè)有哪些高薪崗位?
云原生LLMOps平臺作用
如何選擇云原生機器學(xué)習(xí)平臺
什么是云原生MLOps平臺
如何使物聯(lián)網(wǎng)邊緣設(shè)備高效節(jié)能?
![如何使<b class='flag-5'>物</b><b class='flag-5'>聯(lián)網(wǎng)</b><b class='flag-5'>邊緣</b><b class='flag-5'>設(shè)備</b>高效節(jié)能?](https://file1.elecfans.com/web2/M00/08/A1/wKgaombyZp6AIZVrAAAx61n-1uY304.png)
云原生和非云原生哪個好?六大區(qū)別詳細對比
什么是物聯(lián)網(wǎng)技術(shù)?
京東云原生安全產(chǎn)品重磅發(fā)布
![京東<b class='flag-5'>云原生</b>安全產(chǎn)品重磅發(fā)布](https://file1.elecfans.com//web2/M00/FE/9F/wKgZomajC6SASmmzAATJlNh7RPo422.png)
從積木式到裝配式云原生安全
![從積木式到裝配式<b class='flag-5'>云原生</b>安全](https://file1.elecfans.com//web2/M00/FF/88/wKgaomajC32AVrYjAAC07TrSCCc818.png)
網(wǎng)關(guān)助力邊緣物聯(lián)網(wǎng)
![網(wǎng)關(guān)助力<b class='flag-5'>邊緣</b><b class='flag-5'>物</b><b class='flag-5'>聯(lián)網(wǎng)</b>](https://file1.elecfans.com/web2/M00/EF/CD/wKgZomZxI9SAL8vJAAk3r4vSGAw632.png)
評論