项目介绍
本次设计以STM32F103C8T6单片机为核心,检测植物生长的温湿度、光照和土壤湿度等环境参数。根据检测数据和预设值的对比,判断缺少或者饱和来传递给单片机,以此控制自动实现光的遮或补功能。根据草坪生长期的浇水规则及对外界环境温湿度、土壤湿度的特殊要求,采用光敏电阻模块对草坪实现遮光、补光,DS18B20模块显示反馈室内温度,DHT11湿度模块检测土壤的干湿度进而实现水泵为草坪进行补水操作,通ESP8266模块监控草坪进行远程监控和管理。
功能介绍
(1)能测量环境的温度。温度过高或过低时可启动空调进行调节;
(2)能够检测土壤的湿度。当土壤湿度低时可洒水处理;
(3)能够检测到草坪所受的光照强度,根据草坪生长需要进行遮光或者开灯补光操作,
(4)当系统没有完成相应操作时,需有报警提示;
(5)采集的数据可通过WiFi模块和手机通信,能从手机上监控和修改参数;
所用模块
系统原理图
实物图
部分代码
int main(void)
{
all_int();
while(1)
{
updata_bao();
// delay_ms(100);
key=KEY_Scan(1);
getdata();
xianshi();
keychuli();
ESP_RecvProcess(); // 处理ESP8266接收到的数据
mqtt_lian();
flash_write();
panduan();
}
}
void all_int(void)
{
System_Init(); //初始化系统时钟
LED_Init(); //初始化LED
KEY_Init(); //初始化按键
SysTick_Init(systick_isr); //初始化系统滴答定时器
Lsens_Init(); //初始化光敏电阻及土壤湿度传感器
USART1_Init(115200,NULL,NULL); //初始化串口1,打印日志用
OLED_Init(); //初始化OLED屏幕
OLED_Display_On(); //OLED屏幕显示开
OLED_Clear(); //OLED屏幕清屏
if(DHT11_Init()) //如果DHT11初始化失败则输出错误信息
{
printf(“DHT11 Init ERROR”);
}
delay_ms(500); //延时500ms
flash_read();//读取内存中的传感器阈值
ESP_Init(); //初始化ESP8266 WiFi模块
AliYun_Mqtt_Init(); //初始化阿里云MQTT协议
}
void systick_isr(void)
{
// 每当sys_cnt小于1000时,sys_cnt加1
if(sys_cnt < 1000) sys_cnt++;
else
{
sys_cnt = 0; // 当sys_cnt等于1000时,将sys_cnt重置为0
sys_update_rate = 1; // 将sys_update_rate设为1,表示系统更新率为每秒1次
}
// 每当ping_cnt小于10000时,ping_cnt加1
if(ping_cnt < 10000) ping_cnt++;
else
{
ping_cnt = 0; // 当ping_cnt等于10000时,将ping_cnt重置为0
ping_start = 1; // 将ping_start设为1,表示开始进行ping操作
}
// 每当urc_cnt小于1000时,urc_cnt加1
if(urc_cnt < 1000) urc_cnt++;
else
{
urc_cnt = 0; // 当urc_cnt等于1000时,将urc_cnt重置为0
urc_update = 1; // 将urc_update设为1,表示urc更新
}
// 每当recv_timeout小于30时,recv_timeout加1
if(recv_timeout < 30) recv_timeout++;
if(recv_timeout == 20)
{
recv_complete = 1; // 当recv_timeout等于20时,将recv_complete设为1,表示接收完成
}
// 如果esp状态为ESP_STA_CONNECTED
if(esp_connect_ok == ESP_STA_CONNECTED)
{
// 每当esp_recv_timeout小于30时,esp_recv_timeout加1
if(esp_recv_timeout < 30) esp_recv_timeout++;
if(esp_recv_timeout == 20)
{
esp_recv_complete = 1; // 当esp_recv_timeout等于20时,将esp_recv_complete设为1,表示接收完成
}
}
}
void xianshi (void)
{
光(0) 照(1) 强(2) 度(3) 温(4) 度(5) 湿(6) 度(7)
// 土(8) 壤(9) 湿(10) 度(11) 模(12) 式(13) 手(14) 自(15)
// 动(16) 设(17) 置(18) 阈(19) 值(20) 上(21) 下(22) 限(23)
// 如果p等于0,显示光照强度、温度、湿度、土壤湿度、模式手自动设置阈值
if(p==0)
{
OLED_ShowCHinese(0,2,0); // 显示字符"光"
OLED_ShowCHinese(16,2,1); // 显示字符"照"
OLED_ShowCHinese(32,2,2); // 显示字符"强"
OLED_ShowCHinese(48,2,3); // 显示字符"度"
sprintf((char *)buff,“:%2d ux”,gz); // 将光照强度转换为字符串并存储在buff中
OLED_ShowString(64,2,buff,16); // 在坐标(64,2)处显示光照强度字符串
OLED_ShowCHinese(0,0,4); // 显示字符"温"
OLED_ShowCHinese(16,0,5); // 显示字符"度"
sprintf((char *)buff,":%2dC",h_w); // 将温度转换为字符串并存储在buff中
OLED_ShowString(32,0,buff,16); // 在坐标(32,0)处显示温度字符串
OLED_ShowCHinese(72,0,6); // 显示字符"湿"
OLED_ShowCHinese(88,0,7); // 显示字符"度"
sprintf((char *)buff,":%2d",h_s); // 将湿度转换为字符串并存储在buff中
OLED_ShowString(104,0,buff,16); // 在坐标(104,0)处显示湿度字符串
OLED_ShowCHinese(0,4,8); // 显示字符"土"
OLED_ShowCHinese(16,4,9); // 显示字符"壤"
OLED_ShowCHinese(32,4,10); // 显示字符"湿"
OLED_ShowCHinese(48,4,11); // 显示字符"度"
sprintf((char *)buff,":%2d %%",t_s); // 将土壤湿度转换为字符串并存储在buff中
OLED_ShowString(64,4,buff,16); // 在坐标(64,4)处显示土壤湿度字符串
OLED_ShowCHinese(0,6,12); // 显示字符"模"
OLED_ShowCHinese(16,6,13); // 显示字符"式"
sprintf((char *)buff,":");
OLED_ShowString(32,6,buff,16); // 在坐标(32,6)处显示冒号
if(moshi==1)
{
OLED_ShowCHinese(48,6,14); // 显示字符"手"
OLED_ShowCHinese(64,6,16); // 显示字符"动"
}
if(moshi==0)
{
OLED_ShowCHinese(48,6,15); // 显示字符"自"
OLED_ShowCHinese(64,6,16); // 显示字符"动"
}
}
// 如果p等于1,显示土壤湿度阈值设置界面
if(p==1)
{
OLED_ShowCHinese(32,0,17); // 显示字符"设"
OLED_ShowCHinese(80,0,18); // 显示字符"置"
sprintf((char *)buff," "); // 将空格字符存储在buff中
OLED_ShowString(0,6,buff,16); // 在坐标(0,6)处显示空格字符
OLED_ShowString(0,2,buff,16); // 在坐标(0,2)处显示空格字符
OLED_ShowString(0,4,buff,16); // 在坐标(0,4)处显示空格字符
if(hang==1)
OLED_ShowString(0,2,(u8 *)">",16); // 在坐标(0,2)处显示">"字符
if(hang==2)
OLED_ShowString(0,4,(u8 *)">",16); // 在坐标(0,4)处显示">"字符
if(hang==3)
OLED_ShowString(0,6,(u8 *)">",16); // 在坐标(0,6)处显示">"字符
OLED_ShowCHinese(8,2,10); // 显示字符"湿"
OLED_ShowCHinese(24,2,11); // 显示字符"度"
OLED_ShowCHinese(40,2,21); // 显示字符"上"
OLED_ShowCHinese(56,2,23); // 显示字符"限"
if(sdyz_high>99)sdyz_high=99; // 如果土壤湿度上限大于99,则将其设为99
sprintf((char *)buff,": %2d %%",sdyz_high); // 将土壤湿度上限转换为字符串并存储在buff中
OLED_ShowString(72,2,buff,16); // 在坐标(72,2)处显示土壤湿度上限字符串
OLED_ShowCHinese(8,4,10); // 显示字符"湿"
OLED_ShowCHinese(24,4,11); // 显示字符"度"
OLED_ShowCHinese(40,4,22); // 显示字符"下"
OLED_ShowCHinese(56,4,23); // 显示字符"限"
if(sdyz_low >99)sdyz_low=99; // 如果土壤湿度下限大于99,则将其设为99
sprintf((char *)buff,": %2d %%",sdyz_low); // 将土壤湿度下限转换为字符串并存储在buff中
OLED_ShowString(72,4,buff,16); // 在坐标(72,4)处显示土壤湿度下限字符串
OLED_ShowCHinese(8,6,0); // 显示字符"光"
OLED_ShowCHinese(24,6,1); // 显示字符"照"
OLED_ShowCHinese(40,6,19); // 显示字符"阈"
OLED_ShowCHinese(56,6,20); // 显示字符"值"
if(gzyz > 99)gzyz = 99; // 如果光照阈值大于99,则将其设为99
sprintf((char *)buff,": %2d ux",gzyz); // 将光照阈值转换为字符串并存储在buff中
OLED_ShowString(72,6,buff,16); // 在坐标(72,6)处显示光照阈值字符串
}
}
资料下载链接
「实物制作资料.rar」,来自夸克网盘分享。
夸克网盘无需下载在线播放视频,畅享原画5倍速,支持电视投屏。
/a0ef3461vM😕
链接:https://pan.quark.cn/s/75ec9d817bf9
提取码:CtuL