基于STM32的实验室环境检测系统:温湿度、烟雾、空气质量检测和报警功能

基于(单片机/STM32)的实验室环境检测系统 程序 功能如下: (1)温湿度检测功能:采集实验室的温度和湿度参数。 (2)烟雾检测功能:采集当前实验室环境的烟雾浓度。 (3)空气质量检测功能:采集当前环境的空气,对有害气体进行检测。 (4)显示功能:实时显示实验室温湿度、烟雾浓度、空气质量、排风扇开启状态。 (5)排烟示警功能:当检测到实验室内环境的烟雾或有害气体浓度高于设定值时,打开排风扇并且将报警信息传到手机APP。 (6)按键功能:按键设置烟雾浓度、有害气体浓度的上限。 (7)手机APP显示功能:通过WiFi模块将数据(空气质量、烟雾浓度、窗和门口开启状态等)上传到APP并显示。

实验室里总有些看不见摸不着的东西在搞事情------比如突然飙升的温湿度,或者偷偷摸摸超标的有害气体。今天咱们用STM32搞个环境监测系统,给实验室装上"电子感官",顺手撸点代码把这些隐患揪出来。

先上硬菜------温湿度检测怎么玩。DHT11这货虽然精度不算顶尖,但胜在接线简单。注意读取数据时要卡准时序,就像跟傲娇的网友聊天,发消息的节奏不能错:

c 复制代码
void DHT11_Read(uint8_t *temp, uint8_t *humi) {
    GPIO_InitTypeDef gpio;
    // 拉低18ms触发信号
    DHT11_OUT_LOW();
    Delay_ms(18);
    // 切换输入模式准备读取
    GPIO_Mode_IN_FLOATING(&gpio);
    // 等待传感器回应
    while(DHT11_IN() == 1);
    while(DHT11_IN() == 0);
    while(DHT11_IN() == 1);
    // 40位数据接收...
}

这段代码里最骚的操作是GPIO模式动态切换,输出完立即切输入,像极了渣男变脸的速度。记得在数据位读取时用微秒级延时卡时间窗口,不然传感器传过来的摩斯电码就变乱码了。

烟雾警报触发逻辑更有意思,MQ-2传感器的模拟信号经过ADC转换后,得做个滑动滤波才靠谱:

c 复制代码
#define SMOKE_THRESHOLD 800  // 浓度阈值

uint16_t smoke_filter() {
    static uint16_t buf[5] = {0};
    uint32_t sum = 0;
    // 循环队列更新数据
    for(uint8_t i=4;i>0;i--) 
        buf[i] = buf[i-1];
    buf[0] = ADC_GetValue(ADC1, ADC_CHANNEL_5);
    
    for(uint8_t i=0;i<5;i++)
        sum += buf[i];
    return sum/5;
}

void check_smoke() {
    uint16_t avg = smoke_filter();
    if(avg > SMOKE_THRESHOLD) {
        FAN_CTRL(ON);
        Buzzer_Alert();
        ESP8266_Send("ALERT:SMOKE LEVEL CRITICAL!");
    }
}

这里用了个简易滑动窗口滤波,比直接读单次值稳多了。当浓度超标时不仅启动排风扇,还通过WiFi模块发报警信息,整套动作行云流水。

基于(单片机/STM32)的实验室环境检测系统 程序 功能如下: (1)温湿度检测功能:采集实验室的温度和湿度参数。 (2)烟雾检测功能:采集当前实验室环境的烟雾浓度。 (3)空气质量检测功能:采集当前环境的空气,对有害气体进行检测。 (4)显示功能:实时显示实验室温湿度、烟雾浓度、空气质量、排风扇开启状态。 (5)排烟示警功能:当检测到实验室内环境的烟雾或有害气体浓度高于设定值时,打开排风扇并且将报警信息传到手机APP。 (6)按键功能:按键设置烟雾浓度、有害气体浓度的上限。 (7)手机APP显示功能:通过WiFi模块将数据(空气质量、烟雾浓度、窗和门口开启状态等)上传到APP并显示。

OLED显示屏驱动要玩点花样,用自定义字符让数据显示更生动:

c 复制代码
void display_env() {
    OLED_ShowString(0,0,"Lab Monitor");
    // 温湿度显示带图标
    OLED_DrawBMP(0,16,16,16, temp_icon);
    OLED_ShowNum(24,16,Temp,2,16);
    OLED_DrawBMP(64,16,16,16, humi_icon);
    OLED_ShowNum(88,16,Humi,2,16);
    // 空气质量进度条
    OLED_ShowString(0,32,"AIR:");
    Draw_ProgressBar(32,32, AQI_Level);
    // 风扇状态动画
    if(FAN_Status) 
        OLED_DrawBMP(96,48,16,16, fan_anim[frame%4]);
}

自己画的温度计、水滴图标比纯文字带感多了,动态风扇图标用四帧循环,转起来比老板画的饼还圆润。

手机端数据上传得讲究效率,我直接让ESP8266走HTTP短连接,每30秒打包上传一次:

c 复制代码
void upload_data() {
    char post_data[128];
    sprintf(post_data,"temp=%.1f&humi=%.1f&smoke=%d&aqi=%d", 
           Temp, Humi, Smoke_Level, AQI);
    
    ESP8266_Send("AT+CIPSTART=\"TCP\",\"api.lab.com\",80");
    ESP8266_Send("AT+CIPSEND=%d", strlen(post_data)+38);
    ESP8266_Send("POST /update HTTP/1.1\r\nHost: api.lab.com\r\nContent-Length:%d\r\n\r\n%s", 
                strlen(post_data), post_data);
}

虽然没上MQTT这种专业协议,但胜在实现简单。注意TCP连接每次用完要记得关闭,不然模块内存泄漏起来比水龙头漏水还快。

整套系统跑起来后,实验室就像有了个电子门神。哪天要是闻到焦糊味,先别急着跑路,掏出手机看下是不是哪个憨憨把泡面煮炸了。代码里还埋了个彩蛋------当连续三次检测异常时,会自动抓取传感器数据生成曲线图发到管理邮箱,这可比在实验室门口贴"随手关电源"的标语管用多了。

相关推荐
可观测性用观测云4 天前
云原生网关 Ingress-Nginx 链路追踪实战:OpenTelemetry 采集与观测云集成方案
nginx·kubernetes
蝎子莱莱爱打怪6 天前
GitLab CI/CD + Docker Registry + K8s 部署完整实战指南
后端·docker·kubernetes
蝎子莱莱爱打怪9 天前
Centos7中一键安装K8s集群以及Rancher安装记录
运维·后端·kubernetes
阿里云云原生10 天前
Kubernetes 官方再出公告,强调立即迁移 Ingress NGINX
kubernetes
至此流年莫相忘10 天前
Kubernetes实战篇之配置与存储
云原生·容器·kubernetes
至此流年莫相忘10 天前
Kubernetes实战篇之服务发现
容器·kubernetes·服务发现
only_Klein10 天前
Kubernetes 版本升级
容器·kubernetes·upgrade
sanyii31313110 天前
k8s核心资源Pod-主容器之存活性探测
云原生·容器·kubernetes
EverydayJoy^v^11 天前
Kubernetes 知识点(1)——基础依赖
云原生·容器·kubernetes
Tummer836311 天前
从 Docker 到 Kubernetes:容器编排的工程化实践指南
docker·容器·kubernetes