0343基于STM32单片机的茶园大棚环境土壤湿度光强WiFi监测系统proteus仿真原理图PCB

功能介绍:
0.本系统采用STM32F103RCT6作为单片机
1.采用的LCD1602液晶实时显示当前光强土壤湿度等参数信息
2.当土壤湿度超过设定的阈值,蜂鸣器报警,同时控制水泵工作状态
3.按键可更改环境参数的阈值
4.通过WiFi模块可以和手机端进行数据通信
5.温度传感器和光强传感器均采用高精度数字类传感器

原理图:
在这里插入图片描述

PCB:
在这里插入图片描述

主程序:

#define __MIAN_C
#include "main.h"
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "bsp_gpio.h"
#include "bsp_clkconfig.h"
#include "bsp_delay.h"
#include "bsp_lcd1602.h"
#include "bsp_key.h"
#include "bsp_GeneralTim.h"
#include "bsp_adc.h"
#include "bsp_18b20.h"
#include "bsp_bh1750.h"
#include "bsp_usart.h"

// 局部变量,用于保存转换计算后的电压值
CreatByte Flag;
enum _MODE_DF_ dispMode;

char dis[16];
char dis1[16];
u32 humidity = 0;
volatile uint16_t hmMin= 25;
volatile uint16_t hmMax= 35;
uint16_t tempBuf = 0;
volatile uint16_t tempMin = 25;
volatile uint16_t tempMax = 40;
float f_temp = 0;
int lightBuf; 
float f_light;
volatile uint16_t lightMin = 30;
volatile uint16_t lightMax = 1000;
u8 volatile setIndex = 0;

int main(void)
{

    // 使用HSI,SYSCLK = 4M * RCC_PLLMul_x, x:[2,3,...16],最高是64MH
    HSI_SetSysClock(RCC_PLLMul_2); //使用内部8MHz晶振,并设置PLL输出为8MHz

    // 端口初始化
    GPIO_Config();
    GENERAL_TIM_Init();
    USART_Config();

    DelayMs(1000);
	printf("AT+CIPMUX=1\r\n"); //打开多连接
	DelayMs(1000);
	printf("AT+CIPSERVER=1,8080\r\n"); //建立服务 端口号为8080
	DelayMs(1000);

    Key_GPIO_Config();
    DelayMs(200);
    DS18B20_GPIO_Init();
    BH1750_GPIO_Init();
    Init_BH1750();

    LCD_GPIO_Init();
    LCD_Init();
    LCD_Clear();
    DelayMs(200);

    ADCx_Init();

    while (1)
    {

        if (refreshFlag == 1)
        {
            refreshFlag = 0;
            
            RefreshData();
            
            if (humidity <= hmMax && humidity >= hmMin\
                && f_temp <= tempMax && f_temp >= tempMin \
                && f_light <= lightMax && f_light >= lightMin) //在范围内
            {
                BUZZER_OFF;
            }
            else
            {
                BUZZER_ON;
            }
            
            if (humidity < hmMin) //土壤湿度低时,开启水泵
            {
                RELAY_ON;
            }
            else
            {
                RELAY_OFF;
            }
            
            if (dispMode == NORMAL)
            {
                DispNormal();
            }
        }
        
        if (sendFlag == 1)
        {
            sendFlag = 0;
            TIM_ITConfig(GENERAL_TIM2, TIM_IT_Update, DISABLE);
            SendData();
            TIM_ITConfig(GENERAL_TIM2, TIM_IT_Update, ENABLE);
        }
        KeyProcess();
    }
}

void RefreshData(void)
{
    u8 i;

    for (i = 0; i < 20; i++)
    {
        humidity = humidity + ADC_ConvertedValue[i];
    }
    humidity = humidity / 20; //取20次平均
    humidity = 100 - humidity * 100 / 4096; //读取土壤湿度信息
    
    DS18B20_GetTemp(&tempBuf); //采集温度
    f_temp = tempBuf * 0.0625; //温度转换
    
    Single_Write_BH1750(0x01);   // power on
    Single_Write_BH1750(0x10);   // H- resolution mode
    Multiple_Read_BH1750();       //连续读出数据,存储在BUF中
    lightBuf=BUF[0];
    lightBuf=(lightBuf<<8)+BUF[1];//合成数据,即光照数据
    f_light=(float)lightBuf/1.2; //计算光照数据
}

void SendData(void)
{
    printf("AT+CIPSEND=0,34\r\n"); //发送32位数据
    DelayMs(100);
    printf("Hm:%2d%% T:%5.1f'C\r\nLight:%8.1flx\r\n", humidity, f_temp, f_light); //串口发送
    DelayMs(100);
}

void DispNormal(void)
{
    sprintf(dis, "Hm:%2d%% T:%5.1f", humidity, f_temp);
    LCD_DispStr(0, 0, dis);
    LCD_DispOneChar(14, 0, 0xdf);
    LCD_DispOneChar(15, 0, 'C');
    
    sprintf(dis, "Light:%8.1flx", f_light);
    LCD_DispStr(0, 1, dis);
}

void DispSetHm(u8 setIndex)
{

    LCD_DispStr(0, 0, "  Set Humidity  ");
    sprintf(dis, "   H:%2d%% L:%2d%%  ", hmMax, hmMin);
    LCD_DispStr(0, 1, dis);
    
    switch (setIndex)
    {
        case 1: LCD_SetCursor(6, 1, 1); break;
        case 2: LCD_SetCursor(12, 1, 1); break;
        default:;
    } 
}

void DispSetTemp(u8 setIndex)
{

    LCD_DispStr(0, 0, "Set Temperature ");
    sprintf(dis, "   H:%3d L:%3d  ", tempMax, tempMin);
    LCD_DispStr(0, 1, dis);
    
    switch (setIndex)
    {
        case 1: LCD_SetCursor(7, 1, 1); break;
        case 2: LCD_SetCursor(13, 1, 1); break;
        default:;
    } 
}

void DispSetLight(u8 setIndex)
{

    LCD_DispStr(0, 0, " Set LightLimit ");
    sprintf(dis, "H:%5d  L:%5d", lightMax, lightMin);
    LCD_DispStr(0, 1, dis);
    
    switch (setIndex)
    {
        case 1: LCD_SetCursor(6, 1, 1); break;
        case 2: LCD_SetCursor(15, 1, 1); break;
        default:;
    } 
}
/*********************************************END OF FILE**********************/

实物演示视频:
https://www.bilibili.com/video/BV1ou411r75L/

  • 1
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值