在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>工廠監(jiān)視器(傳感器到前端)開源分享

工廠監(jiān)視器(傳感器到前端)開源分享

2022-12-15 | zip | 0.07 MB | 次下載 | 免費

資料介紹

描述

像越來越多的人一樣,我在 COVID-19 封鎖期間迷上了我的植物。不幸的是,額外的愛和感情似乎阻礙了我最喜歡的植物之一在今年春天長出任何新葉子。現(xiàn)在一個普通人可能會給植物澆水,把它放在陽光下,然后等待——但在制造商社區(qū),我們喜歡數(shù)據(jù)和過度設計的解決方案。所以,我從舊硬件盒中取出一些傳感器,開始制作植物監(jiān)視器!

最初,這將是一個閉環(huán)、離線解決方案,當土壤濕度低于某個待確定值時給植物澆水——最終更多地成為一種數(shù)據(jù)收集工具,用于查看本地網(wǎng)絡上的傳感器數(shù)據(jù)。我以前從未使用過任何與網(wǎng)絡相關的東西,所以這是一個將簡單的想法從傳感器帶到前端的好機會。

該項目包含三個主要部分——Arduino、中間件和前端。確切的代碼和文件結(jié)構在鏈接的 GitHub 存儲庫中,但我將嘗試概述下面的代碼庫。

阿杜諾

Arduino 部分是我最熟悉的部分,因此啟動并運行它大約需要 15 分鐘。連接示意圖如下所示。

pYYBAGOYCMiAAg5HAACpc634X0A728.png
?

您的溫度傳感器可能有四個引腳而不是三個引腳,仍然只有三個活動連接,但請查看特定傳感器的文檔。

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é)果

poYBAGOYCN-ATXB6AABDEJEeUIs046.jpg
?

如您所見,最終結(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)系。我將盡我所能回答!


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
  2. 1.06 MB  |  532次下載  |  免費
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費
  5. 3TC358743XBG評估板參考手冊
  6. 1.36 MB  |  330次下載  |  免費
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費
  9. 5元宇宙深度解析—未來的未來-風口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費
  11. 6迪文DGUS開發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費
  13. 7元宇宙底層硬件系列報告
  14. 13.42 MB  |  182次下載  |  免費
  15. 8FP5207XR-G1中文應用手冊
  16. 1.09 MB  |  178次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費
  3. 2555集成電路應用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費
  7. 4開關電源設計實例指南
  8. 未知  |  21549次下載  |  免費
  9. 5電氣工程師手冊免費下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費
  11. 6數(shù)字電路基礎pdf(下載)
  12. 未知  |  13750次下載  |  免費
  13. 7電子制作實例集錦 下載
  14. 未知  |  8113次下載  |  免費
  15. 8《LED驅(qū)動電路設計》 溫德爾著
  16. 0.00 MB  |  6656次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537798次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191187次下載  |  免費
  13. 7十天學會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138040次下載  |  免費
主站蜘蛛池模板: 四虎永久免费影院在线| 欧美一级特黄视频| 人色网| 69xxxx女人| www.亚洲成人| 色狠狠色综合久久8狠狠色| 美国一级做a一级爱视频| 国产永久视频夜色资源网| 亚洲爽视频| 99久久伊人一区二区yy5099| 亚洲一级毛片中文字幕| 午夜三级国产精品理论三级| 欧美大片一区二区三区| xvideos国产| 日本精品视频一视频高清| 欧美乱理伦另类视频| 一级一级18女人毛片| 欧美亚洲天堂| 亚洲午夜视频| 亚洲综合在线最大成人| 宅男午夜视频在线观看| 男人你懂的网站| 一本大道加勒比久久| 91av视频网站| 欧美大胆一级视频| 立即播放免费毛片一级| 色噜噜狠狠大色综合| 日本色高清| 91色视频网站| 色综合天天干| 日本一区二区不卡在线| 久久网综合| 免费看曰批女人爽的视频网址| 色偷偷亚洲综合网亚洲| 久久久久久久综合色一本| 操到喷水| 午夜理伦| 天天在线天天在线天天影视| 亚洲一区二区视频在线观看| 男人的天堂天堂网| 操综合|