一.项目介绍 智慧农业大棚系统是一种基于物联网技术的农业技术解决方案,旨在提高农作物的生长效率和产量。该系统通过集成多种传感器和智能控制器,实现对大棚内环境的精确监测和控制。 以下是该系统的主要功能和特点: 1.多功能开关控制:该系统配备了采光灯开关、灌溉开关、供暖开关和通风开关等多个控制开关,可以根据实际需要自动或手动控制大棚内的各种设备。
2.精确环境监测:智慧农业大棚系统通过温湿度传惑器、光照强度传感器、二氧化碳浓度传感器、土壤湿度传感器和烟雾浓度传感器等多个传感器,实时监测大棚内的环境参数。
3.阈值设置与报警:系统允许用户设置各个环境参数的阈值,一旦某个参数超过预设的阈值,系统将自动触发报警机制,提醒用户采取相应的措拖。
4.数据采集与分析:该系统能够实时采集大棚内各个传惑器的数据,并将其存储,分析和发送到云服务器。通过对数据的分析,用户可以了解大棚内环境的变化趋势,优化农作物的生长条件。 二.系统总体设计框架
三.软硬件方案设计 1.硬件方案
2.软件方案
四.功能模块介绍 本设计以迪文屏幕为核心采用DGUI II操作系统,使用空气温度,空气湿度,光照,土壤湿度,气体传感器对温室大棚数进行采集,根据可设定的参数阈值与其他环境因子处理后开启通风,开启采光灯等,利用ESP8266和WiFi将数据上传到阿里云,用户可以远程查看大棚数据和控制温室大棚,设计一套基于单片机的农业温室大棚控制系统。它具有以下功能:
(1)温湿度监控功能,通过dht11温湿传感器采集的数据与所设定的阈值参数和其他环境因素进行处理,使用继电器模块控制风扇散热和加热片,达到调节温度的功能。
(2)光照监控功能,使用光照传感器,获取光照强度,光照强度所设定的阈值参数和其他环境因素进行处理,控制采光灯的开关。
(3)土壤湿度监控功能,通过土壤湿度传感器采集的数据与所设定的阈值参数和其他环境因素进行处理,使用继电器模块控制水泵进行灌溉,达到调节湿度的功能。
(4)烟雾监控功能,通过MQ-2传感器采集数据,当环境异常时触发警报,提醒种植者。
(5)更改阈值功能,通过按键改变设定好的阈值,实现不同农作物下设定温室大棚环境参数的不同阈值。
(6)显示功能:使用4.3寸的RGB屏幕,采取LTDC接口驱动,将传感器获取到的数值及设置的阈值和其他信息,直观显示在屏幕上。
(7)数据传输功能:使用ESP8266模块进行数据无线传输,通过WIFI透传,实现与云平台进行通信,通信方式采用MQTT协议将参数传输至云平台。
(8)远程查看与控制功能:采集数据显示在APP上,同时可以在APP上远程控制灌溉,通风等功能。
五.项目意义 1.提高农作物产量和质量
2.节约资源和保护环境
3.提高农业生产的稳定和可靠性
4.推动农业现代化和智能化发展
5.提高农民收入,助力精准扶贫
六.代码实现
- #include "sys.h"
- #include "dht11.h"
- #include "uart2.h"
- #include "uart.h"
- #include "adc.h"
- #include "pwm.h"
- #include <string.h>
- #include <stdio.h>
- char send_str[64];//手动/自动(0/1)
- u16 pub_num=0,sensor_num=0,user_num=0,temp_num=0,temp=0,humi=0;
- float GUANG=0,SHIDU=0,CO2=0,SMOG=0;
- u16 TEMP_L,TEMP_H,SHIDU_L,SMOG_H,LIGH_L,CO2_L,mode=0;
- int temp_buf[6]={0,0,0,0,0,0};
- sbit d1=P2^4;
- sbit d2=P2^5;
- sbit d3=P2^6;
- sbit d4=P2^7;
- void main(void)
- {
- sys_init();//系统初始化
- dht11_init(); //P1^7
- uart2_init(115200);//初始化串口2
- Wifi_Init();
- PORTDRV = 0x02;//驱动电流为8mA RGB规格为12mA
- P2MDOUT |= 0xF0; //设置为推挽输出
- UART4_conf();
- UART5_conf();
- memset(RX4_Buffer,0,COM_RX4_Lenth);
- memset(RX5_Buffer,0,COM_RX5_Lenth);
- printf("init ok\r\n");
- while(1)
- {
-
- //每隔8秒传感器数据发布一次
- if(pub_num++>=80){
- memset(send_str,0,64);
- //双引号和逗号前加3个反斜杠
- sprintf(send_str,"{\\"humi\\":%d\\\,\\"temp\\":%d}",humi,temp);
-
- // sprintf(send_str,"$001,%0.2f,%d,%d,%0.2f,%0.2f,%0.2f#",GUANG,temp,humi,SHIDU,CO2,SMOG);
- // printf(send_str);
- // sys_delay_ms(100);
- Wifi_Send_Data(send_str);
-
- pub_num=0;
- }
- //每隔1.5秒用户逻辑
- if(user_num++>=30){
- if(mode){
- if(SMOG>SMOG_H){
- TX5_writebuff('A');
- }
- temp=16;
- humi=62;
- if(temp>TEMP_H){
- TX5_writebuff('E');
- temp_num=0;
- sys_write_vp(Addr_C3,(u8*)&temp_num,1);
- }
- if(temp<TEMP_L){
- TX5_writebuff('D');
- temp_num=1;
- sys_write_vp(Addr_C3,(u8*)&temp_num,1);
- }
- if(SHIDU<SHIDU_L){
- TX5_writebuff('F');
- temp_num=1;
- sys_write_vp(Addr_C2,(u8*)&temp_num,1);
- }
- if(GUANG<LIGH_L){
- temp_num=1;
- sys_write_vp(Addr_C1,(u8*)&temp_num,1);
- }
- if(CO2<CO2_L){
- TX5_writebuff('G');
- }
- }
- // printf("mode:%d,temp:%d,humi:%d",mode,temp,humi);
- // printf("HHH: %d %d %d %d %d %d\r\n",TEMP_L,TEMP_H,SHIDU_L,SMOG_H,LIGH_L,CO2_L);
-
- // sys_read_vp(Addr_BEEP,(u8*)&temp_num,1);
- // if(temp_num){
- // sys_config(1,0);
- // }else{
- // sys_config(0,0);
- // }
-
- user_num=0;
- }
-
-
- //每隔2秒传感器数据获取一次
- if(sensor_num++>=20){
- //传感器数据读取
- GUANG = (4096 - adc_read(ADC_CHANNEL0))*100.0/4096; //亮度
- CO2 = adc_read(ADC_CHANNEL1)*100.0/4096; //电压
- SHIDU = adc_read(ADC_CHANNEL2)*100.0/4096; //浊度
- SMOG = adc_read(ADC_CHANNEL3)*100.0/4096; //烟雾
-
- //UI界面更新
- temp_num=GUANG;
- sys_write_vp(Addr_D1,(u8*)&temp_num,1);
- temp_num=temp;
- sys_write_vp(Addr_D2,(u8*)&temp_num,1);
- temp_num=humi;
- sys_write_vp(Addr_D3,(u8*)&temp_num,1);
- temp_num=SHIDU;
- sys_write_vp(Addr_D4,(u8*)&temp_num,1);
- temp_num=CO2;
- sys_write_vp(Addr_D5,(u8*)&temp_num,1);
- temp_num=SMOG;
- sys_write_vp(Addr_D6,(u8*)&temp_num,1);
- sensor_num=0;
- }
-
- // //调试串口接收
- // if(COM4.RX_Cnt>0){
- // printf("com4(debug) rec:%s\r\n",RX4_Buffer);
- // memset(RX4_Buffer,0,COM4.RX_Cnt);
- // COM4.RX_Cnt=0;
- // }
- //天问51接收
- if(COM5.RX_Cnt>0){
- printf("tianwen rec:%s\r\n",RX5_Buffer);
- switch(RX5_Buffer[0]){
- case '1':
- //开启采光灯
- temp_num=1;
- sys_write_vp(Addr_C1,(u8*)&temp_num,1);
- break;
- case '2':
- temp_num=0;
- sys_write_vp(Addr_C1,(u8*)&temp_num,1);
- break;
- case '3':
- //开启灌溉
- temp_num=1;
- sys_write_vp(Addr_C2,(u8*)&temp_num,1);
- break;
- case '4':
- temp_num=0;
- sys_write_vp(Addr_C2,(u8*)&temp_num,1);
- break;
- case '5':
- //开启供暖
- temp_num=1;
- sys_write_vp(Addr_C3,(u8*)&temp_num,1);
- break;
- case '6':
- //关闭供暖
- temp_num=0;
- sys_write_vp(Addr_C3,(u8*)&temp_num,1);
- break;
- case '7':
- //开启通风
- temp_num=1;
- sys_write_vp(Addr_C4,(u8*)&temp_num,1);
- break;
- case '8':
- //关闭通风
- temp_num=0;
- sys_write_vp(Addr_C4,(u8*)&temp_num,1);
- break;
- }
- // sprintf(send_str,"$001,0,%d,%d,%d,%d,%dUpDate#",mode,d1,d2,d3,d4);
- // Wifi_Send_Data(send_str);
-
- memset(RX5_Buffer,0,COM5.RX_Cnt);
- COM5.RX_Cnt=0;
- }
- //WIFI串口数据处理 格式:$XXX#
- if(rec_flag==2){
- printf("usart2(wifi) rec:%s\r\n",rx_buff);
- if(rx_buff[0]=='C'){
- if(rx_buff[1]=='1'){
- if(rx_buff[2]=='1'){
- temp_num=1;
- sys_write_vp(Addr_C1,(u8*)&temp_num,1);
-
- }else if(rx_buff[2]=='0'){
- temp_num=0;
- sys_write_vp(Addr_C1,(u8*)&temp_num,1);
- }
- }else if(rx_buff[1]=='2'){
- if(rx_buff[2]=='1'){
- temp_num=1;
- sys_write_vp(Addr_C2,(u8*)&temp_num,1);
-
- }else if(rx_buff[2]=='0'){
- temp_num=0;
- sys_write_vp(Addr_C2,(u8*)&temp_num,1);
- }
-
- }else if(rx_buff[1]=='3'){
-
- if(rx_buff[2]=='1'){
- temp_num=1;
- sys_write_vp(Addr_C3,(u8*)&temp_num,1);
-
- }else if(rx_buff[2]=='0'){
- temp_num=0;
- sys_write_vp(Addr_C3,(u8*)&temp_num,1);
- }
-
- }else if(rx_buff[1]=='4'){
-
- if(rx_buff[2]=='1'){
- temp_num=1;
- sys_write_vp(Addr_C4,(u8*)&temp_num,1);
-
- }else if(rx_buff[2]=='0'){
- temp_num=0;
- sys_write_vp(Addr_C4,(u8*)&temp_num,1);
- }
-
- }
- }
-
- if(rx_buff[0]=='H'){
- if(rx_buff[1]=='1'){
- temp_num=(rx_buff[2]-'0')*10+(rx_buff[3]-'0');
- sys_write_vp(Addr_H1,(u8*)&temp_num,1);
- }
- if(rx_buff[1]=='2'){
- temp_num=(rx_buff[2]-'0')*10+(rx_buff[3]-'0');
- sys_write_vp(Addr_H2,(u8*)&temp_num,1);
- }
- if(rx_buff[1]=='3'){
- temp_num=(rx_buff[2]-'0')*10+(rx_buff[3]-'0');
- sys_write_vp(Addr_H3,(u8*)&temp_num,1);
- }
- if(rx_buff[1]=='4'){
- temp_num=(rx_buff[2]-'0')*10+(rx_buff[3]-'0');
- sys_write_vp(Addr_H4,(u8*)&temp_num,1);
- }
- if(rx_buff[1]=='5'){
- temp_num=(rx_buff[2]-'0')*10+(rx_buff[3]-'0');
- sys_write_vp(Addr_H5,(u8*)&temp_num,1);
- }
- if(rx_buff[1]=='6'){
- temp_num=(rx_buff[2]-'0')*10+(rx_buff[3]-'0');
- sys_write_vp(Addr_H6,(u8*)&temp_num,1);
- }
-
- }
- rec_flag=0;
- }
- sys_read_vp(Addr_MODE,(u8*)&temp_num,1);
- if(temp_num){
- mode=1;
- }else{
- mode=0;
- }
- sys_read_vp(Addr_C1,(u8*)&temp_num,1);
- if(temp_num){
- d1=1;
- }else{
- d1=0;
- }
- sys_read_vp(Addr_C2,(u8*)&temp_num,1);
- if(temp_num){
- d2=1;
- }else{
- d2=0;
- }
- sys_read_vp(Addr_C3,(u8*)&temp_num,1);
- if(temp_num){
- d3=1;
- }else{
- d3=0;
- }
- sys_read_vp(Addr_C4,(u8*)&temp_num,1);
- if(temp_num){
- d4=1;
- }else{
- d4=0;
- }
- sys_read_vp(Addr_H1,(u8*)&temp_num,1);
- TEMP_H=temp_num;
- sys_read_vp(Addr_H2,(u8*)&temp_num,1);
- TEMP_L=temp_num;
- sys_read_vp(Addr_H3,(u8*)&temp_num,1);
- SMOG_H=temp_num;
- sys_read_vp(Addr_H4,(u8*)&temp_num,1);
- SHIDU_L=temp_num;
- sys_read_vp(Addr_H5,(u8*)&temp_num,1);
- LIGH_L=temp_num;
- sys_read_vp(Addr_H6,(u8*)&temp_num,1);
- CO2_L=temp_num;
- sys_delay_ms(100);
- dht11_read_data(&temp,&humi);
-
- }
- }
复制代码
七.演示成果 八.总结与致谢 首先,通过本次的迪文培训,我学习了迪文屏幕的一次开发和二次开发,我学到了很多知识和技能。无论是专业知识还是软技能,我都得到了很大的提升。学校注重培养学生的创新思维和团队合作能力,这让我在与同学们的合作中学到了很多。我也学会了如何高效地管理时间和处理压力,这对我的日后职业发展将起到重要的作用。 其次,我要感谢老师们的辛勤付出。你们不仅在课堂上传授知识,还给予了我许多指导和鼓励。你们的专业知识和丰富经验让我受益匪浅。我特别感谢你们对我的耐心和细心指导,让我能够更好地理解和掌握所学内容。 最后,我要感谢迪文校企合作给予我这次宝贵的学习机会。我相信这段经历将对我的未来产生深远的影响。我将会珍惜所学到的知识和技能,并努力将其应用于实际工作中,为社会做出贡献。 再次感谢迪文公司和所有的老师们!你们的付出和教导让我受益终生。 衷心感谢
|