• 方案介紹
    • 一、設(shè)計(jì)目標(biāo)
    • 二、總體設(shè)計(jì)方案
    • 三、硬件電路設(shè)計(jì)
    • 四、軟件設(shè)計(jì)
    • 五、調(diào)試過(guò)程
    • 六、關(guān)鍵問(wèn)題討論
    • 七、設(shè)計(jì)總結(jié)與體會(huì)
  • 附件下載
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

基于單片機(jī)設(shè)計(jì)的智慧農(nóng)業(yè)大棚檢測(cè)系統(tǒng)

05/26 11:47
462
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

更多詳細(xì)資料請(qǐng)聯(lián)系.docx

共1個(gè)文件

一、設(shè)計(jì)目標(biāo)

本項(xiàng)目基于單片機(jī)設(shè)計(jì)一個(gè)智慧農(nóng)業(yè)大棚檢測(cè)系統(tǒng),以提供實(shí)時(shí)監(jiān)測(cè)和管理大棚環(huán)境的關(guān)鍵參數(shù)。系統(tǒng)支持環(huán)境溫度、濕度檢測(cè),光照強(qiáng)度檢測(cè),并能根據(jù)預(yù)設(shè)的閥值進(jìn)行報(bào)警提示。為了實(shí)現(xiàn)數(shù)據(jù)的顯示和管理,該系統(tǒng)還利用Qt開(kāi)發(fā)了一款對(duì)應(yīng)的Android手機(jī)APP,通過(guò)藍(lán)牙傳輸模塊將單片機(jī)采集到的數(shù)據(jù)傳遞到手機(jī)APP上進(jìn)行顯示和管理。

具體功能如下:

【1】環(huán)境溫度和濕度檢測(cè):系統(tǒng)采用SHT30溫濕度傳感器,能夠?qū)崟r(shí)監(jiān)測(cè)大棚內(nèi)的溫度和濕度,并將數(shù)據(jù)傳輸給單片機(jī)進(jìn)行處理。

【2】光照強(qiáng)度檢測(cè):系統(tǒng)采用BH1750光照傳感器,能夠?qū)崟r(shí)監(jiān)測(cè)大棚內(nèi)的光照強(qiáng)度,并將數(shù)據(jù)傳輸給單片機(jī)進(jìn)行處理。

【3】報(bào)警閥值設(shè)置:系統(tǒng)支持按鍵操作,用戶可以通過(guò)按鍵調(diào)整報(bào)警閥值,以適應(yīng)不同的農(nóng)業(yè)環(huán)境需求。

【4】報(bào)警聲音提示:當(dāng)溫度、濕度或光照強(qiáng)度超過(guò)設(shè)定的閥值時(shí),系統(tǒng)將觸發(fā)報(bào)警,通過(guò)連接的蜂鳴器發(fā)出聲音提示,提醒用戶注意。

【5】數(shù)據(jù)顯示和管理:利用Qt開(kāi)發(fā)的Android手機(jī)APP能夠接收通過(guò)藍(lán)牙傳輸模塊從單片機(jī)端傳遞過(guò)來(lái)的數(shù)據(jù),并在手機(jī)上進(jìn)行實(shí)時(shí)顯示和管理。用戶可以通過(guò)手機(jī)APP查看當(dāng)前的溫度、濕度和光照強(qiáng)度數(shù)據(jù),同時(shí)也可以設(shè)置報(bào)警閥值。

通過(guò)上述設(shè)計(jì),該智慧農(nóng)業(yè)大棚檢測(cè)系統(tǒng)能夠?yàn)檗r(nóng)業(yè)生產(chǎn)提供實(shí)時(shí)的環(huán)境監(jiān)測(cè)和報(bào)警功能,幫助農(nóng)民有效管理大棚環(huán)境,提高農(nóng)作物的產(chǎn)量和質(zhì)量。同時(shí),通過(guò)手機(jī)APP的使用,用戶可以方便地查看和管理數(shù)據(jù),實(shí)現(xiàn)遠(yuǎn)程監(jiān)控和控制,提高農(nóng)業(yè)生產(chǎn)的便捷性和智能化水平。

二、總體設(shè)計(jì)方案

2.1 硬件設(shè)計(jì)

  • 主控芯片采用STM32F103RCT6,具有較高的性能和豐富的外設(shè)接口。
  • 溫濕度檢測(cè)模塊采用SHT30傳感器,可準(zhǔn)確采集環(huán)境溫度和濕度數(shù)據(jù)。
  • 光照強(qiáng)度檢測(cè)模塊采用BH1750傳感器,能夠?qū)崟r(shí)監(jiān)測(cè)大棚內(nèi)的光照情況。
  • 本地報(bào)警提示采用蜂鳴器,發(fā)出聲音提醒農(nóng)民進(jìn)行處理。
  • 通過(guò)藍(lán)牙模塊HC05,將STM32采集到的數(shù)據(jù)傳輸?shù)紸ndroid手機(jī)APP上。

2.2 軟件設(shè)計(jì)

  • 在STM32中編寫(xiě)固件程序,實(shí)現(xiàn)溫濕度傳感器和光照強(qiáng)度傳感器的數(shù)據(jù)采集和處理。
  • 設(shè)計(jì)蜂鳴器的驅(qū)動(dòng)程序,根據(jù)設(shè)定的閾值判斷是否觸發(fā)報(bào)警。
  • 使用藍(lán)牙模塊HC05與Android手機(jī)APP進(jìn)行通信,將采集到的數(shù)據(jù)傳輸?shù)绞謾C(jī)APP上。
  • 在Android手機(jī)APP中,利用Qt開(kāi)發(fā)界面,實(shí)現(xiàn)數(shù)據(jù)顯示、閾值設(shè)定和報(bào)警提示等功能。

2.3 整體流程

  • STM32通過(guò)SHT30和BH1750傳感器采集環(huán)境溫度、濕度和光照強(qiáng)度數(shù)據(jù)。
  • 處理采集到的數(shù)據(jù),判斷是否觸發(fā)報(bào)警條件。
  • 如果達(dá)到報(bào)警條件,則通過(guò)蜂鳴器發(fā)出聲音提示。
  • 將數(shù)據(jù)通過(guò)藍(lán)牙模塊HC05傳輸?shù)紸ndroid手機(jī)APP上。
  • 在Android手機(jī)APP上,實(shí)時(shí)顯示大棚內(nèi)的溫濕度和光照強(qiáng)度數(shù)據(jù)。
  • 農(nóng)民可以通過(guò)手機(jī)APP設(shè)置報(bào)警閾值,當(dāng)超過(guò)或低于設(shè)定的閾值時(shí),會(huì)觸發(fā)報(bào)警提示。

該方案實(shí)現(xiàn)了溫濕度、光照強(qiáng)度的實(shí)時(shí)檢測(cè)和數(shù)據(jù)傳輸,并提供了報(bào)警功能。通過(guò)這個(gè)智慧農(nóng)業(yè)大棚檢測(cè)系統(tǒng),農(nóng)民可以方便地監(jiān)測(cè)大棚內(nèi)的環(huán)境狀況,及時(shí)調(diào)控和管理,提高農(nóng)作物的生長(zhǎng)效果和產(chǎn)量。

三、硬件電路設(shè)計(jì)

本項(xiàng)目的硬件電路設(shè)計(jì)主要涉及主控芯片STM32F103RCT6的連接及傳感器模塊的接口設(shè)計(jì)。以下是項(xiàng)目的硬件電路設(shè)計(jì)概述:

3.1 主控芯片連接

STM32F103RCT6作為主控芯片,負(fù)責(zé)整個(gè)系統(tǒng)的控制和數(shù)據(jù)處理。它與其他模塊通過(guò)引腳連接進(jìn)行數(shù)據(jù)的接收和發(fā)送。 需要為主控芯片提供適當(dāng)?shù)?a class="article-link" target="_blank" href="/tag/%E7%94%B5%E6%BA%90/">電源供電,包括正常工作電壓和邏輯電壓。

image-20230829172530630

3.2 溫濕度傳感器連接

溫濕度傳感器SHT30通過(guò)I2C總線連接到主控芯片。主控芯片上的I2C接口引腳(如SDA和SCL)與傳感器的對(duì)應(yīng)引腳相連,以實(shí)現(xiàn)數(shù)據(jù)的讀取和控制。

image-20230829172622968

3.3 光照傳感器連接

光照傳感器BH1750通過(guò)I2C總線連接到主控芯片。主控芯片上的I2C接口引腳與傳感器的對(duì)應(yīng)引腳相連,以實(shí)現(xiàn)數(shù)據(jù)的讀取和控制。

image-20230829172645508

3.4 報(bào)警蜂鳴器連接

報(bào)警蜂鳴器通過(guò)一個(gè)GPIO引腳與主控芯片相連。當(dāng)報(bào)警條件觸發(fā)時(shí),主控芯片控制該引腳輸出高電平信號(hào),以激活蜂鳴器發(fā)出聲音提示。

image-20230829172718595

3.5 HC05藍(lán)牙模塊連接

HC05藍(lán)牙模塊用于實(shí)現(xiàn)單片機(jī)與Android手機(jī)APP之間的數(shù)據(jù)傳輸。它通過(guò)串口通信與主控芯片相連,主控芯片上的對(duì)應(yīng)串口引腳(如UART_TX和UART_RX)與藍(lán)牙模塊的對(duì)應(yīng)引腳相連。

image-20230829172947679

image-20230829172840965

四、軟件設(shè)計(jì)

4.1 主控芯片模塊

主控芯片(如STM32F103RCT6)負(fù)責(zé)整個(gè)系統(tǒng)的控制和數(shù)據(jù)處理。它與其他硬件模塊相連接,接收傳感器數(shù)據(jù),進(jìn)行數(shù)據(jù)處理和報(bào)警判斷,并控制蜂鳴器的發(fā)聲。

4.2 溫濕度傳感器模塊

溫濕度傳感器(如SHT30)通過(guò)I2C總線與主控芯片相連,負(fù)責(zé)實(shí)時(shí)監(jiān)測(cè)大棚內(nèi)的溫度和濕度。傳感器模塊將采集到的數(shù)據(jù)傳輸給主控芯片進(jìn)行處理。

實(shí)現(xiàn)代碼如下:

以下是STM32標(biāo)準(zhǔn)庫(kù)驅(qū)動(dòng)SHT30傳感器讀取溫濕度,并將數(shù)據(jù)通過(guò)串口打印出來(lái):

#include "stm32f10x.h"
#include "stdio.h"

#define SHT30_ADDR 0x44

void I2C1_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    I2C_InitTypeDef I2C_InitStructure;

    // 使能I2C1和GPIOB時(shí)鐘
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

    // I2C1引腳配置
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;  // 開(kāi)漏輸出
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    // I2C1配置
    I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
    I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;  // 50%占空比
    I2C_InitStructure.I2C_OwnAddress1 = 0x00;          // 主機(jī)模式下無(wú)效
    I2C_InitStructure.I2C_Ack = I2C_Ack_Disable;        // 禁止應(yīng)答
    I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
    I2C_InitStructure.I2C_ClockSpeed = 100000;  // 100kHz的速度
    I2C_Init(I2C1, &I2C_InitStructure);

    // 使能I2C1
    I2C_Cmd(I2C1, ENABLE);
}

void I2C1_Start(void)
{
    // 發(fā)送起始信號(hào)
    I2C_GenerateSTART(I2C1, ENABLE);

    // 等待起始信號(hào)發(fā)送完成
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))
        ;
}

void I2C1_Stop(void)
{
    // 發(fā)送停止信號(hào)
    I2C_GenerateSTOP(I2C1, ENABLE);
}

void I2C1_WriteByte(uint8_t byte)
{
    // 發(fā)送一個(gè)字節(jié)的數(shù)據(jù)
    I2C_SendData(I2C1, byte);

    // 等待發(fā)送完成
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
        ;
}

uint16_t I2C1_ReadByteAck(void)
{
    uint16_t data;

    // 使能應(yīng)答
    I2C_AcknowledgeConfig(I2C1, ENABLE);
    I2C_GenerateACK(I2C1, ENABLE);

    // 等待接收完成
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))
        ;

    // 讀取接收到的數(shù)據(jù)
    data = I2C_ReceiveData(I2C1);

    return data;
}

uint16_t I2C1_ReadByteNack(void)
{
    uint16_t data;

    // 禁止應(yīng)答
    I2C_AcknowledgeConfig(I2C1, DISABLE);
    I2C_GenerateACK(I2C1, DISABLE);

    // 等待接收完成
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))
        ;

    // 讀取接收到的數(shù)據(jù)
    data = I2C_ReceiveData(I2C1);

    return data;
}

void SHT30_Init(void)
{
    // 發(fā)送軟件復(fù)位指令
    I2C1_Start();
    I2C1_WriteByte(SHT30_ADDR << 1);
    I2C1_WriteByte(0x30);
    I2C1_WriteByte(0xA2);
    I2C1_Stop();

    delay_ms(100);
}

void SHT30_Measure(float *temperature, float *humidity)
{
    uint8_t buf[6];
    uint16_t temperature_raw, humidity_raw;

    // 發(fā)送測(cè)量指令
    I2C1_Start();
    I2C1_WriteByte(SHT30_ADDR << 1);
    I2C1_WriteByte(0x2C);
    I2C1_WriteByte(0x06);
    I2C1_Stop();

    delay_ms(20);

    // 讀取測(cè)量結(jié)果
    I2C1_Start();
    I2C1_WriteByte((SHT30_ADDR << 1) | 0x01);
    buf[0] = I2C1_ReadByteAck();
    buf[1] = I2C1_ReadByteAck();
    buf[2] = I2C1_ReadByteAck();
    buf[3] = I2C1_ReadByteAck();
    buf[4] = I2C1_ReadByteAck();
    buf[5] = I2C1_ReadByteNack();
    I2C1_Stop();

    // 計(jì)算溫度值
    temperature_raw = (buf[0] << 8) | buf[1];
    *temperature = -45.0 + 175.0 * (float)temperature_raw / 65535.0;

    // 計(jì)算濕度值
    humidity_raw = (buf[3] << 8) | buf[4];
    *humidity = 100.0 * (float)humidity_raw / 65535.0;
}

void USART1_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;

    // 使能USART1和GPIOA時(shí)鐘
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);

    // USART1引腳配置
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  // 復(fù)用推挽輸出
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // USART1配置
    USART_InitStructure.USART_BaudRate = 115200;  // 波特率為115200
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Tx;
    USART_Init(USART1, &USART_InitStructure);

    // 使能USART1
    USART_Cmd(USART1, ENABLE);
}

void USART1_SendChar(char ch)
{
    // 等待發(fā)送緩沖區(qū)為空
    while (!(USART1->SR & USART_FLAG_TXE))
        ;

    // 發(fā)送一個(gè)字符
    USART_SendData(USART1, ch);
}

int fputc(int ch, FILE *f)
{
    // 將數(shù)據(jù)通過(guò)串口發(fā)送
    USART1_SendChar((char)ch);
    return ch;
}

void delay_ms(uint32_t ms)
{
    while (ms--)
    {
        uint32_t count = 12000;
        while (count--)
            ;
    }
}

int main(void)
{
    float temperature, humidity;

    I2C1_Init();
    USART1_Init();

    SHT30_Init();

    printf("SHT30 Temperature and Humidity Testn");

    while (1)
    {
        SHT30_Measure(&temperature, &humidity);
        printf("Temperature: %.2f°C, Humidity: %.2f%%n", temperature, humidity);

        delay_ms(1000);  // 每隔1秒測(cè)量一次溫濕度
    }
}

以上代碼通過(guò)I2C總線驅(qū)動(dòng)STM32F103讀取SHT30溫濕度傳感器的數(shù)據(jù),并通過(guò)USART1串口打印出溫度和濕度值。

代碼設(shè)計(jì)流程介紹:

【1】引入頭文件:

#include "stm32f10x.h"
#include "stdio.h"

此處引入了STM32F10x系列微控制器的相關(guān)頭文件以及標(biāo)準(zhǔn)輸入輸出庫(kù)的頭文件。

【2】定義宏和函數(shù):

#define SHT30_ADDR 0x44

定義了SHT30傳感器的I2C地址為0x44。

void I2C1_Init(void);
void I2C1_Start(void);
void I2C1_Stop(void);
void I2C1_WriteByte(uint8_t byte);
uint16_t I2C1_ReadByteAck(void);
uint16_t I2C1_ReadByteNack(void);

定義了一系列用于控制I2C總線的函數(shù)。

void SHT30_Init(void);
void SHT30_Measure(float *temperature, float *humidity);

定義了初始化SHT30傳感器和測(cè)量溫濕度的函數(shù)。

void USART1_Init(void);
void USART1_SendChar(char ch);
int fputc(int ch, FILE *f);

定義了初始化USART1串口和發(fā)送字符的函數(shù),以及重定向標(biāo)準(zhǔn)輸出流的函數(shù)。

void delay_ms(uint32_t ms);

定義了延時(shí)函數(shù),用于在實(shí)現(xiàn)中添加延時(shí)。

【3】初始化函數(shù):

void I2C1_Init(void)

該函數(shù)用于初始化I2C1總線和相關(guān)的引腳。使能了I2C1和GPIOB的時(shí)鐘,然后配置了I2C1的引腳,包括引腳的速度和模式等。接著對(duì)I2C1進(jìn)行配置,包括模式、占空比、從機(jī)地址等參數(shù),并最后使能I2C1總線。

void USART1_Init(void)

該函數(shù)用于初始化USART1串口和相關(guān)的引腳。使能了USART1和GPIOA的時(shí)鐘,然后配置了USART1的引腳,包括引腳的速度和模式等。接著對(duì)USART1進(jìn)行配置,包括波特率、字長(zhǎng)、停止位、校驗(yàn)位等參數(shù),并最后使能USART1串口。

【4】I2C總線控制函數(shù):

void I2C1_Start(void)
void I2C1_Stop(void)
void I2C1_WriteByte(uint8_t byte)
uint16_t I2C1_ReadByteAck(void)
uint16_t I2C1_ReadByteNack(void)

這些函數(shù)用于控制I2C總線的起始、停止、寫(xiě)數(shù)據(jù)和讀數(shù)據(jù)操作。具體實(shí)現(xiàn)可以參考STM32的標(biāo)準(zhǔn)庫(kù)函數(shù)。

【5】SHT30傳感器初始化和測(cè)量函數(shù):

void SHT30_Init(void)
void SHT30_Measure(float *temperature, float *humidity)

SHT30_Init函數(shù)用于初始化SHT30傳感器。在函數(shù)中,發(fā)送軟件復(fù)位指令給傳感器,然后延時(shí)一段時(shí)間等待傳感器重置。

SHT30_Measure函數(shù)用于測(cè)量溫濕度數(shù)據(jù)。在函數(shù)中,發(fā)送測(cè)量指令給傳感器,然后延時(shí)等待傳感器完成測(cè)量。接著從傳感器讀取溫濕度數(shù)據(jù),并通過(guò)指針參數(shù)返回給主程序。

【6】串口控制函數(shù):

void USART1_SendChar(char ch)
int fputc(int ch, FILE *f)

USART1_SendChar函數(shù)用于通過(guò)USART1串口發(fā)送一個(gè)字符。在函數(shù)中,通過(guò)輪詢USART狀態(tài)寄存器的空閑標(biāo)志位,判斷發(fā)送緩沖區(qū)是否為空,然后把字符寫(xiě)入數(shù)據(jù)寄存器進(jìn)行發(fā)送。

fputc函數(shù)是C庫(kù)函數(shù)的重定向函數(shù),用于將標(biāo)準(zhǔn)輸出的字符發(fā)送到USART1串口。這里對(duì)于每個(gè)調(diào)用printf函數(shù)輸出的字符,都會(huì)通過(guò)USART1_SendChar函數(shù)發(fā)送出去。

【7】延時(shí)函數(shù):

void delay_ms(uint32_t ms)

這個(gè)函數(shù)用于實(shí)現(xiàn)毫秒級(jí)的延時(shí)。在函數(shù)中,通過(guò)循環(huán)等待的方式實(shí)現(xiàn)了延時(shí)。

【8】主函數(shù):

int main(void)

在主函數(shù)中,調(diào)用I2C1_InitUSART1_Init函數(shù)初始化I2C總線和USART1串口。然后調(diào)用SHT30_Init函數(shù)初始化SHT30傳感器。

進(jìn)入主循環(huán)后,通過(guò)循環(huán)調(diào)用SHT30_Measure函數(shù)測(cè)量溫濕度數(shù)據(jù),并通過(guò)printf函數(shù)打印出來(lái)。最后通過(guò)delay_ms函數(shù)延時(shí)1秒。

4.3 光照傳感器模塊

光照傳感器(如BH1750)通過(guò)I2C總線與主控芯片相連,負(fù)責(zé)實(shí)時(shí)監(jiān)測(cè)大棚內(nèi)的光照強(qiáng)度。傳感器模塊將采集到的數(shù)據(jù)傳輸給主控芯片進(jìn)行處理。

實(shí)現(xiàn)代碼如下:

使用STM32標(biāo)準(zhǔn)庫(kù)編寫(xiě)代碼驅(qū)動(dòng)BH1750讀取環(huán)境光照強(qiáng)度。

#include "stm32f10x.h"
#include "stdio.h"

#define BH1750_ADDR 0x23

void I2C1_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    I2C_InitTypeDef I2C_InitStructure;

    // 使能I2C1和GPIOB時(shí)鐘
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

    // I2C1引腳配置
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;  // 開(kāi)漏輸出
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    // I2C1配置
    I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
    I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;  // 50%占空比
    I2C_InitStructure.I2C_OwnAddress1 = 0x00;          // 主機(jī)模式下無(wú)效
    I2C_InitStructure.I2C_Ack = I2C_Ack_Disable;        // 禁止應(yīng)答
    I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
    I2C_InitStructure.I2C_ClockSpeed = 100000;  // 100kHz的速度
    I2C_Init(I2C1, &I2C_InitStructure);

    // 使能I2C1
    I2C_Cmd(I2C1, ENABLE);
}

void I2C1_Start(void)
{
    // 發(fā)送起始信號(hào)
    I2C_GenerateSTART(I2C1, ENABLE);

    // 等待起始信號(hào)發(fā)送完成
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))
        ;
}

void I2C1_Stop(void)
{
    // 發(fā)送停止信號(hào)
    I2C_GenerateSTOP(I2C1, ENABLE);
}

void I2C1_WriteByte(uint8_t byte)
{
    // 發(fā)送一個(gè)字節(jié)的數(shù)據(jù)
    I2C_SendData(I2C1, byte);

    // 等待發(fā)送完成
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
        ;
}

uint16_t BH1750_ReadData(void)
{
    uint16_t data = 0;

    // 設(shè)置BH1750模式(連續(xù)高分辨率測(cè)量模式)
    I2C1_Start();
    I2C1_WriteByte(BH1750_ADDR);
    I2C1_WriteByte(0x10);
    I2C1_Stop();

    // 延時(shí)等待測(cè)量結(jié)束
    delay_ms(20);

    // 讀取光照強(qiáng)度數(shù)據(jù)
    I2C1_Start();
    I2C1_WriteByte(BH1750_ADDR | 1);
    data = (I2C_ReceiveData(I2C1) << 8);
    I2C_AcknowledgeConfig(I2C1, DISABLE);
    I2C1_Stop();
    delay_ms(2);
    I2C_AcknowledgeConfig(I2C1, ENABLE);

    I2C1_Start();
    I2C1_WriteByte(BH1750_ADDR | 1);
    data |= I2C_ReceiveData(I2C1);
    I2C1_Stop();

    return data;
}

void USART1_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;

    // 使能USART1和GPIOA時(shí)鐘
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);

    // USART1引腳配置
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  // 復(fù)用推挽輸出
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // USART1配置
    USART_InitStructure.USART_BaudRate = 115200;  // 波特率為115200
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Tx;
    USART_Init(USART1, &USART_InitStructure);

    // 使能USART1
    USART_Cmd(USART1, ENABLE);
}

void USART1_SendChar(char ch)
{
    // 等待發(fā)送緩沖區(qū)為空
    while (!(USART1->SR & USART_FLAG_TXE))
        ;

    // 發(fā)送一個(gè)字符
    USART_SendData(USART1, ch);
}

int fputc(int ch, FILE *f)
{
    // 將數(shù)據(jù)通過(guò)串口發(fā)送
    USART1_SendChar((char)ch);
    return ch;
}

void delay_ms(uint32_t ms)
{
    while (ms--)
    {
        uint32_t count = 12000;
        while (count--)
            ;
    }
}

int main(void)
{
    uint16_t lightIntensity;

    I2C1_Init();
    USART1_Init();

    printf("BH1750 Light Intensity Testn");

    while (1)
    {
        lightIntensity = BH1750_ReadData();
        printf("Light Intensity: %d luxn", lightIntensity);

        delay_ms(1000);  // 每隔1秒讀取一次光照強(qiáng)度
    }
}

【1】上面代碼里定義了BH1750的地址BH1750_ADDR為0x23,這是BH1750的默認(rèn)地址。

【2】在I2C1_Init()函數(shù)中,初始化了I2C1總線和相關(guān)的GPIO引腳。通過(guò)RCC_APB1PeriphClockCmd和RCC_APB2PeriphClockCmd函數(shù)使能I2C1和GPIOB時(shí)鐘,然后配置GPIOB的引腳6和7為開(kāi)漏輸出模式(GPIO_Mode_AF_OD)。接著,使用I2C_Init函數(shù)初始化I2C1,并設(shè)置其工作模式為I2C_Mode_I2C、占空比為50%、禁止應(yīng)答、7位地址模式以及100kHz的通信速率。最后,通過(guò)I2C_Cmd函數(shù)使能I2C1。

【3】I2C1_Start()函數(shù)用于發(fā)送I2C總線的起始信號(hào)。調(diào)用I2C_GenerateSTART函數(shù)發(fā)送起始信號(hào),并使用I2C_CheckEvent函數(shù)等待起始信號(hào)發(fā)送完成。

【4】I2C1_Stop()函數(shù)用于發(fā)送I2C總線的停止信號(hào)。調(diào)用I2C_GenerateSTOP函數(shù)發(fā)送停止信號(hào)。

【5】I2C1_WriteByte()函數(shù)用于向I2C設(shè)備發(fā)送一個(gè)字節(jié)的數(shù)據(jù)。通過(guò)I2C_SendData函數(shù)發(fā)送數(shù)據(jù),并使用I2C_CheckEvent函數(shù)等待發(fā)送完成。

【6】BH1750_ReadData()函數(shù)用于讀取光照強(qiáng)度數(shù)據(jù)。,發(fā)送啟動(dòng)測(cè)量指令和模式設(shè)置指令(連續(xù)高分辨率測(cè)量模式)。然后等待測(cè)量結(jié)束的延時(shí)時(shí)間(20ms)。接著,通過(guò)兩次讀取數(shù)據(jù)寄存器的方式獲取光照強(qiáng)度數(shù)據(jù),并將其拼接為一個(gè)16位的無(wú)符號(hào)整數(shù)。

【7】USART1_Init()函數(shù)用于初始化USART1串口和相關(guān)的GPIO引腳。使用RCC_APB2PeriphClockCmd函數(shù)使能USART1和GPIOA時(shí)鐘,然后配置GPIOA的引腳9為復(fù)用推挽輸出模式(GPIO_Mode_AF_PP)。接著,通過(guò)USART_Init函數(shù)初始化USART1,并設(shè)置其波特率為115200、數(shù)據(jù)位長(zhǎng)度為8位、停止位為1位、無(wú)奇偶校驗(yàn)、無(wú)硬件流控制。最后,通過(guò)USART_Cmd函數(shù)使能USART1。

【8】USART1_SendChar()函數(shù)用于發(fā)送一個(gè)字符到USART1串口。使用USART_SR寄存器的USART_FLAG_TXE標(biāo)志位檢查發(fā)送緩沖區(qū)是否為空,然后通過(guò)USART_SendData函數(shù)發(fā)送字符數(shù)據(jù)。

【9】fputc()函數(shù)重定向了輸出流,使得通過(guò)printf函數(shù)打印的字符可以發(fā)送到USART1串口。在該函數(shù)中調(diào)用USART1_SendChar函數(shù)發(fā)送字符數(shù)據(jù),并返回該字符。

【10】delay_ms()函數(shù)用于進(jìn)行延時(shí),單位為毫秒。該函數(shù)使用嵌套循環(huán)實(shí)現(xiàn)了簡(jiǎn)單的延時(shí)功能,不同的系統(tǒng)時(shí)鐘頻率可能需要適當(dāng)調(diào)整。

【11】在main()函數(shù)中,依次調(diào)用I2C1_Init()USART1_Init()函數(shù)進(jìn)行初始化操作。然后,通過(guò)printf函數(shù)向串口發(fā)送初始信息。

【12】在主循環(huán)中,通過(guò)調(diào)用BH1750_ReadData()函數(shù)讀取光照強(qiáng)度數(shù)據(jù),并使用printf函數(shù)將其打印到串口。然后通過(guò)delay_ms函數(shù)進(jìn)行1秒的延時(shí),等待下一次讀取。

4.4 報(bào)警蜂鳴器模塊

報(bào)警蜂鳴器通過(guò)一個(gè)GPIO引腳與主控芯片相連。當(dāng)報(bào)警條件滿足時(shí),主控芯片控制該引腳輸出高電平信號(hào),以激活蜂鳴器發(fā)出聲音提示。

使用STM32F103標(biāo)準(zhǔn)庫(kù)編寫(xiě)的蜂鳴器控制代碼:

#include "stm32f10x.h"

#define BEEP_GPIO_PORT GPIOA
#define BEEP_GPIO_PIN  GPIO_Pin_8

void BEEP_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    // 使能GPIOA時(shí)鐘
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    // 配置蜂鳴器引腳為推挽輸出模式
    GPIO_InitStructure.GPIO_Pin = BEEP_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(BEEP_GPIO_PORT, &GPIO_InitStructure);
}

void BEEP_On(void)
{
    GPIO_SetBits(BEEP_GPIO_PORT, BEEP_GPIO_PIN);
}

void BEEP_Off(void)
{
    GPIO_ResetBits(BEEP_GPIO_PORT, BEEP_GPIO_PIN);
}

int main(void)
{
    BEEP_Init();

    while (1)
    {
        // 控制蜂鳴器開(kāi)啟和關(guān)閉
        BEEP_On();
        Delay_ms(500);
        BEEP_Off();
        Delay_ms(500);
    }
}

在代碼中,使用了GPIOA的第8個(gè)引腳作為蜂鳴器的控制引腳。BEEP_Init函數(shù)用于初始化蜂鳴器引腳,將其配置為推挽輸出模式。BEEP_OnBEEP_Off函數(shù)分別用于開(kāi)啟和關(guān)閉蜂鳴器。

main函數(shù)中,通過(guò)循環(huán)控制蜂鳴器以500ms的間隔進(jìn)行開(kāi)啟和關(guān)閉操作。

4.5 HC05藍(lán)牙模塊模塊

HC05藍(lán)牙模塊通過(guò)串口通信與主控芯片相連,負(fù)責(zé)實(shí)現(xiàn)與Android手機(jī)APP之間的數(shù)據(jù)傳輸和通信。它接收主控芯片發(fā)送的數(shù)據(jù),并通過(guò)藍(lán)牙與手機(jī)APP進(jìn)行交互。

使用STM32標(biāo)準(zhǔn)庫(kù)編寫(xiě)代碼,用于通過(guò)串口2驅(qū)動(dòng)HC05模塊,并進(jìn)行配置和數(shù)據(jù)通信

#include "stm32f10x.h"
#include "stdio.h"

// HC05配置指令
#define AT_CMD_MODE     "AT+CMODE=0rn"     // 配置為從模式
#define AT_CMD_PW       "AT+PSWD=1234rn"   // 配對(duì)密碼設(shè)置為1234

// 函數(shù)聲明
void USART2_Init(void);
void USART2_SendChar(char ch);
void USART2_SendString(char* str);
char USART2_Receive(void);

int main(void)
{
    // 初始化USART2串口
    USART2_Init();
    
    // 發(fā)送AT指令配置HC05為從模式
    USART2_SendString(AT_CMD_MODE);
    for(int i = 0; i < 1000000; i++);  // 等待一段時(shí)間
    
    // 發(fā)送AT指令配置配對(duì)密碼
    USART2_SendString(AT_CMD_PW);
    for(int i = 0; i < 1000000; i++);  // 等待一段時(shí)間
    
    while(1)
    {
        // 接收手機(jī)發(fā)送的數(shù)據(jù)
        char data = USART2_Receive();
        
        // 處理接收到的數(shù)據(jù),例如發(fā)送回應(yīng)等
        // ...
    }
}

void USART2_Init(void)
{
    // 使能USART2和GPIOA時(shí)鐘
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
    
    // 配置USART2的引腳
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;             // USART2_TX
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        // 復(fù)用推挽輸出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;      // GPIO速度為50MHz
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;             // USART2_RX
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;          // 上拉輸入
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    // 配置USART2的參數(shù)
    USART_InitTypeDef USART_InitStructure;
    USART_InitStructure.USART_BaudRate = 9600;             // 波特率為9600
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;     // 數(shù)據(jù)位長(zhǎng)度為8位
    USART_InitStructure.USART_StopBits = USART_StopBits_1;           // 停止位為1位
    USART_InitStructure.USART_Parity = USART_Parity_No;              // 無(wú)奇偶校驗(yàn)
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;   // 無(wú)硬件流控制
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;  // 支持收發(fā)模式
    USART_Init(USART2, &USART_InitStructure);
    
    // 使能USART2
    USART_Cmd(USART2, ENABLE);
}

void USART2_SendChar(char ch)
{
    while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);  // 等待發(fā)送緩沖區(qū)為空
    USART_SendData(USART2, (uint16_t)ch);  // 發(fā)送數(shù)據(jù)
}

void USART2_SendString(char* str)
{
    while(*str)
    {
        USART2_SendChar(*str++);
    }
}

char USART2_Receive(void)
{
    while (USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET);  // 等待接收緩沖區(qū)非空
    return (char)USART_ReceiveData(USART2);
}

以上代碼通過(guò)USART2串口與HC05模塊進(jìn)行通信,并發(fā)送AT指令對(duì)其進(jìn)行配置。其中,AT_CMD_MODE用于將HC05配置為從模式,AT_CMD_PW用于設(shè)置配對(duì)密碼為1234。

代碼設(shè)計(jì)思路介紹:

【1】引入頭文件:

#include "stm32f10x.h"
#include "stdio.h"

引入了STM32F10x系列微控制器的相關(guān)頭文件和標(biāo)準(zhǔn)輸入輸出庫(kù)的頭文件。

【2】定義宏和函數(shù):

#define AT_CMD_MODE     "AT+CMODE=0rn"
#define AT_CMD_PW       "AT+PSWD=1234rn"

void USART2_Init(void);
void USART2_SendChar(char ch);
void USART2_SendString(char* str);
char USART2_Receive(void);

定義了用于配置HC05模塊的AT指令,以及用于初始化USART2串口、發(fā)送字符和字符串、接收字符的函數(shù)。

【3】USART2串口初始化函數(shù):

void USART2_Init(void)

該函數(shù)用于初始化USART2串口和相關(guān)引腳。使能了USART2和GPIOA的時(shí)鐘,然后配置了USART2的引腳,包括引腳的模式和速度等。接著對(duì)USART2進(jìn)行配置,設(shè)置波特率、數(shù)據(jù)位長(zhǎng)度、停止位、奇偶校驗(yàn)位等參數(shù),并最后使能USART2串口。

【4】發(fā)送字符和字符串函數(shù):

void USART2_SendChar(char ch)
void USART2_SendString(char* str)

這些函數(shù)用于通過(guò)USART2串口發(fā)送字符和字符串。對(duì)于USART2_SendChar函數(shù),它會(huì)等待發(fā)送緩沖區(qū)為空,然后將字符寫(xiě)入數(shù)據(jù)寄存器進(jìn)行發(fā)送。對(duì)于USART2_SendString函數(shù),它會(huì)遍歷字符串中的每個(gè)字符,并調(diào)用USART2_SendChar函數(shù)進(jìn)行發(fā)送。

【5】接收字符函數(shù):

char USART2_Receive(void)

該函數(shù)用于從USART2串口接收一個(gè)字符。它會(huì)等待接收緩沖區(qū)非空,然后讀取數(shù)據(jù)寄存器的值并返回接收到的字符。此函數(shù)在主循環(huán)中可以用于接收HC05模塊發(fā)送的數(shù)據(jù)。

【6】主函數(shù):

int main(void)

在主函數(shù)中,調(diào)用USART2_Init函數(shù)初始化USART2串口。然后使用USART2_SendString函數(shù)依次發(fā)送配置指令AT_CMD_MODEAT_CMD_PW給HC05模塊。發(fā)送完指令后,通過(guò)循環(huán)調(diào)用USART2_Receive函數(shù)接收HC05模塊發(fā)送的數(shù)據(jù)。

五、調(diào)試過(guò)程

在項(xiàng)目設(shè)計(jì)完成后,進(jìn)行測(cè)試和調(diào)試是非常重要的,以確保系統(tǒng)的正常運(yùn)行和功能的有效性。

下面是本項(xiàng)目的測(cè)試和調(diào)試過(guò)程流程:

5.1 硬件測(cè)試

  • 檢查硬件組裝和連接是否正確,包括主控芯片STM32F103RCT6、傳感器模塊SHT30和BH1750以及藍(lán)牙模塊HC05的連接。
  • 使用示波器或多用途測(cè)試儀檢測(cè)各個(gè)模塊的電源供應(yīng)和信號(hào)線連接是否正常。
  • 測(cè)試溫濕度傳感器(SHT30)和光照強(qiáng)度傳感器(BH1750)是否能夠正確采集環(huán)境數(shù)據(jù)。
  • 測(cè)試蜂鳴器是否能夠發(fā)出合適的聲音提示。

5.2 固件程序測(cè)試

  • 在STM32開(kāi)發(fā)環(huán)境中編譯程序,將固件程序燒錄到主控芯片STM32F103RCT6上。
  • 使用串口調(diào)試助手等工具,與STM32建立通信連接,檢查數(shù)據(jù)的傳輸和接收是否正常。
  • 對(duì)溫濕度傳感器和光照強(qiáng)度傳感器進(jìn)行數(shù)據(jù)采集測(cè)試,觀察是否能夠準(zhǔn)確讀取傳感器數(shù)據(jù)。
  • 設(shè)置閾值并測(cè)試報(bào)警功能,確保報(bào)警觸發(fā)條件和報(bào)警提示的準(zhǔn)確性。

5.3 Android手機(jī)APP測(cè)試

  • 安裝開(kāi)發(fā)好的Android手機(jī)APP到測(cè)試設(shè)備上,確保安裝過(guò)程順利。
  • 打開(kāi)APP,并與藍(lán)牙模塊HC05進(jìn)行連接,觀察是否能夠成功建立通信。
  • 測(cè)試數(shù)據(jù)的傳輸和接收功能,確保從STM32接收到的數(shù)據(jù)能夠在APP界面上正確顯示。
  • 設(shè)置閾值并觸發(fā)報(bào)警測(cè)試,確認(rèn)報(bào)警提示(聲音、震動(dòng)、彈窗等)是否按照設(shè)定的條件正常工作。

5.4 系統(tǒng)整體測(cè)試

  • 模擬實(shí)際環(huán)境,調(diào)整大棚溫濕度和光照強(qiáng)度,觀察系統(tǒng)是否能夠準(zhǔn)確檢測(cè)并顯示環(huán)境參數(shù)。
  • 調(diào)整報(bào)警閾值,觸發(fā)報(bào)警條件,驗(yàn)證報(bào)警提示是否按照預(yù)期工作。
  • 進(jìn)行長(zhǎng)時(shí)間運(yùn)行測(cè)試,確保系統(tǒng)的穩(wěn)定性和可靠性。

六、關(guān)鍵問(wèn)題討論

6.1 本項(xiàng)目的核心與技術(shù)難點(diǎn)

【1】硬件集成:將主控芯片、傳感器模塊、藍(lán)牙模塊和蜂鳴器等多個(gè)硬件模塊進(jìn)行正確的連接和集成是一個(gè)挑戰(zhàn)。需要仔細(xì)設(shè)計(jì)電路連接、通信協(xié)議和接口定義,確保各個(gè)模塊能夠正常協(xié)同工作。

【2】數(shù)據(jù)處理與算法:在主控芯片的固件程序中,需要對(duì)傳感器采集到的數(shù)據(jù)進(jìn)行處理和分析,判斷是否觸發(fā)報(bào)警條件。這可能涉及到數(shù)據(jù)濾波、閾值判定、異常檢測(cè)等算法的設(shè)計(jì)和實(shí)現(xiàn)。

【3】藍(lán)牙通信:與手機(jī)APP之間的藍(lán)牙通信是一個(gè)難點(diǎn)。需要實(shí)現(xiàn)穩(wěn)定可靠的數(shù)據(jù)傳輸和通信協(xié)議,確保數(shù)據(jù)的準(zhǔn)確性和實(shí)時(shí)性。

6.2 本項(xiàng)目的實(shí)用性

【1】實(shí)時(shí)監(jiān)測(cè)和報(bào)警功能:該項(xiàng)目能夠?qū)崟r(shí)監(jiān)測(cè)大棚內(nèi)的溫度、濕度和光照強(qiáng)度,并在超過(guò)設(shè)定閥值時(shí)觸發(fā)報(bào)警。這對(duì)于農(nóng)業(yè)生產(chǎn)者來(lái)說(shuō)非常實(shí)用,能夠幫助他們及時(shí)發(fā)現(xiàn)問(wèn)題并采取措施,以保證大棚內(nèi)環(huán)境的穩(wěn)定和作物的健康生長(zhǎng)。

【2】遠(yuǎn)程監(jiān)控和管理:通過(guò)與手機(jī)APP的藍(lán)牙通信,用戶可以遠(yuǎn)程監(jiān)控大棚內(nèi)的數(shù)據(jù)并進(jìn)行管理。他們可以隨時(shí)查看溫濕度和光照強(qiáng)度的實(shí)時(shí)數(shù)據(jù),設(shè)置報(bào)警閥值,接收?qǐng)?bào)警通知,并對(duì)大棚環(huán)境進(jìn)行遠(yuǎn)程調(diào)整和控制。

【3】自動(dòng)化和智能化:該項(xiàng)目利用傳感器和自動(dòng)化控制技術(shù),實(shí)現(xiàn)了對(duì)大棚環(huán)境的智能監(jiān)測(cè)和控制。這不僅提高了農(nóng)業(yè)生產(chǎn)的效率和質(zhì)量,還減輕了人工管理的負(fù)擔(dān),具有較高的實(shí)用性和應(yīng)用價(jià)值。

6.3 關(guān)鍵點(diǎn)總結(jié)

【1】傳感器選擇和集成:選擇適合的溫濕度傳感器和光照強(qiáng)度傳感器,并合理集成到硬件設(shè)計(jì)中。需要考慮傳感器的精度、響應(yīng)速度以及與主控芯片的通信協(xié)議等因素。

【2】數(shù)據(jù)采集和處理算法:設(shè)計(jì)合適的數(shù)據(jù)采集和處理算法,確保從傳感器獲取的數(shù)據(jù)準(zhǔn)確可靠,并能夠根據(jù)設(shè)定的閾值判斷是否觸發(fā)報(bào)警條件。

【3】報(bào)警機(jī)制:設(shè)計(jì)報(bào)警機(jī)制,根據(jù)設(shè)定的閾值和實(shí)時(shí)采集的數(shù)據(jù)進(jìn)行比較,當(dāng)達(dá)到報(bào)警條件時(shí),觸發(fā)報(bào)警提示,如聲音、震動(dòng)或彈窗等方式。

【4】藍(lán)牙通信:確保藍(lán)牙模塊能夠與主控芯片穩(wěn)定通信,并能夠成功傳輸采集的數(shù)據(jù)到Android手機(jī)APP上。需要考慮通信的穩(wěn)定性、數(shù)據(jù)傳輸?shù)乃俾屎桶踩缘纫蛩亍?/p>

【5】Android手機(jī)APP設(shè)計(jì):設(shè)計(jì)用戶友好的界面,在手機(jī)APP上實(shí)時(shí)顯示大棚內(nèi)的溫濕度和光照強(qiáng)度數(shù)據(jù),并提供設(shè)置界面,允許農(nóng)民設(shè)置報(bào)警閾值。同時(shí),實(shí)現(xiàn)報(bào)警提示的功能,保證報(bào)警條件的準(zhǔn)確性和報(bào)警方式的有效性。

【6】系統(tǒng)穩(wěn)定性和可靠性:在測(cè)試和調(diào)試階段,需要對(duì)整個(gè)系統(tǒng)進(jìn)行全面的測(cè)試,包括硬件和軟件的各個(gè)模塊,以確保系統(tǒng)的穩(wěn)定性和可靠性。同時(shí),考慮到長(zhǎng)時(shí)間運(yùn)行的情況,還需進(jìn)行長(zhǎng)時(shí)間測(cè)試,以驗(yàn)證系統(tǒng)能夠持續(xù)運(yùn)行并正常工作。

七、設(shè)計(jì)總結(jié)與體會(huì)

本項(xiàng)目的目的是設(shè)計(jì)實(shí)現(xiàn)對(duì)農(nóng)業(yè)大棚環(huán)境的智能監(jiān)測(cè)和管理,通過(guò)傳感器采集數(shù)據(jù)、主控芯片處理和判斷、藍(lán)牙通信與手機(jī)APP交互,以及報(bào)警蜂鳴器的控制,實(shí)現(xiàn)了對(duì)溫度、濕度和光照強(qiáng)度等參數(shù)的實(shí)時(shí)監(jiān)測(cè)和報(bào)警功能。

在項(xiàng)目開(kāi)發(fā)過(guò)程中,也遇到了一些挑戰(zhàn)和難點(diǎn),比如:硬件的連接和集成、數(shù)據(jù)處理算法的設(shè)計(jì)和實(shí)現(xiàn),以及與手機(jī)APP之間的藍(lán)牙通信。通過(guò)細(xì)致的計(jì)劃和分工,最終也是成功地克服了這些困難,得以完成了整個(gè)系統(tǒng)的開(kāi)發(fā)。

在實(shí)施過(guò)程中,深刻認(rèn)識(shí)到模塊化設(shè)計(jì)的重要性。通過(guò)將系統(tǒng)劃分為多個(gè)硬件模塊和軟件模塊,能夠更好地管理和調(diào)試每個(gè)模塊,并且在需要時(shí)進(jìn)行模塊的替換和升級(jí),提高了系統(tǒng)的可擴(kuò)展性和可維護(hù)性。

在測(cè)試階段,也意識(shí)到用戶體驗(yàn)的重要性。通過(guò)與潛在用戶的溝通和反饋,不斷優(yōu)化和改進(jìn)系統(tǒng)的界面設(shè)計(jì)和功能實(shí)現(xiàn),力求使用戶能夠輕松使用和管理該系統(tǒng)。這種用戶導(dǎo)向的設(shè)計(jì)理念提高了系統(tǒng)的實(shí)用性和用戶滿意度。

總的來(lái)說(shuō),本項(xiàng)目的設(shè)計(jì)與實(shí)施過(guò)程對(duì)軟硬件的協(xié)同工作、數(shù)據(jù)處理與算法設(shè)計(jì)、用戶體驗(yàn)等方面有了更深入的理解。通過(guò)克服挑戰(zhàn)和不斷優(yōu)化,成功地將智能農(nóng)業(yè)大棚監(jiān)測(cè)系統(tǒng)帶入實(shí)際應(yīng)用,并為農(nóng)業(yè)生產(chǎn)者提供了一種方便、高效且可靠的解決方案。相信隨著技術(shù)的不斷發(fā)展,智慧農(nóng)業(yè)將在未來(lái)發(fā)揮更大的作用,為農(nóng)業(yè)生產(chǎn)帶來(lái)更多的創(chuàng)新和改進(jìn)。

  • 更多詳細(xì)資料請(qǐng)聯(lián)系.docx
    下載
意法半導(dǎo)體

意法半導(dǎo)體

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

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

查看更多

相關(guān)推薦

方案定制

去合作
方案開(kāi)發(fā)定制化,2000+方案商即時(shí)響應(yīng)!