資料介紹
描述
像越來越多的人一樣,我在 COVID-19 封鎖期間迷上了我的植物。不幸的是,額外的愛和感情似乎阻礙了我最喜歡的植物之一在今年春天長出任何新葉子。現(xiàn)在一個普通人可能會給植物澆水,把它放在陽光下,然后等待——但在制造商社區(qū),我們喜歡數(shù)據(jù)和過度設計的解決方案。所以,我從舊硬件盒中取出一些傳感器,開始制作植物監(jiān)視器!
最初,這將是一個閉環(huán)、離線解決方案,當土壤濕度低于某個待確定值時給植物澆水——最終更多地成為一種數(shù)據(jù)收集工具,用于查看本地網(wǎng)絡上的傳感器數(shù)據(jù)。我以前從未使用過任何與網(wǎng)絡相關的東西,所以這是一個將簡單的想法從傳感器帶到前端的好機會。
該項目包含三個主要部分——Arduino、中間件和前端。確切的代碼和文件結(jié)構在鏈接的 GitHub 存儲庫中,但我將嘗試概述下面的代碼庫。
阿杜諾
Arduino 部分是我最熟悉的部分,因此啟動并運行它大約需要 15 分鐘。連接示意圖如下所示。
您的溫度傳感器可能有四個引腳而不是三個引腳,仍然只有三個活動連接,但請查看特定傳感器的文檔。
DHT11 需要 Arduino 提供的 GND 和 VCC,以及 Arduino 讀取的數(shù)據(jù)信號。土壤濕度傳感器有點棘手,它需要與 DHT11(GND、VCC、信號)相同的連接,但由于傳感器有效地設置了電解,它的使用壽命很短。如果你讓它不斷地關閉直流電壓,其中一條腿(陽極)會迅速氧化,傳感器將開始給你提供虛假讀數(shù)。
因此,建議在讀數(shù)時只為濕度傳感器供電。這很容易通過將 VCC 信號連接到 Arduino 的數(shù)字輸出引腳之一,并在您期望讀取之前發(fā)送一個“HIGH”脈沖來實現(xiàn)。在我的情況下,它是從引腳 8 供電的。
獲取傳感器讀數(shù)的軟件如下。確保你有我安裝的 DHT11 傳感器庫(注意我沒有使用 Adafruit 電路游樂場庫,使用的庫更輕量級。)
#include
const int DHT_pin = A0;
const int soil_moisture_pin = A1;
const int soil_moisture_trigger = 8;
int soil_moisture = 0;
unsigned long ms_per_s = 1000L;
unsigned long minutes = 60;
unsigned long sampling_time = minutes * ms_per_s * 60;
int dht_sig = 0;
int soil_moisture_sig = 0;
dht DHT;
void setup() {
pinMode(soil_moisture_pin,INPUT);
pinMode(soil_moisture_trigger,OUTPUT);
Serial.begin(9600);
}
void loop() {
dht_sig = DHT.read11(DHT_pin);
digitalWrite(soil_moisture_trigger,HIGH);
delay(10);
soil_moisture_sig = analogRead(soil_moisture_pin);
digitalWrite(soil_moisture_trigger,LOW);
soil_moisture = map(soil_moisture_sig,168,0,0,100);
Serial.print(DHT.temperature);
Serial.print(DHT.humidity);
Serial.print(soil_moisture);
delay(sampling_time);
}
中間件
實際上,您可以通過在控制回路旁邊添加一個水泵來自動為您的植物澆水,從而將項目留在這里,但讓我們繼續(xù)。
現(xiàn)在 Arduino 部分運行良好,我們需要在 Raspberry Pi 上設置代碼以獲取此信息。Pis 唯一真正的工作是從 Arduino 獲取數(shù)據(jù)并將其推送到將在下一部分中制作的服務器上。如果你想降低項目的成本,你可以簡單地使用一個兼容 wifi 的微控制器——老實說,使用整個 Raspberry Pi 3b+ 來完成這個任務是多余的。
無論如何,我們將使用 PySerial 從 Arduino 獲取數(shù)據(jù)。請注意,Arduino 端的串行打印是通過串行通信發(fā)送數(shù)據(jù)。因此,我們在 Arduino 代碼中打印到串行控制臺的任何內(nèi)容都可以被 PySerial 讀取。確保您的 Arduino 已插入 Pi 的 USB 端口之一。
首先要做的是創(chuàng)建一個main.py 文件并通過執(zhí)行獲取 PySerial
sudo pip install pyserial
在 Pi 的終端中。讓我們開始編碼。
打開main.py 并導入 pyserial - 注意模塊名稱只是“serial”。
import serial
我們現(xiàn)在可以使用以下行設置串行對象:
ser = serial.Serial("/dev/ttyACM0",9600)
第一個參數(shù)是 COM 端口,這對您來說可能有所不同。9600 是波特率,也是在 Arduino 端設置的。
PySerial 是 Python 中任何與串行相關的功能強大的包 - 但我們只會使用 read 函數(shù)。我們將在從 Arduino 到 Raspberry pi 的每個數(shù)據(jù)包中發(fā)送三個數(shù)據(jù)值——溫度是前 5 個字節(jié),濕度是接下來的 5 個字節(jié),土壤濕度是最后兩個字節(jié)。這可以使用
ser.read()
功能。我們還需要解碼傳入的字節(jié),因此您的代碼如下所示:
import serial
ser = serial.Serial("/dev/ttyACM0",9600)
temperature_r = ser.read(5).decode('utf-8')
humidity_r = ser.read(5).decode('utf-8')
soil_m_r = ser.read(2).decode('utf-8')
關于 ser.read() 有幾點需要注意。首先,它是阻塞的,這意味著在讀取某些內(nèi)容之前不會執(zhí)行其他代碼。在等待來自 Arudino 的數(shù)據(jù)時,我們將利用這一優(yōu)勢,但是,如果軟件沒有按預期運行,這是一件好事。
現(xiàn)在我們已經(jīng)從傳感器獲取到 Raspberry Pi 的數(shù)據(jù),是時候?qū)⑵浞诺骄W(wǎng)絡上了。
燒瓶
Flask 是一個用于 Python 的 microweb 框架,可用于制作服務器。不建議將 Flask 用作生產(chǎn)服務器 - 它也在他們的官方文檔中說明了這一點,所以如果你打算將基于它的項目商業(yè)化,請三思。
要設置服務器,我們需要制作一個燒瓶應用程序。首先,我們需要進行一些導入并初始化一個 Flask 對象:
from flask import Flask, jsonify,render_template,request
app = Flask(__name__)
if __name__ == '__main__':
app.run()
現(xiàn)在該應用程序已準備好讓我們向其中添加一些路線。讓我們從加載頁面開始。
from flask import Flask, jsonify,render_template,request
app = Flask(__name__)
@app.route("/")
def index():
return render_template('index.html')
if __name__ == '__main__':
app.run()
在這種情況下,index.html是要加載的 HTML 頁面。此功能將由 Javascript 驅(qū)動。
您可以提供app.run()
一些參數(shù),在我的例子中,我指定了要在 Raspberry Pi 的 IP 上運行的主機和端口。
app.run(host = '0.0.0.0', port = 5000)
?
把這一切放在一起
我們運行系統(tǒng)的三個部分:Arduino,它是數(shù)據(jù)收集單元,Pyserial,它抓取 Arduino 數(shù)據(jù),以及將數(shù)據(jù)推送到本地網(wǎng)絡的燒瓶服務器。
在開始集成之前,讓我先回顧一下代碼流程。Arduino 將全天收集數(shù)據(jù),當有人登錄本地網(wǎng)絡時,所有這些數(shù)據(jù)都會被繪制出來。為此,我們需要長時間存儲數(shù)據(jù),直到請求處于活動狀態(tài)。我們可以使用線程來做到這一點。在這個線程中,我們要做的就是在一個while循環(huán)中收集數(shù)據(jù)。由于讀取功能被阻塞,循環(huán)將被卡住,直到 Arduino 首先發(fā)送任何數(shù)據(jù)。線程將在單獨的函數(shù)中定義,并通過隊列將數(shù)據(jù)發(fā)送到燒瓶應用程序。代碼現(xiàn)在看起來像這樣:
from flask import Flask, jsonify,render_template,request
import threading, queue
import serial
from datetime import datetime
ser = serial.Serial("/dev/ttyACM0",9600)
app = Flask(__name__)
q = queue.Queue()
temperature = []
humidity = []
soil_moisture = []
time_ax = []
def data_collection():
while(1):
#set variables
i = 0
#read is blocking so waits till next packet of data is sent
temperature_r = ser.read(5).decode('utf-8')
humidity_r = ser.read(5).decode('utf-8')
soil_m_r = ser.read(2).decode('utf-8')
time_of_reading = datetime.now() #this will be the x axis
#put data in queue
q.put(temperature_r)
q.put(humidity_r)
q.put(soil_m_r)
q.put(time_of_reading.strftime("%H:%M"))
@app.route("/")
def index():
return render_template('index.html')
if __name__ == '__main__':
x = threading.Thread(target=data_collection)
x.start()
app.run(host = '0.0.0.0', port = 5000)
現(xiàn)在我們終于可以定義第二條路由,它將從數(shù)據(jù)收集線程中獲取數(shù)據(jù),并將其發(fā)送到前端。Queue 模塊中的 get 和 put 方法也是阻塞的——所以如果事情不正常,請務必查看文檔。
from flask import Flask, jsonify,render_template,request
import threading, queue
import serial
from datetime import datetime
ser = serial.Serial("/dev/ttyACM0",9600)
app = Flask(__name__)
q = queue.Queue()
temperature = []
humidity = []
soil_moisture = []
time_ax = []
def data_collection():
while(1):
#set variables
i = 0
#read is blocking so waits till next packet of data is sent
temperature_r = ser.read(5).decode('utf-8')
humidity_r = ser.read(5).decode('utf-8')
soil_m_r = ser.read(2).decode('utf-8')
time_of_reading = datetime.now() #this will be the x axis
#put data in queue
q.put(temperature_r)
q.put(humidity_r)
q.put(soil_m_r)
q.put(time_of_reading.strftime("%H:%M"))
@app.route("/update", methods = ['GET'])
def update_chart():
while not q.empty():
temperature.append(q.get())
humidity.append(q.get())
soil_moisture.append(q.get())
time_ax.append(q.get())
return jsonify(results = [temperature,humidity,soil_moisture,time_ax])
@app.route("/")
def index():
return render_template('index.html')
if __name__ == '__main__':
x = threading.Thread(target=data_collection)
x.start()
app.run(host = '0.0.0.0', port = 5000)
這就是 Python 方面的內(nèi)容。
Javascript
所有后端都準備好了 - 我們可以使用 chartjs 使用 Javascript 繪制數(shù)據(jù)。首先設置chartjs環(huán)境。我使用了以下代碼行:
var ctx = $("#temperature_chart");
console.log("test");
var temperature_chart = new Chart(ctx, {
type: 'line',
data: {
labels: [],
datasets : [
{
label: 'temperature',
data: [temperature],
borderColor: [
'#060666',
],
borderWidth: 3,
fill: false,
yAxisID: "temperature"
},
{
label: 'Humidity',
data: [humidity],
borderColor: [
'#d6c73e'
],
fill: false,
yAxisID: "humidity"
},
{
label: 'Soil Moisture',
data: [soil_moisture],
borderColor: [
'#7fced4'
],
fill: false,
yAxisID: "humidity"
}
]
},
options: {
responsive: false,
scales:{
xAxes: [ {
//type: 'time',
display: true,
scaleLabel : {
display: true,
labelString: 'Time (s)'
},
ticks: {
autoSkip: true,
maxTicksLimit: 12
}
}],
yAxes: [ {
id: "temperature",
display: true,
position: 'left',
ticks: {
suggestedMin: 15,
suggestedMax: 30
},
scaleLabel : {
display: true,
labelString: 'Temperature (C)'
}
},
{
id: "humidity",
display: true,
position: 'right',
ticks: {
suggestedMin: 0,
suggestedMax: 100
},
scaleLabel : {
display: true,
labelString: 'Percentage Humidity'
}
}]
}
}
});
最后,為了從 Flask 后端獲取數(shù)據(jù),我們使用以下代碼行:
var x = 0;
var temperature = 0;
var humidity = 0;
var soil_moisture = 0;
var updated_data = $.get('/update');
updated_data.done(function(results){
temperature = results.results[0];
humidity = results.results[1];
soil_moisture = results.results[2];
x = results.results[3];
console.log(temperature);
console.log(humidity);
console.log(soil_moisture);
temperature_chart.data.datasets[0].data = temperature;
temperature_chart.data.datasets[1].data = humidity;
temperature_chart.data.datasets[2].data = soil_moisture;
temperature_chart.data.labels = x;
temperature_chart.update();
});
當有人進入網(wǎng)頁時,這會調(diào)用 Python 腳本中指定的更新路由。
結(jié)果
結(jié)果
如您所見,最終結(jié)果是帶有兩個 y 軸的時間戳圖。該項目總體運行良好,在更多的日子里,我能夠看到溫度和濕度的明顯周期性,以及土壤濕度的線性下降趨勢,正如預期的那樣!這些數(shù)據(jù)是完全原始的,有幾種方法可以使這個項目變得更好
可能的后續(xù)步驟
此項目中的傳感器可以更換為與 Arduino 或 Raspberry Pi 兼容的任何其他傳感器。最終,您可能想要進行一些實際處理而不是繪制原始數(shù)據(jù) - 因此,將所有數(shù)據(jù)不斷發(fā)送到 csv 可能更容易,而不是將其放入隊列中以進行檢索。這意味著在您的 wifi 中斷或系統(tǒng)停止響應的情況下,您可以使用數(shù)據(jù)。
您還可以連接水泵或其他一些可以從本地網(wǎng)絡控制的執(zhí)行器 - 如果在前端按下按鈕,只需添加另一條路線。
Chartjs 并不是真正用于實時繪圖,但您可以通過另一條輪詢數(shù)據(jù)的路由輕松地使其每隔幾秒更新一次。然后,您可以在 javascript 中檢索此數(shù)據(jù)并在 setInterval() 函數(shù)中更新圖表。
如果您有任何問題,請隨時與我們聯(lián)系。我將盡我所能回答!
- Pi Skype監(jiān)視器開源分享
- 無線串口監(jiān)視器開源分享
- 車庫門監(jiān)視器開源分享
- 蜂窩連接的蜂巢監(jiān)視器開源分享
- 樹莓派監(jiān)視器開源項目
- 管道監(jiān)視器開源設計
- CPU和RAM使用監(jiān)視器開源分享
- 城市花園監(jiān)視器開源分享
- 小馬駒監(jiān)視器開源分享
- 健康監(jiān)視器開源分享
- OctoPrint打印監(jiān)視器開源分享
- 電源監(jiān)視器開源項目
- 4至14芯電池組監(jiān)視器的模擬前端芯片OZ9355 63次下載
- MAX971 IR傳感器_監(jiān)視器喚醒主系統(tǒng) 0次下載
- IR傳感器/監(jiān)視器喚醒主系統(tǒng)
- 典型電池監(jiān)視器電路圖分享 604次閱讀
- 簡單的電池監(jiān)視器電路圖 557次閱讀
- 如何創(chuàng)建自定義監(jiān)視器? 516次閱讀
- 光纖應用中的監(jiān)視器校準 880次閱讀
- 如何最大限度地延長無線傳感器的運行時間 1077次閱讀
- 如何通過Raspberry Pi設置CE電流監(jiān)視器 2120次閱讀
- Cypress懷孕監(jiān)視器CY8C38系列的性能特性及應用方案 2354次閱讀
- KUKA C4如何使用診斷監(jiān)視器? 3595次閱讀
- 具監(jiān)視器的800mA單電阻器堅固型線性穩(wěn)壓器LT3089 1123次閱讀
- 揭秘液晶顯示器和液晶監(jiān)視器的七大不同點 2091次閱讀
- 鋰離子電池和穩(wěn)壓器監(jiān)視器電路圖 1767次閱讀
- 基于LTC2991系統(tǒng)監(jiān)視器的相對濕度測量 1934次閱讀
- 液晶監(jiān)視器的選購與保養(yǎng) 1022次閱讀
- 120Hz+全高清LCD監(jiān)視器新技術應用解析 1335次閱讀
- 光隔離溫度傳感器監(jiān)視電路圖 1795次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
- 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數(shù)字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅(qū)動電路設計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 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次下載 | 免費
評論
查看更多