1. 程式人生 > 其它 >手把手搭建自己的智慧家居 - 基於 IOT Pi 的智慧甲醛檢測器

手把手搭建自己的智慧家居 - 基於 IOT Pi 的智慧甲醛檢測器

智慧家居 - 基於 IOT Pi 的智慧甲醛檢測器

之前的文章體驗 MS-RTOS 的時候入手了一個塊 IOT Pi ,放著也是浪費,這次我們就利用 IOT PI 開發一個智慧甲醛檢測器。φ(>ω<*)

關於 IOT Pi 和 MS_RTOS 的介紹可以看看 (初識 IOT Pi 與 MS-RTOS),這兩個一個是翼輝推出的物聯網開發板(官網介紹),一個是新一代小型物聯網作業系統(官網介紹),之前只是跟著官方文件大概體驗了一下,一直有想法去研究真正實踐一下,最近家裡新買了一些傢俱正好做一個智慧甲醛檢測器來檢測下甲醛是否超標。

軟體準備

使用 MS-RTOS 需要下載對應的 IDE 開發環境,下載資源以及安裝使用可以參考官網教程:

IoT Pi 快速入門

其中需要安裝的有 IoT Studio 、MS-RTOS AutoTester 這兩個軟體,分別是整合開發 IDE 和 燒寫及日誌檢視工具。官方文件寫得非常具體可,具體使用上遇到什麼問題可以看看我之前寫的:初識 IOT Pi 與 MS-RTOS 裡面有我初次使用的時候遇到坑和解決辦法。

硬體準備

一塊 IOT Pi 開發板、配合燒寫的 Jlink ARM 模擬器(某寶一搜全都是)、一個甲醛檢測感測器 (在寫這篇文章的時候發現之前買的感測器下架了,連結是他們家另一款甲醛感測器,看了一下,uart 協議雖然有些些差距,但是和之前適配其他氣體類感測器結構一致,只需要改動一處巨集定義就可以相容了,具體修改參照後文中的程式碼解析)

管腳連線如下:3V3 - 3V3 、GND - GND 、RXD - PA2、 TXD - PA3

工程配置

根據官方文件 IoT Pi Pro 快速入門 完成以下步驟:

MS-RTOS 雲開發平臺上完成 msrtos_base_sdk 配置和下載

在 IoT Stduio 上完成 msrtos_base_sdk 工程匯入和編譯

在 IoT Stduio 上完成 bspstm32f4xx 工程的下載和匯入,如下圖所示:

Wi-Fi AP 列表配置

bspstm32f4xx/src/board/IOT_PI/iot_pi_init.c 為 IoT Pi 開發板的初始化原始檔,在此原始檔中的 ap_list[]

變數用於指定手動連線模式下嘗試連線到的 Wi-Fi AP 列表:

/**
 * WiFi AP list.
 */
static const ms_esp_at_net_ap_t ap_list[] = {
    { "EOS-00000F",    "123456789" }, // Spirit 1 的 Wi-Fi AP SSID 與密碼 
};

bspstm32f4xx 編譯

選中 bspstm32f4xx 工程,點選 “編譯” 按鈕,將編譯 bspstm32f4xx 工程,編譯完成後,會在 Debug 目錄生成 bspiotpi.bin 檔案:

libsddc 配置及編譯

靈感桌面的祕密寶庫下載 libsddc :https://gitee.com/inspiration-desktop/libsddc.git

將整個目錄替換 msrtos_base_sdk 工程中的 libsddc 目錄;

選中 msrtos_base_sdk 工程,點選 “編譯” 按鈕,將編譯 msrtos_base_sdk 工程的元件,編譯完成後,會在 libsddc/Debug/sddc_examples/src/example/demo 目錄生成 sddc_demo.bin 檔案:

燒錄驗證

使用 MS-RTOS AutoTester 燒寫映象,請參考 《IoT Pi 快速入門》 完成 bspiotpi.bindemo_sddc_sdk.bin 映象燒寫,注意不同的映象需要燒寫到不同的地址,如下表所示:

映象 燒寫地址
bspiotpi.bin 0x08000000
demo_sddc_sdk.bin 0x08040000

按下 IoT Pi 開發板的 RESET 按鍵,MS-RTOS 作業系統啟動後,將自動執行 0x08040000 地址處的 SDDC demo 程式:

可以參考 《IoT Pi 快速入門》 或之前的文章 智慧溫度感測器!基於 arduino 的智慧測溫模組 在 Spirit 1 中進行裝置新增,這裡就不贅述了,開啟之前寫的 DDC 協議嗅探器進行下測試,看到甲醛濃度只有 0.01 這下可以放心了;


還可以設定警告濃度,達到警告濃度後設備會主動上報當前甲醛濃度:

程式碼解析

由於現在購買到的甲醛感測器模組的協議和我文章中用到的不一致,需要修改 libsddc/src/sddc_sdk_lib/SDDC_SDK_UART_DEV.h 檔案中的一個巨集值,將 AIR_INFO_TYPE_1 改為 AIR_INFO_TYPE_2 即可:

#define AIR_INFO_TYPE_1   // 改為 AIR_INFO_TYPE_2

#ifdef AIR_INFO_TYPE_1
#define BUF_SIZE 40
#endif
#ifdef AIR_INFO_TYPE_2
#define BUF_SIZE 24
#endif
#ifdef  AIR_INFO_TYPE_3
#define BUF_SIZE 9
#endif

#define FRAME_HEADER_AA 0xaa
#define FRAME_HEADER_2C 0x2c
#define FRAME_HEADER_E4 0xe4

#define UART_AIR_NAME "ch2o"
#define WARN_REPORT_DATA 0.06  //甲醛超標濃度

int uart_dev_init(void);
sddc_bool_t uart_dev_state_get(char *objvalue, int value_len);
sddc_bool_t uart_dev_state_set(const ms_uint64_t value);

libsddc/src/sddc_sdk_lib/SDDC_SDK_UART_DEV.h 檔案中定義了三種類型的資料格式(其實並沒有用到。。。)只有上面的巨集定義和函式宣告有用到。

libsddc/src/sddc_sdk_lib/SDDC_SDK_UART_DEV.c 檔案中,有著 uart_dev_init 的實現。包括開啟串列埠並配置,並啟用一個執行緒來定期獲取甲醛濃度:

int uart_dev_init(void)
{
    fd = ms_io_open("/dev/uart2", O_RDWR, 0666);

    ms_uart_param_t  param;
    param.baud      = 9600;
    param.data_bits = MS_UART_DATA_BITS_8B;
    param.stop_bits = MS_UART_STOP_BITS_1B;
    param.parity    = MS_UART_PARITY_NONE;

    param.flow_ctl  = MS_UART_FLOW_CTL_NONE;
    param.mode = MS_UART_MODE_TX_RX;
    param.clk_pol = MS_UART_CPOL_LOW;
    param.clk_pha = MS_UART_CPHA_1EDGE;
    param.clk_last_bit = MS_UART_LAST_BIT_DISABLE;

    int ret = ms_io_ioctl(fd, MS_UART_CMD_SET_PARAM, &param);
    if (ret < 0) {
        ms_printf("[error]: set uart param failed!\n");
        ms_io_close(fd);
        return -1;
    }
    warn_data = WARN_REPORT_DATA;
    ret = ms_thread_create("t_uart",
                           iot_pi_uart_dev_get_thread,
                           MS_NULL,
                           2048U,
                           30U,
                           70U,
                           MS_THREAD_OPT_USER | MS_THREAD_OPT_REENT_EN,
                           MS_NULL);
    sddc_return_value_if_fail(ret == MS_ERR_NONE, -1);

    return 0;
}

iot_pi_uart_dev_get_thread 執行緒中定期 3s 獲取一次甲醛濃度,校驗資料無誤後如果超過設定的警告濃度就上報到 Spirit 1上面:

void iot_pi_uart_dev_get_thread()
{
    ms_uint8_t buf[BUF_SIZE];

    while(1) {
        usleep(1000 * 3000);
        ms_io_read(fd, &buf, sizeof(buf));
        if(buf[0] == FRAME_HEADER_AA){
//        if(buf[0] == FRAME_HEADER_2C && buf[1] == FRAME_HEADER_E4){
            if (CheckSum(&buf, (BUF_SIZE-1)) != buf[BUF_SIZE-1]) {
                printf("data checksum fail ...\n");
                break;
            } else {
                printf("data checksum success ...\n");
                uart_value_set(&buf);
            }

            if (data >= WARN_REPORT_DATA) {
                uart_report_state();  
            }
         }
     }
}

總結

MS-RTOS 和 IOT Pi 使用起來更偏向於普通的嵌入式作業系統開發,配置上封裝沒有 arduino 這麼完善,還是要自己去配置串列埠和 GPIO 口什麼的,但是 IDE 比 arduino 聰明多了,MS-RTOS 開發手感也比 arduino 移植上去的那個半殘的 FreeRTOS 好很多,完善很多。大部分 POSIX 介面都支援,但是用 MS-RTOS 介面程式碼執行效率更高。不過目前元件太少,只能做一些基礎開發,希望官方能加入更多的元件。