
ZE08-CH2O是一种甲醛(甲醛)传感器,用于检测环境中的甲醛浓度。甲醛是一种有毒气体,广泛用于建筑材料、家具、地毯、化妆品和其他消费品的生产中。高浓度的甲醛对人体健康有害,可能导致呼吸道问题、眼痛、皮肤刺激甚至癌症。
ZE08-CH2O传感器采用电化学原理,能够测量环境中甲醛的浓度,并输出相应的电信号。它通常与微控制器或数据采集系统配合使用,以便监测甲醛浓度并采取适当的措施,如提醒用户开窗通风或触发警报。
这种传感器通常具有以下特点:
高灵敏度:能够检测到低浓度的甲醛。
高精度:提供准确的测量结果。
高稳定性:能够长时间稳定地工作。
快速响应:能够迅速检测到甲醛浓度的变化。
小型化设计:体积小,便于集成到不同的应用中。


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

串口接收的代码:
c展开代码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;
        }
    }
}
显示的代码:
c展开代码    //甲醛
    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);
引脚图:

原理图:

初始化:
c展开代码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;
            }
        }
    }
}
发送短信:
c展开代码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



本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!