博客專欄

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

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

        發布人:智能物聯研習社 時間:2021-04-24 來源:工程師 發布文章


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

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

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

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

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

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

        而且,市面上大多數的環境監測儀并沒有擁有多功能的性能,難道要買好幾個不同功能點的儀器嗎?

        NO!  既燒錢,又麻煩 !

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

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

        先來張定妝照~


        new


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

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


        開啟動我的DIY之路~

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

        一、甲醛檢測


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

        具體電氣參數如圖:

        注 釋 : 氣 體 濃 度 值 (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檢測技術,能夠實現對同一環境中PM2.5和VOC的同時檢測。

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

        PM2.5+

        PM2.5-

        具體電氣參數如圖:


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


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

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

        三、煙霧檢測


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

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

        MQ2--

        傳感器靈敏度曲線如圖


        MQ2_S

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

        MQ2

        該模塊原理圖如下


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


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

        四、燃氣檢測

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


        傳感器靈敏度曲線如圖

        MQ4靈敏度

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

        五、火焰檢測


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

        為了減少開發周期,本次采購了市面上常見的火焰傳感器模組
        火焰傳感器

        原理圖如下

        火焰原理圖

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


        1、環境安全衛士電路設計

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

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

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

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


        SCHV3

        PCB如下

        PCBV2

        原理圖與PCB查看:

        下載地址

        • 原理圖

        • PCB


        戳以下鏈接,回復“環境檢測儀2”,即可獲取50元模組券以及詳細開發者資料,手慢無?。?/span>

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



        • 2、環境安全衛士實物搭建

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

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

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

        front1

        back1

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


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


        臺燈

        當然,用戶也可以根據自身需求,將本環境安全衛士和其他設備進行關聯。

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


        image.png

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


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

        step1

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

        step1.5

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

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

        step4

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

        all

        當然,我們也可以激發自己創意,給它穿上不同外衣

        all2

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

        另外,也可以根據自己的創意,設計出其他外觀,比如:

        new

        外形結構文件下載鏈接


        在這里插入圖片描述

        上罩殼

        在這里插入圖片描述

        下罩殼


        下面,講一講關于固件開發 part~


        3、環境安全衛士固件開發


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

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

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

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

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

        • 甲醛傳感器相關資料

        • PM2.5傳感器資料

        通過閱讀甲醛傳感器的資料我們可以發現,傳感器數據上傳格式和計算方法如下:

         /***********************************************************
         *   Function:  get_ch2o_sensor_value
         *   Input:     none
         *   Output:    none
         *   Return:    none
         *   Notice:    得到并上傳甲醛的數據
         ***********************************************************/
        static VOID get_ch2o_sensor_value(VOID)
        {
            UINT_T  buff_ret, find_head_index = 0;
            //甲醛數據高位,低位
            UCHAR_T ch2o_data_high, ch2o_data_low;
            //校驗和
            UCHAR_T check_sums = 0x00;    
            //串口數據緩存區
            UCHAR_T ch2o_receive_buffer[CH2O_BUFFER_SIZE];
            //指向甲醛數據頭部
            UCHAR_T *p_ch2o_value = NULL;
        
            memset(ch2o_receive_buffer, 0, sizeof(ch2o_receive_buffer));
        
            //讀取串口數據
            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 傳感器發送過來的頭部
            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;
                }
            }
        
            //本次采集數據不完整
            if (find_head_index > 11) { 
                PR_ERR("ch2o get uart data no complete!");
                return;
            }
        
            //將指針指向 ch2o 數據中的頭部
            p_ch2o_value = ch2o_receive_buffer + find_head_index;
        
            //檢驗和,確認讀取的數據的準確性
            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 數據到涂鴉云
            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:    甲醛數據校驗和
         ***********************************************************/
        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; //設置數據緩存個數
        }


        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;
        }

        煙霧傳感器,數據獲?。?/p>

        /* 煙霧傳感器 */
        #define SMOKE_ALARM_LIM 1.0
        
        /***********************************************************
         *   Function:  get_smoke_sensor_value
         *   Input:     none
         *   Output:    none
         *   Return:    none
         *   Notice:    得到并上傳煙霧的數據,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;
            }
        
            //上傳數據
            updata_dp_single(gs_air_box.dp_smoke_state, PROP_ENUM, gs_air_box.smoke_state);
        
            //PR_NOTICE("get smoke value, updata...");
            return;
        }

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

        3.檢測引腳高低電平獲取狀態:火焰傳感器

        火焰傳感器,檢測到火焰后斷開220v電源,重啟后220v通電,防止發生意外情況。

         /***********************************************************
         *   Function:  get_smoke_sensor_value
         *   Input:     none
         *   Output:    none
         *   Return:    none
         *   Notice:    得到并上傳火焰的數據
         ***********************************************************/
        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.設備初始化:

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


         /***********************************************************
         *   Function:  air_box_device_init
         *   Input:     none
         *   Output:    none
         *   Return:    none
         *   Notice:    環境安全衛士設備初始化
         ***********************************************************/
        VOID air_box_device_init(VOID)
        {
            INT_T opRet = OPRT_OK;
        
            /* 火焰傳感器相關外設初始化 */
            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 接收數據,在函數 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);
        
            /* 創建信號量 */
            opRet = tuya_hal_semaphore_create_init(&preheat_semaphore, 0, 1);
            if (opRet != OPRT_OK) {
                PR_ERR("creat preheat semaphore error : %d", opRet);
            }
        
            /* 預熱 60s 后釋放信號量,開始采集傳感器數據 */
            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);
        
            //預熱完成,上傳預熱完成數據到涂鴉云
            gs_air_box.preheat_state = false;
            updata_dp_single(gs_air_box.dp_preheat, PROP_BOOL, gs_air_box.preheat_state);
        }

        傳感器采集數據任務輪詢函數:

         /***********************************************************
         *   Function:  acquire_data_task
         *   Input:     none
         *   Output:    none
         *   Return:    none
         *   Notice:    獲取傳感器數據任務
         ***********************************************************/
        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控制設備。已經配網成功的設備,可長按按鍵再次進入配網模式。

        環境安全衛士APP顯示界面:


        app

        2.報警

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


        img

        至此,我們已經成功完成多功能環境安全衛士的開發~搓搓手,原來DIY一款如此高級的環境檢測儀也是如此簡單~



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

        手慢無??!

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

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



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




        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 德化县| 四川省| 嘉荫县| 牡丹江市| 台湾省| 五家渠市| 桐庐县| 罗江县| 阿拉善右旗| 健康| 和顺县| 镇江市| 宝山区| 星子县| 临湘市| 南部县| 陆良县| 景泰县| 盐池县| 元朗区| 榆中县| 万州区| 渝北区| 成武县| 鹿泉市| 墨玉县| 永新县| 运城市| 武山县| 孝感市| 武安市| 五华县| 朝阳区| 清镇市| 临猗县| 新乡县| 盐亭县| 西畴县| 镇安县| 故城县| 厦门市|