精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

電子發(fā)燒友App

硬聲App

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>支持物聯(lián)網(wǎng)種植系統(tǒng)的構(gòu)建

支持物聯(lián)網(wǎng)種植系統(tǒng)的構(gòu)建

2023-06-15 | zip | 0.00 MB | 次下載 | 免費(fèi)

資料介紹

描述

概述

種植植物的寧?kù)o和清新是從城市生活的喧囂中解脫出來的。然而,我們有時(shí)會(huì)因?yàn)樯钪械臒蓝鵁o法好好照顧這些美麗的植物。不過不用擔(dān)心,智能室內(nèi)花園是自動(dòng)種植的完美解決方案。即使我們不在家,它也能照料我們的植物。

在這個(gè)項(xiàng)目中,我們將一個(gè)普通的室內(nèi)花園改造為一個(gè)功能齊全且支持物聯(lián)網(wǎng)的種植系統(tǒng)。

功能

您可以使室內(nèi)花園在適度的預(yù)算內(nèi)具有以下功能。

  • 使用應(yīng)用程序進(jìn)行遠(yuǎn)程控制和數(shù)據(jù)監(jiān)控。
  • 監(jiān)測(cè)溫度和濕度、光照強(qiáng)度、土壤濕度和水位。
  • 自動(dòng)補(bǔ)光、加濕、加熱、換氣、澆水、水箱加水。

完成原型后,選擇一個(gè)亞克力盒子來裝飾你的花園。

邏輯

我們將功能劃分為更小的構(gòu)建塊,如下圖所示。

?
pYYBAGNom2WAdfBDAAOu21cVE7g769.png
?

腳步

第 1 步:原型

程序一:修改主控板

使用涂鴉智能APP實(shí)現(xiàn)遠(yuǎn)程控制,我們使用涂鴉WB3S網(wǎng)絡(luò)模塊作為主控。涂鴉三明治 Wi-Fi SoC 主控板(WB3S)幫助您快速實(shí)現(xiàn)各種智能硬件原型。該板只有一個(gè) ADC 端口,因此我們使用 4 通道模擬多路復(fù)用器RS2255來擴(kuò)展更多模擬通道。

?
pYYBAGNom2iAAIMjAAEherTt-VM125.png
?
poYBAGNom2uALhf2AAGS0hxY1Ac107.png
?

RS2255 提供對(duì)三個(gè)模擬通道的訪問,分別表示為 A1、A2 和 A3。

  • 模擬頻道

電路圖顯示,要讀取 A1、A2 和 A3 上的值,嵌入式系統(tǒng)必須首先讀取 ADC 值。PWM0 和 PWM1 輸出控制 RS2255,這與 ADC 如何連接到模擬通道有關(guān)。見下表:

pYYBAGNom3CAI2FUAAASk5MVUnA388.png
?

程序 2:檢測(cè)光強(qiáng)度

使用BH1750傳感器檢測(cè)光強(qiáng)度。BH1750 是一款使用 I2C 進(jìn)行通信的數(shù)字環(huán)境光傳感器。BH1750FVI 是用于 I2C 總線接口的數(shù)字環(huán)境光傳感器 IC。它可以精確測(cè)量高達(dá) 65535 lx 的光的 LUX 值。BH1750如下圖:

?
poYBAGNom3KAdrnlAAAxG7-TIGE608.png
?
  • BH1750的電路圖:
?
poYBAGNom3SAK6mGAACfEh8Ek0M809.png
?

引腳配置:

  • VCC:3-5V 電源輸入
  • GND:電源地
  • SCL:I2C 時(shí)鐘引腳
  • SDA:I2C 數(shù)據(jù)引腳
  • ADDR:地址引腳
  • BH1750的電路圖:
  • 引腳配置:

程序 3:測(cè)量溫度和濕度

使用SHT21濕度和溫度傳感器測(cè)量環(huán)境溫度和濕度。SHT21經(jīng)過全面校準(zhǔn),具有低功耗和出色的長(zhǎng)期穩(wěn)定性。它使用 I2C 協(xié)議進(jìn)行通信。

注意:如果 SHT21 傳感器不可用,您可以使用HTU21D傳感器替代。

poYBAGNom3eAHP2XAAC9Z9IUz-E901.png
?
  • SHT21的電路圖:
?
poYBAGNom3mASJlGAABxqfnSrpk723.png
?
  • VCC:3.3V電源輸入
  • GND:電源地
  • SCL:I2C 時(shí)鐘引腳
  • SDA:I2C 數(shù)據(jù)引腳
  • SHT21的電路圖:
  • 引腳配置:

程序 4:測(cè)量土壤水分

使用土壤濕度傳感器測(cè)量土壤的含水量。表面鍍鎳,感應(yīng)面積大,可提高導(dǎo)電性,防止與土壤接觸生銹的問題。該傳感器提供模擬和數(shù)字輸出。數(shù)字輸出簡(jiǎn)單,而模擬輸出更準(zhǔn)確。您可以借助傳感器板上的電位器(藍(lán)色)調(diào)整傳感器的靈敏度。傳感器使用 LM393 比較器將土壤濕度水平與預(yù)設(shè)閾值進(jìn)行比較。

pYYBAGNom36AJaALAAClS0ydbzo862.png
?
  • 土壤濕度傳感器電路圖:
?
poYBAGNom4GANM3tAAEZRENc6Kk706.png
?
  • 引腳配置:VCC:3.3-5V 電源輸入GND:電源地D0:數(shù)字輸出A0:模擬輸出

程序 5:測(cè)量水箱水位

使用水位傳感器測(cè)量水箱中的水深。水位傳感器具有高性能和低功耗的靈敏度。它可以很容易地將水量轉(zhuǎn)換為模擬信號(hào),輸出值可以被微處理器識(shí)別,從而實(shí)現(xiàn)水位報(bào)警。

poYBAGNom4OAPFcAAABJX6-K1Zg523.png
?
  • 水位傳感器電路圖:
?
poYBAGNom4WAMPF9AABc3sMuRII072.png
?
  • 引腳配置:+:3-5V電源輸入-:電源地S:模擬輸出

程序 6:補(bǔ)光

使用室內(nèi)花園上的 LED 植物燈補(bǔ)光。生長(zhǎng)燈由2835顆LED燈珠組成。共有114顆珠子,分暖白、紅、藍(lán)、遠(yuǎn)紅外四個(gè)波段,每個(gè)波段的比例為25:9:2:2。

為了實(shí)現(xiàn)蔬菜以及花卉和水果的兩種生長(zhǎng)模式,兩個(gè) PWM 輸出控制光譜。一個(gè)控制藍(lán)光,另一個(gè)控制暖白光、紅光和遠(yuǎn)紅外光。

poYBAGNom4uAYi3cAAO-2PYbGiw084.png
?
  • 蔬菜種植方式:

植物燈板提供暖白光、紅光、藍(lán)光和遠(yuǎn)紅外光。頻譜報(bào)告如下:

pYYBAGNom5CAHQhhAAPxHjGIngw868.png
?
poYBAGNom5SAKzCWAAMp7HdtErM991.png
?
  • 花果種植模式:

植物燈板提供暖白光、紅光和遠(yuǎn)紅外光。頻譜報(bào)告如下:

poYBAGNom52AeMh2AARdwLY4uxw974.png
?
pYYBAGNom6KAWTc4AANqnPbIIF4297.png
?
  • 引腳配置:12V:12V電源輸入PON:PWM輸入1 RON:PWM輸入2 GND:電源地

注意藍(lán)光只能在其他PWM信號(hào)輸出時(shí)進(jìn)行調(diào)節(jié)。如果您沒有植物燈板,您可以使用兩個(gè) PWM 輸出交替控制 LED 燈條。

程序 7:噴涂

使用 1 通道繼電器模塊來控制 5V 霧化器模塊。造霧器芯片的工作頻率為 108 kHz。第八針可用于監(jiān)測(cè)水位,實(shí)現(xiàn)低水位切斷,防止霧化盤缺水。

pYYBAGNom6SAVtrHAABXym8jHv4499.png
?
  • 制霧器模塊電路圖:
?
pYYBAGNom6iAUvqsAAC3DmZjntc143.png
?
  • 引腳配置:紅線:5V黑線:GND

程序 8:加熱

使用1路繼電器模塊控制75W遠(yuǎn)紅外線燈泡。紅外線燈泡具有熱效率高、遇水防爆、傳熱快、散熱快等特點(diǎn)。重要的是,它可以在潮濕的環(huán)境中有效地工作。您可以根據(jù)需要使用冷卻風(fēng)扇。

poYBAGNom6uAdFpyAABPKj9b8Mw284.png
?

(可選)冷卻風(fēng)扇:使用安裝在室內(nèi)花園中的冷卻風(fēng)扇(12V DC 0.18A)。風(fēng)扇和紅外線燈泡通過220V AC轉(zhuǎn)12V DC電源變壓器并聯(lián),由繼電器模塊控制。

pYYBAGNom7GAABJ3AARFPPewQ1U965.png
?

程序 9:通風(fēng)

使用1路繼電器模塊控制兩個(gè)高速冷卻風(fēng)扇(12V 0.5A)。通風(fēng)可以降低環(huán)境溫度和濕度,從而為植物授粉。

poYBAGNom7WAFdw0AAGK0JaOqTw650.png
?

程序 10:加注水箱

使用 1 通道繼電器模塊控制 12V 水泵。您可以根據(jù)需要選擇供水或?qū)⑺酶臑?2V水電磁閥。

  • 功率:24W
  • 流量:5升/分鐘
  • 進(jìn)水壓力:0.48 MPa
poYBAGNom7mAZE0IAAEECNi1FB4228.png
?

程序 11:水

使用 1 通道繼電器模塊控制兩個(gè) 12V DC 隔膜泵。水被泵送并施用于土壤。

pYYBAGNom7uAF7_kAAAhtadbN9M848.png
?

程序 12:我們?yōu)槭裁匆褂美^電器模塊?

繼電器模塊通常用于切換使用比大多數(shù)微控制器可以處理的電壓更高的電壓的設(shè)備。

您可以使用兩個(gè)1路繼電器模塊和一個(gè)4路繼電器模塊來實(shí)現(xiàn)自動(dòng)噴灑、加熱、水箱加水、通風(fēng)和澆水。

  • 1通道繼電器模塊
poYBAGNom76AUyIlAABpgN6vWWQ891.png
?
  • 4通道繼電器模塊
poYBAGNom8KAJb3WAADBH6uwtFw928.png
?
  • 繼電器引腳
poYBAGNom8WAfGiiAAA5ON0xWtE766.png
?

程序 13:選擇室內(nèi)花園

選擇一個(gè)簡(jiǎn)單的傳統(tǒng)室內(nèi)花園進(jìn)行改造。

我們準(zhǔn)備了一個(gè)傳統(tǒng)的室內(nèi)花園,配有種植燈板和大型土壤容器。

pYYBAGNom8iAJkRFAAMEjjNuSVs402.png
?

這個(gè)花園有以下功能:

poYBAGNom8uARxpnAAFu7meBOjY296.png
?

程序 14:花園供電

花園需要四種電源,即220V AC、12V DC、5V DC和3.3V DC。為此,我們使用以下解決方案:

  • 220V AC:來自 220V/50 Hz 電網(wǎng)的電源。
poYBAGNom9GANcEnAABP8YQC6ks391.png
?
?
pYYBAGNom9SAOtGiAAAjK2wrJZQ187.png
?

12V散熱風(fēng)扇與紅外線燈泡相連。紅外燈泡連接到 220V 交流電源。隔離開關(guān)電源模塊 (12V 400 mA) 為冷卻風(fēng)扇產(chǎn)生 12V DC。

pYYBAGNom9eAYTxlAAAcwL-2JL0410.png
?
  • 5V DC:為繼電器模塊和超聲波霧化器供電。
?
pYYBAGNom9qARKf-AABNAijUdY4912.png
?

模塊規(guī)格

  • 輸入電壓:9V–36V DC
  • 輸出電壓:5.2V/5A/25W
  • 輸入不同的電壓會(huì)輸出不同的功率:
  • 9–24V DC,輸出 5.2V/6A/30W。
  • 24–32V DC,輸出 5.2V/5A/25W。
  • 32-36V DC,輸出 5.2V/3.5A/18W。

3.3V DC:涂鴉三明治DC-DC電源板供電。此電源板配備雙電源插孔,可接受 12V DC 或 5V DC 電源。

  • 12V DC輸入時(shí),兩顆SY8012B芯片工作,為板上其他元件提供12V、5V、3.3V DC供電
poYBAGNom92Ae_bXAABwK19cKto209.png
?

步驟 15:設(shè)計(jì)亞克力盒子

我們使用 Adob??e AutoCAD 設(shè)計(jì)了一個(gè)亞克力盒子。注意事項(xiàng):

  • 鍋大小
  • 組件尺寸和布局
  • 固定孔位
  • 接線用螺絲孔

下圖顯示了組件布局供您參考。您可以修改和重新設(shè)計(jì)以滿足您的需求。下載 2D 圖紙。

  • 正視圖:
pYYBAGNom-CAD-c9AABef6cQREk973.png
?
  • 后視圖:
poYBAGNom-KAOUx3AADNcaEdowk027.png
?

第 2 步:組裝

程序1:準(zhǔn)備材料

準(zhǔn)備以下組件和用品。

poYBAGNom-WAZDpZAABzIEGA4_4395.png
?
pYYBAGNom-eASQ8YAAByRaEAByY834.png
?
pYYBAGNom-2AVumfAAB5nQ5Q9uk092.png
?
pYYBAGNom_CAUzlaAAArpDR792o956.png
?

程序2:組裝亞克力盒

根據(jù)圖紙切割亞克力板。用粘合劑組裝丙烯酸組件。

pYYBAGNom_eAG9DqAAIVTHlII0s481.png
?

程序 3:接線

下載接線圖

?
pYYBAGNonFKAfFVuABftyTi1QVo524.png
?

程序 4:安裝組件

注意事項(xiàng):

  • 組件位置。
  • 上排風(fēng)口用于進(jìn)風(fēng)口,下排風(fēng)口用于出風(fēng)口。
  • 電線使用和長(zhǎng)度。
  • 光傳感器位置。

程序5:制作霧化器

  • 找一個(gè)帶蓋的瓶子。
pYYBAGNonFeAMJ_iAAIiDItPKjc812.png
?
  • 固定脫脂棉。

在蓋子上鉆一個(gè)直徑合適的孔來固定脫脂棉。放一些沙子或小石頭固定棉花的底部。

poYBAGNonGCALZopAAO00mrBQOM134.png
?
  • 將水位感應(yīng)線通過蓋子孔插入瓶子。
pYYBAGNonGKAWqUIAAA-YNVbehU641.png
?
  • 修復(fù)霧化器。

1.如圖所示將造霧器放在蓋子上。

poYBAGNonGiAVkSAAAC5qliBkjs428.png
?

2. 重新擰上蓋子,但不要太緊。否則無法產(chǎn)生霧氣。如果沒有瓶子,您可以用熱膠固定霧化器。

poYBAGNonGuAYkLEAAHLrC5caYg072.png
?

程序 6:完成組裝

將組件放入盒子中并整理電線。

?
poYBAGNonHCAGgxQAAoegY3RMCk954.jpg
?
?
pYYBAGNonHSABVmCAAIVXDwrSWU567.jpg
?

第 3 步:創(chuàng)建

進(jìn)行涂鴉 OS 開發(fā),需要在涂??鴉IoT 平臺(tái)上創(chuàng)建一個(gè)室內(nèi)花園產(chǎn)品,然后獲取 SDK。該產(chǎn)品代表了智慧花園的所有物聯(lián)網(wǎng)功能,包括產(chǎn)品授權(quán)和配置,構(gòu)建了花園與涂鴉物聯(lián)網(wǎng)平臺(tái)的通信。本節(jié)介紹如何在涂鴉物聯(lián)網(wǎng)平臺(tái)上打造智能室內(nèi)花園有關(guān)詳細(xì)信息,請(qǐng)參閱創(chuàng)建產(chǎn)品

?
pYYBAGNomXaAGxuSAABiWTVrJ_s934.png
?
  • 找到自定義函數(shù)并單擊創(chuàng)建函數(shù)。設(shè)置自定義函數(shù)的屬性。
  • 要設(shè)置溫度和濕度范圍,請(qǐng)?zhí)砑铀膫€(gè)整數(shù)數(shù)據(jù)點(diǎn) (DP),即Max Temp 、Min Temp Max HumidityMin Humidity 。
  • 要將水箱水位的數(shù)據(jù)傳輸?shù)皆贫?,?qǐng)?zhí)砑铀渌坏恼麛?shù)DP
  • 要控制生長(zhǎng)光色,請(qǐng)?zhí)砑覮ight Color的枚舉 DP 。
  • 要在預(yù)定和自動(dòng)補(bǔ)光之間切換,請(qǐng)?zhí)砑?/font>Fill Light的布爾 DP
  • 登錄涂鴉物聯(lián)網(wǎng)平臺(tái),點(diǎn)擊創(chuàng)建。
  • 選擇小家電>植物種植者。
  • 單擊自定義解決方案>植物種植者。輸入產(chǎn)品名稱,協(xié)議類型選擇WiFi+藍(lán)牙,點(diǎn)擊頁(yè)面下方的創(chuàng)建產(chǎn)品。
  • 創(chuàng)建標(biāo)準(zhǔn)函數(shù)中,選擇開關(guān)、、當(dāng)前溫度、當(dāng)前濕度、倒計(jì)時(shí)、剩余時(shí)間故障。
  • (可選)要實(shí)現(xiàn)智能花園的非標(biāo)準(zhǔn)功能,需要自定義一些功能。
  • 完成功能定義后,點(diǎn)擊設(shè)備面板選擇喜歡的應(yīng)用控制面板。建議選擇適合您的調(diào)試需要的調(diào)試面板。

您已完成在涂鴉 IoT 平臺(tái)上創(chuàng)建產(chǎn)品。它已準(zhǔn)備好進(jìn)行嵌入式系統(tǒng)開發(fā)。

第 4 步:代碼

嵌入式代碼基于 BK7231 芯片組,使用涂鴉通用 Wi-Fi SDK 開發(fā)。您可以從涂鴉 GitHub 倉(cāng)庫(kù)拉取的 demo 例程中獲取環(huán)境變量,也可以下載包含 SDK 環(huán)境變量的 demo 例程。我們通過方法 1 獲取 SDK。

程序 1:進(jìn)入申請(qǐng)

克隆存儲(chǔ)庫(kù)以在您的計(jì)算機(jī)上創(chuàng)建本地副本。打開apps存儲(chǔ)演示代碼的文件夾。在這個(gè)文件夾中,新建一個(gè)文件夾,命名bk7231t_plant_grow_mach_demo為存放demo相關(guān)的源文件、頭文件、編譯文件。

如果您是第一次接觸 BK7231 開發(fā),我們建議您文件夾中分別找到tuya_device.c并將它們復(fù)制到這個(gè)新創(chuàng)建的文件夾中。tuya_device.hsrcincludebk7231t_bl0937_1_plug_demo

打開tuya_device.c并找到該device_init功能。

OPERATE_RET device_init(VOID)
{
OPERATE_RET op_ret = OPRT_OK;
TY_IOT_CBS_S wf_cbs = {
status_changed_cb,\
gw_ug_inform_cb,\
gw_reset_cb,\
dev_obj_dp_cb,\
dev_raw_dp_cb,\
dev_dp_query_cb,\
NULL,
};
op_ret = tuya_iot_wf_soc_dev_init_param(hw_get_wifi_mode(),WF_START_SMART_FIRST,\
&wf_cbs,NULL,PRODECT_KEY,DEV_SW_VERSION);
if(OPRT_OK != op_ret) {
PR_ERR("tuya_iot_wf_soc_dev_init_param error,err_num:%d",op_ret);
return op_ret;
}
op_ret = tuya_iot_reg_get_wf_nw_stat_cb(wf_nw_status_cb);
if(OPRT_OK != op_ret) {
PR_ERR("tuya_iot_reg_get_wf_nw_stat_cb is error,err_num:%d",op_ret);
return op_ret;
}
op_ret= app_dltj_init(APP_DLTJ_NORMAL);
if(OPRT_OK != op_ret) {
PR_ERR("dltj init err!");
return op_ret;
}
op_ret = app_switch_init(APP_SW_MODE_NORMAL);
if(op_ret != OPRT_OK) {
return op_ret;
}
return op_ret;
}

在 BK7231T 芯片組的開發(fā)環(huán)境中,device_init函數(shù)是應(yīng)用程序代碼的入口。設(shè)備上電時(shí),BK7231T適配層運(yùn)行初始化代碼,然后調(diào)用該函數(shù)初始化應(yīng)用層。該函數(shù)處理以下內(nèi)容:

  • 調(diào)用tuya_iot_wf_soc_dev_init_param()SDK初始化配置工作模式和配對(duì)模式,注冊(cè)回調(diào)函數(shù),保存固件密鑰和PID。
TY_IOT_CBS_S wf_cbs = {
status_changed_cb,\
gw_ug_inform_cb,\
gw_reset_cb,\
dev_obj_dp_cb,\
dev_raw_dp_cb,\
dev_dp_query_cb,\
NULL,
};
op_ret = tuya_iot_wf_soc_dev_init_param(hw_get_wifi_mode(),WF_START_SMART_FIRST,\
&wf_cbs,NULL,PRODECT_KEY,DEV_SW_VERSION);
if(OPRT_OK != op_ret) {
PR_ERR("tuya_iot_wf_soc_dev_init_param error,err_num:%d",op_ret);
return op_ret;
} op_ret = tuya_iot_reg_get_wf_nw_stat_cb(wf_nw_status_cb);
if(OPRT_OK != op_ret) {
    PR_ERR("tuya_iot_reg_get_wf_nw_stat_cb is error,err_num:%d",op_ret);
    return op_ret;
}
op_ret= app_dltj_init(APP_DLTJ_NORMAL);
if(OPRT_OK != op_ret) {
PR_ERR("dltj init err!");
return op_ret;
}
op_ret = app_switch_init(APP_SW_MODE_NORMAL);
if(op_ret != OPRT_OK) {
return op_ret;
}
  • 調(diào)用tuya_iot_reg_get_wf_nw_stat_cb()注冊(cè)設(shè)備網(wǎng)絡(luò)狀態(tài)回調(diào)。
op_ret = tuya_iot_reg_get_wf_nw_stat_cb(wf_nw_status_cb);
if(OPRT_OK != op_ret) {
    PR_ERR("tuya_iot_reg_get_wf_nw_stat_cb is error,err_num:%d",op_ret);
    return op_ret;
}
  • 在應(yīng)用層調(diào)用初始化函數(shù)。
op_ret= app_dltj_init(APP_DLTJ_NORMAL);
if(OPRT_OK != op_ret) {
    PR_ERR("dltj init err!");
    return op_ret;
}

op_ret = app_switch_init(APP_SW_MODE_NORMAL);
if(op_ret != OPRT_OK) {
    return op_ret;
}

因?yàn)?/font>tuya_device.c是借用了另一個(gè)demo,所以我們需要為這個(gè)demo實(shí)現(xiàn)一個(gè)應(yīng)用初始化函數(shù)。創(chuàng)建app_plant.c及其頭文件并實(shí)現(xiàn)app_plant_init()device_init.

程序 2:應(yīng)用程序架構(gòu)

應(yīng)用程序代碼分三層實(shí)現(xiàn)。

  • 底層有傳感器驅(qū)動(dòng)代碼和封裝傳感器初始化和數(shù)據(jù)采集接口。
  • 第二層有部分控制邏輯代碼,調(diào)用傳感器驅(qū)動(dòng)接口來實(shí)現(xiàn)各個(gè)組件的控制邏輯。該層封裝了輪詢數(shù)據(jù)處理的接口。
  • 第一層創(chuàng)建應(yīng)用任務(wù)調(diào)用第二層接口,處理DP數(shù)據(jù)傳輸,接受解析。

app_plant.c實(shí)現(xiàn)第一層。

  • app_plant_init()調(diào)用二層封裝的設(shè)備初始化接口,創(chuàng)建應(yīng)用任務(wù)。
OPERATE_RET app_plant_init(IN APP_PLANT_MODE mode)
{
    OPERATE_RET op_ret = OPRT_OK;

    if(APP_PLANT_NORMAL == mode) {
        
        // Initialize I/O, sensors, PWM, and more
        plant_device_init();
        
        // Create data collection tasks for I2C sensors
        xTaskCreate(sensor_data_get_iic_theard,"thread_data_get_iic",512,NULL,TRD_PRIO_3,NULL);

        // Create data collection tasks for ADC sensors
        xTaskCreate(sensor_data_get_adc_theard,"thread_data_get_adc",512,NULL,TRD_PRIO_4,NULL);

        // Create data processing tasks
        xTaskCreate(sensor_data_deal_theard,"thread_data_deal",512,NULL,TRD_PRIO_4,NULL);

        // Create scheduled tasks for DP data reporting
        xTaskCreate(sensor_data_report_theard,"thread_data_report",512,NULL,TRD_PRIO_4,NULL);
    }else {
        // Non-production test mode
    }

    return op_ret;
}
  • app_report_all_dp_status()報(bào)告所有 DP 數(shù)據(jù):
VOID app_report_all_dp_status(VOID)
{
    OPERATE_RET op_ret = OPRT_OK;

    INT_T dp_cnt = 0;
    dp_cnt = 12;

    TY_OBJ_DP_S *dp_arr = (TY_OBJ_DP_S *)Malloc(dp_cnt*SIZEOF(TY_OBJ_DP_S));
    if(NULL == dp_arr) {
        PR_ERR("malloc failed");
        return;
    }

    memset(dp_arr, 0, dp_cnt*SIZEOF(TY_OBJ_DP_S));

    dp_arr[0].dpid = DPID_SWITCH_P;
    dp_arr[0].type = PROP_BOOL;
    dp_arr[0].time_stamp = 0;
    dp_arr[0].value.dp_value = plant_ctrl_data.Switch;
    ......
    
    op_ret = dev_report_dp_json_async(NULL,dp_arr,dp_cnt);
    Free(dp_arr);
    if(OPRT_OK != op_ret) {
        PR_ERR("dev_report_dp_json_async relay_config data error,err_num",op_ret);
    }

    PR_DEBUG("dp_query report_all_dp_data");
    return;
}
  • 任務(wù)功能。

在任務(wù)中,plant_get_iic_sensor_data()、plant_get_adc_sensor_data()、plant_ctrl_handle()plant_ctrl_all_off()被循環(huán)調(diào)用。這些接口來自第二層并在plant_control.c.

STATIC VOID sensor_data_get_iic_theard(PVOID_T pArg)
{   
    while(1) {

        PR_DEBUG("plant_get_i2c_sensor_data");
        vTaskDelay(TASKDELAY_SEC);

        if(TRUE == plant_ctrl_data.Switch) {    
            plant_get_iic_sensor_data();
        }
        
    }
}

STATIC VOID sensor_data_get_adc_theard(PVOID_T pArg)
{   
    while(1) {

        PR_DEBUG("plant_get_adc_sensor_data");
        vTaskDelay(TASKDELAY_SEC*2);

        if(TRUE == plant_ctrl_data.Switch) {
            plant_get_adc_sensor_data();
        }
        
    }
}

STATIC VOID sensor_data_deal_theard(PVOID_T pArg)
{   
    while(1) {
        vTaskDelay(TASKDELAY_SEC);

        if(TRUE == plant_ctrl_data.Switch) {
            plant_ctrl_handle();
        }else {
            plant_ctrl_all_off();
        }
        
    }

}

STATIC VOID sensor_data_report_theard(PVOID_T pArg)
{   
    while(1) {
        vTaskDelay(TASKDELAY_SEC*5);
        app_report_all_dp_status();
    }

}
  • deal_dp_proc()根據(jù)DP ID處理接收到的DP數(shù)據(jù)。
VOID deal_dp_proc(IN CONST TY_OBJ_DP_S *root)
{
    UCHAR_T dpid;

    dpid = root->dpid;
    PR_DEBUG("dpid:%d",dpid);
    
    switch (dpid) {
    
    case DPID_SWITCH_P:
        PR_DEBUG("set switch:%d",root->value.dp_bool);
        plant_ctrl_data.Switch = root->value.dp_bool;
        break;
        
    case DPID_PUMP:
        PR_DEBUG("set pump:%d",root->value.dp_bool);
        plant_ctrl_data.Pump = root->value.dp_bool;
        break;
        
        ......
        
    default:
        break;
    }

    return;

}

我們已經(jīng)構(gòu)建了應(yīng)用程序架構(gòu)。接下來,我們需要在第二層實(shí)現(xiàn)接口,這些接口放在plant_control.c. 以下程序描述了溫度和濕度、光照和土壤濕度方面的控制邏輯。

程序 3:溫度和濕度

要控制溫度和濕度,首先我們必須收集數(shù)據(jù)。SHT21 傳感器收集溫度和濕度數(shù)據(jù)。它使用 I2C 協(xié)議進(jìn)行通信。我們根據(jù)SHT21 技術(shù)手冊(cè)編寫傳感器驅(qū)動(dòng)程序代碼驅(qū)動(dòng)代碼完成后,我們封裝了傳感器初始化、數(shù)據(jù)采集、數(shù)據(jù)轉(zhuǎn)換的接口。

所有 SHT21 驅(qū)動(dòng)程序和外部接口均以sht21.c. 封裝的外部接口從plant_control.c.

1.tuya_sht21_init(sht21_init_t* param)初始化傳感器。request 參數(shù)是一個(gè)指向結(jié)構(gòu)的指針,該結(jié)構(gòu)包含有關(guān) SDA 和 SCL I/O 引腳和分辨率的信息。

typedef struct 
{
    UCHAR_T SDA_PIN;            ///< SDA pin
    UCHAR_T SCL_PIN;            ///< SCL pin
    sht21_resolution_t RESOLUTION;   
}sht21_init_t;

2.定義結(jié)構(gòu)變量plant_control.c并調(diào)用plant_device_init()以初始化傳感器。

#define IIC_SDA_PIN                         (6)
#define IIC_SCL_PIN                         (7)

STATIC sht21_init_t sht21_int_param = {IIC_SDA_PIN, IIC_SCL_PIN, SHT2x_RES_10_13BIT};

VOID plant_device_init(VOID)
{

    // SHT21 IIC driver init 
    tuya_sht21_init(&sht21_int_param);
    
}

3.初始化后,傳感器可以提供環(huán)境溫度和濕度值。因?yàn)榛▓@需要連續(xù)的環(huán)境參數(shù),所以必須相應(yīng)地調(diào)用獲取傳感數(shù)據(jù)的接口。在上述過程中,任務(wù)函數(shù)app_plant.c之一plant_get_iic_sensor_data()plant_control.c. 因此,我們需要調(diào)用傳感器數(shù)據(jù)采集接口tuya_sht21_measure()和計(jì)算接口tuya_sht21_cal_RH()這兩個(gè)接口的參數(shù)都是枚舉值,用來獲取溫度或濕度。

VOID plant_get_iic_sensor_data(VOID)
{

    SHORT_T hum;
    SHORT_T temp;

    tuya_sht21_init(&sht21_int_param);

    hum = tuya_sht21_measure(HUMIDITY);
    device_data.humidity = tuya_sht21_cal_RH(hum);
    
    if(device_data.humidity > 0){ // Remove invalid humidity values less than 0
        plant_report_data.Humidity_current = (UCHAR_T)device_data.humidity;
        PR_NOTICE("humidity = %d",plant_report_data.Humidity_current);
    }

    temp = tuya_sht21_measure(TEMP);
    device_data.temperature = tuya_sht21_cal_temperature(temp);
    plant_report_data.Temp_current = (UCHAR_T)device_data.temperature;
    PR_NOTICE("tempre = %d",plant_report_data.Temp_current);
}

4.將環(huán)境溫度和濕度與閾值進(jìn)行比較。我們?cè)?/font>涂鴉 IoT 平臺(tái)上創(chuàng)建了最高最低溫度和濕度的四個(gè) DP ,因此我們可以通過應(yīng)用設(shè)置閾值并通過云端發(fā)送到設(shè)備。處理DP數(shù)據(jù)中deal_dp_proc()函數(shù)。app_plant.c

VOID deal_dp_proc(IN CONST TY_OBJ_DP_S *root)
{
    UCHAR_T dpid;

    dpid = root->dpid;
    PR_DEBUG("dpid:%d",dpid);
    
    switch (dpid) {

    ......
    
    case DPID_TEMP_MAX:
        PR_DEBUG("set temp max:%d",root->value.dp_value);
        plant_ctrl_data.Temp_max = root->value.dp_value;
        break;
    
    case DPID_HUMIDITY_MAX:
        PR_DEBUG("set humidity max:%d",root->value.dp_value);
        plant_ctrl_data.Humidity_max = root->value.dp_value;
        break;
    
    case DPID_TEMP_MIN:
        PR_DEBUG("set temp min:%d",root->value.dp_value);
        plant_ctrl_data.Temp_min = root->value.dp_value;
        break;

    case DPID_HUMIDITY_MIN:
        PR_DEBUG("set humidity min:%d",root->value.dp_value);
        plant_ctrl_data.Humidity_min = root->value.dp_value;
        break;
    ......
    
    default:
        break;
    }

    return;

}

5.創(chuàng)建數(shù)據(jù)比較和I/O設(shè)備控制任務(wù)app_plant.c它在循環(huán)中調(diào)用plant_ctrl_handle()函數(shù)。plant.control.c所有控制邏輯都在 中指定plant_ctrl_handle()。為了調(diào)節(jié)溫度和濕度,我們使用了霧化器、紅外線燈泡和冷卻風(fēng)扇,它們通過繼電器模塊打開/關(guān)閉。tuya_gpio_inout_set()此 SDK 中封裝的接口和tuya_gpio_write()接口控制 I/O 輸出。代碼如下:

#define HUMIDIFIER_PORT                     (24)
#define HUMIDIFIER_LEVEL                    LOW

#define HEATING_ROD_PORT                    (20)
#define HEATING_ROD_LEVEL                   LOW

#define COOL_DOWN_FAN_PORT                  (21)
#define COOL_DOWN_FAN_LEVEL                 LOW

STATIC VOID __ctrl_gpio_init(CONST TY_GPIO_PORT_E port, CONST BOOL_T high)
{
    // Set I/O pin to output mode
    tuya_gpio_inout_set(port, FALSE);
    // Set I/O level
    tuya_gpio_write(port, high);
}

VOID plant_device_init(VOID)
{
    // SHT21 IIC driver init 
    tuya_sht21_init(&sht21_int_param);

    // gpio init
    __ctrl_gpio_init(HUMIDIFIER_PORT, HUMIDIFIER_LEVEL);

    __ctrl_gpio_init(COOL_DOWN_FAN_PORT, COOL_DOWN_FAN_LEVEL);  

    __ctrl_gpio_init(HEATING_ROD_PORT, HEATING_ROD_LEVEL);

}

STATIC VOID __passive_ctrl_module_temp_humidity(VOID)
{   
    if(device_data.humidity < plant_ctrl_data.Humidity_min) {
        tuya_gpio_write(HUMIDIFIER_PORT, !HUMIDIFIER_LEVEL);
    }else {
        tuya_gpio_write(HUMIDIFIER_PORT, HUMIDIFIER_LEVEL);
    }

    if(device_data.temperature < plant_ctrl_data.Temp_min) {
        tuya_gpio_write(HEATING_ROD_PORT, !HEATING_ROD_LEVEL);
    }else {
        tuya_gpio_write(HEATING_ROD_PORT, HEATING_ROD_LEVEL);
    }

    if((device_data.temperature > plant_ctrl_data.Temp_max)||(device_data.humidity > plant_ctrl_data.Humidity_max)) {
        tuya_gpio_write(COOL_DOWN_FAN_PORT,!COOL_DOWN_FAN_LEVEL);
    }else {
        tuya_gpio_write(COOL_DOWN_FAN_PORT,COOL_DOWN_FAN_LEVEL);
    }
    
}

VOID plant_ctrl_handle(VOID)
{   
    PR_DEBUG("enter ctrl handle");

    __passive_ctrl_module_temp_humidity();
    
}

程序 4:燈光控制

BH1750 光傳感器使用 I2C 協(xié)議進(jìn)行通信。我們根據(jù)BH1750 數(shù)據(jù)表編寫傳感器驅(qū)動(dòng)程序代碼。驅(qū)動(dòng)代碼完成后,我們封裝了傳感器初始化和數(shù)據(jù)采集的接口。所有 BH1750 驅(qū)動(dòng)程序和外部接口均以bh1750.c. 封裝的外部接口從plant_control.c.

1.tuya_bh1750_init(sht21_init_t* param)初始化傳感器。request 參數(shù)是一個(gè)指向包含有關(guān) SDA 和 SCL I/O 管腳信息的結(jié)構(gòu)的指針。

typedef struct 
{
    UCHAR_T SDA_PIN;            ///< SDA pin
    UCHAR_T SCL_PIN;            ///< SCL pin 
}bh1750_init_t;

2.定義結(jié)構(gòu)變量plant_control.c并調(diào)用plant_device_init()以初始化傳感器。

#define IIC_SDA_PIN                         (6)
#define IIC_SCL_PIN                         (7)

STATIC bh1750_init_t bh1750_int_param = {IIC_SDA_PIN, IIC_SCL_PIN};

VOID plant_device_init(VOID)
{
......
    // SHT21 IIC driver init 
    tuya_bh1750_init(&bh1750_int_param);
......
}

tuya_bh1750_get_bright_value()3.初始化完成后,調(diào)用BH1750數(shù)據(jù)采集接口plant_get_iic_sensor_data()獲取光照強(qiáng)度值。為保證光傳感器和溫濕度傳感器采集數(shù)據(jù)時(shí)通信穩(wěn)定,plant_get_iic_sensor_data()輸入時(shí)只啟用其中一個(gè)傳感器。

VOID plant_get_iic_sensor_data(VOID)
{

    SHORT_T hum;
    SHORT_T temp;

    switch (IIC_SELECT_FLAG)
    {
    case 0:    
        tuya_sht21_init(&sht21_int_param);

        hum = tuya_sht21_measure(HUMIDITY);
        device_data.humidity = tuya_sht21_cal_RH(hum);
        if(device_data.humidity > 0){ // Remove invalid humidity values less than 0
            plant_report_data.Humidity_current = (UCHAR_T)device_data.humidity;
            PR_NOTICE("humidity = %d",plant_report_data.Humidity_current);
        }

        temp = tuya_sht21_measure(TEMP);
        device_data.temperature = tuya_sht21_cal_temperature(temp);
        plant_report_data.Temp_current = (UCHAR_T)device_data.temperature;
        PR_NOTICE("tempre = %d",plant_report_data.Temp_current);
        
        IIC_SELECT_FLAG = 1;

        break;
    case 1:    
        tuya_bh1750_init(&bh1750_int_param);

        device_data.light_intensity_value = tuya_bh1750_get_bright_value();
        PR_NOTICE("light_intensity_value = %d",device_data.light_intensity_value);
        
        IIC_SELECT_FLAG = 0;

        break;

    default:
        break;
    }

}

4.因?yàn)槲覀儧]有創(chuàng)建一個(gè)DP來設(shè)置一個(gè)應(yīng)用程序的光強(qiáng)度值,我們?cè)诖a中設(shè)置了一個(gè)值。調(diào)整光亮度,使光傳感器采集的數(shù)據(jù)接近該值。我們還設(shè)置了一個(gè)誤差范圍,以避免在臨界點(diǎn)出現(xiàn)光閃爍。

#define ACCURACY                         (2000)  // Error range
#define light_value_set                  (12000) // Light intensity in lx unit

5.PWM輸出控制燈光亮度。PWM 初始化和輸出功能在plant_pwm.c. 初始化PWM in plant_device_init(),調(diào)用實(shí)現(xiàn)光控的接口plant_ctrl_handle()。

USER_PWM_DUTY_T user_pwm_duty = {0,0};

VOID plant_device_init(VOID)
{
    ......
    plant_pwm_init();
    ......
}

STATIC VOID __passive_ctrl_module_light(VOID)
{   
    if(IIC_SELECT_FLAG){ // If the I2C temperature and humidity sensor operates previously
        return;
    }

    if((TRUE == plant_ctrl_data.Auto_switch)) { // Automatic light filling is switched on
        USHORT_T current = device_data.light_intensity_value;
        USHORT_T set = light_value_set;

        if((current - set) > ACCURACY) { // Current light intensity is greater than the set value but not within the error range
            if((current - set) >= 200) {
                if(plant_ctrl_data.Bright_value >= 50)plant_ctrl_data.Bright_value -= 50;
            }else if((current - set) > 150) {
                if(plant_ctrl_data.Bright_value >= 20)plant_ctrl_data.Bright_value -= 20;
            }else {
                if(plant_ctrl_data.Bright_value >= 1)plant_ctrl_data.Bright_value--;
            }
        }else if((set - current) > ACCURACY) { // Current light intensity is less than the set value but not within the error range
            if((set - current) >= 200) {
                if(plant_ctrl_data.Bright_value <= 950)plant_ctrl_data.Bright_value += 50;
            }else if((set - current) > 150) {
                if(plant_ctrl_data.Bright_value <= 980)plant_ctrl_data.Bright_value += 20;
            }else {
                if(plant_ctrl_data.Bright_value <= 999)plant_ctrl_data.Bright_value++;
            }
        }
    } 
}

STATIC VOID __initiative_ctrl_module_light(VOID)
{   
    
    if(TRUE == plant_ctrl_data.Auto_switch) { // Automatic light filling is switched on
        PR_NOTICE("Ligth open !!!!");
        if(plant_ctrl_data.Light_color == red) { // Set light color to red
            user_pwm_duty.duty_red = plant_ctrl_data.Bright_value;
            user_pwm_duty.duty_blue = 0;
        }else if(plant_ctrl_data.Light_color == blue) { // Set light color to blue
            user_pwm_duty.duty_blue = plant_ctrl_data.Bright_value;
            user_pwm_duty.duty_red = 0;
        }else {
            user_pwm_duty.duty_blue = plant_ctrl_data.Bright_value;
            user_pwm_duty.duty_red = user_pwm_duty.duty_blue;
        }
        plant_pwm_set(&user_pwm_duty);
    }else { // Automatic light filling is switched off. Users manually schedule light filling.
        if(plant_ctrl_data.Light_color == red) {
            user_pwm_duty.duty_red = 1000;
            user_pwm_duty.duty_blue = 0;
        }else if(plant_ctrl_data.Light_color == blue) {
            user_pwm_duty.duty_blue = 1000;
            user_pwm_duty.duty_red = 0;
        }else {
            user_pwm_duty.duty_red = 1000;
            user_pwm_duty.duty_blue = 1000;
        }
        if((IsThisSysTimerRun(light_timer) == FALSE)&&(plant_ctrl_data.Countdown_set != cancel)) {
            light_flag_min = (USHORT_T)plant_ctrl_data.Countdown_set * 60;
            plant_pwm_set(&user_pwm_duty);
            sys_start_timer(light_timer,1000*60,TIMER_CYCLE);
        }else if(plant_ctrl_data.Countdown_set == cancel) {
            user_pwm_duty.duty_blue = 0;
            user_pwm_duty.duty_red = 0;
            plant_pwm_set(&user_pwm_duty);
            light_flag_min = 0;
            sys_stop_timer(light_timer);
        }else if(IsThisSysTimerRun(light_timer) == TRUE) {
            plant_pwm_set(&user_pwm_duty);
        }
        // Save timer's remaining time in minute
        plant_report_data.Countdown_left = light_flag_min;
    }
                                                                        
}

VOID plant_ctrl_handle(VOID)
{   
    ......
    __passive_ctrl_module_light();
    __initiative_ctrl_module_light();
}

程序 5:土壤水分

土壤濕度傳感器根據(jù)土壤電阻的變化輸出不同的模擬信號(hào)值。ADC 將來自傳感器的模擬信號(hào)轉(zhuǎn)換為數(shù)字信號(hào),以監(jiān)測(cè)水分的變化。

1.app_plant.c中,ADC采集任務(wù)循環(huán)調(diào)用plant_get_adc_sensor_data()。plant_control.c所有ADC采集相關(guān)的代碼都放在這個(gè)界面中:

VOID plant_get_adc_sensor_data(VOID)
{   // Control switch analog chip to select soil moisture channel
    rs2255_channel_checkout(SOIL_MOISTURE_SENSOR_PORT);
        
    tuya_hal_adc_init(&tuya_adc);
    tuya_hal_adc_value_get(TEMP_ADC_DATA_LEN, &device_data.soil_humidity);
    PR_NOTICE("soil_humidity = %d",device_data.soil_humidity);

    tuya_hal_adc_finalize(&tuya_adc);

}

2.當(dāng)土壤水分值低于閾值時(shí),水泵開始運(yùn)行并為植物供水。調(diào)用自動(dòng)澆水接口plant_ctrl_handle()。

  • 變量使水泵有一個(gè)休息間隔,以避免植物澆水過多ADD_WATER_COUNT。ADD_WATER_READY
STATIC VOID __passive_ctrl_module_soil_humidity(VOID)
{   
    if(device_data.soil_humidity > plant_ctrl_data.Soil_humidity_threshold) { 

        if(ADD_WATER_READY) { 

            tuya_gpio_write(WATER_VALVE_PORT, !WATER_VALVE_LEVEL);

            ADD_WATER_COUNT++;
            if(ADD_WATER_COUNT > 5) {
                ADD_WATER_READY = 0;
            }

        } else{

            tuya_gpio_write(WATER_VALVE_PORT, WATER_VALVE_LEVEL);
            ADD_WATER_COUNT++;
            if(ADD_WATER_COUNT >15) {
                ADD_WATER_READY = 1;
                ADD_WATER_COUNT = 0;
            }

        }
    }else {

        ADD_WATER_READY = 1;
        ADD_WATER_COUNT = 0;
        tuya_gpio_write(WATER_VALVE_PORT, WATER_VALVE_LEVEL);

    }
}

VOID plant_ctrl_handle(VOID)
{   
    ......
    __passive_ctrl_module_soil_humidity();
    ......
}

程序 6:水箱

水泵用于從水箱抽水并向工廠供水。當(dāng)水位下降時(shí),需要另一個(gè)水泵為水箱供水。水位傳感器根據(jù)電阻產(chǎn)生輸出電壓,通過測(cè)量我們可以確定水位。我們需要使用 ADC 讀取這個(gè)模擬電壓并將其轉(zhuǎn)換為數(shù)字值。

1.rs2255_init()用于初始化模擬開關(guān)芯片。RS2255 與 SDA 和 SCL 引腳共享相同的 I/O,因此初始化在 ADC 數(shù)據(jù)采集開始時(shí)運(yùn)行,這與其他 I2C 傳感器初始化相同。

VOID plant_get_adc_sensor_data(VOID)
{
    rs2255_init();

    switch (ADC_SELECT_FLAG)
    {
    case 0:    

        rs2255_channel_checkout(WATER_SENSOR_PORT);
        tuya_hal_adc_init(&tuya_adc);
        tuya_hal_adc_value_get(TEMP_ADC_DATA_LEN, &device_data.water_tank_value);
        PR_NOTICE("water_tank_value = %d",device_data.water_tank_value);

        ADC_SELECT_FLAG = 1;

        break;
    case 1:    
        
        rs2255_channel_checkout(SOIL_MOISTURE_SENSOR_PORT);
        tuya_hal_adc_init(&tuya_adc);
        tuya_hal_adc_value_get(TEMP_ADC_DATA_LEN, &device_data.soil_humidity);
        PR_NOTICE("soil_humidity = %d",device_data.soil_humidity);

        ADC_SELECT_FLAG = 0;

        break;

    default:
        break;
    }
    
    tuya_hal_adc_finalize(&tuya_adc);

}

2.調(diào)用plant_ctrl_handle()實(shí)現(xiàn)水箱水位控制。

#define WATER_PUMP_PORT                     (22)
#define WATER_PUMP_LEVEL                    LOW

STATIC VOID __initiative_ctrl_module_pump(VOID)
{   
    // Convert water level sensor value into remaining water level percentage for data transmission
    if(device_data.water_tank_value < 1700) {
        plant_report_data.Water_remain = 10;
    }else if(device_data.water_tank_value < 2500) {
        plant_report_data.Water_remain = 25;
    }else if(device_data.water_tank_value < 2700) {
        plant_report_data.Water_remain = 50;
    }else if(device_data.water_tank_value < 2900) {
        plant_report_data.Water_remain = 75;
    }else if(device_data.water_tank_value >= 3000) {
        plant_report_data.Water_remain = 100;
    }

    if(TRUE == plant_ctrl_data.Pump){ // If water pump is switched on
        PR_NOTICE("water pump open !!!!");
        tuya_gpio_write(WATER_PUMP_PORT,!WATER_PUMP_LEVEL);
    }else {
        tuya_gpio_write(WATER_PUMP_PORT,WATER_PUMP_LEVEL);
    }
    if(device_data.water_tank_value >= 3000) { // When the water level approaches the threshold, the water pump is switched off
        PR_NOTICE("water tank is full !!!!");
        tuya_gpio_write(WATER_PUMP_PORT,WATER_PUMP_LEVEL);
        plant_ctrl_data.Pump = FALSE;
    }
                                                                    
}

VOID plant_ctrl_handle(VOID)
{   
    ......
    __initiative_ctrl_module_pump();
    ......
}

現(xiàn)在,我們已經(jīng)完成了編碼部分。用APP上的調(diào)試面板測(cè)試DP數(shù)據(jù)傳輸后,我們就可以進(jìn)行固件編譯了。

程序 7:編譯和燒錄

Linux 終端中,運(yùn)行build_app.sh腳本來編譯固件。生成的固件位于apps> APP_PATH>output中。

  • 命令格式:
build_app.sh /home/share/samba/ci/ty_iot_wf_bt_sdk_bk7231t$ sudo sh build_app.sh apps/bk7231t_plant_grow_mach_demo bk7231t_plant_grow_mach_demo 1.0.0
  • 命令示例:
/home/share/samba/ci/ty_iot_wf_bt_sdk_bk7231t$ sudo sh build_app.sh apps/bk7231t_plant_grow_mach_demo bk7231t_plant_grow_mach_demo 1.0.0
  • 下圖顯示成功返回。
poYBAGNomYaAKb8ZAAHQ8-a4huI824.png
?

?

將固件燒錄到模塊后,我們開始進(jìn)行功能調(diào)試。有關(guān)刻錄和授權(quán)的更多信息,請(qǐng)參閱刻錄和授權(quán) WB 系列模塊。

第 5 步:調(diào)試

一旦模塊被授權(quán),我們將手機(jī)連接到 Wi-Fi 網(wǎng)絡(luò),打開藍(lán)牙,按照說明對(duì)花園進(jìn)行配對(duì)。然后,我們可以用應(yīng)用程序控制花園。在本項(xiàng)目中,我們使用涂鴉智能 App 作為控制終端。有不同的應(yīng)用程序選項(xiàng)。有關(guān)詳細(xì)信息,請(qǐng)參閱應(yīng)用程序開發(fā)

調(diào)試過程如下:

程序 1:預(yù)定和自動(dòng)補(bǔ)光

  • 打開花園并設(shè)置倒計(jì)時(shí)。

?

pYYBAGNonIGAct_qAABLKGV8mZY390.png
?

?

pYYBAGNonIqAapkRAAK1JGk9sLM415.png
?

?

2.設(shè)置燈光顏色,生長(zhǎng)燈板相應(yīng)改變顏色。

?

pYYBAGNonI6AObkQAALMN6vhZSc153.png
?

?

3.當(dāng)倒計(jì)時(shí)設(shè)置為取消時(shí),植物燈板將關(guān)閉。

4.開啟自動(dòng)補(bǔ)光后,燈光亮度會(huì)不斷增加,直到達(dá)到預(yù)設(shè)值。

程序二:溫濕度控制

1.可以在涂鴉智能APP上查看當(dāng)前環(huán)境溫度和濕度。

?

pYYBAGNonJCAB82lAABAFpJRPes330.png
?

?

2.如果您設(shè)置的最小濕度大于當(dāng)前濕度,霧化器將啟動(dòng)。當(dāng)環(huán)境濕度超過最小值時(shí),制霧器將停止。

?

pYYBAGNonJWAHjhjAAMhxAz1cCk103.png
?

?

3.如果您設(shè)置的最低溫度高于當(dāng)前溫度,紅外線燈泡將打開。當(dāng)環(huán)境溫度超過最小值時(shí),紅外燈泡將停止。

4.以同樣的方式測(cè)試最高溫度和濕度,并觀察冷卻風(fēng)扇是否相應(yīng)運(yùn)行。這個(gè)風(fēng)扇可以對(duì)空氣進(jìn)行除濕和冷卻。

程序 3:加注水箱

1.可查看水箱水位剩余水百分比。

2.在涂鴉智能APP開啟Pump ,開啟水泵。

?

?

pYYBAGNonJeAUBsQAABGBxUYzOY139.png
?

?

poYBAGNonJyAcsotAAD3ZNcvzTo292.png
?

?

1:通風(fēng)繼電器模塊

2:噴涂繼電器模塊

3:補(bǔ)水箱繼電器模塊

?

3.將水位傳感器放入杯中,加水至銅線完全沒入。您會(huì)發(fā)現(xiàn)水泵停止并且應(yīng)用程序上的Pump恢復(fù)。

?

pYYBAGNonJ-AdHAMAAIST79UUi4961.png
?

?

4.水箱水位變?yōu)?00。

?

poYBAGNonKSAMaanAAAmELbputM549.png
?

?

程序 4:自動(dòng)澆水

  • 當(dāng)您打開花園時(shí),用于澆水的水泵將持續(xù)運(yùn)行。

?

poYBAGNonKaAYuFIAAC440iATqY131.png
?

?

  • 4:澆水繼電器模塊
  • 5:加熱繼電器模塊

2.將土壤濕度傳感器放入水中,模擬土壤濕度達(dá)到閾值的情況。你會(huì)發(fā)現(xiàn)水泵停止。

?
poYBAGNonLGARtssABGAhS5Fs4U105.png
?

概括

恭喜!您已成功構(gòu)建智能室內(nèi)花園的原型。依托涂鴉物聯(lián)網(wǎng)平臺(tái),您可以快速輕松地從零開始構(gòu)建各種智能原型。


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

評(píng)論

查看更多

下載排行

本周

  1. 1開關(guān)電源設(shè)計(jì)原理手冊(cè)
  2. 1.83 MB   |  14次下載  |  免費(fèi)
  3. 2智能小車proteus仿真+C源程序
  4. 0.02 MB   |  4次下載  |  免費(fèi)
  5. 3PL4807單節(jié)鋰離子電池充電器中文手冊(cè)
  6. 1.36 MB   |  3次下載  |  免費(fèi)
  7. 4BQ769142技術(shù)參考手冊(cè)
  8. 2.99MB   |  2次下載  |  免費(fèi)
  9. 5BQ77207EVM用戶指南
  10. 865.23KB   |  2次下載  |  免費(fèi)
  11. 6TMR技術(shù)在電流傳感器中的應(yīng)用
  12. 616.47 KB  |  1次下載  |  免費(fèi)
  13. 7CBM8605_8606_8608-運(yùn)算放大器【中文排版】-202406271735
  14. 2.70 MB  |  1次下載  |  免費(fèi)
  15. 801-07-06-CBM8655_CBM8656精密運(yùn)算放大器
  16. 4.49 MB  |  1次下載  |  免費(fèi)

本月

  1. 1XL4015+LM358恒壓恒流電路圖
  2. 0.38 MB   |  155次下載  |  1 積分
  3. 2PCB布線和布局電路設(shè)計(jì)規(guī)則
  4. 0.40 MB   |  52次下載  |  免費(fèi)
  5. 3GB/T4706.1-2024 家用和類似用途電器的安全第1部分:通用要求
  6. 7.43 MB   |  14次下載  |  1 積分
  7. 4智能門鎖原理圖
  8. 0.39 MB   |  14次下載  |  免費(fèi)
  9. 5開關(guān)電源設(shè)計(jì)原理手冊(cè)
  10. 1.83 MB   |  14次下載  |  免費(fèi)
  11. 6elmo直線電機(jī)驅(qū)動(dòng)調(diào)試細(xì)則
  12. 4.76 MB   |  9次下載  |  6 積分
  13. 7WIFI智能音箱原理圖完整版
  14. 0.09 MB   |  7次下載  |  10 積分
  15. 8PC1013三合一快充數(shù)據(jù)線充電芯片介紹
  16. 1.03 MB   |  7次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935115次下載  |  10 積分
  3. 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計(jì)
  4. 1.48MB  |  420061次下載  |  10 積分
  5. 3Altium DXP2002下載入口
  6. 未知  |  233084次下載  |  10 積分
  7. 4電路仿真軟件multisim 10.0免費(fèi)下載
  8. 340992  |  191367次下載  |  10 積分
  9. 5十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
  10. 158M  |  183333次下載  |  10 積分
  11. 6labview8.5下載
  12. 未知  |  81581次下載  |  10 積分
  13. 7Keil工具M(jìn)DK-Arm免費(fèi)下載
  14. 0.02 MB  |  73806次下載  |  10 積分
  15. 8LabVIEW 8.6下載
  16. 未知  |  65985次下載  |  10 積分