• 方案介紹
  • 附件下載
  • 相關推薦
申請入駐 產(chǎn)業(yè)圖譜

基于STM32的智慧農(nóng)業(yè)管理系統(tǒng)設計與實現(xiàn)

06/03 10:13
1668
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

更多詳細資料請聯(lián)系.docx

共1個文件

一、前言

1.1 項目介紹

【1】項目功能

隨著全球農(nóng)業(yè)現(xiàn)代化進程的加快,以及物聯(lián)網(wǎng)、人工智能等先進技術的發(fā)展與應用,智慧農(nóng)業(yè)已經(jīng)成為現(xiàn)代農(nóng)業(yè)發(fā)展的新趨勢?;诰珳矢兄?、智能控制和遠程管理的智慧農(nóng)業(yè)系統(tǒng)能夠顯著提升農(nóng)作物生產(chǎn)效率,降低資源消耗,實現(xiàn)環(huán)境友好型可持續(xù)農(nóng)業(yè)生產(chǎn)。

在當前背景下,我國正大力推進數(shù)字鄉(xiāng)村建設,智慧農(nóng)業(yè)管理系統(tǒng)作為其中的重要組成部分,對于提高農(nóng)業(yè)生產(chǎn)精細化管理水平,解決傳統(tǒng)農(nóng)業(yè)中信息獲取不及時、人工管理成本高、決策缺乏科學依據(jù)等問題具有重要作用。

本設計開發(fā)一套基于STM32F103RCT6主控芯片的智慧農(nóng)業(yè)管理系統(tǒng),通過集成DHT11溫濕度傳感器、BH1750光照強度傳感器以及土壤濕度檢測傳感器,實時監(jiān)測農(nóng)田環(huán)境和作物生長狀態(tài),并在超出閾值時通過蜂鳴器報警,提醒管理人員進行灌溉、施肥等操作。同時,采用NBIoT通信技術(BC26模塊)將采集到的數(shù)據(jù)上傳至云端,利用EMQX開源MQTT服務器框架部署于華為云ECS服務器上的MQTT服務器,實現(xiàn)數(shù)據(jù)的遠程展示與處理。

系統(tǒng)支持微信小程序遠程控制功能,使得農(nóng)戶或管理者可以隨時隨地查看農(nóng)田環(huán)境參數(shù)、接收預警信息,并能遠程手動控制灌溉設備、補光燈等,大大提高了農(nóng)業(yè)生產(chǎn)的智能化和便捷性。此項目的實施不僅有助于推動我國農(nóng)業(yè)信息化水平的提升,也有利于農(nóng)業(yè)資源的高效利用,對保障國家糧食安全、促進農(nóng)業(yè)增效、農(nóng)民增收具有重要意義。

img

image-20240228104600454

【2】設計實現(xiàn)的功能

(1)實時環(huán)境監(jiān)測:系統(tǒng)通過集成的DHT11溫濕度傳感器、BH1750光照強度傳感器以及土壤濕度檢測傳感器,實時監(jiān)測農(nóng)田環(huán)境中的溫度、濕度、光照強度和土壤含水量等關鍵參數(shù)。當這些參數(shù)超過或低于預設閾值時,系統(tǒng)將自動觸發(fā)蜂鳴器報警,提醒管理人員關注并采取相應措施。

(2)自動化管理與預警:根據(jù)土壤濕度傳感器檢測的數(shù)據(jù),如果土壤濕度低于設定的適宜作物生長的含水量閥值,則系統(tǒng)會自動提醒管理者進行灌溉操作。同時,可以按照預設周期發(fā)送施肥提醒,以確保農(nóng)作物在最佳時期得到充足的水分和養(yǎng)分供應。

(3)遠程控制功能:利用NBIoT通信技術(BC26模塊)將現(xiàn)場采集到的各項數(shù)據(jù)上傳至云端MQTT服務器,并通過微信小程序?qū)崿F(xiàn)遠程訪問和展示。用戶可以通過微信小程序查看實時監(jiān)測數(shù)據(jù),以及對農(nóng)田設備進行遠程手動控制,如啟動或關閉5V抽水泵進行灌溉,開啟或關閉白色LED補光燈調(diào)節(jié)光照條件。

(4)數(shù)據(jù)上云與分析:基于EMQX開源MQTT服務器框架搭建的MQTT服務器,能夠接收并處理STM32主控板傳輸?shù)霓r(nóng)業(yè)環(huán)境數(shù)據(jù),并對接微信小程序平臺,為用戶提供直觀易懂的數(shù)據(jù)圖表和分析結(jié)果,便于農(nóng)戶或農(nóng)業(yè)技術人員進行科學決策和精準管理。

【3】項目硬件模塊組成

(1)主控模塊: 采用STM32F103RCT6微控制器作為核心控制單元,負責整個系統(tǒng)的運行和管理。STM32F103RCT6具有豐富的外設接口、強大的處理能力和低功耗特性,能夠?qū)崟r處理傳感器數(shù)據(jù)、執(zhí)行邏輯判斷,并通過無線通信模塊發(fā)送和接收指令。

(2)環(huán)境監(jiān)測模塊:

  • 溫濕度監(jiān)測:使用DHT11溫濕度傳感器采集農(nóng)田環(huán)境的溫度和濕度信息。
  • 光照強度監(jiān)測:采用BH1750光照強度傳感器測量農(nóng)田的光照強度。
  • 土壤濕度檢測:使用土壤濕度檢測傳感器獲取作物生長區(qū)域的土壤含水量數(shù)據(jù)。

(3)控制輸出模塊:

  • 補光燈控制:配置白色LED燈作為補光光源,根據(jù)光照強度監(jiān)測結(jié)果,通過STM32主控板進行智能調(diào)節(jié)或遠程手動控制。
  • 灌溉系統(tǒng)控制:采用5V抽水泵配合繼電器實現(xiàn)灌溉功能,當土壤濕度低于預設閾值時,STM32主控板將控制繼電器閉合,啟動抽水泵進行灌溉;反之則停止灌溉。

(4)無線通信模塊: 集成NBIoT-BC26模塊,實現(xiàn)與云端服務器的數(shù)據(jù)交互。該模塊具備廣覆蓋、低功耗、大連接的特點,可確保在各種復雜農(nóng)業(yè)環(huán)境中穩(wěn)定地傳輸數(shù)據(jù)至MQTT服務器。

(5)報警模塊: 系統(tǒng)配備蜂鳴器用于異常情況報警,當環(huán)境參數(shù)超出設定范圍時,主控板會驅(qū)動蜂鳴器發(fā)出聲音警報。

1.2 設計思路

(1)系統(tǒng)需求分析:根據(jù)智慧農(nóng)業(yè)管理的實際需求,確定需要監(jiān)測的關鍵環(huán)境參數(shù)(溫度、濕度、光照強度和土壤濕度),以及必要的控制功能(灌溉、補光燈控制等)。同時考慮遠程監(jiān)控與預警的需求,規(guī)劃通過NBIoT通信技術實現(xiàn)數(shù)據(jù)上傳及遠程操控。

(2)硬件選型與設計:

  • 主控芯片選擇STM32F103RCT6,因其具有豐富的外設接口、強大的處理能力和低功耗特性,能夠滿足系統(tǒng)實時數(shù)據(jù)采集與控制的要求。
  • 選用DHT11作為溫濕度傳感器,BH1750作為光照強度傳感器,以及土壤濕度檢測傳感器,分別獲取農(nóng)田環(huán)境的基本信息。
  • 設計灌溉系統(tǒng),使用5V抽水泵配合繼電器控制灌溉,以響應土壤濕度的監(jiān)測結(jié)果。
  • 采用白色LED燈作為補光光源,并接入主控板進行智能調(diào)節(jié)或遠程控制。
  • 配備蜂鳴器用于異常情況報警。
  • 選用NBIoT-BC26模塊確保無線通信穩(wěn)定可靠,實現(xiàn)數(shù)據(jù)上云。

(3)軟件架構(gòu)設計:

  • 開發(fā)STM32的嵌入式軟件程序,負責讀取各傳感器數(shù)據(jù),執(zhí)行邏輯判斷,如環(huán)境參數(shù)超限時觸發(fā)報警、根據(jù)土壤濕度自動或手動控制灌溉、周期性提醒施肥等操作。
  • 實現(xiàn)NBIoT通信協(xié)議棧,將現(xiàn)場采集的數(shù)據(jù)通過BC26模塊發(fā)送至云端MQTT服務器。
  • 在云端部署EMQX開源MQTT服務器框架,接收并存儲前端設備發(fā)送的數(shù)據(jù)。
  • 開發(fā)微信小程序客戶端,對接MQTT服務器,展示農(nóng)田環(huán)境的各項實時監(jiān)測數(shù)據(jù),提供遠程手動控制界面。

1.3 傳感器功能介紹

(1)DHT11溫濕度傳感器

  • 功能:用于實時監(jiān)測農(nóng)田環(huán)境中的溫度和相對濕度。
  • 特點:DHT11是一種低成本、低功耗的數(shù)字式溫濕度復合傳感器,提供了一體化的解決方案。它能夠直接輸出經(jīng)過校準的數(shù)字信號,便于微處理器直接讀取,無需復雜的信號處理電路。

(2)BH1750光照強度傳感器

  • 功能:測量農(nóng)田或溫室內(nèi)的光照強度(照度),以判斷當前光照條件是否滿足作物生長需求。
  • 特點:BH1750是一款I2C接口的數(shù)字光照強度傳感器,具有高精度和寬量程的特點,可精確檢測光照強度,并支持多種分辨率模式切換以適應不同的應用場景。

(3)土壤濕度檢測傳感器

  • 功能:用于監(jiān)測種植區(qū)域土壤的水分含量,作為決定灌溉與否的重要依據(jù)。
  • 特點:這類傳感器通常采用電容式、電阻式或者頻域反射(FDR)等原理來檢測土壤濕度,通過轉(zhuǎn)換為電信號變化,從而實現(xiàn)對土壤含水量的非破壞性測定。其特點是能反映土壤實際濕潤狀況,幫助實現(xiàn)精準灌溉。

(4)蜂鳴器報警模塊

  • 功能:雖然不是傳統(tǒng)意義上的傳感器,但在本系統(tǒng)中作為報警裝置使用,當環(huán)境參數(shù)超出預設閾值時,由主控芯片STM32控制蜂鳴器發(fā)出聲音警報,提醒管理人員及時處理異常情況。

(5)5V抽水泵與繼電器組合

  • 功能:抽水泵與繼電器配合實現(xiàn)灌溉功能,繼電器根據(jù)土壤濕度傳感器的數(shù)據(jù)反饋控制抽水泵的開關狀態(tài),達到智能灌溉的目的。
  • 特點:繼電器作為電子開關,可以遠程控制大電流設備如抽水泵的通斷,實現(xiàn)小電流控制大電流,同時隔離了主控制器與負載之間的電氣連接,提高了系統(tǒng)的安全性。

(6)NBIoT-BC26模塊

  • 功能:作為物聯(lián)網(wǎng)通信組件,負責將采集到的各種數(shù)據(jù)無線傳輸至云端服務器,同時也接收來自云端的控制指令,實現(xiàn)遠程數(shù)據(jù)交互和控制。
  • 特點:NBIoT(窄帶物聯(lián)網(wǎng))技術具有低功耗、廣覆蓋、大連接的優(yōu)點,特別適合于智慧農(nóng)業(yè)這種需要大面積部署且網(wǎng)絡連接要求穩(wěn)定的場景。BC26模塊是基于NBIoT標準的通信模塊,具備良好的網(wǎng)絡兼容性和穩(wěn)定性。

1.4 開發(fā)工具的選擇

STM32的編程語言選擇C語言,C語言執(zhí)行效率高,大學里主學的C語言,C語言編譯出來的可執(zhí)行文件最接近于機器碼,匯編語言執(zhí)行效率最高,但是匯編的移植性比較差,目前在一些操作系統(tǒng)內(nèi)核里還有一些低配的單片機使用的較多,平常的單片機編程還是以C語言為主。C語言的執(zhí)行效率僅次于匯編,語法理解簡單、代碼通用性強,也支持跨平臺,在嵌入式底層、單片機編程里用的非常多,當前的設計就是采用C語言開發(fā)。

開發(fā)工具選擇Keil,keil是一家世界領先的嵌入式微控制器軟件開發(fā)商,在2015年,keil被ARM公司收購。因為當前芯片選擇的是STM32F103系列,STMF103是屬于ARM公司的芯片構(gòu)架、Cortex-M3內(nèi)核系列的芯片,所以使用Kile來開發(fā)STM32是有先天優(yōu)勢的,而keil在各大高校使用的也非常多,很多教科書里都是以keil來教學,開發(fā)51單片機、STM32單片機等等。目前作為MCU芯片開發(fā)的軟件也不只是keil一家獨大,IAR在MCU微處理器開發(fā)領域里也使用的非常多,IAR擴展性更強,也支持STM32開發(fā),也支持其他芯片,比如:CC2530,51單片機的開發(fā)。從軟件的使用上來講,IAR比keil更加簡潔,功能相對少一些。如果之前使用過keil,而且使用頻率較多,已經(jīng)習慣再使用IAR是有點不適應界面的。

二、EMQX開源MQTT服務器框架

EMQX是一款開源的、云原生的分布式物聯(lián)網(wǎng)MQTT消息服務器,設計目標是實現(xiàn)高可靠性,并支持承載海量物聯(lián)網(wǎng)終端的MQTT連接,以及在海量物聯(lián)網(wǎng)設備間實現(xiàn)低延時消息路由?;贓rlang/OTP平臺開發(fā),充分利用了Erlang/OTP的軟實時、低延時和分布式特性。

以下是EMQX服務器框架的詳細介紹:

(1)可擴展性:EMQX支持億級的MQTT服務訂閱,單節(jié)點能夠支持500萬MQTT設備連接,集群可擴展至1億并發(fā)MQTT連接。這種強大的擴展能力使其能夠適應不同規(guī)模的物聯(lián)網(wǎng)應用。

(2)安全性:EMQX提供了多種安全機制,包括SSL/TLS、密碼認證、增強認證和ACL(訪問控制列表)等,以保障數(shù)據(jù)傳輸和訪問的安全性。

(3)規(guī)則引擎:EMQX內(nèi)置了基于SQL的規(guī)則引擎,能夠?qū)崟r過濾、轉(zhuǎn)換和處理消息,提供靈活的消息處理機制。這使得應用程序能夠根據(jù)業(yè)務需求對消息進行靈活處理。

(4)數(shù)據(jù)存儲:EMQX企業(yè)版還提供了數(shù)據(jù)存儲功能,將客戶端上下線狀態(tài)、訂閱關系、離線消息、消息內(nèi)容以及消息回執(zhí)等操作記錄到各種數(shù)據(jù)庫中。這一功能在服務崩潰或客戶端異常離線后,能夠保留數(shù)據(jù),確保數(shù)據(jù)的完整性和可靠性。

(5)集群設計:EMQX采用Masterless的大規(guī)模分布式集群架構(gòu),實現(xiàn)了系統(tǒng)的高可用性和水平擴展。集群設計包括維護訂閱表、路由表和主題樹等數(shù)據(jù)結(jié)構(gòu),以實現(xiàn)消息轉(zhuǎn)發(fā)和投遞給各節(jié)點上的訂閱者。

(6)協(xié)議支持:EMQX完全支持MQTT 5.0和3.x協(xié)議標準,提供了更好的伸縮性、安全性和可靠性。同時,它還提供了對多種其他協(xié)議的支持,如WebSocket、TCP、SSL/TLS等。

(7)易用性:EMQX提供了豐富的API和插件管理功能,使得用戶可以方便地查看在線客戶端信息、踢出客戶端、管理插件狀態(tài)等。它還提供了可視化的管理界面和調(diào)試工具,方便用戶進行監(jiān)控和管理。

三、購買ECS云服務器

3.1 登錄官網(wǎng)

https://www.huaweicloud.com/

image-20231108104223041

3.2 購買ECS服務器

【1】選擇ECS彈性服務器

image-20231108104347511

【2】選擇ECS服務器的區(qū)域、配置信息、操作系統(tǒng)(我選擇的Ubuntu18.04 64位)。

image-20231108104741429

【3】購買彈性公網(wǎng)IP,配置帶寬。

image-20231108104901006

【4】配置密碼

image-20231108105046704

【5】選擇購買時長,我這里選擇了1個月時長

image-20231108105311420

【6】確認付費付款

image-20231108105349984

image-20231108105454687

收到郵件提醒,服務器創(chuàng)建成功。 (為了寫教程,花費320元,買了一個月服務器)

image-20231108105618267

【7】返回彈性服務器的控制臺

image-20231108105525415

【8】點擊服務器名字,可以進入到詳情頁面。

image-20231108110321756

3.3 配置安全組

要確保MQTT服務器常用的幾個端口已經(jīng)開放出出來。

image-20231108110539506

3.4 安裝FinalShell

Windows下安裝 FinalShell 終端,方便使用SSH協(xié)議遠程登錄到云服務器。 (當然,使用其他方式登錄也是一樣的)

image-20231108110719420

3.5 遠程登錄到云服務器終端

【1】新建連接,選擇SSH連接。

image-20231108110858411

【2】填入IP地址、用戶名、密碼

這里的主機就是填服務器的公網(wǎng)IP地址,密碼就是創(chuàng)建服務器輸入的密碼,用戶名直接用root。

image-20231108111008259

【3】點擊連接服務器

image-20231108111125207

【4】第一次登錄會彈出提示框,選擇接受并保存

image-20231108111208880

【5】接下來可以看到服務器已經(jīng)登錄成功了。

image-20231108111247385

四、Linux下安裝EMQX

本章節(jié)將介紹如何在 Ubuntu 系統(tǒng)中下載安裝并啟動 EMQX。

支持的 Ubuntu 版本:

  • Ubuntu 22.04
  • Ubuntu 20.04
  • Ubuntu 18.04

4.1 官網(wǎng)地址

鏈接:https://www.emqx.io/docs/zh/v5.2/deploy/install-ubuntu.html

4.2 通過Apt源安裝

EMQX 支持通過 Apt 源安裝,免除了用戶需要手動處理依賴關系和更新軟件包等的困擾,具有更加方便、安全和易用等優(yōu)點。

在命令行終端,復制下面的命令過去,按下回車鍵。

【1】通過以下命令配置 EMQX Apt 源:

curl -s https://assets.emqx.com/scripts/install-emqx-deb.sh | sudo bash

【2】運行以下命令安裝 EMQX:

sudo apt-get install emqx

【3】運行以下命令啟動 EMQX:

sudo systemctl start emqx

過程如下:

image-20231108111924723

image-20231108112053540

4.3 EMQX常用的命令

sudo systemctl emqx start    啟動
sudo systemctl emqx stop     停止
sudo systemctl emqx restart  重啟 

五、配置EMQX服務器

5.1 登錄EMQX內(nèi)置管理控制臺

EMQX 提供了一個內(nèi)置的管理控制臺,即 EMQX Dashboard。方便用戶通過 Web 頁面就能輕松管理和監(jiān)控 EMQX 集群,并配置和使用所需的各項功能。

在瀏覽器里輸入: http://122.112.225.194:18083 就可以訪問EMQX的后臺管理頁面??梢怨芾硪赃B接的客戶端或檢查運行狀態(tài)。

這里面的IP地址,就是自己ECS云服務器的公網(wǎng)IP地址。

打開瀏覽器后,輸入地址后打開的效果:

image-20231108112216658

默認用戶名和密碼:

用戶名:admin
密碼:public

第一次登錄會提示你修改新密碼,如果不想設置,也可以選擇跳過(公網(wǎng)服務器部署,還是要修改密碼安全些)。

下面修改新密碼:

image-20231108112320173

登錄成功的頁面顯示如下:

image-20231108112412396

5.2 MQTT配置

這里可以配置MQTT的一些參數(shù),根據(jù)自己的需求進行配置。

image-20231108112603617

5.3 測試MQTT通信

新建一個客戶端,點擊連接。

image-20231108112632462

連接之后,然后點擊訂閱,和發(fā)布,如果下面消息能正常的接收。說明MQTT服務器通信是已經(jīng)正常,沒問題了。

并且在這個頁面也可以看到主題發(fā)布主題訂閱的格式。

image-20231108112651564

5.4 MQTT客戶端登錄服務器測試

接下來就打開我們自己的MQTT客戶端登錄MQTT服務器進行測試數(shù)據(jù)的通信。

端口選擇: 1883

根據(jù)軟件參數(shù)填入?yún)?shù),登錄,進行主題的發(fā)布和訂閱。

image-20231108112828605

說明: 目前還沒有配置客戶端認證,現(xiàn)在只要IP和端口輸入正確,MQTT三元組可以隨便輸入,都可以登錄上服務器的,服務器沒有對三元組做校驗。

EMQ X 默認配置中啟用了匿名認證,任何客戶端都能接入 EMQX。沒有啟用認證插件或認證插件沒有顯式允許/拒絕(ignore)連接請求時,EMQX 將根據(jù)匿名認證啟用情況決定是否允許客戶端連接。

然后打開EMQX的管理后臺,可以看到我們的設備已經(jīng)登錄服務器了,名字為test1

image-20231108112900540

在訂閱主題的頁面也可以看到我們客戶端設備訂閱的主題。

image-20231108112938585

5.5 客戶端認證配置

EMQX 默認配置中啟用了匿名認證,任何客戶端都能接入 EMQX。沒有啟用認證插件或認證插件沒有顯式允許/拒絕(ignore)連接請求時,EMQX 將根據(jù)匿名認證啟用情況決定是否允許客戶端連接。

在正式產(chǎn)品里肯定是要啟用認證的,不然任何設備都能接入。

下面就介紹如何配置 客戶端認證。

【1】打開客戶端認證頁面

image-20231107160746380

【2】選擇密碼認證

image-20231107160844450

【3】選擇內(nèi)置數(shù)據(jù)庫

image-20231107160916912

【4】設置認證方式(都可以默認,不用改),直接點擊創(chuàng)建。

image-20231107161002220

【5】創(chuàng)建成功后,點擊用戶管理

image-20231107161043692

【6】添加用戶

image-20231107161154596

image-20231107161254779

【7】添加成功

image-20231107161317252

【8】添加完畢之后,打開MQTT客戶端可以進行測試。

登錄的時候,MQTT用戶名和密碼必須輸入正確,按照上一步添加的信息進行如實填寫,否則是無法登錄服務器的。

image-20231108113054185

5.6 客戶端授權配置

客戶端授權頁面可以配置每個客戶端(設備)的主題發(fā)布,訂閱權限。限制它是否可以發(fā)布主題,訂閱主題。 如果有需要就可以進行配置。

http://127.0.0.1:18083/#/authorization/detail/built_in_database?tab=users

【1】創(chuàng)建數(shù)據(jù)源

image-20231107153705954

【2】選擇內(nèi)置數(shù)據(jù)庫

image-20231107153725972

【3】完成創(chuàng)建

image-20231107153746654

【4】點擊權限管理

image-20231107153810651

【5】選擇客戶端ID,點擊添加

image-20231107153902413

【6】配置權限

image-20231107161803875

5.7 數(shù)據(jù)轉(zhuǎn)發(fā)(集成)

在集成選項里,可以對設備數(shù)據(jù)處理。 比如:轉(zhuǎn)發(fā)到自己的HTTP服務器,轉(zhuǎn)發(fā)到自己其他的MQTT服務器,創(chuàng)建規(guī)則,某些事件觸發(fā)某些動作等等。

image-20231107225638965

選擇數(shù)據(jù)橋接。

可以把數(shù)據(jù)發(fā)送端自己的HTTP服務器,或者發(fā)送到其他的MQTT服務器。

image-20231107225815739

選擇HTTP服務 (如果自己有HTTP服務器,可以將數(shù)據(jù)轉(zhuǎn)發(fā)給自己的HTTP服務器)。

image-20231107225942506

七、MQTT客戶端消息互發(fā)測試

7.1 添加2個設備

為了方便測試設備間互相訂閱主題,數(shù)據(jù)收發(fā),在客戶端認證頁面至少添加2個設備。我這里分別添加了test1test2

image-20231107163706657

7.2 設備間測試

設備A訂閱設備B的主題,設備B訂閱設備A的主題,實現(xiàn)數(shù)據(jù)互發(fā)。

image-20231108113409036

設備A的MQTT信息:

MQTT服務器地址:122.112.225.194
MQTT服務器端口號:1883
MQTT客戶端ID:AAA
MQTT用戶名:test1
MQTT登錄密碼:12345678

訂閱主題:BBB/#
發(fā)布主題:AAA/1
發(fā)布的消息:{ "msg": "我是AAA設備" }

設備B的MQTT信息:

MQTT服務器地址:122.112.225.194
MQTT服務器端口號:1883
MQTT客戶端ID:BBB
MQTT用戶名:test2
MQTT登錄密碼:12345678

訂閱主題:AAA/#
發(fā)布主題:BBB/1
發(fā)布的消息:{ "msg": "我是BBB設備" }

八、STM32硬件端開發(fā)

8.1 BC26模塊的AT指令調(diào)試過程

BC20/BC26 開啟GPS、連接MQTT服務器的AT指令發(fā)送流程。

(1)查詢模塊是否正常

AT

OK

(2)獲取卡號,查詢卡是否插好

AT+CIMI

460041052911195

OK

(3)激活網(wǎng)絡

AT+CGATT=1

OK

(4)獲取網(wǎng)絡激活狀態(tài)

AT+CGATT?

+CGATT: 1

OK

(5)查詢網(wǎng)絡質(zhì)量

AT+CSQ

+CSQ: 26,0

OK

(6)檢查網(wǎng)絡狀態(tài)

AT+CEREG=? //檢查網(wǎng)絡狀態(tài)
+CEREG: 0,1 //找網(wǎng)成功
OK

(7)激活GPS

激活GPS,要等一段時間
AT+QGNSSC=1

OK

(8)查詢GPS激活狀態(tài)

查詢激活狀態(tài),1表示成功激活
AT+QGNSSC?

+QGNSSC: 1

OK

(9)獲取一次GPS定位語句

AT+QGNSSRD="NMEA/RMC"
+QGNSSRD: $GNRMC,120715.00,A,3150.78179,N,11711.93433,E,0.000,,310818,,,A,V*19
OK

(10)連接MQTT服務器

AT+QMTOPEN=0,"a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com",1883

OK

+QMTOPEN: 0,0

(11)登錄MQTT服務器

命令格式: AT+QMTCONN=<tcpconnectID>,<clientID>,<username>,<password>
AT+QMTCONN=0,"6210e8acde9933029be8facf_dev1_0_0_2022021913","6210e8acde9933029be8facf_dev1","6cea55404b463e666cd7a6060daba745bbaa17fe7078dfef45f8151cdf19673d"

OK

+QMTCONN: 0,0,0

(12)訂閱主題

命令格式: AT+QMTSUB=<tcpconnectID>,<msgID>,"<topic1>”,<qos1>[,"<topic2>”,<qos2>…]

AT+QMTSUB=0,1,"$oc/devices/6210e8acde9933029be8facf_dev1/sys/messages/down",2

OK

+QMTSUB: 0,1,0,2

(13)發(fā)布主題

命令格式:AT+QMTPUB=<tcpconnectID>,<msgID>,<qos>,<retain>,"<topic>","<msg>"

先發(fā)送指令: 
AT+QMTPUB=0,0,0,0,"$oc/devices/6210e8acde9933029be8facf_dev1/sys/properties/repor"

等待返回 ">" 
接著發(fā)送數(shù)據(jù).不需要加回車。
"{"services": [{"service_id": "gps","properties":{"longitude":12.345,"latitude":33.345}}]}"
數(shù)據(jù)發(fā)送完畢,再發(fā)送結(jié)束符。 十六進制的值--0x1a  。某些串口調(diào)試助手可以適應ctrl+z 快捷鍵輸入0xA
等待模塊返回"OK",到此數(shù)據(jù)發(fā)送完成。    
OK

+QMTPUB: 0,0,0

8.2 BH1750傳感器

下面貼出的是BH1750核心讀取代碼,因為BH1750本身就是標準的IIC協(xié)議,下面就不貼出IIC協(xié)議了,直接貼出封裝讀取光敏信息的代碼。

#include "bh1750.h"
float Read_BH1750_Data()
{
    unsigned char t0;
    unsigned char t1;
    float t;
    u8 r_s=0;
    IIC_Start(); //發(fā)送起始信號
    IIC_WriteOneByteData(0x46);
    r_s=IIC_GetACK();//獲取應答
    if(r_s)printf("error:1rn");
    IIC_WriteOneByteData(0x01);
    r_s=IIC_GetACK();//獲取應答
     if(r_s)printf("error:2rn");
    IIC_Stop(); //停止信號 
    
    IIC_Start(); //發(fā)送起始信號
    IIC_WriteOneByteData(0x46);
    r_s=IIC_GetACK();//獲取應答
    if(r_s)printf("error:3rn");
    IIC_WriteOneByteData(0x01);
    r_s=IIC_GetACK();//獲取應答
    if(r_s)printf("error:4rn");
    IIC_Stop(); //停止信號 
    
    IIC_Start(); //發(fā)送起始信號
    IIC_WriteOneByteData(0x46);
    r_s=IIC_GetACK();//獲取應答
    if(r_s)printf("error:5rn");
    IIC_WriteOneByteData(0x10);
    r_s=IIC_GetACK();//獲取應答
    if(r_s)printf("error:6rn");
    IIC_Stop(); //停止信號 
    
    DelayMs(100); //等待
    
    IIC_Start(); //發(fā)送起始信號
    IIC_WriteOneByteData(0x47);
    r_s=IIC_GetACK();//獲取應答
    if(r_s)printf("error:7rn");
    
    t0=IIC_ReadOneByteData(); //接收數(shù)據(jù)
    IIC_SendACK(0); //發(fā)送應答信號
    t1=IIC_ReadOneByteData(); //接收數(shù)據(jù)
    IIC_SendACK(1); //發(fā)送非應答信號
    IIC_Stop(); //停止信號
    
     t=(((t0<<8)|t1)/1.2);
     return t;  
}


8.3 DHT11溫濕度模塊

下面貼出的是 DHT11 溫濕度傳感器驅(qū)動代碼。

#include "dht11.h"
#include "delay.h"

//復位DHT11
void DHT11_Rst(void)	   
{                 
	  DHT11_IO_OUT(); 	//SET OUTPUT
    DHT11_DQ_OUT=0; 	//拉低DQ
    DelayMs(20);    	//拉低至少18ms
    DHT11_DQ_OUT=1; 	//DQ=1 
	  DelayUs(30);     	//主機拉高20~40us
}
//等待DHT11的回應
//返回1:未檢測到DHT11的存在
//返回0:存在
u8 DHT11_Check(void) 	   
{   
	u8 retry=0;
	DHT11_IO_IN();//SET INPUT	 
  while (DHT11_DQ_IN&&retry<100)//DHT11會拉低40~80us
	{
		retry++;
		DelayUs(1);
	};	 
	if(retry>=100)return 1;
	else retry=0;
    while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后會再次拉高40~80us
	{
		retry++;
		DelayUs(1);
	};
	if(retry>=100)return 1;	    
	return 0;
}
//從DHT11讀取一個位
//返回值:1/0
u8 DHT11_Read_Bit(void) 			 
{
 	u8 retry=0;
	while(DHT11_DQ_IN&&retry<100)//等待變?yōu)榈?a class="article-link" target="_blank" href="/baike/1465710.html">電平
	{
		retry++;
		DelayUs(1);
	}
	retry=0;
	while(!DHT11_DQ_IN&&retry<100)//等待變高電平
	{
		retry++;
		DelayUs(1);
	}
	DelayUs(40);//等待40us
	if(DHT11_DQ_IN)return 1;
	else return 0;		   
}

//從DHT11讀取一個字節(jié)
//返回值:讀到的數(shù)據(jù)
u8 DHT11_Read_Byte(void)    
{        
    u8 i,dat;
    dat=0;
	for (i=0;i<8;i++) 
	{
   		dat<<=1; 
	    dat|=DHT11_Read_Bit();
    }						    
    return dat;
}


//從DHT11讀取一次數(shù)據(jù)
//temp:溫度值(范圍:0~50°)
//humi:濕度值(范圍:20%~90%)
//返回值:0,正常;1,讀取失敗
u8 DHT11_Read_Data(u8 *temp,u8 *humi)    
{        
 	u8 buf[5];
	u8 i;
	DHT11_Rst();
	//printf("------------------------rn");
	if(DHT11_Check()==0)
	{
		for(i=0;i<5;i++)//讀取40位數(shù)據(jù)
		{
			buf[i]=DHT11_Read_Byte();
		}
		if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
		{
			*humi=buf[0];
			*temp=buf[2];
		}
	}else return 1;
	return 0;	    
}


//初始化DHT11的IO口 DQ 同時檢測DHT11的存在
//返回1:不存在
//返回0:存在    	 
u8 DHT11_Init(void)
{
	RCC->APB2ENR|=1<<2;    //使能PORTA口時鐘 
	GPIOA->CRL&=0XFF0FFFFF;//PORTA.5 推挽輸出
	GPIOA->CRL|=0X00300000;
	GPIOA->ODR|=1<<5;      //輸出1				    
	DHT11_Rst();
	return DHT11_Check();
}

8.4 土壤濕度傳感器

通過 ADC 模塊讀取土壤濕度代碼:

#include "stm32f1xx_hal.h"
#include "stdio.h"

ADC_HandleTypeDef hadc1;
UART_HandleTypeDef huart1;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
static void MX_ADC1_Init(void);

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_USART1_UART_Init();
    MX_ADC1_Init();

    uint16_t adc_value;

    while (1)
    {
        HAL_ADC_Start(&hadc1); // 啟動 ADC 轉(zhuǎn)換
        if (HAL_ADC_PollForConversion(&hadc1, 100) == HAL_OK)
        {
            adc_value = HAL_ADC_GetValue(&hadc1); // 讀取 ADC 值
            char buffer[50];
            sprintf(buffer, "Soil Moisture: %drn", adc_value);
            HAL_UART_Transmit(&huart1, (uint8_t *)buffer, strlen(buffer), HAL_MAX_DELAY); // 通過串口打印土壤濕度數(shù)據(jù)
        }
        HAL_Delay(1000); // 延時1秒
    }
}

void SystemClock_Config(void)
{
    // 略,根據(jù)實際情況配置系統(tǒng)時鐘
}

static void MX_ADC1_Init(void)
{
    ADC_ChannelConfTypeDef sConfig = {0};

    hadc1.Instance = ADC1;
    hadc1.Init.ScanConvMode = DISABLE;
    hadc1.Init.ContinuousConvMode = DISABLE;
    hadc1.Init.DiscontinuousConvMode = DISABLE;
    hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
    hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
    hadc1.Init.NbrOfConversion = 1;
    if (HAL_ADC_Init(&hadc1) != HAL_OK)
    {
        Error_Handler();
    }

    sConfig.Channel = ADC_CHANNEL_0; // 修改為實際連接的通道
    sConfig.Rank = 1;
    sConfig.SamplingTime = ADC_SAMPLETIME_13CYCLES_5; // 根據(jù)實際情況調(diào)整采樣時間
    if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
    {
        Error_Handler();
    }
}

static void MX_USART1_UART_Init(void)
{
    huart1.Instance = USART1;
    huart1.Init.BaudRate = 115200;
    huart1.Init.WordLength = UART_WORDLENGTH_8B;
    huart1.Init.StopBits = UART_STOPBITS_1;
    huart1.Init.Parity = UART_PARITY_NONE;
    huart1.Init.Mode = UART_MODE_TX_RX;
    huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    huart1.Init.OverSampling = UART_OVERSAMPLING_16;
    if (HAL_UART_Init(&huart1) != HAL_OK)
    {
        Error_Handler();
    }
}

void Error_Handler(void)
{
    while (1)
    {
    }
}

#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t *file, uint32_t line)
{
}
#endif

8.5 硬件連線

硬件連接方式:
1. TFT 1.44 寸彩屏接線
GND   電源地
VCC   接5V或3.3v電源
SCL   接PC8(SCL)
SDA   接PC9(SDA)
RST   接PC10
DC    接PB7
CS    接PB8
BL	  接PB11


2. 板載LED燈接線
LED1---PA8
LED2---PD2 (被串口占用)


3. 板載按鍵接線
K0---PA0 
K1---PC5 
K2---PA15


4. ESP8266--WiFi模塊
ATK-ESP8266串口WIFI模塊與STM32的串口2相連接。
PA2(TX)--RXD 模塊接收腳
PA3(RX)--TXD 模塊發(fā)送腳
GND---GND 地
VCC---VCC 電源(3.3V~5.0V)


5. 環(huán)境光檢測檢測:BH1750數(shù)字傳感器
SDA-----PB7
SCL-----PB6
GND---GND 地
VCC---VCC 電源(3.3V~5.0V)


6. 溫濕度傳感器: DHT11
VCC--VCC
GND---GND
DAT---PA5 


7. 土壤濕度傳感器
VCC--->5V
GND--->GND
DAT--->PA1


8. 繼電器控制--水泵抽水
VCC--->5V
GND--->GND
DAT--->PA6

8.6 KEIL工程

image-20230411145037563

8.7 取模軟件使用

本地設備的LCD顯示屏上會顯示各種傳感器數(shù)據(jù),需要用到中文、數(shù)字、字母。

當前使用的取模軟件如下:

image-20230215171354548

這是軟件的設置頁面:

image-20230222103504914

8.8 核心代碼

   while(1)
   {
        //按鍵可以手動控制開啟水泵和補光燈
        key=KEY_Scan();
        if(key)printf("key=%drn",key);
       
        //模式切換
        if(key==2)
        {
            mode=!mode; //模式切換
            printf("按鍵按下: 執(zhí)行模式切換: %drn",mode);
        }  
       
        //控制水泵開關
        if(key==1)
        {
            MOTOR=!MOTOR;
            printf("控制水泵開關: %drn",MOTOR);
        }      
        //輪詢時間到達
        if(time_cnt>20)
        {
            //模式顯示
            if(mode)  //自動模式
            {
                LCD_ShowChineseFont(90,16*6+2,16,HZ_FONT_16[28],RED,0);
                LCD_ShowChineseFont(90+16,16*6+2,16,HZ_FONT_16[29],RED,0);
            }
            else    //手動模式
            {
                LCD_ShowChineseFont(90,16*6+2,16,HZ_FONT_16[30],RED,0);
                LCD_ShowChineseFont(90+16,16*6+2,16,HZ_FONT_16[31],RED,0);
            }
            
            //放到水里61,接觸空氣是135
            //越濕潤值越小,越干旱值越大
            //土壤濕度
            SOIL=GetAdcCHxDATA(1);
            SOIL = 4095 - SOIL;  //將干燥度轉(zhuǎn)為濕度
            printf("土壤濕度:%drn",SOIL);
            SOIL = (float)SOIL / (float)4095 * 100.0;
            
            //【土壤濕度顯示】        
            sprintf(data_buff,"%5d",SOIL);
            Gui_DrawFont_GBK16(72,16*4+2,RED,0,(u8*)data_buff);

            //自動模式下控制自動澆水
            if(mode)
            {
                //如果 SOIL <=0 表示是非法值,沒有放在土壤里
                if(SOIL>1)
                {
                    //根據(jù)濕度自動開關水泵澆水
                    //這里的值根據(jù)自己實際測試情況修改
                    if(SOIL<MAX_SOIL)
                    {
                        //第一次進來,才需要清除計數(shù)變量
                        if(motor_flag==0)
                        {
                            motor_sec_cnt=0;
                        }
                        motor_flag=1;  //澆水
                    }
                    else
                    {
                        motor_flag=0;  //停止?jié)菜?
                    } 
                }
                
            }
            
            //【濕度閥值顯示】
            sprintf(data_buff,"%4d",MAX_SOIL);
            Gui_DrawFont_GBK16(72,16*5+2,RED,0,(u8*)data_buff);
                
            //【1】光強度
            //讀取光強度
            BH1750=Read_BH1750_Data();
            printf("光強度:%drn",BH1750);

            //顯示光強度
            sprintf(data_buff,"%4d",BH1750);
            Gui_DrawFont_GBK16(72,16*2+2,RED,0,(u8*)data_buff);
            
            
            //【2】溫濕度
            //讀取溫濕度
            if(DHT11_Read_Data(&DHT11_T,&DHT11_H))
            {
                printf("溫度讀取失敗.rn");
            }
              
            printf("環(huán)境溫度:%drn環(huán)境濕度:%drn",DHT11_T,DHT11_H);

            //顯示溫度
            sprintf(data_buff,"%4d",DHT11_T);
            Gui_DrawFont_GBK16(72,16*0+2,RED,0,(u8*)data_buff);
            
            //顯示濕度
            sprintf(data_buff,"%4d",DHT11_H);
            Gui_DrawFont_GBK16(72,16*1+2,RED,0,(u8*)data_buff);
            
             //土壤溫度
            DS18B20=DS18B20_Get_Temp();

            //轉(zhuǎn)換土壤溫度
            sprintf(data_buff,"%d.%d",DS18B20>>4,DS18B20&0xF);   
            f_ds18b02=atof(data_buff);
            
            //顯示土壤溫度
            sprintf(data_buff,"%6.2f",f_ds18b02);
            Gui_DrawFont_GBK16(72,16*4+2,RED,0,(u8*)data_buff);
            
            printf("環(huán)境溫度:%d℃n",DHT11_T);
            printf("環(huán)境濕度:%dn",DHT11_H);
            printf("土壤濕度:%drn",SOIL);
            printf("土壤溫度:%frn",f_ds18b02);
            
            time_cnt=0;
            LED1=!LED1;
            
            //上報數(shù)據(jù)
            sprintf(data_buff,"{"services": [{"service_id": "stm32","properties":{"DHT11_T":%d,"DHT11_H":%d,"BH1750":%d,"SOIL":%d,"DS18B20":%f,"MOTOR":%d,"mode":%d,"MAX_SOIL":%d}}]}",
            DHT11_T,DHT11_H,BH1750,SOIL,f_ds18b02,MOTOR,mode,MAX_SOIL);
            
            MQTT_PublishData(POST_TOPIC,data_buff,0);
            printf("更新數(shù)據(jù).rn");
        }
        
        
        //接收WIFI返回的數(shù)據(jù)
        if(USART3_RX_FLAG)
        {
            USART3_RX_BUFFER[USART3_RX_CNT]='?';
            
            printf("WIFI收到數(shù)據(jù):rn");
            //向串口打印服務器返回的數(shù)據(jù)
            for(i=0;i<USART3_RX_CNT;i++)
            {
                printf("%c",USART3_RX_BUFFER[i]);
            }
            
            //如果是服務器下發(fā)了屬性事件  
            if(USART3_RX_CNT>5)
            {
                //開澆水電機
                if(strstr((char*)&USART3_RX_BUFFER[5],""MOTOR":1"))
                {
                    motor_sec_cnt=0;
                    motor_flag=1;
                }
                //關澆水電機
                else if(strstr((char*)&USART3_RX_BUFFER[5],""MOTOR":0"))
                {
                    motor_flag=0;
                }
                //設置濕度閥值
                else if(strstr((char*)&USART3_RX_BUFFER[5],""MAX_SOIL":"))
                {
                    find_p=strstr((char*)&USART3_RX_BUFFER[5],""MAX_SOIL":");
                    MAX_SOIL=atoi(find_p+11);
                    printf("設置濕度閥值:%drn",MAX_SOIL);
                }
                
                //自動模式
                if(strstr((char*)&USART3_RX_BUFFER[5],""mode":1"))
                {
                    mode=1;
                }
                //手動模式
                else if(strstr((char*)&USART3_RX_BUFFER[5],""mode":0"))
                {
                    mode=0;
                }
                
                
                //使用字符串查找函數(shù)
                //設置屬性,澆水
                //"motor":1
                if(strstr((char*)&USART3_RX_BUFFER[5],"sys/commands/request_id="))
                {
                    char *p=NULL;
                    p=strstr((char*)&USART3_RX_BUFFER[5],"request_id=");
                    if(p)
                    {        
                        //解析數(shù)據(jù)
                        //$oc/devices/6434f5044f1d6803244e5db4_dev1/sys/commands/request_id=d2d11779-5bf6-42e5-a5b8-6efc91c7166c{"paras":{"MOTOR":1},"service_id":"stm32","command_name":"澆水電機控制"}
                        strncpy(request_id,p,47);      
                    }
                    
                    //上報數(shù)據(jù)
                    sprintf(mqtt_message,"{"result_code":0,"response_name":"COMMAND_RESPONSE","paras":{"result":"success"}}");
                    
                    sprintf(data_buff,"$oc/devices/6434f5044f1d6803244e5db4_dev1/sys/commands/response/%s",
                    request_id);
                    
                    MQTT_PublishData(data_buff,mqtt_message,0);
                    
                    printf("發(fā)布主題:%srn",data_buff);
                    printf("發(fā)布數(shù)據(jù):%srn",mqtt_message);
                }      
            }
            
            USART3_RX_CNT=0;
            USART3_RX_FLAG=0;
        }
        
        DelayMs(10);
        time_cnt++;
	 }

8.9 程序正常運行效果

設備運行過程中會通過串口打印調(diào)試信息,我們可以通過串口打印了解程序是否正常。比如:ESP8266是否聯(lián)網(wǎng)成功,是否連接到服務器。

image-20230224011611980

image-20230224013625715

8.10 硬件技術問題

(1)STM32與物聯(lián)網(wǎng)服務器的交互協(xié)議

STM32硬件端與物聯(lián)網(wǎng)服務器通過WIFI進行通信。每間隔一端時間,STM32就會向物聯(lián)網(wǎng)服務器上傳當前傳感器的數(shù)據(jù)。

傳感器上傳組合的MQTT主題報文格式如下:

//上報數(shù)據(jù)
sprintf(data_buff,"{"services": [{"service_id": "stm32","properties":{"DHT11_T":%d,"DHT11_H":%d,"BH1750":%d,"SOIL":%d,"DS18B20":%f,"MOTOR":%d,"mode":%d,"MAX_SOIL":%d}}]}",
DHT11_T,DHT11_H,BH1750,SOIL,f_ds18b02,MOTOR,mode,MAX_SOIL);

MQTT_PublishData(POST_TOPIC,data_buff,0);

手機APP給STM32下發(fā)的消息:

len:162,Data:f$oc/devices/6434f5044f1d6803244e5db4_dev1/sys/commands/request_id=c1dc39a7-97d1-49f4-bee3-c6bc96e002c4{"paras":{"MOTOR":0},"service_id":null,"command_name":null}
len:166,Data:f$oc/devices/6434f5044f1d6803244e5db4_dev1/sys/commands/request_id=b5c6cee2-c3fc-4fc9-a9c5-8528e180ece4{"paras":{"MAX_SOIL":60},"service_id":null,"command_name":null}
len:166,Data:f$oc/devices/6434f5044f1d6803244e5db4_dev1/sys/commands/request_id=11715fde-1f5b-4864-8499-73cbedc24ec9{"paras":{"MAX_SOIL":89},"service_id":null,"command_name":null}
len:162,Data:f$oc/devices/6434f5044f1d6803244e5db4_dev1/sys/commands/request_id=29f10139-e414-4632-aeb1-4d17ac6a3959{"paras":{"MOTOR":1},"service_id":null,"command_name":null}
len:161,Data:f$oc/devices/6434f5044f1d6803244e5db4_dev1/sys/commands/request_id=86722292-d182-485a-a20f-e980643ead0e{"paras":{"mode":0},"service_id":null,"command_name":null}

(2)ESP8266-WIFI功能介紹

當前項目采用ESP8266模塊完成與智慧大屏的通訊,ESP8266支持AP和STA模式;當前項目里配置成STA模式,去連接指定的WIFI熱點,連接之后配置成TCP客戶端模式,連接智慧大屏創(chuàng)建的TCP服務器,然后就可以進行數(shù)據(jù)傳輸同通訊。ESP8266和智慧大屏必須在一個局域網(wǎng)里才可以連接,也就是需要連接同一個熱點。

下面是ESP8266的特點介紹:

ESP8266是一款Wi-Fi適用的可編程網(wǎng)絡單芯片,搭載一個Tensilica L106 32-位處理器,可支持802.11 b/g/n Wi-Fi 功能,還有一個低功耗的10-bit精度的模擬/數(shù)字信號處理器和高度集成的低功耗,高安全性的TLS/SSL協(xié)議核心,能夠支持用戶終端上的全功能的低成本IoT應用。

(3)DHT11溫濕度傳感器

DHT11是一款有已校準數(shù)字信號輸出的溫濕度傳感器。 其精度濕度±5%RH, 溫度±2℃,量程濕度5~95%RH, 溫度-20~+60℃。

DHT11應用專用的數(shù)字模塊采集技術和溫濕度傳感技術,確保產(chǎn)品具有極高的可靠性和卓越的長期穩(wěn)定性。傳感器包括一個電阻式感濕元件和一個NTC測溫元件,并與一個高性能8位單片機相連接。因此該產(chǎn)品具有品質(zhì)卓越、超快響應、抗干擾能力強、性價比極高等優(yōu)點。每個DHT11傳感器都在極為精確的濕度校驗室中進行校準。校準系數(shù)以程序的形式存在OTP內(nèi)存中,傳感器內(nèi)部在檢測信號的處理過程中要調(diào)用這些校準系數(shù)。單線制串行接口,使系統(tǒng)集成變得簡易快捷。超小的體積、極低的功耗,使其成為該類應用中,在苛刻應用場合的最佳選擇。產(chǎn)品為4針單排引腳封裝,連接方便。

該傳感器包括一個電阻式測濕元件和一個 NTC測溫元件,并與一個高性能 8 位單片機相連接。通過單片機等微處理器簡單的電路連接就能夠?qū)崟r的采集本地濕度和溫度。DHT11 與單片機之間能采用簡單的單總線進行通信,僅僅需要一個 I/O 口。傳感器內(nèi)部濕度和溫度數(shù)據(jù) 40Bit 的數(shù)據(jù)一次性傳給單片機,數(shù)據(jù)采用校驗和方式進行校驗,有效的保證數(shù)據(jù)傳輸?shù)臏蚀_性。DHT11 功耗很低,5V 電源電壓下,工作平均最大電流 0.5mA。

DHT11 的技術參數(shù)如下:

? 工作電壓范圍:3.3V-5.5V
? 工作電流 :平均 0.5mA
? 輸出:單總線數(shù)字信號
? 測量范圍:濕度 20~90%RH,溫度 0~50℃
? 精度 :濕度±5%,溫度±2℃
? 分辨率 :濕度 1%,溫度 1℃

DHT11 數(shù)字濕溫度傳感器采用單總線數(shù)據(jù)格式。即,單個數(shù)據(jù)引腳端口完成輸入輸出雙向傳輸。其數(shù)據(jù)包由 5Byte(40Bit)組成。數(shù)據(jù)分小數(shù)部分和整數(shù)部分,一次完整的數(shù)據(jù)傳輸為40bit,高位先出。

DHT11 的數(shù)據(jù)格式為:8bit 濕度整數(shù)數(shù)據(jù)+8bit 濕度小數(shù)數(shù)據(jù)+8bit 溫度整數(shù)數(shù)據(jù)+8bit 溫度小數(shù)數(shù)據(jù)+8bit 校驗和。其中校驗和數(shù)據(jù)為前四個字節(jié)相加。

九、硬件選型

【1】母對母杜邦線

作用: 連接模塊與單片機。

鏈接:https://detail.tmall.com/item.htm?ali_refid=a3_430582_1006:1104520036:N:MsF9mE9KLTC2IibWJh%20K1A==:adaa6d3d7abe6f1f07b87a36416ee4fb&ali_trackid=1_adaa6d3d7abe6f1f07b87a36416ee4fb&id=14466195609&skuId=3936936817454&spm=a230r.1.14.1

image-20230316142240375

【2】洞洞板

鏈接:https://detail.tmall.com/item.htm?spm=a230r.1.14.34.16b221829wBwAI&id=525489414251&ns=1&abbucket=9&skuId=3929211749440

image-20221031234443667

【3】USB下載線

鏈接:https://detail.tmall.com/item.htm?areaId=500100&cat_id=2&id=36635861113&is_b=1&rn=b29713f11d07002439272415bce5c7e1&skuId=3762719825529&spm=a220m.1000858.1000725.31.46e677b4qLTl6B&user_id=1695056989

image-20221208211912983

【4】STM32F103RCT6開發(fā)板

主控CPU采用STM32F103RCT6,這顆芯片包括48 KB SRAM、256 KB Flash、2個基本定時器、4個通用定時器、2個高級定時器、51個通用IO口、5個串口、2個DMA控制器、3個SPI、2個I2C、1個USB、1個CAN、3個12位ADC、1個12位DAC、1個SDIO接口,芯片屬于大容量類型,配置較高,整體符合硬件選型設計。當前選擇的這款開發(fā)板自帶了一個1.4寸的TFT-LCD彩屏,可以顯示當前傳感器數(shù)據(jù)以及一些運行狀態(tài)信息。

鏈接:https://detail.tmall.com/item.htm?id=540109077095&skuId=4456080806080&spm=a1z0d.6639537.1997196601.4.69157484Ospeps

image-20230316142634303

【5】 DHT11溫濕度傳感器

DHT11數(shù)字溫濕度傳感器是一款含有已校準數(shù)字信號輸出的溫濕度復合傳感器。它應用專用的數(shù)字模塊采集技術和溫濕度傳感技術,確保產(chǎn)品具有可靠性與卓越的長期穩(wěn)定性,成本低、相對濕度和溫度測量、快響應、抗干擾能力強、信號傳輸距離長、數(shù)字信號輸出、精確校準。傳感器包括一個電容式感濕元件和一個NTC測溫元件,并與一個高性能8位單片機相連接??捎糜谂照{(diào)、除濕器、測試及檢測設備、消費品、汽車、自動控制、數(shù)據(jù)記錄器、氣象站、家電、濕度調(diào)節(jié)器、醫(yī)療、其他相關濕度檢測控制。

特點如下:

1、可以檢測周圍環(huán)境的濕度

2、可以檢測周圍環(huán)境的溫度

3、濕度測量范圍:20%-95%(0度-50度范圍)濕度測量誤差:±5%4、溫度測量范圍:o度-50度溫度測量誤差:±2度

4、工作電壓3.3V-5V

5、輸出形式數(shù)字輸出

https://detail.tmall.com/item.htm?id=15598344236&ali_refid=a3_430582_1006:1104520036:N:TAiHo9GD8eTurMzH21/csQ==:bead289475b4a86864858785eb160a52&ali_trackid=1_bead289475b4a86864858785eb160a52&spm=a230r.1.14.1&skuId=4835521242383

image-20220319211432662

image-20220319211455249

【6】BH1750光敏傳感器

鏈接:https://detail.tmall.com/item.htm?abbucket=3&id=543135220776&ns=1&spm=a230r.1.14.16.d7597d40XRn0Ec

image-20230207211644477

【7】 ESP8266 WIFI

鏈接:https://detail.tmall.com/item.htm?spm=a230r.1.14.1.322267d12csSBI&id=609757779633&ns=1&abbucket=9&skuId=4447338308660

image-20230211133730875

■模塊采用串口(LVTTL) 與MCU (或其他串口設備) 通信,內(nèi)置TCP/IP協(xié)議棧,能夠?qū)崿F(xiàn)串口與WIFI之間的轉(zhuǎn)換
■模塊支持LVTTL串口, 兼容3…3V和5V單片機系統(tǒng)
■模塊支持串 口轉(zhuǎn)WIFI STA、串口轉(zhuǎn)AP和WIFI STA+WIFI AP的模式,從而快速構(gòu)建串口-WIFI數(shù)據(jù)傳輸方案
■模塊小巧(19mm*29mm), 通過6個2.54mm間距排針與外部連接

image.png
image.png
image.png
image.png
image.png
image.png

【8】 繼電器

鏈接:https://detail.tmall.com/item.htm?abbucket=0&id=41268748362&ns=1&spm=a21n57.1.0.0.1f98523c5N83UP

image-20230404101859351

【9】土壤濕度傳感器

鏈接: https://detail.tmall.com/item.htm?spm=a230r.1.14.16.f54e4813fvxQrB&id=37365775741&ns=1&abbucket=19&skuId=4136086852947

image-20221202143001552

十、上位機開發(fā)

10.1 說明

一套完整的物聯(lián)網(wǎng)產(chǎn)品。會分為設備端,服務器,上位機部分。

這個章節(jié),介紹采用Qt開發(fā)上位機的過程。利用EMQX提供的API接口與MQTT客戶端設備進行通信,完成數(shù)據(jù)上傳,命令下發(fā)等功能。

10.2 查看全部的API接口

幫助文檔地址: https://www.emqx.io/docs/zh/v5.0/admin/api.html#%E8%AE%A4%E8%AF%81

EMQX 提供了管理監(jiān)控 REST API,這些 API 遵循 OpenAPI (Swagger) 3.0 規(guī)范。
EMQX 在 REST API 上做了版本控制,EMQX 5.0.0 以后的所有 API 調(diào)用均以 /api/v5 開頭。

EMQX 服務啟動后,可以訪問 http://localhost:18083/api-docs/index.html (opens new window)來查看 API 的文檔。還可以直接在 Swagger UI 上嘗試執(zhí)行一些 API。

比如: 我的EMQX服務器是在華為云ECS服務器上搭建,公網(wǎng)IP是: 122.112.225.194

那我訪問API文檔的地址就是下面這樣的格式: 在瀏覽器里打開即可。

http://122.112.225.194:18083/api-docs/index.html

訪問效果如下:

image-20231109102334735

10.3 創(chuàng)建API密匙

【1】登錄EMQX的后臺管理頁面: http://122.112.225.194:18083/

【2】找到菜單里的 系統(tǒng)設置選項–>API密匙。

image-20231109102603268

【3】創(chuàng)建密匙。

image-20231109102641949

【4】填寫密匙名稱

image-20231109102751550

【5】創(chuàng)建成功

image-20231109102813593

【6】得到API Key 和 Secret Key

API Key    :  f072a6e9758b8cdf
Secret Key :  LzwPB71Yf7PTED39C7RGboz9C9ANhv83ULUynTANgog4hG    

10.4 測試API: 獲取節(jié)點信息

上一步已經(jīng)創(chuàng)建好API的訪問密匙,這里就以 獲取節(jié)點信息為例,調(diào)用獲取節(jié)點信息的API接口,獲取節(jié)點 信息。

接口在API文檔里的介紹:

image-20231109104834087

根據(jù)前面的API訪問路徑規(guī)則說明; 那么,獲取節(jié)點信息的API完整訪問路徑為:

http://122.112.225.194:18083/api/v5/nodes

接下來就用python寫一份代碼,測試一下接口是否可以正常訪問。 python代碼直接放服務器運行(主要是我本地沒有安裝python環(huán)境,云服務器的環(huán)境是已經(jīng)安裝OK的,測試方便)。

【1】在云服務器上創(chuàng)建一個python文件,方便測試代碼

image-20231109103413275

【2】創(chuàng)建之后FinaShell自動上傳到服務器

image-20231109103503799

【3】編輯代碼

在這里雙擊要編輯的文件,就可以打開文件進行編輯。默認采用內(nèi)置的編輯器,也可以選擇自己電腦上的外置編輯器。

image-20231109103639018

【4】代碼編輯完成,按下鍵盤快捷鍵Ctrl + S 保存文件內(nèi)容,保存之后文件內(nèi)容會自動同步到服務器。

image-20231109103835524

保存后提示,自動上傳。

image-20231109103905198

寫入的代碼如下:

import urllib.request
import json
import base64

username = 'f072a6e9758b8cdf'
password = 'LzwPB71Yf7PTED39C7RGboz9C9ANhv83ULUynTANgog4hG'

url = 'http://122.112.225.194:18083/api/v5/nodes'

req = urllib.request.Request(url)
req.add_header('Content-Type', 'application/json')

auth_header = "Basic " + base64.b64encode((username + ":" + password).encode()).decode()
req.add_header('Authorization', auth_header)

with urllib.request.urlopen(req) as response:
    data = json.loads(response.read().decode())

print(data)

【5】執(zhí)行代碼,返回結(jié)果

通過返回信息來看,節(jié)點信息獲取是沒有問題的。

root@emqx:~/emqx# python3 http_api_test.sh 
[{'connections': 0, 'edition': 'Opensource', 'live_connections': 0, 'load1': 0.0, 'load15': 0.0, 'load5': 0.0, 'log_path': '/var/log/emqx', 'max_fds': 1048576, 'memory_total': '3.66G', 'memory_used': '612.59M', 'node': 'emqx@127.0.0.1', 'node_status': 'running', 'otp_release': '25.3.2-2/13.2.2', 'process_available': 2097152, 'process_used': 543, 'role': 'core', 'sys_path': '/usr/lib/emqx', 'uptime': 84000040, 'version': '5.3.1-alpha.1'}]
root@emqx:~/emqx# python3 http_api_test.sh 
[{'connections': 0, 'edition': 'Opensource', 'live_connections': 0, 'load1': 0.0, 'load15': 0.0, 'load5': 0.0, 'log_path': '/var/log/emqx', 'max_fds': 1048576, 'memory_total': '3.66G', 'memory_used': '613.23M', 'node': 'emqx@127.0.0.1', 'node_status': 'running', 'otp_release': '25.3.2-2/13.2.2', 'process_available': 2097152, 'process_used': 543, 'role': 'core', 'sys_path': '/usr/lib/emqx', 'uptime': 84008046, 'version': '5.3.1-alpha.1'}]

image-20231109104126534

10.5 在線調(diào)試(獲取主題列表)

在編寫代碼之前,可以先測試下API接口的效果,可以直接在Swagger UI界面直接調(diào)試API。

地址: http://122.112.225.194:18083/api-docs/index.html#/

例如:以獲取以訂閱主題列表的API接口為例。

【1】在Swagger UI界面上找到對應的API接口。

image-20231109135332598

【2】點擊API說明,展開詳情

image-20231109135420842

【3】點擊右邊的試試看按鈕。

image-20231109135445907

【4】點擊執(zhí)行

image-20231109135529687

【5】然后會彈出提示框,讓你填入用戶名和密碼。

這個用戶名和密碼就是前面創(chuàng)建API密匙生成的API Key(用戶名)Secret Key(密碼)

API Key    :  f072a6e9758b8cdf
Secret Key :  LzwPB71Yf7PTED39C7RGboz9C9ANhv83ULUynTANgog4hG  

image-20231109135552701

【6】根據(jù)提示輸入用戶名和密碼,再點擊登錄。

image-20231109135742095

【7】再次點擊執(zhí)行,就可以看到接口返回的數(shù)據(jù)了。

并且在頁面上也寫出了,請求的信息。使用curl命令行給出詳細的請求過程,參考這個就可以自己寫代碼了。

image-20231109135909136

【8】API調(diào)用,curl命令行執(zhí)行代碼如下:

curl -X 'GET' 
  'http://122.112.225.194:18083/api/v5/topics?node=emqx%40127.0.0.1&page=1&limit=50' 
  -H 'accept: application/json'

【9】python代碼實現(xiàn)

import requests  
  
url = 'http://122.112.225.194:18083/api/v5/topics?node=emqx%40127.0.0.1&page=1&limit=50'  
headers = {'accept': 'application/json'}  
  
response = requests.get(url, headers=headers)  
  
if response.status_code == 200:  
    data = response.json()  
    # 在這里處理返回的數(shù)據(jù)  
    print(data)  
else:  
    print("請求失敗,狀態(tài)碼:", response.status_code)

10.6 在線調(diào)試(發(fā)布主題)

API里也支持發(fā)布主題,利用HTTP協(xié)議發(fā)布主題消息,如果設備端訂閱了該主題,就可以收到API接口發(fā)布的消息。

【1】先找到發(fā)布主題的API接口

image-20231109140301178

【2】點擊API名字,展開詳情

image-20231109140335187

【3】點擊右邊的Try it out按鈕。

image-20231109140418433

【4】參數(shù)填寫說明

因為這個接口是發(fā)送主題的,需要填參數(shù),填自己需要發(fā)布什么主題,什么消息。

出來的框框里就是發(fā)布信息,根據(jù)自己需要修改。

image-20231109140519545

topic就是發(fā)布的主題。 payload 就是發(fā)布的消息內(nèi)容。 只要MQTT客戶端訂閱了這個主題,就可以收到發(fā)布的消息。

這個主題的名字可以隨便改的。我這里就用默認的名字和內(nèi)容測試。

image-20231109143824763

{
  "payload_encoding": "plain",
  "topic": "api/example/topic",
  "qos": 0,
  "payload": "hello emqx api",
  "properties": {
    "payload_format_indicator": 0,
    "message_expiry_interval": 0,
    "response_topic": "some_other_topic",
    "correlation_data": "string",
    "user_properties": {
      "foo": "bar"
    },
    "content_type": "text/plain"
  },
  "retain": false
}

【5】MQTT客戶端登錄。

打開MQTT客戶端,登錄服務器,訂閱api/example/topic主題。

image-20231109144015067

【6】在API調(diào)試頁面,點擊執(zhí)行

image-20231109144118094

【7】執(zhí)行之后,在MQTT客戶端的就可以收到API下發(fā)的消息了。

image-20231109144140647

【8】API接口調(diào)用,curl命令行執(zhí)行的代碼如下:

curl -X 'POST' 
  'http://122.112.225.194:18083/api/v5/publish' 
  -H 'accept: application/json' 
  -H 'Content-Type: application/json' 
  -d '{
  "payload_encoding": "plain",
  "topic": "api/example/topic",
  "qos": 0,
  "payload": "hello emqx api",
  "properties": {
    "payload_format_indicator": 0,
    "message_expiry_interval": 0,
    "response_topic": "some_other_topic",
    "correlation_data": "string",
    "user_properties": {
      "foo": "bar"
    },
    "content_type": "text/plain"
  },
  "retain": false
}'

【9】Python代碼實現(xiàn)

import requests  
import json  
  
url = 'http://122.112.225.194:18083/api/v5/publish'  
headers = {  
    'accept': 'application/json',  
    'Content-Type': 'application/json'  
}  
data = {  
    "payload_encoding": "plain",  
    "topic": "api/example/topic",  
    "qos": 0,  
    "payload": "hello emqx api",  
    "properties": {  
        "payload_format_indicator": 0,  
        "message_expiry_interval": 0,  
        "response_topic": "some_other_topic",  
        "correlation_data": "string",  
        "user_properties": {  
            "foo": "bar"  
        },  
        "content_type": "text/plain"  
    },  
    "retain": False  
}  
  
response = requests.post(url, headers=headers, data=json.dumps(data))  
  
if response.status_code == 200:  
    print("消息發(fā)布成功")  
else:  
    print("消息發(fā)布失敗,狀態(tài)碼:", response.status_code)

10.7 安裝Qt環(huán)境

Qt的中文官網(wǎng): https://www.qt.io/zh-cn/image-20221207160550486

image-20221207160606892

QT5.12.6的下載地址:https://download.qt.io/archive/qt/5.12/5.12.6

打開下載鏈接后選擇下面的版本進行下載:

qt-opensource-windows-x86-5.12.6.exe 13-Nov-2019 07:28 3.7G Details

軟件安裝時斷網(wǎng)安裝,否則會提示輸入賬戶。

安裝的時候,第一個復選框里勾選一個mingw 32編譯器即可,其他的不管默認就行,直接點擊下一步繼續(xù)安裝。

image-20221203151742653

說明: 我這里只是介紹PC端的環(huán)境搭建(這個比較簡單)。 Android的開發(fā)環(huán)境比較麻煩,可以去我的博客里看詳細文章。

選擇MinGW 32-bit 編譯器:

image-20221203151750344

10.8 新建Qt工程

【1】新建工程

image-20231109131248752

【2】設置工程名字

image-20231109131438532

【3】選擇QWiget父類

image-20231109131459281

【4】選擇編譯套件: 如果電腦沒有安裝VS環(huán)境,就選MinGW,這個比較簡單沒有其他依賴環(huán)境問題。 具體看自己編譯的程序最終在哪里運行,來選擇合適的編譯器。

image-20231109131533021

【5】創(chuàng)建完成

image-20231109131624052

【6】點擊左下角設置發(fā)布類型。默認是Debug,選擇Release,運行效率高一些(如果需要調(diào)試就選擇Debug)。

image-20231109131733058

10.9 設計代碼

【1】獲取服務器節(jié)點信息

QString requestUrl;
QNetworkRequest request;

request.setUrl(QUrl("http://100.112.225.194:18083/api/v5/nodes"));
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
QString username = "f072a6e9758b8cdf";
QString password = "LzwPB71Yf7PTED39C7RGboz9C9ANhv83ULUynTANgog4hG";
QString concatenated = username + ":" + password;
QByteArray data = concatenated.toLocal8Bit().toBase64();
QString headerData = "Basic " + data;
request.setRawHeader("Authorization", headerData.toLocal8Bit());

//發(fā)送請求
manager->get(request);

【2】獲得訂閱的主題列表

QString requestUrl;
QNetworkRequest request;

request.setUrl(QUrl("http://100.112.225.194:18083/api/v5/topics"));
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
QString username = "f072a6e9758b8cdf";
QString password = "LzwPB71Yf7PTED39C7RGboz9C9ANhv83ULUynTANgog4hG";
QString concatenated = username + ":" + password;
QByteArray data = concatenated.toLocal8Bit().toBase64();
QString headerData = "Basic " + data;
request.setRawHeader("Authorization", headerData.toLocal8Bit());

//發(fā)送請求
manager->get(request);

【3】發(fā)布主題

void Widget::publish_topic_http_post(QString topic,QString message)
{
    QString requestUrl;
    QNetworkRequest request;

    request.setUrl(QUrl(QString("http://%1:18083/api/v5/publish").arg(emqx_ip)));
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
    request.setRawHeader("Authorization", "Basic ZjA3MmE2ZTk3NThiOGNkZjpMendQQjcxWWY3UFRFRDM5QzdSR2JvejlDOUFOaHY4M1VMVXluVEFOZ29nNGhH");

    QJsonObject payload;
    payload["payload_encoding"] = "plain";
    payload["topic"] = topic;    // "api/example/topic";
    payload["qos"] = 0;
    payload["payload"] =message; // "hello emqx api";

    QJsonObject properties;
    properties["payload_format_indicator"] = 0;
    properties["message_expiry_interval"] = 0;
    properties["response_topic"] = "some_other_topic";
    properties["correlation_data"] = "string";
    QJsonObject userProperties;
    userProperties["foo"] = "bar";
    properties["user_properties"] = userProperties;
    properties["content_type"] = "text/plain";

    payload["properties"] = properties;
    payload["retain"] = false;

    QJsonDocument jsonDoc(payload);
    QByteArray jsonData = jsonDoc.toJson();

    //發(fā)送請求
    manager->post(request, jsonData);
}

調(diào)用示例:

//發(fā)布主題
publish_topic_http_post("api/cmd/topic","hello mqtt dev");

十一、制作過程

image-20240226015633136

img

十二、總結(jié)

本智慧農(nóng)業(yè)管理系統(tǒng)設計與實現(xiàn)項目基于STM32F103RCT6微控制器為核心,通過集成DHT11溫濕度傳感器、BH1750光照強度傳感器和土壤濕度檢測傳感器等設備,構(gòu)建了一套全面的農(nóng)田環(huán)境監(jiān)測系統(tǒng)。當環(huán)境參數(shù)超出預設閾值時,系統(tǒng)能夠?qū)崟r報警并自動或提醒進行灌溉、施肥等操作,同時利用蜂鳴器發(fā)出聲音警報。

在遠程控制方面,系統(tǒng)采用NBIoT-BC26模塊實現(xiàn)了無線通信功能,將采集到的數(shù)據(jù)傳輸至云端MQTT服務器,并通過EMQX開源框架搭建的服務器處理數(shù)據(jù)。用戶可通過微信小程序隨時隨地查看農(nóng)田環(huán)境的各項實時數(shù)據(jù),實現(xiàn)對農(nóng)作物生長環(huán)境的遠程監(jiān)控,并能便捷地執(zhí)行手動灌溉、開啟補光燈等遠程控制操作。

本項目的成功實施,不僅有效提升了農(nóng)業(yè)生產(chǎn)過程中的智能化水平,降低了人工管理成本,而且為實現(xiàn)精準農(nóng)業(yè)和智慧農(nóng)業(yè)提供了有力的技術支持。未來,隨著物聯(lián)網(wǎng)技術、云計算人工智能技術的進一步發(fā)展,這套智慧農(nóng)業(yè)管理系統(tǒng)將有望在更多領域推廣使用,助力我國現(xiàn)代農(nóng)業(yè)朝著更高效、智能、可持續(xù)的方向邁進。

  • 更多詳細資料請聯(lián)系.docx
    下載
意法半導體

意法半導體

意法半導體(ST)集團于1987年6月成立,是由意大利的SGS微電子公司和法國Thomson半導體公司合并而成。1998年5月,SGS-THOMSON Microelectronics將公司名稱改為意法半導體有限公司。意法半導體是世界最大的半導體公司之一,公司銷售收入在半導體工業(yè)五大高速增長市場之間分布均衡(五大市場占2007年銷售收入的百分比):通信(35%),消費(17%),計算機(16%),汽車(16%),工業(yè)(16%)。 據(jù)最新的工業(yè)統(tǒng)計數(shù)據(jù),意法半導體是全球第五大半導體廠商,在很多市場居世界領先水平。例如,意法半導體是世界第一大專用模擬芯片和電源轉(zhuǎn)換芯片制造商,世界第一大工業(yè)半導體和機頂盒芯片供應商,而且在分立器件、手機相機模塊和車用集成電路領域居世界前列.

意法半導體(ST)集團于1987年6月成立,是由意大利的SGS微電子公司和法國Thomson半導體公司合并而成。1998年5月,SGS-THOMSON Microelectronics將公司名稱改為意法半導體有限公司。意法半導體是世界最大的半導體公司之一,公司銷售收入在半導體工業(yè)五大高速增長市場之間分布均衡(五大市場占2007年銷售收入的百分比):通信(35%),消費(17%),計算機(16%),汽車(16%),工業(yè)(16%)。 據(jù)最新的工業(yè)統(tǒng)計數(shù)據(jù),意法半導體是全球第五大半導體廠商,在很多市場居世界領先水平。例如,意法半導體是世界第一大專用模擬芯片和電源轉(zhuǎn)換芯片制造商,世界第一大工業(yè)半導體和機頂盒芯片供應商,而且在分立器件、手機相機模塊和車用集成電路領域居世界前列.收起

查看更多

相關推薦