博客專欄

EEPW首頁 > 博客 > 【真香現(xiàn)場】為老婆 DIY 一款集多功能于一身的環(huán)境檢測儀,守護家人健康全靠它!【內附原理圖+源代碼】

【真香現(xiàn)場】為老婆 DIY 一款集多功能于一身的環(huán)境檢測儀,守護家人健康全靠它!【內附原理圖+源代碼】

發(fā)布人:智能物聯(lián)研習社 時間:2021-04-24 來源:工程師 發(fā)布文章


近日,剛入住新房,老婆說:“家里有沒有甲醛超標呀!? 總感覺聞著一股味兒~"

我頓時心里一緊,感覺被無形的、摸不著的危害威脅著生命。

心想:“不行、不行,一定要買個環(huán)境檢測儀,來檢測一下!”

家中老小的健康安全,促使我打開了X寶,準備入手個環(huán)境檢測儀。

但......(急剎車!)

定睛一看,環(huán)境監(jiān)測儀怎么那么貴,并不是說"剁手”就能“剁手”的(緊緊裹住自己小錢袋)!

而且,市面上大多數(shù)的環(huán)境監(jiān)測儀并沒有擁有多功能的性能,難道要買好幾個不同功能點的儀器嗎?

NO!  既燒錢,又麻煩 !

靈機一動,不如自制一個環(huán)境檢測儀,實時檢測空氣健康安全,在家,在公司,隨時拿出來測一測,節(jié)能環(huán)保,健康安全!

有了想法,必須付諸實踐~畢竟不是光說說的!

先來張定妝照~


new


戳以下鏈接,回復“環(huán)境檢測儀2”,即可獲取50元模組券以及詳細開發(fā)者資料,手慢無??!

 https://www.wjx.cn/vj/wFXuAGU.aspx  


開啟動我的DIY之路~

先給大家介紹幾款簡單的傳感器,如果大家有別的傳感器,也可以采用!

一、甲醛檢測


ZE08-CH2O型電化學甲醛模組,是一個通用型、小型化模組,利用電化學原理對空氣中存在的CH2O進行探測,具有良好的選擇性,穩(wěn)定性。內置溫度傳感器,可進行溫度補償;同時具有數(shù)字輸出與模擬電壓輸出,方便使用。

具體電氣參數(shù)如圖:

注 釋 : 氣 體 濃 度 值 (PPB)=( 氣 體 濃 度 高 位 *256+ 氣 體 濃 度 低 位 ). 當 轉 換 為 PPM 時 : PPM= PPB/1000.
1PPM×1.25 = 1.25mg/m3.

其中Byte8校驗值=(取反(Byte1+Byte2+……+Byte7))+ 1

二、PM2.5檢測


PM2.5檢測采用ZPH02 空污粉塵傳感器。它整合了紅外PM2.5檢測原理和較為成熟的VOC檢測技術,能夠實現(xiàn)對同一環(huán)境中PM2.5和VOC的同時檢測。

該傳感器中PM2.5檢測采用粒子計數(shù)原理,可靈敏檢測直徑1μm以上灰塵顆粒物,VOC傳感器對有機揮發(fā)氣體具有極高的靈敏度。

PM2.5+

PM2.5-

具體電氣參數(shù)如圖:


備注:
對PM2.5 的計算:
舉例:傳感器發(fā)出一幀正常數(shù)據(jù)中,第 3位 0X12,第 4位 0X13。則表示:傳感器輸出的占空比為18.19%。
串口模式下低脈沖率輸出范圍 0.5%-50%。


對 VOC氣體檢測:
每一幀數(shù)據(jù)中第 7位表示 VOC輸出,直接輸出 0x01-0x04四個等級,依次對應“優(yōu)、良、中、差”,無傳感器
或故障時顯示 0x00;

其中Byte8校驗值=(取反(Byte1+Byte2+……+Byte7))+ 1

三、煙霧檢測


煙霧檢測采用MQ-2煙霧傳感器,該傳感器可用于家庭和工廠的氣體泄漏監(jiān)測裝置,

適宜于液化氣、苯、烷、酒精、氫氣、煙霧等的探測。

MQ2--

傳感器靈敏度曲線如圖


MQ2_S

為了減少開發(fā)周期,本次采購了MQ-2煙霧傳感器模組

MQ2

該模塊原理圖如下


MQ系列氣體傳感器模塊電路圖


如圖可知,可以通過檢測AO端的電平電壓,來判斷煙霧大?。妷涸礁撸瑹熿F濃度越高)。

四、燃氣檢測

燃氣檢測采用MQ-4氣體傳感器,該傳感器對甲烷,天燃氣有很高的靈敏度,廣泛適用于家庭用氣體泄漏報警器、工業(yè)用可燃氣體報警器以及便攜式氣體檢測器。電氣特性如下


傳感器靈敏度曲線如圖

MQ4靈敏度

為了減少開發(fā)周期,本次采購了MQ-4氣體傳感器模組。該模組的原理圖和MQ-2煙霧傳感器模組相同,可以通過檢測AO端的電平電壓,來判斷燃氣濃度(電壓越高,燃氣濃度越高)。

五、火焰檢測


火焰檢測采用紅外接收管,該管可以用來探測火源或其它一些波長在700納米~1000納米范圍內的熱源。當無紅外光照時,有很小的飽和和反向漏電流(暗電流),此時光敏管不導通。當有紅外光照時,飽和反向漏電流馬上增加,形成光電流,在一定的范圍,它隨入射光強度的增大而增大。

為了減少開發(fā)周期,本次采購了市面上常見的火焰?zhèn)鞲衅髂=M
火焰?zhèn)鞲衅? src=

原理圖如下

火焰原理圖

可以通過檢測AO端的電平電壓,來判斷火勢的強弱(電壓越低,火勢越強)。


1、環(huán)境安全衛(wèi)士電路設計

到此步,大家肯定都已經選擇好心儀的環(huán)境傳感器,接著就帶大家基于這些傳感器,設計一款環(huán)境安全衛(wèi)士電路~

主控單元選擇WB3S 模組,這是一款由涂鴉智能開發(fā)的低功耗嵌入式Wi-Fi+BLE 雙協(xié)議模組。它由一個高集成度的無線射頻芯片BK7231T和少量外圍器件構成,內置了Wi-Fi網絡協(xié)議棧和豐富的庫函數(shù)。由于ADC口資源不足,我們還需對其進行適當修改,拓展ADC接口,具體措施是在電路中增加一款四通道模擬多路復用/解復用器芯片——RS2255。這是一款是數(shù)字控制的模擬開關,它的導通電阻只有24歐姆,漏電流只有1nA。

另外,本方案使用了較多傳感器,為了減少走線,使整體更加簡潔美觀,主控板需要引出各種傳感器接口,而且各個模塊與主控板的通信接口電平存在不匹配的現(xiàn)象,模塊供電電壓也存在差異。

為了解決上述問題,具體原理圖設計如下


SCHV3

PCB如下

PCBV2

原理圖與PCB查看:

下載地址

  • 原理圖

  • PCB


戳以下鏈接,回復“環(huán)境檢測儀2”,即可獲取50元模組券以及詳細開發(fā)者資料,手慢無??!

 https://www.wjx.cn/vj/wFXuAGU.aspx  



  • 2、環(huán)境安全衛(wèi)士實物搭建

這一步結束,大家肯定也都完成了環(huán)境安全衛(wèi)士電路設計,接下來就要把PCB文件發(fā)給PCB廠家進行打樣。

這個過程,很培養(yǎng)大家的動手能力,看著枯燥卻又會帶著歡樂,當然也要注意安全,別被烙鐵燙著。
電容電阻三極管焊好之后,接下來就比簡單啦。只需要根據(jù)結構空間要求,將各個傳感器模塊安插在對應的位置上,并完成焊接固定。
為了使走線更加精簡,可直接將甲醛傳感器的VCC,GND,TXD焊到P5的VCC,GND,RXD,其他傳感器同理。

全部焊好之后,效果如圖:

front1

back1

怎么樣,是不是有點小開心~
但是可能也有同學覺得太丑,光禿禿的,都是電路。


別急!為了增加產品的可使用性,我選擇了一款帶臺燈的插座,對其進行改造,將環(huán)境安全衛(wèi)士固定在臺燈支架上,這樣在檢測房間空氣質量的同時,還可以檢測插座上的設備是否出現(xiàn)火災等危險情況,尤其是可以對手機等這類鋰電池設備充電引發(fā)的安全問題惡化之前進行提前通知,防止災難的進一步發(fā)生。


臺燈

當然,用戶也可以根據(jù)自身需求,將本環(huán)境安全衛(wèi)士和其他設備進行關聯(lián)。

臺燈內可增加一路繼電器控制,當異常發(fā)生時,自動斷開220V市電,降低損失。


image.png

以上相關準備工作完成后,接下來就可以開始正式的產品搭建工作。


1.將臺燈的燈罩拆開,可以看到里面的LED燈板和兩根正負電源線,用電烙鐵等工具將LED燈板拆除

step1

2.將臺燈底座的四個海綿墊拆除,卸下螺絲,可以拆除底座

step1.5

3.將主控板固定在燈罩區(qū)域適當位置,將兩根正負電源線分別焊到主控板上的P6端,這樣當按下插座上的“臺燈”按鈕時,插座就可以給主控板提供5V電壓,注意區(qū)分正負極。

4.修改臺燈電路,在火線電路中串入一個繼電器,并引出繼電器控制線

step4

5.將上一步引出的控制線焊于主控板P2的Sig處,并安裝燈罩,底座。

all

當然,我們也可以激發(fā)自己創(chuàng)意,給它穿上不同外衣

all2

這樣,整機搭建基本完成。

另外,也可以根據(jù)自己的創(chuàng)意,設計出其他外觀,比如:

new

外形結構文件下載鏈接


在這里插入圖片描述

上罩殼

在這里插入圖片描述

下罩殼


下面,講一講關于固件開發(fā) part~


3、環(huán)境安全衛(wèi)士固件開發(fā)


開發(fā)環(huán)境是在Linux下進行開發(fā)的,環(huán)境搭建和SDK的拉取可以在涂鴉 github 上的倉庫 上進行學習。

該代碼是基于1.0.2版本的 SDK 進行開發(fā)的,第一次接觸soc開發(fā)的同學,可以在 涂鴉github上的倉庫 上拉取代碼進行學習和開發(fā)。該代碼中的 apps/template-demo 比較簡單,可在該代碼的基礎上進行學習或開發(fā)。

本 demo可在github上下載源代碼 ,下載完成源代碼后,將代碼放入SDK里面的APPS文件夾下。進行編譯下載就可以了。編譯后的產物中會出現(xiàn)QIO,UA,UG文件其中QIO是生產固件,UA是用戶去固件,UG是升級固件。
在這里插入圖片描述

本 demo主要是通過3種方式進行獲取傳感器信息的,分別是串口,adc,檢測引腳高低電平。下面將以這三種方式進行簡單的介紹。

1.串口類傳感器:甲醛,pm2.5

  • 甲醛傳感器相關資料

  • PM2.5傳感器資料

通過閱讀甲醛傳感器的資料我們可以發(fā)現(xiàn),傳感器數(shù)據(jù)上傳格式和計算方法如下:

 /***********************************************************
 *   Function:  get_ch2o_sensor_value
 *   Input:     none
 *   Output:    none
 *   Return:    none
 *   Notice:    得到并上傳甲醛的數(shù)據(jù)
 ***********************************************************/
static VOID get_ch2o_sensor_value(VOID)
{
    UINT_T  buff_ret, find_head_index = 0;
    //甲醛數(shù)據(jù)高位,低位
    UCHAR_T ch2o_data_high, ch2o_data_low;
    //校驗和
    UCHAR_T check_sums = 0x00;    
    //串口數(shù)據(jù)緩存區(qū)
    UCHAR_T ch2o_receive_buffer[CH2O_BUFFER_SIZE];
    //指向甲醛數(shù)據(jù)頭部
    UCHAR_T *p_ch2o_value = NULL;

    memset(ch2o_receive_buffer, 0, sizeof(ch2o_receive_buffer));

    //讀取串口數(shù)據(jù)
    bk_uart_recv(CH2O_SENSOR_UART, ch2o_receive_buffer, CH2O_BUFFER_SIZE, 0xFFFF);

    // for (find_head_index = 0; find_head_index<CH2O_BUFFER_SIZE; find_head_index++) {
    //     PR_NOTICE("ch2o_receive_buffer[%d] = %02x", find_head_index, ch2o_receive_buffer[find_head_index]);
    // }

    //尋找 ch2o 傳感器發(fā)送過來的頭部
    for (find_head_index = 0; find_head_index<CH2O_BUFFER_SIZE; find_head_index++) {
        if (ch2o_receive_buffer[find_head_index] == 0xff && \
            ch2o_receive_buffer[find_head_index+1] == 0x17 && \
            ch2o_receive_buffer[find_head_index+2] == 0x04){
            //PR_NOTICE("find head is %d", find_head_index);
            break;
        }
    }

    //本次采集數(shù)據(jù)不完整
    if (find_head_index > 11) { 
        PR_ERR("ch2o get uart data no complete!");
        return;
    }

    //將指針指向 ch2o 數(shù)據(jù)中的頭部
    p_ch2o_value = ch2o_receive_buffer + find_head_index;

    //檢驗和,確認讀取的數(shù)據(jù)的準確性
    check_sums = ch2o_check_sum(p_ch2o_value, 9);
    if (check_sums != *(p_ch2o_value + 8)) {
        PR_ERR("ch2o check_sums error");
        return;
    }
    
    ch2o_data_high = *(p_ch2o_value+4);
    ch2o_data_low = *(p_ch2o_value+5);

    gs_air_box.ch2o_value = ch2o_data_high * 256 + ch2o_data_low;

    //PR_NOTICE("ch2o value is : %d .", gs_air_box.ch2o_value);

    //上傳 ch2o 數(shù)據(jù)到涂鴉云
    updata_dp_single(gs_air_box.dp_ch2o_value, PROP_VALUE, gs_air_box.ch2o_value);

    return;
}

校驗和的計算方式為:

 /***********************************************************
 *   Function:  ch2o_check_sum
 *   Input:     none
 *   Output:    none
 *   Return:    none
 *   Notice:    甲醛數(shù)據(jù)校驗和
 ***********************************************************/
static UCHAR_T ch2o_check_sum(UCHAR_T *data, UCHAR_T len)
{
    UCHAR_T i, tempq = 0;
    data += 1; //指向data[1]

    for(i=0; i<(len-2); i++)
    {
        tempq += *data;
        data++;
    }

    tempq = (~tempq) + 1;

    return (tempq);
}


PM2.5的獲取方法和甲醛的很相似,這里不再過多介紹。

2.ADC類傳感器:燃氣傳感器,煙霧傳感器

相關資料
由于在WB3S上只要一個ADC,所以我們這里用RS2255 芯片進行復用,引腳選擇如下:


ADC初始化:

/* ADC */
#define ADC_DATA_LEN    4
static  tuya_adc_dev_t  tuya_adc;

static VOID adc_init(VOID)
{
    tuya_adc.priv.pData = Malloc(ADC_DATA_LEN * sizeof(USHORT_T)); //這里一直使用tuya_adc,所有后面就沒有釋放該空間
    memset(tuya_adc.priv.pData, 0, ADC_DATA_LEN*sizeof(USHORT_T));
    tuya_adc.priv.data_buff_size = ADC_DATA_LEN; //設置數(shù)據(jù)緩存?zhèn)€數(shù)
}


ADC采集:

 /***********************************************************
 *   Function:  get_adc_value
 *   Input:     none
 *   Output:    adc_value : 采集到的 adc 值
 *   Return:    none
 *   Notice:    得到 adc 采集的電壓值
 ***********************************************************/
VOID get_adc_value(OUT USHORT_T* adc_value) 
{
    INT_T ret;

    if (adc_value == NULL) {
        PR_ERR("pm25_adc_value is NULL");
        return;
    }
    memset(tuya_adc.priv.pData, 0, ADC_DATA_LEN*sizeof(USHORT_T));
    ret = tuya_hal_adc_init(&tuya_adc);
    if (ret != OPRT_OK) {
        PR_ERR("ADC init error : %d ", ret);
        return;
    }

    ret = ret = tuya_hal_adc_value_get(ADC_DATA_LEN, adc_value); 
    if (ret != OPRT_OK) {
        PR_ERR("ADC get value error : %d ", ret);
    }

    tuya_hal_adc_finalize(&tuya_adc);
    return;
}

煙霧傳感器,數(shù)據(jù)獲?。?/p>

/* 煙霧傳感器 */
#define SMOKE_ALARM_LIM 1.0

/***********************************************************
 *   Function:  get_smoke_sensor_value
 *   Input:     none
 *   Output:    none
 *   Return:    none
 *   Notice:    得到并上傳煙霧的數(shù)據(jù),A1
 ***********************************************************/
static VOID get_smoke_sensor_value(VOID)
{
    USHORT_T    smoke_adc_value;
    FLOAT_T     smoke_volt; 

    //復用 adc 到 A1 
    tuya_gpio_write(RS2255_A, FALSE);
    tuya_gpio_write(RS2255_B, TRUE);

    tuya_hal_system_sleep(500);

    //得到煙霧傳感器 ad 值
    get_adc_value(&smoke_adc_value);
    //PR_NOTICE("smoke_adc_value : %d ", smoke_adc_value);

    //計算實際電壓值
    smoke_volt = (smoke_adc_value / 4095.0) * 2.4 * 2;
    //PR_NOTICE("smoke_volt : %lf ", smoke_volt);

    //判斷是否到報警門限值
    if (smoke_volt >= SMOKE_ALARM_LIM) {
        gs_air_box.smoke_state = ALARM;
    } else {
        gs_air_box.smoke_state = NORMAL;
    }

    //上傳數(shù)據(jù)
    updata_dp_single(gs_air_box.dp_smoke_state, PROP_ENUM, gs_air_box.smoke_state);

    //PR_NOTICE("get smoke value, updata...");
    return;
}

燃氣傳感器和煙霧相似,這里就不再過多介紹。

3.檢測引腳高低電平獲取狀態(tài):火焰?zhèn)鞲衅?/p>

火焰?zhèn)鞲衅?,檢測到火焰后斷開220v電源,重啟后220v通電,防止發(fā)生意外情況。

 /***********************************************************
 *   Function:  get_smoke_sensor_value
 *   Input:     none
 *   Output:    none
 *   Return:    none
 *   Notice:    得到并上傳火焰的數(shù)據(jù)
 ***********************************************************/
static VOID get_flame_sensor_value(VOID)
{
    if (FALSE == tuya_gpio_read(FLAME_SENSOR_PIN)) {
        gs_air_box.flame_state = ALARM;
        /* 檢測到火焰,拉低220V控制引腳,斷電 */
        tuya_gpio_write(POWER_OFF_220V_PIN, FALSE);
    } else {
        gs_air_box.flame_state = NORMAL;
    }

    updata_dp_single(gs_air_box.dp_flame_state, PROP_ENUM, gs_air_box.flame_state);

    return;
}


4.設備初始化:

啟動時,先對環(huán)境安全衛(wèi)士相關的外設和引腳進行初始化設置,創(chuàng)建信號量,傳感器預熱,預熱完成后釋放信號量,開始采集。


 /***********************************************************
 *   Function:  air_box_device_init
 *   Input:     none
 *   Output:    none
 *   Return:    none
 *   Notice:    環(huán)境安全衛(wèi)士設備初始化
 ***********************************************************/
VOID air_box_device_init(VOID)
{
    INT_T opRet = OPRT_OK;

    /* 火焰?zhèn)鞲衅飨嚓P外設初始化 */
    tuya_gpio_inout_set(FLAME_SENSOR_PIN, TRUE);
    tuya_gpio_inout_set(POWER_OFF_220V_PIN, FALSE);
    /* 啟動時,拉高220V控制引腳,通電 */
    tuya_gpio_write(POWER_OFF_220V_PIN, TRUE);

    /* ADC 復用,相關引腳初始化 */ 
    tuya_gpio_inout_set(RS2255_A, FALSE);
    tuya_gpio_inout_set(RS2255_B, FALSE);
    adc_init();

    /* 甲醛傳感器使用 uart2 接收數(shù)據(jù),在函數(shù) app_init() 里面已經修改完成波特率 */
    
    /* pm2.5 傳感器 串口 初始化 */
    ty_uart_init(PM25_SENSOR_UART, TYU_RATE_9600, TYWL_8B, TYP_NONE, TYS_STOPBIT1, (PM25_BUFFER_SIZE * SIZEOF(UCHAR_T)), TRUE);

    /* 創(chuàng)建信號量 */
    opRet = tuya_hal_semaphore_create_init(&preheat_semaphore, 0, 1);
    if (opRet != OPRT_OK) {
        PR_ERR("creat preheat semaphore error : %d", opRet);
    }

    /* 預熱 60s 后釋放信號量,開始采集傳感器數(shù)據(jù) */
    opSocSWTimerStart(preheat_timer, SENSOR_PREHEAT_TIME, preheat_semaphore_post_task); 

    tuya_hal_thread_create(NULL, "acquire sensor data", 512*4, TRD_PRIO_2, acquire_data_task, NULL);
}

預熱完成釋放信號量:

VOID preheat_semaphore_post_task(VOID)
{
    //預熱完成,釋放信號量
    tuya_hal_semaphore_post(preheat_semaphore);
    //關閉預熱軟件定時器
    opSocSWTimerStop(preheat_timer);

    //預熱完成,上傳預熱完成數(shù)據(jù)到涂鴉云
    gs_air_box.preheat_state = false;
    updata_dp_single(gs_air_box.dp_preheat, PROP_BOOL, gs_air_box.preheat_state);
}

傳感器采集數(shù)據(jù)任務輪詢函數(shù):

 /***********************************************************
 *   Function:  acquire_data_task
 *   Input:     none
 *   Output:    none
 *   Return:    none
 *   Notice:    獲取傳感器數(shù)據(jù)任務
 ***********************************************************/
VOID acquire_data_task(VOID)
{
    //等待預熱完成
    tuya_hal_semaphore_wait(preheat_semaphore);

    while (1) {
        get_ch2o_sensor_value();
        get_flame_sensor_value();
        get_gas_sensor_value();
        get_pm25_sensor_value();
        get_smoke_sensor_value();
        tuya_hal_system_sleep(500);
    }
}

整機演示1.實時顯示當前空氣狀況

燒錄授權 完成后,設備就可以正常配網了。連接WiFi,打開藍牙,按照配網流程成功配網后,即可使用app控制設備。已經配網成功的設備,可長按按鍵再次進入配網模式。

環(huán)境安全衛(wèi)士APP顯示界面:


app

2.報警

當煙霧,燃氣或者火焰三者中有一種的濃度大于設定值,則app會顯示報警狀態(tài),并且斷開220V電壓。


img

至此,我們已經成功完成多功能環(huán)境安全衛(wèi)士的開發(fā)~搓搓手,原來DIY一款如此高級的環(huán)境檢測儀也是如此簡單~



戳以下鏈接,回復“環(huán)境檢測儀2”,即可獲取50元模組券以及詳細開發(fā)者資料,

手慢無!!

 https://www.wjx.cn/vj/wFXuAGU.aspx  

心動不如行動~ 老鐵們!在家、在公司也能讓室內環(huán)境變得更健康、安全!有趣又省錢的難道不香嗎?



*博客內容為網友個人發(fā)布,僅代表博主個人觀點,如有侵權請聯(lián)系工作人員刪除。




相關推薦

技術專區(qū)

關閉