資料介紹
描述
概述
種植植物的寧?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)建塊,如下圖所示。
腳步
第 1 步:原型
程序一:修改主控板
使用涂鴉智能APP實(shí)現(xiàn)遠(yuǎn)程控制,我們使用涂鴉WB3S網(wǎng)絡(luò)模塊作為主控。涂鴉三明治 Wi-Fi SoC 主控板(WB3S)幫助您快速實(shí)現(xiàn)各種智能硬件原型。該板只有一個(gè) ADC 端口,因此我們使用 4 通道模擬多路復(fù)用器RS2255來擴(kuò)展更多模擬通道。
RS2255 提供對(duì)三個(gè)模擬通道的訪問,分別表示為 A1、A2 和 A3。
- 模擬頻道
電路圖顯示,要讀取 A1、A2 和 A3 上的值,嵌入式系統(tǒng)必須首先讀取 ADC 值。PWM0 和 PWM1 輸出控制 RS2255,這與 ADC 如何連接到模擬通道有關(guān)。見下表:
程序 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如下圖:
- BH1750的電路圖:
引腳配置:
程序 3:測(cè)量溫度和濕度
使用SHT21濕度和溫度傳感器測(cè)量環(huán)境溫度和濕度。SHT21經(jīng)過全面校準(zhǔn),具有低功耗和出色的長(zhǎng)期穩(wěn)定性。它使用 I2C 協(xié)議進(jìn)行通信。
注意:如果 SHT21 傳感器不可用,您可以使用HTU21D傳感器替代。
- SHT21的電路圖:
- 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)行比較。
- 土壤濕度傳感器電路圖:
- 引腳配置:VCC:3.3-5V 電源輸入GND:電源地D0:數(shù)字輸出A0:模擬輸出
程序 5:測(cè)量水箱水位
使用水位傳感器測(cè)量水箱中的水深。水位傳感器具有高性能和低功耗的靈敏度。它可以很容易地將水量轉(zhuǎn)換為模擬信號(hào),輸出值可以被微處理器識(shí)別,從而實(shí)現(xiàn)水位報(bào)警。
- 水位傳感器電路圖:
- 引腳配置:+: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)紅外光。
- 蔬菜種植方式:
植物燈板提供暖白光、紅光、藍(lán)光和遠(yuǎn)紅外光。頻譜報(bào)告如下:
- 花果種植模式:
植物燈板提供暖白光、紅光和遠(yuǎn)紅外光。頻譜報(bào)告如下:
- 引腳配置: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)低水位切斷,防止霧化盤缺水。
- 制霧器模塊電路圖:
- 引腳配置:紅線:5V黑線:GND
程序 8:加熱
使用1路繼電器模塊控制75W遠(yuǎn)紅外線燈泡。紅外線燈泡具有熱效率高、遇水防爆、傳熱快、散熱快等特點(diǎn)。重要的是,它可以在潮濕的環(huán)境中有效地工作。您可以根據(jù)需要使用冷卻風(fēng)扇。
(可選)冷卻風(fēng)扇:使用安裝在室內(nèi)花園中的冷卻風(fēng)扇(12V DC 0.18A)。風(fēng)扇和紅外線燈泡通過220V AC轉(zhuǎn)12V DC電源變壓器并聯(lián),由繼電器模塊控制。
程序 9:通風(fēng)
使用1路繼電器模塊控制兩個(gè)高速冷卻風(fēng)扇(12V 0.5A)。通風(fēng)可以降低環(huán)境溫度和濕度,從而為植物授粉。
程序 10:加注水箱
使用 1 通道繼電器模塊控制 12V 水泵。您可以根據(jù)需要選擇供水或?qū)⑺酶臑?2V水電磁閥。
- 功率:24W
- 流量:5升/分鐘
- 進(jìn)水壓力:0.48 MPa
程序 11:水
使用 1 通道繼電器模塊控制兩個(gè) 12V DC 隔膜泵。水被泵送并施用于土壤。
程序 12:我們?yōu)槭裁匆褂美^電器模塊?
繼電器模塊通常用于切換使用比大多數(shù)微控制器可以處理的電壓更高的電壓的設(shè)備。
您可以使用兩個(gè)1路繼電器模塊和一個(gè)4路繼電器模塊來實(shí)現(xiàn)自動(dòng)噴灑、加熱、水箱加水、通風(fēng)和澆水。
- 1通道繼電器模塊
- 4通道繼電器模塊
- 繼電器引腳
程序 13:選擇室內(nèi)花園
選擇一個(gè)簡(jiǎn)單的傳統(tǒng)室內(nèi)花園進(jìn)行改造。
我們準(zhǔn)備了一個(gè)傳統(tǒng)的室內(nèi)花園,配有種植燈板和大型土壤容器。
這個(gè)花園有以下功能:
程序 14:花園供電
花園需要四種電源,即220V AC、12V DC、5V DC和3.3V DC。為此,我們使用以下解決方案:
- 220V AC:來自 220V/50 Hz 電網(wǎng)的電源。
- 12V DC:將 S-120-12 開關(guān)電源連接到 220V AC 電網(wǎng)。
12V散熱風(fēng)扇與紅外線燈泡相連。紅外燈泡連接到 220V 交流電源。隔離開關(guān)電源模塊 (12V 400 mA) 為冷卻風(fēng)扇產(chǎn)生 12V DC。
- 5V DC:為繼電器模塊和超聲波霧化器供電。
模塊規(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供電
步驟 15:設(shè)計(jì)亞克力盒子
我們使用 Adob??e AutoCAD 設(shè)計(jì)了一個(gè)亞克力盒子。注意事項(xiàng):
- 鍋大小
- 組件尺寸和布局
- 固定孔位
- 接線用螺絲孔
下圖顯示了組件布局供您參考。您可以修改和重新設(shè)計(jì)以滿足您的需求。下載 2D 圖紙。
- 正視圖:
- 后視圖:
第 2 步:組裝
程序1:準(zhǔn)備材料
準(zhǔn)備以下組件和用品。
程序2:組裝亞克力盒
根據(jù)圖紙切割亞克力板。用粘合劑組裝丙烯酸組件。
程序 3:接線
程序 4:安裝組件
注意事項(xiàng):
- 組件位置。
- 上排風(fēng)口用于進(jìn)風(fēng)口,下排風(fēng)口用于出風(fēng)口。
- 電線使用和長(zhǎng)度。
- 光傳感器位置。
程序5:制作霧化器
- 找一個(gè)帶蓋的瓶子。
- 固定脫脂棉。
在蓋子上鉆一個(gè)直徑合適的孔來固定脫脂棉。放一些沙子或小石頭固定棉花的底部。
- 將水位感應(yīng)線通過蓋子孔插入瓶子。
- 修復(fù)霧化器。
1.如圖所示將造霧器放在蓋子上。
2. 重新擰上蓋子,但不要太緊。否則無法產(chǎn)生霧氣。如果沒有瓶子,您可以用熱膠固定霧化器。
程序 6:完成組裝
將組件放入盒子中并整理電線。
第 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)品。
- 找到自定義函數(shù)并單擊創(chuàng)建函數(shù)。設(shè)置自定義函數(shù)的屬性。
- 要設(shè)置溫度和濕度范圍,請(qǐng)?zhí)砑铀膫€(gè)整數(shù)數(shù)據(jù)點(diǎn) (DP),即Max Temp 、Min Temp 、Max Humidity和Min 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。
-
方法一: GitHub 倉(cāng)庫(kù)中的 BK7231T SDK
ty_iot_wf_bt_sdk_bk7231t
。 - 方法二: GitHub上的花園demo 。
程序 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.h
src
include
bk7231t_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
- 下圖顯示成功返回。
?
將固件燒錄到模塊后,我們開始進(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í)。
?
?
?
2.設(shè)置燈光顏色,生長(zhǎng)燈板相應(yīng)改變顏色。
?
?
3.當(dāng)倒計(jì)時(shí)設(shè)置為取消時(shí),植物燈板將關(guān)閉。
4.開啟自動(dòng)補(bǔ)光后,燈光亮度會(huì)不斷增加,直到達(dá)到預(yù)設(shè)值。
程序二:溫濕度控制
1.可以在涂鴉智能APP上查看當(dāng)前環(huán)境溫度和濕度。
?
?
2.如果您設(shè)置的最小濕度大于當(dāng)前濕度,霧化器將啟動(dòng)。當(dāng)環(huán)境濕度超過最小值時(shí),制霧器將停止。
?
?
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 ,開啟水泵。
?
?
?
?
1:通風(fēng)繼電器模塊
2:噴涂繼電器模塊
3:補(bǔ)水箱繼電器模塊
?
3.將水位傳感器放入杯中,加水至銅線完全沒入。您會(huì)發(fā)現(xiàn)水泵停止并且應(yīng)用程序上的Pump恢復(fù)。
?
?
4.水箱水位變?yōu)?00。
?
?
程序 4:自動(dòng)澆水
- 當(dāng)您打開花園時(shí),用于澆水的水泵將持續(xù)運(yùn)行。
?
?
- 4:澆水繼電器模塊
- 5:加熱繼電器模塊
2.將土壤濕度傳感器放入水中,模擬土壤濕度達(dá)到閾值的情況。你會(huì)發(fā)現(xiàn)水泵停止。
概括
恭喜!您已成功構(gòu)建智能室內(nèi)花園的原型。依托涂鴉物聯(lián)網(wǎng)平臺(tái),您可以快速輕松地從零開始構(gòu)建各種智能原型。
- 基于物聯(lián)網(wǎng)技術(shù)的農(nóng)業(yè)種植環(huán)境監(jiān)控系統(tǒng)設(shè)計(jì)
- 支持物聯(lián)網(wǎng)的16x2 LCD屏幕
- 使用Arduino構(gòu)建基于物聯(lián)網(wǎng)的天氣監(jiān)測(cè)系統(tǒng)
- 構(gòu)建工業(yè)用物聯(lián)網(wǎng)
- 支持物聯(lián)網(wǎng)的智能風(fēng)扇速度控制器PCB板
- 探究機(jī)械工程物聯(lián)網(wǎng)系統(tǒng)遠(yuǎn)程解決方案 15次下載
- 構(gòu)建基于 MCU 安全物聯(lián)網(wǎng)系統(tǒng)
- 構(gòu)建基于 MCU 安全物聯(lián)網(wǎng)系統(tǒng)
- 什么是智能工廠-物聯(lián)網(wǎng)系統(tǒng) 7次下載
- 基于ZigBee和物聯(lián)網(wǎng)的智能草莓大棚控制系統(tǒng) 37次下載
- 基于藍(lán)牙4.0構(gòu)建醫(yī)療物聯(lián)網(wǎng)系統(tǒng) 12次下載
- 物聯(lián)網(wǎng)操作系統(tǒng)的技術(shù)路線有哪些之中國(guó)廠商的機(jī)遇有哪些
- 如何使用物聯(lián)網(wǎng)操作系統(tǒng)Zephyr實(shí)現(xiàn)“連續(xù)集成”開源軟件的詳細(xì)說明
- 使用物聯(lián)網(wǎng)進(jìn)行家庭智慧種植系統(tǒng)的設(shè)計(jì)方案的詳細(xì)資料說明 4次下載
- 物聯(lián)網(wǎng)果園種植遠(yuǎn)程監(jiān)控控制系統(tǒng) 4次下載
- 物聯(lián)網(wǎng)智能寵物管理系統(tǒng) 825次閱讀
- 基于阿里云物聯(lián)網(wǎng)平臺(tái)的智能燈光控制系統(tǒng)設(shè)計(jì) 4035次閱讀
- 如何使用M5Stamp PICO和Qubitro構(gòu)建物聯(lián)網(wǎng)門鎖監(jiān)控系統(tǒng) 1680次閱讀
- 基于電子標(biāo)簽和物聯(lián)網(wǎng)實(shí)現(xiàn)工業(yè)企業(yè)物聯(lián)網(wǎng)系統(tǒng)的設(shè)計(jì) 3698次閱讀
- 如何構(gòu)建一個(gè)完整的物聯(lián)網(wǎng)解決方案 4743次閱讀
- 為什么物聯(lián)網(wǎng)存儲(chǔ)基于對(duì)象 1424次閱讀
- 物聯(lián)網(wǎng)設(shè)備經(jīng)常遇到怎樣的網(wǎng)絡(luò)問題 1225次閱讀
- 突破物聯(lián)網(wǎng)界限,您準(zhǔn)備好了嗎?(文末免費(fèi)下載白皮書) 2027次閱讀
- 物聯(lián)網(wǎng)系統(tǒng)評(píng)價(jià)的模型如何去構(gòu)建實(shí)現(xiàn) 1328次閱讀
- 種植物聯(lián)網(wǎng)系統(tǒng)架構(gòu)圖和功能介紹 6211次閱讀
- 物聯(lián)網(wǎng)十大經(jīng)典開源操作系統(tǒng) 1w次閱讀
- 采用物聯(lián)網(wǎng)RFID技術(shù)構(gòu)建的智能圖書管理系統(tǒng)淺析 1683次閱讀
- 物聯(lián)網(wǎng)網(wǎng)關(guān)概述及系統(tǒng)設(shè)計(jì) 9432次閱讀
- 物聯(lián)網(wǎng)有哪些操作系統(tǒng)?物聯(lián)網(wǎng)操作系統(tǒng)匯總 5.4w次閱讀
- 利用物聯(lián)網(wǎng)生態(tài)圖研究物聯(lián)網(wǎng)的方法 6045次閱讀
下載排行
本周
- 1開關(guān)電源設(shè)計(jì)原理手冊(cè)
- 1.83 MB | 14次下載 | 免費(fèi)
- 2智能小車proteus仿真+C源程序
- 0.02 MB | 4次下載 | 免費(fèi)
- 3PL4807單節(jié)鋰離子電池充電器中文手冊(cè)
- 1.36 MB | 3次下載 | 免費(fèi)
- 4BQ769142技術(shù)參考手冊(cè)
- 2.99MB | 2次下載 | 免費(fèi)
- 5BQ77207EVM用戶指南
- 865.23KB | 2次下載 | 免費(fèi)
- 6TMR技術(shù)在電流傳感器中的應(yīng)用
- 616.47 KB | 1次下載 | 免費(fèi)
- 7CBM8605_8606_8608-運(yùn)算放大器【中文排版】-202406271735
- 2.70 MB | 1次下載 | 免費(fèi)
- 801-07-06-CBM8655_CBM8656精密運(yùn)算放大器
- 4.49 MB | 1次下載 | 免費(fèi)
本月
- 1XL4015+LM358恒壓恒流電路圖
- 0.38 MB | 155次下載 | 1 積分
- 2PCB布線和布局電路設(shè)計(jì)規(guī)則
- 0.40 MB | 52次下載 | 免費(fèi)
- 3GB/T4706.1-2024 家用和類似用途電器的安全第1部分:通用要求
- 7.43 MB | 14次下載 | 1 積分
- 4智能門鎖原理圖
- 0.39 MB | 14次下載 | 免費(fèi)
- 5開關(guān)電源設(shè)計(jì)原理手冊(cè)
- 1.83 MB | 14次下載 | 免費(fèi)
- 6elmo直線電機(jī)驅(qū)動(dòng)調(diào)試細(xì)則
- 4.76 MB | 9次下載 | 6 積分
- 7WIFI智能音箱原理圖完整版
- 0.09 MB | 7次下載 | 10 積分
- 8PC1013三合一快充數(shù)據(jù)線充電芯片介紹
- 1.03 MB | 7次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935115次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計(jì)
- 1.48MB | 420061次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233084次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191367次下載 | 10 積分
- 5十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183333次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81581次下載 | 10 積分
- 7Keil工具M(jìn)DK-Arm免費(fèi)下載
- 0.02 MB | 73806次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65985次下載 | 10 積分
評(píng)論
查看更多