news 2026/7/24 10:45:07

温室大棚监控系统实战笔记

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
温室大棚监控系统实战笔记

51单片机温室大棚温湿度光照控制系统资料包括原理图,PCB文件,源程序,一些软件等,仿真文件。 设计简介: (1)51单片机+DHT11温湿度传感器+GY-30光照传感器+1602液晶; (2)温度检测范围0-50度; (3)湿度检测范围20%-95%; (4)光照检测范围1-65535勒克斯; (5)有3个按键,用来设置温度、湿度和光照强度的报警范围; (6)有6个指示灯,分别代表温度过高、温度过低、湿度过高、湿度过低、光照过低、光照过高; (7)超出设置的正常范围,声光报警(蜂鸣器+LED灯); 程序有详细注释。

这个51单片机项目挺有意思的,核心就是让单片机当大棚管家,实时盯着温湿度光照。咱们直接上干货,看看怎么用STC89C52配上一堆传感器实现环境监控。

硬件全家福:DHT11负责温湿度(注意这货不能测零下),GY-30光照传感器(I2C接口挺省事),1602液晶显示数据。三个按键用来调阈值,六个LED当状态指示灯,超标了就亮红灯+蜂鸣器哔哔叫。

主程序骨架

`c

void main() {

init_all(); // 外设初始化三连

read_thresholds(); // 从EEPROM读取上次设定的阈值

while(1) {

read_sensors(); // 采集三要素

update_display(); // 液晶刷数据

check_alarm(); // 阈值比对

key_scan(); // 按键检测

delay(1000); // 悠着点采样

}

}

`

这个主循环像极了打工人的日常——每隔1秒就采集数据、刷新屏幕、检查异常,顺带看看有没有人按按键改设置。

DHT11数据读取要点

这个温湿度传感器有点小脾气,时序必须卡准。代码里专门用nop()做精准延时:

`c

// 启动信号

void DHT11_start() {

DATA = 0;

delay18ms(); // 主机拉低18ms

DATA = 1;

delay30us(); // 然后拉高20-40us

}

`

注意DATA引脚需要切换输入输出模式,这里用了端口模式寄存器配置技巧。数据格式是5字节,校验和得算对,不然数据会抽风。

GY-30光照采集

这个BH1750模块比ADC光敏电阻稳多了,I2C通讯要注意地址0x23。连续测量模式代码:

`c

void BH1750Write(uint8t cmd) {

I2C_Start();

I2C_SendByte(0x46); // 写指令

I2C_WaitAck();

I2C_SendByte(cmd);

I2C_WaitAck();

I2C_Stop();

}

`

读取时直接取两字节数据,拼成lux值。实测在强光下能到上万勒克斯,比传统方法量程大很多。

按键处理技巧

三个按键分别对应温度、湿度、光照的阈值设置。长按进入设置模式,短按加减数值。状态机写法最靠谱:

`c

enum KEY_STATE { IDLE, PRESSED, HOLD };

static enum KEYSTATE keystate = IDLE;

51单片机温室大棚温湿度光照控制系统资料包括原理图,PCB文件,源程序,一些软件等,仿真文件。 设计简介: (1)51单片机+DHT11温湿度传感器+GY-30光照传感器+1602液晶; (2)温度检测范围0-50度; (3)湿度检测范围20%-95%; (4)光照检测范围1-65535勒克斯; (5)有3个按键,用来设置温度、湿度和光照强度的报警范围; (6)有6个指示灯,分别代表温度过高、温度过低、湿度过高、湿度过低、光照过低、光照过高; (7)超出设置的正常范围,声光报警(蜂鸣器+LED灯); 程序有详细注释。

void key_scan() {

if(KEY1 == 0) {

if(key_state == IDLE) {

key_state = PRESSED;

thresholdmode = (thresholdmode +1)%3; // 切换设置项

}

// 长按处理...

} else {

key_state = IDLE;

}

}

`

EEPROM存储设定值,断电不丢失。注意AT24C02的页写入限制,别跨页写入。

报警逻辑

六个LED对应不同异常状态,用位域结构体管理最省RAM:

`c

struct AlarmFlags {

uint8t temphigh :1;

uint8t templow :1;

uint8t humihigh :1;

uint8t humilow :1;

uint8t lighthigh:1;

uint8t lightlow :1;

} alarms;

`

判断逻辑就是简单的大小比较,但加了回差防止临界值抖动:

`c

if(currenttemp > temphigh + 2) {

alarms.temp_high = 1;

beep_on();

}

`

蜂鸣器驱动加了脉冲调制,比直接电平驱动更省电,用定时器做个1KHz的PWM效果更佳。

1602显示优化

液晶显示要避免频繁刷新,采用差异更新策略:

`c

static char last_temp[5] = " ";

void update_display() {

sprintf(current_temp, "%2dC", temp);

if(strcmp(currenttemp, lasttemp) != 0) {

lcdwrite(1, 5, currenttemp);

strcpy(lasttemp, currenttemp);

}

// 其他数据同理...

}

`

这样处理能避免屏幕闪烁,同时降低总线负载。

源码里还有看门狗、软件抗干扰这些实战技巧。比如在DHT11读取失败时自动重试,I2C总线超时检测等。整个工程结构清晰,模块化程度高,拿来改造成其他监控系统也很方便。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/14 14:24:04

前端开发者如何通过umeditor实现PDF文档内容转存?

教育网站系统开发记:探寻支持 Word 内容粘贴与信创环境的富文本编辑器 作为一名 PHP 开发人员,最近我接到一个颇具挑战性的网站开发项目。客户是一位学校老师,他希望我们为他打造一个教育网站系统。这个项目有一些特殊且关键的需求&#xff…

作者头像 李华
网站建设 2026/7/14 14:24:06

数据库设计避坑指南:如何用1NF到BCNF解决数据冗余和异常问题

数据库设计避坑指南:如何用1NF到BCNF解决数据冗余和异常问题 在电商平台的订单系统中,你是否遇到过这样的场景:当用户修改收货地址时,需要同时更新数十条历史订单记录?或者在教务管理系统中,删除一门课程导…

作者头像 李华
网站建设 2026/7/14 14:24:17

Qwen3.5-9B多场景:食品包装图像理解+营养成分表提取案例

Qwen3.5-9B多场景:食品包装图像理解营养成分表提取案例 1. 案例背景与价值 在食品行业,快速准确地获取包装上的关键信息一直是个挑战。传统方法需要人工查看包装、手动记录数据,效率低下且容易出错。Qwen3.5-9B模型通过其强大的视觉-语言理…

作者头像 李华
网站建设 2026/7/14 14:24:18

Wan2.1-UMT5实战:应对GitHub打不开情况下的依赖安装与模型下载

Wan2.1-UMT5实战:应对GitHub打不开情况下的依赖安装与模型下载 1. 引言 最近在部署Wan2.1-UMT5这个多语言翻译模型时,你是不是也遇到了一个让人头疼的问题?照着官方文档一步步操作,结果在pip install或者git clone的时候&#x…

作者头像 李华