色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

聚豐項目 > 遠程蜂箱檢測系統(tǒng)

遠程蜂箱檢測系統(tǒng)

蜂蜜具有促進消化,護膚美容,抗菌消炎,提高免疫力,入藥等作用,但是傳統(tǒng)蜂蜜的產(chǎn)量卻是有限的,因為野中蜂對生存環(huán)境也比較苛刻,野中蜂比較喜歡生存在干燥,通風(fēng),污染低,蜜源豐富的情況,溫度不宜過高,噪聲較小,沒有刺激性氣味的環(huán)境下,并且巢蟲對蜂蜜的危害比較大,一般會附在蜂箱底部,如果生長過多,就會趴在巢房上,像這種情況下,蜜蜂就會飛逃,或者出現(xiàn)其他環(huán)境不適合的情況下也會出現(xiàn)蜂群飛逃的情況,蜂蜜的質(zhì)量跟釀蜜的時間是成正比的,所以當(dāng)一年中出現(xiàn)蜜蜂飛逃會嚴重影響蜂蜜的質(zhì)量和產(chǎn)量。所以蜂農(nóng)一般過一段時間就會對蜜蜂的情況進行檢查,但是由于時間或者距離等限制不能及時檢查,接下來就是我用所學(xué)知識對蜜蜂生存環(huán)境的檢測,基于AB32VG1與VWXR2并搭載RT-Thread操作系統(tǒng)的遠程蜂箱檢測系統(tǒng),使用DHT11對蜂箱內(nèi)的溫濕度進行檢測,判斷蜂箱是否淋雨,使用光敏電阻對蜂箱內(nèi)的亮度進行檢測,是HC-SR04對蜂箱底部進行巢蟲檢測,并通VWXR2進行遠程的數(shù)據(jù)傳輸。然后在客戶端上查看蜂箱狀況。即使出差也不用擔(dān)心。

jf_15811252 jf_15811252

分享
1 喜歡這個項目
團隊介紹

jf_15811252 jf_15811252

團隊成員

理想三旬 嵌入式軟件工程師

分享
項目簡介
蜂蜜具有促進消化,護膚美容,抗菌消炎,提高免疫力,入藥等作用,但是傳統(tǒng)蜂蜜的產(chǎn)量卻是有限的,因為野中蜂對生存環(huán)境也比較苛刻,野中蜂比較喜歡生存在干燥,通風(fēng),污染低,蜜源豐富的情況,溫度不宜過高,噪聲較小,沒有刺激性氣味的環(huán)境下,并且巢蟲對蜂蜜的危害比較大,一般會附在蜂箱底部,如果生長過多,就會趴在巢房上,像這種情況下,蜜蜂就會飛逃,或者出現(xiàn)其他環(huán)境不適合的情況下也會出現(xiàn)蜂群飛逃的情況,蜂蜜的質(zhì)量跟釀蜜的時間是成正比的,所以當(dāng)一年中出現(xiàn)蜜蜂飛逃會嚴重影響蜂蜜的質(zhì)量和產(chǎn)量。所以蜂農(nóng)一般過一段時間就會對蜜蜂的情況進行檢查,但是由于時間或者距離等限制不能及時檢查,接下來就是我用所學(xué)知識對蜜蜂生存環(huán)境的檢測,基于AB32VG1與VWXR2并搭載RT-Thread操作系統(tǒng)的遠程蜂箱檢測系統(tǒng),使用DHT11對蜂箱內(nèi)的溫濕度進行檢測,判斷蜂箱是否淋雨,使用光敏電阻對蜂箱內(nèi)的亮度進行檢測,是HC-SR04對蜂箱底部進行巢蟲檢測,并通VWXR2進行遠程的數(shù)據(jù)傳輸。然后在客戶端上查看蜂箱狀況。即使出差也不用擔(dān)心。
硬件說明

RT-Thread使用情況概述:

  整個方案涉及的技術(shù)棧有:主控選型、傳感器選型、IO口的分配 操作系統(tǒng)的選擇與運用、API 接口對接wifi通信協(xié)議、整個系統(tǒng)的調(diào)試等等。通過這個作品,讓我對RT-Thread操作系統(tǒng)的框架,內(nèi)核啟動流程等有了深刻的認識,對面對對象的編程手法有了更深的理解,實現(xiàn)對線程、信號量、互斥量靜態(tài)和動態(tài)的創(chuàng)建和刪除與運用實現(xiàn)ADC、UARTD等設(shè)備的運用。

內(nèi)核部分:使用了線程、信號量、定時器等

組件部分:Fish

軟件包:DHT11、HC-SR04

設(shè)備驅(qū)動:GPIO,ADC,UART等

  硬件主要使用了AB32VG1開發(fā)板,DHT11溫濕度模塊,HC-SR04模塊,MH檢測裝置,以及VWXR2三明治開發(fā)板等(由于在實驗室有些模塊沒有找到,如4G,聲音等,所以對項目進行簡化)。

I/O分配情況:

圖片.png

整個系統(tǒng)接線圖:

整體布線圖.png 

各個模塊簡介:

AB32VG1

   CPUAB5301A;( LQFP48 封裝,主頻 120M,片上集成 RAM 192K, flash 8 MbitADCPWMUSBUARTIIC 等資源).

搭載藍牙模塊,FM 模塊,一路 TF Card 接口,一路 USB 接口,一路 IIC 接口,一路音頻接口(美標(biāo) CTIA),六路 ADC 輸入引腳端子引出,六路 PWM 輸出引腳端子引出,一個全彩 LED 燈模塊, 一個電源指示燈, 三個燒錄指示燈,一個 IRDA(紅外接收端口),一個 Reset 按鍵, 三個功能按鍵(通用版為兩個功能按鍵)。主要功能是作為主控并且搭載RT-Thread操作系統(tǒng)實現(xiàn)實時性控制。

VWXR2:

  • 內(nèi)置低功耗32位cpu,可兼做處理器,主頻最高支持380MHz

  • 工作電壓:2.7-5.5V

  • 外設(shè):9*GPIO,2*Uart,2*ADC

  • 天線支持:板載+可選ipex

  • 采樣率:16K/16bit

  • 語音輸入:內(nèi)置2路音頻ADC,可直接模擬mic

  • 音頻輸出:1路

  • 板載音頻功放:最大支持2.6W

  • 推薦喚醒距離:<=3m

  • 默認語音技能:天氣、百科、日歷、計算器、成語、翻譯、已支持音樂內(nèi)容點播支持線性雙MIC,間距靈活可調(diào)(>40mm),ID和MD結(jié)構(gòu)設(shè)計靈活,易集成.

  • 主要功能是實現(xiàn)MCU與客戶端的連接,進行數(shù)據(jù)交互。

DHT11:

   DHT11數(shù)字溫濕度傳感器是一款含有已校準(zhǔn)數(shù)字信號輸出的溫濕度復(fù)合傳感器。單線通訊方式,測量精度不怎么樣。供電5v不然會出現(xiàn)意想不到的BUG.主要功能是實現(xiàn)蜂箱內(nèi)部的溫濕度采集,讓蜂農(nóng)看到蜂箱內(nèi)部的情況。

HC-SR04:

   采用IO口TRIG觸發(fā)測距,給至少10us的高電平信號;模塊自動發(fā)送8個40khz的方波,自動檢測是否有信號返回;有信號返回,通過IO口ECHO輸出一個高電平,高電平持續(xù)的時間就是超聲波從發(fā)射到返回的時間。測距范圍是2cm-400cm,值得注意的是,供電為5V,不然會出現(xiàn)采集數(shù)據(jù)不準(zhǔn)或者不能采集的情況。實現(xiàn)巢蟲檢測。

MH采集:

   即光照強度采集,模擬量輸出,能使數(shù)據(jù)的處理更靈活,實現(xiàn)蜂箱蓋的檢測,由于蜜蜂是喜歡黑暗的環(huán)境,通過采集光敏電阻的值,并且有用戶設(shè)置亮度為多少時才觸發(fā)。




軟件說明

摘要:RT-Thread 是一個集實時操作系統(tǒng)(RTOS)內(nèi)核、中間件組件和開發(fā)者社區(qū)于一體的技術(shù)平臺,RT-Thread 也是一個組件完整豐富、高度可伸縮、簡易開發(fā)、超低功耗、高安全性的物聯(lián)網(wǎng)操作系統(tǒng)。RT-Thread 具備一個 IoT OS 平臺所需的所有關(guān)鍵組件,例如GUI、網(wǎng)絡(luò)協(xié)議棧、安全傳輸、低功耗組件等等。經(jīng)過11年的累積發(fā)展,RT-Thread 已經(jīng)擁有一個國內(nèi)最大的嵌入式開源社區(qū),同時被廣泛應(yīng)用于能源、車載、醫(yī)療、消費電子等多個行業(yè),累積裝機量超過 8 臺,成為國人自主開發(fā)、國內(nèi)最成熟穩(wěn)定和裝機量最大的開源 RTOS

RT-Thread 主要采用 C 語言編寫,淺顯易懂,方便移植。它把面向?qū)ο蟮脑O(shè)計方法應(yīng)用到實時系統(tǒng)設(shè)計中,使得代碼風(fēng)格優(yōu)雅、架構(gòu)清晰、系統(tǒng)模塊化并且可裁剪性非常好。針對資源受限的微控制器(MCU)系統(tǒng),可通過方便易用的工具,裁剪出僅需要 3KB Flash1.2KB RAM 內(nèi)存資源的 NANO 版本(NANO RT-Thread 官方于 2017 7 月份發(fā)布的一個極簡版內(nèi)核);而對于資源豐富的物聯(lián)網(wǎng)設(shè)備,RT-Thread 又能使用在線的軟件包管理工具,配合系統(tǒng)配置工具實現(xiàn)直觀快速的模塊化裁剪,無縫地導(dǎo)入豐富的軟件功能包,實現(xiàn)類似 Android 的圖形界面及觸摸滑動效果、智能語音交互效果等復(fù)雜功能。其他的不說,就非常符合國人習(xí)慣,RT-Thread Studio 也好用,完善化的論壇,里面有個非常好用的功能就是對一個函數(shù)按CTRL鍵就會跳到相應(yīng)說明的位置,還有中文的API參考手冊等諸多功能,對新手入門特友好。

VWXR2與MCU通信協(xié)議

1 串口通信約定

  •  波特率:9600/115200

  • 數(shù)據(jù)位:8

  • 奇偶校驗:無

  • 停止位:1

  • 數(shù)據(jù)流控:無

  • MCU:用戶控制板控制芯片,與涂鴉模組通過串口進行通信

2 幀格式說明

圖片.png

? 所有大于 1 個字節(jié)的數(shù)據(jù)均采用大端模式傳輸。

? 一般情況下,采用同命令字一發(fā)一收同步機制。

圖片.png

? 模組控制命令下發(fā)及 MCU 狀態(tài)上報則采用異步模式,假設(shè)模組控制命令下發(fā)的命令字為 x,MCU 狀態(tài)上報的命令字為 y,如下所示:

  ?模組控制命令下發(fā)

圖片.png

? MCU 狀態(tài)上報

圖片.png

?數(shù)據(jù)類型


圖片.png

       在本項目中用到了raw(蜂箱蓋狀態(tài)),value(溫濕度,電源電壓值),bool(巢蟲檢測)以及defaut(開發(fā)板狀態(tài))上報數(shù)據(jù)類型。

/**
 * @brief  raw型dp數(shù)據(jù)上傳
 * @param[in] {dpid} dpid號
 * @param[in] {value} 當(dāng)前dp值指針
 * @param[in] {len} 數(shù)據(jù)長度
 * @return Null
 * @note   Null
 */
unsigned char mcu_dp_raw_update(unsigned char dpid,const unsigned char value[],unsigned short len)
{
    unsigned short send_len = 0;
    
    if(stop_update_flag == ENABLE)
        return SUCCESS;
    //
    send_len = set_wifi_uart_byte(send_len,dpid);
    send_len = set_wifi_uart_byte(send_len,DP_TYPE_RAW);
    //
    send_len = set_wifi_uart_byte(send_len,len / 0x100);
    send_len = set_wifi_uart_byte(send_len,len % 0x100);
    //
    send_len = set_wifi_uart_buffer(send_len,(unsigned char *)value,len);
    
    wifi_uart_write_frame(STATE_UPLOAD_CMD,MCU_TX_VER,send_len);
    
    return SUCCESS;
}

/**
 * @brief  bool型dp數(shù)據(jù)上傳
 * @param[in] {dpid} dpid號
 * @param[in] {value} 當(dāng)前dp值
 * @return Null
 * @note   Null
 */
unsigned char mcu_dp_bool_update(unsigned char dpid,unsigned char value)
{
    unsigned short send_len = 0;
    
    if(stop_update_flag == ENABLE)
        return SUCCESS;
    
    send_len = set_wifi_uart_byte(send_len,dpid);
    send_len = set_wifi_uart_byte(send_len,DP_TYPE_BOOL);
    //
    send_len = set_wifi_uart_byte(send_len,0);
    send_len = set_wifi_uart_byte(send_len,1);
    //
    if(value == FALSE) {
        send_len = set_wifi_uart_byte(send_len,FALSE);
    }else {
        send_len = set_wifi_uart_byte(send_len,1);
    }
    
    wifi_uart_write_frame(STATE_UPLOAD_CMD, MCU_TX_VER, send_len);
    
    return SUCCESS;
}
/**
 * @brief  value型dp數(shù)據(jù)上傳
 * @param[in] {dpid} dpid號
 * @param[in] {value} 當(dāng)前dp值
 * @return Null
 * @note   Null
 */
unsigned char mcu_dp_value_update(unsigned char dpid,unsigned long value)
{
    unsigned short send_len = 0;
    
    if(stop_update_flag == ENABLE)
        return SUCCESS;
    
    send_len = set_wifi_uart_byte(send_len,dpid);
    send_len = set_wifi_uart_byte(send_len,DP_TYPE_VALUE);
    //
    send_len = set_wifi_uart_byte(send_len,0);
    send_len = set_wifi_uart_byte(send_len,4);
    //
    send_len = set_wifi_uart_byte(send_len,value >> 24);
    send_len = set_wifi_uart_byte(send_len,value >> 16);
    send_len = set_wifi_uart_byte(send_len,value >> 8);
    send_len = set_wifi_uart_byte(send_len,value & 0xff);
    
    wifi_uart_write_frame(STATE_UPLOAD_CMD,MCU_TX_VER,send_len);
    
    return SUCCESS;
}
/**
 * @brief  fault型dp數(shù)據(jù)上傳
 * @param[in] {dpid} dpid號
 * @param[in] {value} 當(dāng)前dp值
 * @return Null
 * @note   Null
 */
unsigned char mcu_dp_fault_update(unsigned char dpid,unsigned long value)
{
    unsigned short send_len = 0;
     
    if(stop_update_flag == ENABLE)
        return SUCCESS;
    
    send_len = set_wifi_uart_byte(send_len,dpid);
    send_len = set_wifi_uart_byte(send_len,DP_TYPE_BITMAP);
    //
    send_len = set_wifi_uart_byte(send_len,0);
    
    if((value | 0xff) == 0xff) {
        send_len = set_wifi_uart_byte(send_len,1);
        send_len = set_wifi_uart_byte(send_len,value);
    }else if((value | 0xffff) == 0xffff) {
        send_len = set_wifi_uart_byte(send_len,2);
        send_len = set_wifi_uart_byte(send_len,value >> 8);
        send_len = set_wifi_uart_byte(send_len,value & 0xff);
    }else {
        send_len = set_wifi_uart_byte(send_len,4);
        send_len = set_wifi_uart_byte(send_len,value >> 24);
        send_len = set_wifi_uart_byte(send_len,value >> 16);
        send_len = set_wifi_uart_byte(send_len,value >> 8);
        send_len = set_wifi_uart_byte(send_len,value & 0xff);
    }    
    
    wifi_uart_write_frame(STATE_UPLOAD_CMD, MCU_TX_VER, send_len);

    return SUCCESS;
}
/**
 * @brief  系統(tǒng)所有dp點信息上傳,實現(xiàn)APP和muc數(shù)據(jù)同步
 * @param  Null
 * @return Null
 * @note   此函數(shù)SDK內(nèi)部需調(diào)用,MCU必須實現(xiàn)該函數(shù)內(nèi)數(shù)據(jù)上報功能,包括只上報和可上報可下發(fā)型數(shù)據(jù)
 */
void all_data_update(void)
{
    mcu_dp_raw_update(DPID_MEAL_PLAN,0,0); //當(dāng)前蜂箱狀況檢測指針,當(dāng)前蜂箱狀況檢測數(shù)據(jù)長度RAW型數(shù)據(jù)上報;
    mcu_dp_value_update(DPID_BATTERY_PERCENTAGE,0); //當(dāng)前電池電量VALUE型數(shù)據(jù)上報;
    mcu_dp_bool_update(DPID_CHARGE_STATE,0); //當(dāng)前充電狀態(tài)BOOL型數(shù)據(jù)上報;
    mcu_dp_enum_update(DPID_COVER_STATE,0); //當(dāng)前蜂箱蓋狀態(tài)枚舉型數(shù)據(jù)上報;
    mcu_dp_fault_update(DPID_FAULT,0); //當(dāng)前故障告警故障型數(shù)據(jù)上報;
    mcu_dp_value_update(DPID_FEED_REPORT,0); //當(dāng)前檢測結(jié)果上報VALUE型數(shù)據(jù)上報;
    mcu_dp_value_update(DPID_VOICE_TIMES,0); //當(dāng)前語音播放次數(shù)VALUE型數(shù)據(jù)上報;
    mcu_dp_bool_update(DPID_LIGHT,0); //當(dāng)前小夜燈BOOL型數(shù)據(jù)上報;
    mcu_dp_value_update(DPID_NOW_TEMP,0); //當(dāng)前溫度檢測VALUE型數(shù)據(jù)上報;
    mcu_dp_value_update(DPID_HUM,90); //當(dāng)前濕度檢測VALUE型數(shù)據(jù)上報;
    mcu_dp_bool_update(DPID_CHECK,0); // 當(dāng)前巢蟲檢測 BOOL型數(shù)據(jù)上報;
    mcu_dp_value_update(DPID_LIGHT,0); //VALUE型數(shù)據(jù)上報;
}

調(diào)試:調(diào)試過程中我采用的是一個傳感器一個傳感器的調(diào),出錯容易找,然后在進行多個傳感器的融合

  1.  創(chuàng)建好工程后,編寫按鍵(實現(xiàn)按鍵VWXR2復(fù)位與配網(wǎng)模式切換),LED(實現(xiàn)AB32VG1開發(fā)板正常運行觀察,避免出現(xiàn)卡死情況然后并不知道哪里出了問題)功能。

//貼的主要代碼,全部代碼已經(jīng)放入gitee
static void key_thread_entry(void* p)
{
    uint8_t byn_value = 0;

    while(1)
    {
        byn_value = btn_scan(0);
        switch(byn_value)
        {
            case KEY0_PRES:
                rt_kprintf("key0  pushed\n");
                mcu_reset_wifi();
                rt_kprintf("mcu_reset_wifi\n");//使VWXR2開發(fā)板復(fù)位,并進入配網(wǎng)模式
                break;
            case KEY1_PRES:
                rt_kprintf("key1  pushed\n");
                mcu_set_wifi_mode(0);
                rt_kprintf("smart_wifi_mode");//實現(xiàn)智能配網(wǎng)
                break;
            default:
                break;
        }
        rt_thread_mdelay(100);
    }
}

 int rt_thread_key(void)
{
    rt_thread_t key_ret = RT_NULL;

    key_init();
    key_ret = rt_thread_create("key", key_thread_entry, RT_NULL, 512, 9, 10);
    if(key_ret == RT_NULL)
    {
        rt_kprintf("key init ERROR");
        return RT_ERROR;
    }
    else {
        rt_kprintf("rt_thread_key  succeed....\n");
    }

    rt_thread_startup(key_ret);
}

INIT_APP_EXPORT(rt_thread_key);

打開調(diào)試助手觀察串口輸出情況

圖片.png

按下key0后VWXR2開發(fā)板會播報“我已進入配網(wǎng)狀態(tài),請下載APP為我完成配網(wǎng)”,演示如下:


2.DHT11調(diào)試與數(shù)據(jù)上報

在RT-Thread Setting中添加DHT11的sdk包,選擇第一個并保存

圖片.png

配置自己分配的引腳

圖片.png

刪掉SDK包中的void rt_hw_us_delay(rt_uint32_t us)函數(shù)

在board.c中添加自己的硬件定時器us函數(shù),uint8_t等會報錯,在前面加上rt_就可以了

void rt_hw_us_delay(rt_uint32_t us)
 {
     rt_uint32_t ticks;
     rt_uint32_t told, tnow, tcnt = 0;
     rt_uint32_t reload = TMR0PR;

     ticks = us * reload / (1000);
     told = TMR0CNT;
     while (1)
     {
         tnow = TMR0CNT;
         if (tnow != told)
         {
             if (tnow > told)
             {
                 tcnt += tnow - told;
             }
             else
             {
                 tcnt += reload - told + tnow;
             }
             told = tnow;
             if (tcnt >= ticks)
             {
                 break;
             }
         }
     }
 }

觀察串口輸出

圖片.png

測試成功,在線程中添加數(shù)據(jù)上報代碼

#define DHT11_DATA_PIN   GET_PIN(A, 0)

 static void read_temp_entry(void *parameter)
{
    rt_device_t dev = RT_NULL;
    struct rt_sensor_data sensor_data;
    rt_size_t res;
    rt_uint8_t get_data_freq = 1; /* 1Hz */

    dev = rt_device_find("temp_dht11");
    if (dev == RT_NULL)
    {
        return;
    }

    if (rt_device_open(dev, RT_DEVICE_FLAG_RDWR) != RT_EOK)
    {
        rt_kprintf("open device failed!\n");
        return;
    }

    rt_device_control(dev, RT_SENSOR_CTRL_SET_ODR, (void *)(&get_data_freq));

    while (1)
    {
        res = rt_device_read(dev, 0, &sensor_data, 1);

        if (res != 1)
        {
            rt_kprintf("read data failed! result is %d\r\n", res);
            rt_device_close(dev);
            return;
        }
        else
        {
            if (sensor_data.data.temp >= 0)
            {
                uint8_t temp = (sensor_data.data.temp & 0xffff) >> 0;      // get temp
                uint8_t humi = (sensor_data.data.temp & 0xffff0000) >> 16; // get humi

               rt_kprintf("temp:%d, humi:%d\n" ,temp, humi);

                mcu_dp_value_update(DPID_NOW_TEMP,temp); //當(dāng)前溫度檢測VALUE型數(shù)據(jù)上報;
                mcu_dp_value_update(DPID_HUM,humi); //當(dāng)前濕度檢測VALUE型數(shù)據(jù)上報;
            }
        }

        rt_thread_delay(3000);
    }
}

 static int dht11_read_temp_sample(void)
{
    rt_thread_t dht11_thread;

    dht11_thread = rt_thread_create("dht_tem",read_temp_entry, RT_NULL,1024,13,20);
    if(dht11_thread==RT_NULL)
    {

      rt_kprintf("dht11_thread  fail....\n");
    }
    else {
        rt_kprintf("dht11_thread  succeed....\n");
    }
    rt_thread_startup(dht11_thread);
}
INIT_APP_EXPORT(dht11_read_temp_sample);

static int rt_hw_dht11_port(void)
{
    struct rt_sensor_config cfg;
    
    cfg.intf.user_data = (void *)DHT11_DATA_PIN;
    rt_hw_dht11_init("dht11", &cfg);

    return RT_EOK;
}

INIT_COMPONENT_EXPORT(rt_hw_dht11_port);

打開手機APP,觀察數(shù)據(jù)

圖片.png

app對溫度進行了一個縮小10的處理

3.HC-SR04

添加SDK包,并且修改引腳,并進行數(shù)據(jù)上報

#define SR04_TRIG_PIN GET_PIN(E, 0)
#define SR04_ECHO_PIN GET_PIN(A, 6)

int sr04_read_distance_sample(void);
int rt_hw_sr04_port(void);


static void sr04_read_distance_entry(void *parameter)
{
    rt_device_t dev = RT_NULL;
    struct rt_sensor_data sensor_data;
    rt_size_t res;
 rt_uint16_t distance=0;
    dev = rt_device_find(parameter);
    if (dev == RT_NULL) {
        rt_kprintf("Can't find device:%s\n", parameter);
        return;
    }

    if (rt_device_open(dev, RT_DEVICE_FLAG_RDWR) != RT_EOK) {
        rt_kprintf("open device failed!\n");
        return;
    }
    rt_device_control(dev, RT_SENSOR_CTRL_SET_ODR, (void *)100);

    while (1) {
        res = rt_device_read(dev, 0, &sensor_data, 1);
        if (res != 1) {
            rt_kprintf("read data failed!size is %d\n", res);
            rt_device_close(dev);
            return;
        }
        else {
            distance=sensor_data.data.proximity / 10+sensor_data.data.proximity % 10;
            if(distance>=20&&distance<=400)
            //rt_kprintf("distance:%3d.%dcm, timestamp:%5d\n", sensor_data.data.proximity / 10, sensor_data.data.proximity % 10, sensor_data.timestamp);
            if(distance>30)
            mcu_dp_bool_update(DPID_CHECK,0); // 當(dāng)前巢蟲檢測 BOOL型數(shù)據(jù)上報;
            else {
                mcu_dp_bool_update(DPID_CHECK,1); // 當(dāng)前巢蟲檢測 BOOL型數(shù)據(jù)上報;
            }
        }
        rt_thread_mdelay(2000);
    }
}

int sr04_read_distance_sample(void)
{
    rt_thread_t sr04_thread;

    sr04_thread = rt_thread_create("sr04",
                                   sr04_read_distance_entry,
                                   "pr_sr04",
                                   1024,
                                   11,
                                   20);
    if (sr04_thread != RT_NULL) {
        rt_thread_startup(sr04_thread);
    }

    return RT_EOK;
}
INIT_APP_EXPORT(sr04_read_distance_sample);

4.AB32VG1與VWXR2之間的通信

#include"uart1.h"

/* 用于接收消息的信號量 */
static struct rt_semaphore rx_sem;
 rt_device_t serial;

/* 接收數(shù)據(jù)回調(diào)函數(shù) */

static rt_err_t uart_input(rt_device_t dev, rt_size_t size)

{
    /* 串口接收到數(shù)據(jù)后產(chǎn)生中斷,調(diào)用此回調(diào)函數(shù),然后發(fā)送接收信號量 */
    rt_sem_release(&rx_sem);
    return RT_EOK;
}
static void serial_thread_entry(void *parameter)

{
    char ch;
    rt_kprintf("test UART1 \n");
    while (1)
    {
        /* 從串口讀取一個字節(jié)的數(shù)據(jù),沒有讀取到則等待接收信號量 */

        while (rt_device_read(serial, -1, &ch, 1) != 1)

        {
            /* 阻塞等待接收信號量,等到信號量后再次讀取數(shù)據(jù) */
            rt_sem_take(&rx_sem, RT_WAITING_FOREVER);
        }

         uart_receive_input(ch);
    }
}

static int uart_sample(int argc, char *argv[])

{
    rt_err_t ret = RT_EOK;
    char uart_name[RT_NAME_MAX];
    char str[] = "hello RT-Thread!\r\n";
    if (argc == 2)
    {
        rt_strncpy(uart_name, argv[1], RT_NAME_MAX);
    }
    else
    {
        rt_strncpy(uart_name, SAMPLE_UART_NAME, RT_NAME_MAX);
    }
    /* 查找系統(tǒng)中的串口設(shè)備 */
    serial = rt_device_find(uart_name);
    if (!serial)
    {
        rt_kprintf("find %s failed!\n", uart_name);
        return RT_ERROR;
    }

    /* 初始化信號量 */

    rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO);
    /* 以中斷接收及輪詢發(fā)送模式打開串口設(shè)備 */
    rt_device_open(serial, RT_DEVICE_FLAG_INT_RX);
    /* 設(shè)置接收回調(diào)函數(shù) */
    rt_device_set_rx_indicate(serial, uart_input);
    /* 發(fā)送字符串 */
    rt_device_write(serial, 0, str, (sizeof(str) - 1));
    /* 創(chuàng)建 serial 線程 */
    rt_thread_t thread = rt_thread_create("serial", serial_thread_entry,
RT_NULL, 1024, 7, 10);
    /* 創(chuàng)建成功則啟動線程 */
    if (thread != RT_NULL)
    {
        rt_kprintf("uart1_thread succeed....\n");
        rt_thread_startup(thread);
    }
    else
    {
        ret = RT_ERROR;
    }
   return ret;
}
//在protel.c中添加單字節(jié)函數(shù),進行數(shù)據(jù)的上報
/**
 * @brief  串口發(fā)送數(shù)據(jù)
 * @param[in] {value} 串口要發(fā)送的1字節(jié)數(shù)據(jù)
 * @return Null
 */
void uart_transmit_output(unsigned char value)
{

      rt_device_write(serial, 0,&value, 1);//單字節(jié)上報

}

程序?qū)懞煤螅蜷_涂鴉調(diào)試助手,選擇模擬模組,因為我要調(diào)試我寫的程序是否和模組通信

img_20211128124918.png

VWXR2與串口接線如圖所示

圖片.pngimg_20211128125855.png

當(dāng)調(diào)試助手出現(xiàn)下面這個界面時,證明程序沒問題,然后就可以和模組連接了

img_20211128130005.png

演示效果



項目代碼地址:

https://gitee.com/AB32VG1/ab32.git

評論區(qū)(0 )
主站蜘蛛池模板: 成人影片迅雷下载| 亚洲欧美免费无码专区| 阿娇和冠希13分钟在线观看| 狠狠色欧美亚洲狠狠色www | 日本无码免费久久久精品| 成人小视频在线观看免费| 美女内射少妇一区二区四区| 欧美日韩一区在线观看| 亚洲国产精品嫩草影院| 成人毛片一区二区三区| 欧美亚洲日韩欧洲不卡| 囯产精品久久久久免费蜜桃| 佐山爱痴汉theav| 5g在视影讯天天5g免费观看| 跳蛋按摩棒玉势PLAY高H| 亚洲 中文 自拍 无码| 国产精品久久久久精品A片软件| 黄色a级免费网站| 美女脱光app| 我要色色网| 久久热免费视频| 国产在线一卡二卡| 久久黄色大片| 米奇在线8888在线精品视频| 女性性纵欲派对| 日本学生VIDEOVIDEOS更新| 手机移动oa| 亚洲 欧美 国产 综合久久| 亚洲精品久久久久久久蜜臀老牛| 亚洲性无码av在线| 4399日本电影完整版在线观看免费 | 粗好大用力好深快点漫画| 出租屋自拍贵在真实15P| 国产人妻麻豆蜜桃色精| 久久草这在线观看免费| 蜜桃色欲AV久久无码精品| 青青精品国产自在线拍| 无码人妻视频又大又粗欧美| 亚洲欧洲日本天天堂在线观看| 综合色一色综合久久网vr| voyeurhit农村夫妻偷拍|