【STM32F103C8T6单片机】甲醛监测与报警系统设计

文章目录

  • 原理图
  • ZE08-CH2O甲醛传感器
  • A9短信模块
  • 实物
  • 原理图

    ZE08-CH2O甲醛传感器

    ZE08-CH2O是一种甲醛(甲醛)传感器,用于检测环境中的甲醛浓度。甲醛是一种有毒气体,广泛用于建筑材料、家具、地毯、化妆品和其他消费品的生产中。高浓度的甲醛对人体健康有害,可能导致呼吸道问题、眼痛、皮肤刺激甚至癌症。

    ZE08-CH2O传感器采用电化学原理,能够测量环境中甲醛的浓度,并输出相应的电信号。它通常与微控制器或数据采集系统配合使用,以便监测甲醛浓度并采取适当的措施,如提醒用户开窗通风或触发警报。

    这种传感器通常具有以下特点:

    高灵敏度:能够检测到低浓度的甲醛。
    高精度:提供准确的测量结果。
    高稳定性:能够长时间稳定地工作。
    快速响应:能够迅速检测到甲醛浓度的变化。
    小型化设计:体积小,便于集成到不同的应用中。

    采用5V供电,然后使用STM32F103C8T6单片机的串口3,波特率9600,与ZE08-CH2O甲醛传感器进行通信。ZE08-CH2O甲醛传感器的输出电平是3.3。


    串口接收的代码:

    u32 ch2o_high = 1000;//甲醛的最大值,高于就报警 1000就是0.1mg/m3
    u32 ch2o;//甲醛浓度 mg/m3*10000
    
    
    u8 UART3_dat_ch2o[20];
    u8 ch2o_cnt = 0;
    
    void USART3_IRQHandler(void) {
        u8 res;
        if (USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) /* 接收到数据 */
        {
            res = USART_ReceiveData(USART3);
            //回发
            //USART_SendData(USART3, res);                                          /* 发送数据到串口3 */
    				UART3_dat_ch2o[ch2o_cnt]=res;
            switch (ch2o_cnt) {
                case 0:
                    if (UART3_dat_ch2o[ch2o_cnt] == 0xFF) ch2o_cnt = 1;
                    else ch2o_cnt = 0;
                    break;
    
                case 1:
                    if (UART3_dat_ch2o[ch2o_cnt] == 0x17) ch2o_cnt = 2;
                    else ch2o_cnt = 0;
                    break;
    
                case 2:
                    if (UART3_dat_ch2o[ch2o_cnt] == 0x04) ch2o_cnt = 3;
                    else ch2o_cnt = 0;
                    break;
    
                case 3:
                    if (UART3_dat_ch2o[ch2o_cnt] == 0x00) ch2o_cnt = 4;
                    else ch2o_cnt = 0;
                    break;
    
                case 4:
                    ch2o_cnt = 5;
                    break;
    
                case 5:
                    ch2o_cnt = 6;
                    break;
    
                case 6:
                    if (UART3_dat_ch2o[ch2o_cnt] == 0x13) ch2o_cnt = 7;
                    else ch2o_cnt = 0;
                    break;
    
                case 7:
                    if (UART3_dat_ch2o[ch2o_cnt] == 0x88) ch2o_cnt = 8;
                    else ch2o_cnt = 0;
                    break;
    
                case 8:  //校验接收的数据  正确则处理接收的数据
                    if ((UART3_dat_ch2o[ch2o_cnt] + UART3_dat_ch2o[1] + UART3_dat_ch2o[2] + UART3_dat_ch2o[3] +
                         UART3_dat_ch2o[4] + UART3_dat_ch2o[5] + UART3_dat_ch2o[6] + UART3_dat_ch2o[7]) % 256 == 0) {
                        ch2o = UART3_dat_ch2o[4] * 256 + UART3_dat_ch2o[5];
                        ch2o = ch2o * 13.392857;
                        ch2o_cnt = 0;
                    } else {
                        ch2o_cnt = 0;
                    }
                    break;
            }
    
        }
    }
    
    
    
    

    显示的代码:

        //甲醛
        memset(xianshi, 0, sizeof(xianshi));
        sprintf(xianshi, "C:%d.%04d mg/m3 ", (int) ch2o / 10000, (int) ch2o % 10000);
        OLED_P8x16Str(16 * 0, 4, xianshi, 0);
    

    A9短信模块

    引脚图:

    原理图:

    初始化:

    void init_A9(void) {
        OK = 0;
        printf("AT\r\n");
        delay_ms(500);
        printf("AT\r\n");
        delay_ms(500);
        while (1) {
            if (OK == 1)                  /* OK */
            {
                OK = 0;
                break;
            } else {
                delay_ms(500);
                printf("AT\r\n");     /* 再次测试AT */
                OLED_P8x16Str(16 * 0, 2, "SIM AT TEST ", 0);
            }
        }
        /* 检测卡SIM */
        OK = 0;
        printf("AT+CCID\r\n");
        delay_ms(500);
        while (OK == 0) {
            printf("AT+CCID\r\n");
            OLED_P8x16Str(16 * 0, 2, "SIM ERROR   ", 0);
            delay_ms(500);
        }
    }
    //A9模块
    void USART1_IRQHandler(void)                                                                  /* 串口1中断服务程序 */
    {
        u8 receiveData;
        static unsigned char over_flag = 0;                                                  /* 完成标志 */
    
        if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)                              /* 接收中断(接收到的数据必须是0x0d 0x0a结尾) */
        {
            receiveData = USART_ReceiveData(USART1);                                      /* 读取接收到的数据 */
            if (receiveData == '>') {
                OKGSM = 1;
            }
            RX_BUF[LENGTH++] = receiveData;
            if (receiveData == '\r') {
                over_flag = 1;
            } else if (((receiveData == '\n') && (over_flag == 1)))      /* 收到\r\n */
            {
                RX_BUF[LENGTH] = '\0';
                LENGTH = 0;
                over_flag = 0;                                    /* 完成标志 */
    
                if (strstr(RX_BUF, "OK") != NULL) {
                    OK = 1;
                } else {
                    OK = 0;
                }
            }
        }
    }
    
    

    发送短信:

    void send_once_GSM(void) {
        printf("AT+CMGF=1\r\n");
        OK = 0;
        delay_ms(500);
        while (OK == 0) {
            printf("AT+CMGF=1\r\n");
            delay_ms(500);
        }
    
    
        printf("AT+CMGS=\"13198256451\"\r\n");
        OKGSM = 0;
        delay_ms(500);
        while (OKGSM == 0) {
            printf("AT+CMGS=\"13198256451\"\r\n");
            delay_ms(500);
        }                                                       /* 等待 反应 */
        delay_ms(500);
    
        printf("message warining!!!!!!! ");
        while (USART_GetFlagStatus(USART1, USART_FLAG_TC) != SET);
    
        USART_SendData(USART1, 0x1a);                         /* 短信结尾字符 */
        while (USART_GetFlagStatus(USART1, USART_FLAG_TC) != SET);
    }
    

    实物

    最终搭载了SIM800C短信模块。
    源码:http://dt4.8tupian.net/2/28880a8b9990.pg3

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【STM32F103C8T6单片机】甲醛监测与报警系统设计

    发表评论