功能介绍:
0.本系统采用STC89C52作为单片机
1.LCD1602实时显示当前土壤湿度,环境温湿度
2.按键可设定土壤湿度和环境温湿度阈值
3.超过设定阈值时,控制继电器,温度过高时蜂鸣器报警
4.WIFI间隔时间上传土壤湿度,环境温湿度。
5.可通过WIFI控制继电器
*1O# 表示1号继电器打开 支持(1~5)
*1C# 表示1号继电器关闭 支持(1~5)
WIFI控制继电器后,进入手动模式
*MA# 表示可恢复自动模式
5.采用DC002作为电源接口可直接输入5V给整个系统供电
原理图:
PCB :
主程序:
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#include "delay.h"
#include "dht11.h"
#include "lcd1602.h"
#include "tlc0832.h"
sbit BUZZER = P2^4;
sbit KEY_SWITCH = P3^6; //确认按键
sbit KEY_SET = P3^3; //设置按键
sbit KEY_ADD = P3^4; //加按键
sbit KEY_SUB = P3^5; //减按键
sbit RELAY_COOL = P2^0;
sbit RELAY_HEAT = P2^1;
sbit RELAY_HM = P2^2;
sbit RELAY_DHM = P2^3;
sbit RELAY_SOIL_HM = P3^2;
#define ON 0
#define OFF 1
enum {NORMAL=1, SET_TEMP, SET_HM, SET_SOIL_HM} DispMode;
unsigned char dis0[18]; //数组暂存
unsigned char R_buf[4];
bit refreshFlag = 0;
bit setFlag = 0; //设置标志
bit setIndex = 0;
bit autoFlag = 1;
int Temp = 0;
int Humidity = 0;
int soilHumidity = 0;
int minTemp = 25;
int maxTemp = 35;
int minEvHm = 65;
int maxEvHm = 85;
int minSoilHm = 30;
void Timer0_Init(); //函数声明
void UART_Init();
void UART_SendByte(unsigned char dat);
void UART_SendStr(unsigned char *s, unsigned char length);
void DispNormal(void);
void DispSetTemp(setFlag, setIndex);
void DispSetHm(setFlag, setIndex);
void DispSetSiolHm(setFlag, setIndex);
void RelayCtrl(void);
void BuzzerCtrl(void);
void KeyScan(void);
void main()
{
Timer0_Init(); //定时器0初始化
LCD_Init(); //LCD初始化
LCD_Clear();
LCD_DispStr(4, 0, "Welcome!");
DelayS(5); //等待WIFI启动
UART_Init(); //串口初始化
UART_SendStr("AT+CIPMUX=1\r\n", 13); //打开多连接
DelayS(1);
UART_SendStr("AT+CIPSERVER=1,8080\r\n", 21); //建立服务 端口号为8080
DelayS(1);
DispMode = NORMAL;
while (1) //主循环
{
if (refreshFlag == 1) //刷新数据标志
{
static unsigned char cnt = 0;
refreshFlag = 0;
//检测数据
TR0 = 0; //关总中断
if (cnt % 5 == 0)
{
DHT11_ReadData(); //检测温湿度
Temp = U8T_data_H;
Humidity = U8RH_data_H;
}
soilHumidity = 100 - 100 * ((5 * ReadADC(AIN0_GND) / 255 - 1.3) / (4.6-1.3)); //检测土壤湿度
if (soilHumidity < 0)
{
soilHumidity = 0;
}
else if (soilHumidity > 100)
{
soilHumidity = 100;
}
if (DispMode == NORMAL)
{
DispNormal();
}
else if (DispMode == SET_TEMP)
{
DispSetTemp(setFlag, setIndex);
}
else if (DispMode == SET_HM)
{
DispSetHm(setFlag, setIndex);
}
else if (DispMode == SET_SOIL_HM)
{
DispSetSiolHm(setFlag, setIndex);
}
TR0 = 1; //开总中断
if (cnt >= 10) //5秒发送一次
{
cnt = 0;
//WIFI发送数据
UART_SendStr("AT+CIPSEND=0,35\r\n", 17); //发送AT命令
DelayMs(100);
sprintf(dis0, "Temp:%02d'C Hm:%02d%% \r\n", Temp, Humidity);
UART_SendStr(dis0, 19); //发送内容
if (autoFlag == 1) //自动模式
{
sprintf(dis0, "Siol Hm:%3d%% A\r\n", soilHumidity);
}
else
{
sprintf(dis0, "Siol Hm:%3d%% M\r\n", soilHumidity);
}
UART_SendStr(dis0, 16); //发送内容
}
else
{
cnt++;
}
}
RelayCtrl();
BuzzerCtrl();
KeyScan();
}
}
void DispNormal(void)
{
//LCD显示数据
sprintf(dis0, "Temp:%2d", Temp);
LCD_DispStr(0, 0, dis0);
LCD_DispOneChar(7, 0, 0xdf); //摄氏度的点
sprintf(dis0, "C Hm:%2d%%", Humidity);
LCD_DispStr(8, 0, dis0);
if (autoFlag == 1)
{
sprintf(dis0, "Siol Hm: %3d%% A", soilHumidity); //自动模式
}
else
{
sprintf(dis0, "Siol Hm: %3d%% M", soilHumidity); //WIFI控制,手动模式显示
}
LCD_DispStr(0, 1, dis0);
}
void DispSetTemp(setFlag, setIndex)
{
LCD_DispStr(0, 0, " Set Temp ");
sprintf(dis0, " Min:%2d Max:%2d ", minTemp, maxTemp);
LCD_DispStr(0, 1, dis0);
if (setFlag == 1)
{
if (setIndex == 0)
{
LCD_DispOneChar(0, 1, '>'); //箭头
LCD_DispOneChar(8, 1, ' ');
}
else if (setIndex == 1)
{
LCD_DispOneChar(0, 1, ' ');
LCD_DispOneChar(8, 1, '>'); //箭头
}
}
else
{
LCD_DispOneChar(0, 1, ' ');
LCD_DispOneChar(8, 1, ' ');
}
}
void DispSetHm(setFlag, setIndex)
{
LCD_DispStr(0, 0, " Set Hm ");
sprintf(dis0, " Min:%2d Max:%2d ", minEvHm, maxEvHm);
LCD_DispStr(0, 1, dis0);
if (setFlag == 1)
{
if (setIndex == 0)
{
LCD_DispOneChar(0, 1, '>'); //箭头
LCD_DispOneChar(8, 1, ' ');
}
else if (setIndex == 1)
{
LCD_DispOneChar(0, 1, ' ');
LCD_DispOneChar(8, 1, '>'); //箭头
}
}
else
{
LCD_DispOneChar(0, 1, ' ');
LCD_DispOneChar(8, 1, ' ');
}
}
void DispSetSiolHm(setFlag, setIndex)
{
LCD_DispStr(0, 0, " Set Soil Hm ");
sprintf(dis0, " Min:%2d ", minSoilHm);
LCD_DispStr(0, 1, dis0);
if (setFlag == 1)
{
LCD_DispOneChar(4, 1, '>'); //箭头
}
else
{
LCD_DispOneChar(4, 1, ' ');
}
}
void RelayCtrl(void)
{
if (autoFlag == 1) //自动模式
{
if (Temp < minTemp)
{
RELAY_HEAT = ON;
RELAY_COOL = OFF;
}
else if (Temp > maxTemp)
{
RELAY_HEAT = OFF;
RELAY_COOL = ON;
}
else
{
RELAY_HEAT = OFF;
RELAY_COOL = OFF;
}
if (Humidity < minEvHm)
{
RELAY_HM = ON;
RELAY_DHM = OFF;
}
else if (Humidity > maxEvHm)
{
RELAY_HM = OFF;
RELAY_DHM = ON;
}
else
{
RELAY_HM = OFF;
RELAY_DHM = OFF;
}
if (soilHumidity < minSoilHm)
{
RELAY_SOIL_HM = ON;
}
else
{
RELAY_SOIL_HM = OFF;
}
}
}
void BuzzerCtrl(void)
{
if (Temp > maxTemp)
{
BUZZER = ON;
}
else
{
BUZZER = OFF;
}
}
void KeyScan(void)
{
if (!KEY_SET) //设置键按下
{
DelayMs(10);
if (!KEY_SET)
{
if (DispMode != NORMAL)
{
setFlag = ~setFlag;
}
else
{
setFlag = 0;
}
while(!KEY_SET);
}
}
if (!KEY_SWITCH) //切换键按下
{
DelayMs(10);
if (!KEY_SWITCH)
{
if (DispMode == NORMAL)
{
autoFlag = 1; //恢复自动模式
}
else if (DispMode == SET_TEMP || DispMode == SET_HM)
{
if (setFlag == 1)
{
setIndex = ~setIndex;
}
}
while(!KEY_SWITCH);
}
}
if (!KEY_ADD) //加键按下
{
DelayMs(10);
if (!KEY_ADD)
{
if (DispMode == SET_TEMP && setFlag == 1)
{
if (setIndex == 0)
{
minTemp++;
if (minTemp >= maxTemp)
{
minTemp = 0;
}
}
else
{
maxTemp++;
if (maxTemp >= 100)
{
maxTemp = minTemp+1;
}
}
}
else if (DispMode == SET_HM && setFlag == 1)
{
if (setIndex == 0)
{
minEvHm++;
if (minEvHm >= maxEvHm)
{
minEvHm = 0;
}
}
else
{
maxEvHm++;
if (maxEvHm >= 100)
{
maxEvHm = minEvHm+1;
}
}
}
else if (DispMode == SET_SOIL_HM && setFlag == 1)
{
if (setIndex == 0)
{
minSoilHm++;
if (minSoilHm >= 100)
{
minSoilHm = 0;
}
}
}
else
{
DispMode++;
if (DispMode > SET_SOIL_HM)
{
DispMode = NORMAL;
}
setIndex = 0;
}
while(!KEY_ADD);
}
}
if (!KEY_SUB) //减键按下
{
DelayMs(10);
if (!KEY_SUB)
{
if (DispMode == SET_TEMP && setFlag == 1)
{
if (setIndex == 0)
{
minTemp--;
if (minTemp < 0)
{
minTemp = maxTemp-1;
}
}
else
{
maxTemp--;
if (maxTemp <= minTemp)
{
maxTemp = 99;
}
}
}
else if (DispMode == SET_HM && setFlag == 1)
{
if (setIndex == 0)
{
minEvHm--;
if (minEvHm < 0)
{
minEvHm = maxEvHm-1;
}
}
else
{
maxEvHm--;
if (maxEvHm <= minEvHm)
{
maxEvHm = 99;
}
}
}
else if (DispMode == SET_SOIL_HM && setFlag == 1)
{
if (setIndex == 0)
{
minSoilHm--;
if (minSoilHm < 0)
{
minSoilHm = 99;
}
}
}
else
{
DispMode--;
if (DispMode < NORMAL)
{
DispMode = SET_SOIL_HM;
}
setIndex = 0;
}
while(!KEY_SUB);
}
}
}
void Timer0_Init()
{
TMOD &= 0xF0;
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0 = (65536 - 18432) / 256; //重新赋值 20ms
TL0 = (65536 - 18432) % 256;
EA = 1; //总中断打开
ET0 = 1; //定时器中断打开
TR0 = 1; //定时器开关打开
}