摘要:本文讲述如何实现一个智能农业大棚系统,该系统需要采集光照强度、二氧化碳浓度、温湿度等等各类参数,且可以通过微信小程序查看各类传感器采集的数据,并可通过小程序控制水泵、排气扇和光照灯营造适合农作物生长的环境。
一、本系统主要用到的元器件:
STC12C5A60S2单片机
ESP8266-01S
DHT11温湿度传感器
SGP30二氧化碳传感器
BH1750光照强度传感器
土壤温湿度传感器
OLED显示模块
蜂鸣器
AMS1117降压芯片
三极管
电阻、电容等
二、本系统的实现流程
1、传感器的数据采集
传感器是本系统的重要组成之一,传感器的数据采集关乎着整个系统运转。通过传感器,我们可以获取大棚内部的二氧化碳浓度、光照强度、温湿度、土壤湿度等数据参数,通过分析获得的数据参数有利于我们对大棚的实时管理。
比如土壤湿度传感器,其是一种常用的农业传感器,用于检测土壤中的水分含量。其工作原理基于土壤中水分对电阻的影响。当土壤中含有水分时,电阻会相应地发生变化,从而可以通过测量电阻来确定土壤的湿度。但是土壤湿度传感器的一边检测到的结果为模拟量,本文用到的主控模块为STC12C5A60S2单片机,该单片机自带ADC转换器,可以将土壤湿度传感器采集的模拟量转换成数据量。
2、微信小程序设计
在本系统中,我们选用微信小程序作为整个系统的上位机,可以将采集到的数据更好的展现给用户,可供用户随时随地查看大棚内部的环境参数。因此本节主要讲解如何实现微信小程序的UI界面设计和微信小程序与巴法云平台的交互。
微信小程序的UI界面设计,主要为小程序界面设置、显示字体的样式和大小设置、获取数据的显示位置和背景图的设计等。下面是本系统的UI界面展示:
微信小程序与巴法云交互需要的条件有:巴法云控制台的用户秘钥(详见巴法云用户手册)、连接巴法云提供的服务器(详见巴法云用户手册)、与之交互的执行函数等等。
3、自动化控制实现
除了上述两点,实现自动化控制也是本系统的重点,本系统有三个执行模块,分别为光照灯、水泵和排气扇。这三个模块可通过微信小程序发送指令进行控制,亦可通过判断大棚内部环境是否符合设置的范围内启动调节。
总的来说,本系统的实现流程可以概括为:传感器采集数据,将数据发送到微信小程序中进行显示和控制,根据预设条件自动化地控制大棚内部的设备,实现对大棚内部环境的实时监控和控制。
主控模块的部分代码:
#include "STC12C5A60S2.H"
#include "delay.h"
#include "dht11.h"
#include "sgp30.h"
#include "bh1750.h"
#include "oled.h"
#include "init.h"
#include "uart.h"
#include "main.h"
#include "string.h"
#include "soil.h"
#include "alarm.h"
uchar flag;
uchar s_flag;
uchar dis_data;
void main()
{
beep = 0;
timer0Init(); //定时器初始化
Uart_Init(); //串口初始化
CO2_Init(); //SGP30模块初始化
OLED_Init();//OLED初始化
OLED_Clear();//清屏
OLED_show(); //显示
esp8266_connect(); //发送指令连接手机热点,同时订阅巴法云主题
while(1)
{
SendOutDH11Str();//读取dht11的值
CO2_get();//读取CO2的值
dis_data_get();//获取光照强度的值
soil_get();//读取土壤湿度的值
All_oled_show();//显示数据
judge();
esp8266_send();//WiFi上传数据函数
if(s_flag == 1)
{
prints("cmd=0&msg=ping"); //发送心跳
s_flag = 0;
}
}
}
//连接巴法云
void esp8266_connect()
{
/*模块作为服务器,模块设置为server模式,手机连接模块*/
prints("AT+CWJAP=\"HONOR\",\"12345678\"\r\n");
delay_ms(6000);
delay_ms(2000);
prints("AT+CIPMODE=1\r\n"); //进入透传模式
delay_ms(200);
prints("AT+CIPSTART=\"TCP\",\"bemfa.com\",8344\r\n"); //连接巴法云的服务器
delay_ms(200);
prints("AT+CIPSEND\r\n"); //开始透传
delay_ms(200);
prints("cmd=1&uid=xxxxx&topic=led\r\n"); //订阅巴法云的主题
delay_ms(200);
prints("cmd=1&uid=xxxxx&topic=fan\r\n");
delay_ms(200);
prints("cmd=1&uid=xxxxx&topic=pump\r\n");
delay_ms(200);
prints("cmd=1&uid=xxxxx&topic=test\r\n");
delay_ms(200);
}
//通过esp8266上传数据
void esp8266_send()
{
prints("cmd=2&uid=xxxxx&topic=test&msg=#");
PutNum(RH);//发送湿度数据
putchar('#');
PutNum(TH);//发送温度数据
putchar('#');
PutNum(CO2);//发送二氧化碳浓度数据
putchar('#');
PutNum(dis_data);//发送光照强度数据
putchar('#');
PutNum(resl);//发送土壤湿度数据
prints("\r\n");
delay_ms(2000);
}
//显示函数
void All_oled_show()
{
OLED_ShowNum(40,0,TH/10, 1, 16);
OLED_ShowNum(50,0,TH%10, 1, 16);
OLED_ShowNum(110,0,(RH)/10, 1, 16);
OLED_ShowNum(120,0,(RH)%10, 1, 16);
OLED_ShowNum(40,2,dis_data/1000, 1, 16);
OLED_ShowNum(50,2,dis_data/100, 1, 16);
OLED_ShowNum(60,2,dis_data/10, 1, 16);
OLED_ShowNum(70,2,dis_data%10, 1, 16);
OLED_ShowNum(40,4,resl/10, 1, 16);
OLED_ShowNum(50,4,resl%10, 1, 16);
OLED_ShowNum(40,6,CO2/1000, 1, 16);
OLED_ShowNum(50,6,CO2/100, 1, 16);
OLED_ShowNum(60,6,CO2/10, 1, 16);
OLED_ShowNum(70,6,CO2%10, 1, 16);
}
微信小程序的部分代码:
data: {
//需要修改的地方
uid:"xxxxxxx",//用户密钥,巴法云控制台获取
ledtopic:"led",//控制led的主题,创客云控制台创建
dhttopic:"test",//传输温湿度的主题,创客云控制台创建
fantopic:"fan",//控制风扇的主题
pumptopic:"pump",//控制水泵的主题
dataTime:"", //记录数据上传的时间
wendu:"",//温度值,默认为空
shidu:"",//湿度值,默认为空
co2 :"",//二氧化碳浓度
guangzhao:"",//光照强度
tudi:"",//土壤湿度
client: null,//mqtt客户端,默认为空
adcode:'',
city:'',//城市
humidity:'',//湿度
province:'',//省份
reporttime:'',//发布时间
temperature:'',//实时温度
weather:'',//天气
winddirection:'',//风向
windpower:'',//风力
},
仅供参考,有不正之处勿喷。