温室大棚监控系统实战笔记
51单片机温室大棚温湿度光照控制系统资料包括原理图PCB文件源程序一些软件等仿真文件。 设计简介: 151单片机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当状态指示灯超标了就亮红灯蜂鸣器哔哔叫。主程序骨架cvoid 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(); // 主机拉低18msDATA 1;delay30us(); // 然后拉高20-40us}注意DATA引脚需要切换输入输出模式这里用了端口模式寄存器配置技巧。数据格式是5字节校验和得算对不然数据会抽风。GY-30光照采集这个BH1750模块比ADC光敏电阻稳多了I2C通讯要注意地址0x23。连续测量模式代码cvoid BH1750Write(uint8t cmd) {I2C_Start();I2C_SendByte(0x46); // 写指令I2C_WaitAck();I2C_SendByte(cmd);I2C_WaitAck();I2C_Stop();}读取时直接取两字节数据拼成lux值。实测在强光下能到上万勒克斯比传统方法量程大很多。按键处理技巧三个按键分别对应温度、湿度、光照的阈值设置。长按进入设置模式短按加减数值。状态机写法最靠谱cenum KEY_STATE { IDLE, PRESSED, HOLD };static enum KEYSTATE keystate IDLE;51单片机温室大棚温湿度光照控制系统资料包括原理图PCB文件源程序一些软件等仿真文件。 设计简介: 151单片机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对应不同异常状态用位域结构体管理最省RAMcstruct AlarmFlags {uint8t temphigh :1;uint8t templow :1;uint8t humihigh :1;uint8t humilow :1;uint8t lighthigh:1;uint8t lightlow :1;} alarms;判断逻辑就是简单的大小比较但加了回差防止临界值抖动cif(currenttemp temphigh 2) {alarms.temp_high 1;beep_on();}蜂鸣器驱动加了脉冲调制比直接电平驱动更省电用定时器做个1KHz的PWM效果更佳。1602显示优化液晶显示要避免频繁刷新采用差异更新策略cstatic 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总线超时检测等。整个工程结构清晰模块化程度高拿来改造成其他监控系统也很方便。