【单片机 TB作品】基于STM32F103C8T6单片机的甲醛监测与报警系统

原理图

在这里插入图片描述

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
在这里插入图片描述

### 使用MicroPython进行甲醛检测模块开发 #### 硬件连接说明 对于JW01-CO2二氧化碳、甲醛、TVOC检测模块(USART型),硬件连接需要注意的是该模块的FT引脚可以接受5V电压,而STM32F103C8T6的USART接口并非全部都支持5V电平。具体来说,仅USART1和USART3能够承受5V信号输入[^1]。 为了确保安全并实现稳定通信,在使用MicroPython控制板如ESP32或RPi Pico时建议采用逻辑电平转换器来匹配不同MCU之间的UART工作电压。如果目标控制器确实兼容5V UART,则可以直接将传感器的TXD/RXD分别对接到对应的接收/发送端子上,并提供必要的电源线接地连线。 #### MicroPython初始化代码示例 以下是基于ESP32平台的一个简单初始化实例: ```python from machine import Pin, UART import time # 初始化串口通信参数设置为9600波特率,默认数据位8停止位1无校验 uart = UART(2, baudrate=9600, tx=Pin(17), rx=Pin(16)) def read_sensor(): while uart.any() > 0: data = uart.read() if data is not None and len(data) >= 9: # 假设返回的数据包长度至少为9字节 formaldehyde_level = int.from_bytes(data[2:4], 'big') / 100.0 # 将读取到的数据解析成浮点数表示ppm浓度 print(f'Formaldehyde level detected: {formaldehyde_level:.2f} ppm') time.sleep(60) # 预热时间等待 read_sensor() ``` 此段程序创建了一个名为`read_sensor()`的功能函数用于持续监听来自传感器的信息流直到接收到完整的响应报文为止;随后提取其中有关于甲醛含量的部分并通过除法运算将其转化为人类可理解的形式打印出来。注意这里假设了设备启动后的前六十秒内可能不会给出有效测量结果因此加入了相应的延时期待让其充分自检完成后再做进一步处理。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值