基于STM32单片机的智能粮仓温湿度检测控制仿真

仿真图:

在这里插入图片描述

芯片/模块的特点:

STM32F103简介:
高性能处理器:STM32F103系列采用ARM Cortex-M3内核,工作频率可达到72MHz,具有较高的计算能力和执行效率。

多种存储容量和类型:STM32F103系列提供了不同存储容量和类型的微控制器,包括Flash存储器和RAM存储器。Flash存储器容量范围从16KB到512KB不等,RAM存储器容量从10KB到64KB不等,可以根据应用需求选择适当的存储容量。

丰富的外设接口:STM32F103系列微控制器提供了多种外设接口,包括串行通信接口(如USART、SPI、I2C等)、通用定时器和计数器、模拟数字转换器(ADC)、PWM输出、以太网接口等,可满足各种应用的需求。

低功耗特性:STM32F103系列微控制器具有多种低功耗模式,以在不同的应用场景下降低系统功耗,并延长电池寿命。例如,它支持停机模式、待机模式和休眠模式等。

强大的软件生态系统:STM32F103系列微控制器支持意法半导体公司的STM32Cube软件开发生态系统,提供了一系列工具和软件库,简化了软件开发过程,同时还有广泛的开发社区支持。

安全性功能:STM32F103系列微控制器具有硬件加密和校验功能,可确保代码的安全性和完整性。

丰富的包装选项:STM32F103系列提供多种封装选项,包括LQFP、BGA、LFBGA等,方便了不同应用和布局要求的设计。

主程序:

#include "bsp_gpio.h"   
#include "sys.h"
#include "usart.h"
#include <stdio.h>
#include "timer.h"
#include "bsp_key.h"
#include "bsp_lcd1602.h"
#include "dht11.h"
#include "bsp_clkconfig.h"
#include "bsp_delay.h"

char dis0[16]; // 1602显示第一行
char dis1[16];

u16 tempMax = 40; //温度阈值
u16 hmMax = 60; //湿度阈值

u8 setIndex = 0;
u8 fanFlag1 = 0;


void KeyProcess(void);

int main(void)
{
    HSI_SetSysClock(RCC_PLLMul_2);

	uart_init(9600);		  // 串口初始化为9600
	TIM3_Int_Init(49, 7199); // 50ms
	// 	Adc_Init();		  		//ADC初始化

	Key_GPIO_Config();
	GPIO_Config();
	LCD_GPIO_Init(); // 1602接口初始化
	LCD_Init();
	delay_ms(200);

	sprintf(dis0, "Temp:%02d C DH:%02d%%", (u16)DHT11.Tem_H, (u16)DHT11.Hum_H); // 打印温湿度
	LCD_DispStr(0, 0, dis0);										// 初始化显示
	LCD_DispOneChar(7, 0, 0xdf);
	sprintf(dis0, "TH:%02d C DHH:%02d%%", (u16)tempMax, (u16)hmMax); // 打印温湿度阈值
	LCD_DispStr(0, 1, dis0);										// 初始化显示
	LCD_DispOneChar(5, 1, 0xdf);
	while (1)
	{
		if (refreshFlag == 1)
		{
			refreshFlag = 0;
			if (DHT11_ReadData()) // 是否读取到温湿度
			{
				sprintf(dis0, "%02d", (u16)DHT11.Tem_H); // 打印温湿度
				LCD_DispStr(5, 0, dis0);	// 显示
				sprintf(dis0, "%02d", (u16)DHT11.Hum_H); // 打印温湿度
				LCD_DispStr(13, 0, dis0);	// 显示
				
                sprintf(dis0, "Temp:%02d'C DH:%02d%%", (u16)DHT11.Tem_H, (u16)DHT11.Hum_H); // 打印温湿度
				printf(dis0); // 串口打印数据
				printf("\r\n");
				if (DHT11.Tem_H > tempMax) // 对比温度值
				{
					fanFlag1 = 1;
					printf("Temperature High\r\n"); // 发送温度过高
				}
				else
				{
					fanFlag1 = 0;
					printf("Temperature Normal\r\n"); // 温度正常
				}
				if (DHT11.Hum_H > hmMax) // 对比湿度值
				{
					printf("Humidity High\r\n"); // 发送湿度过高
				}
				else
				{
					printf("Humidity Normal\r\n"); // 湿度正常
				}

				if (DHT11.Tem_H > tempMax || DHT11.Hum_H > hmMax) //超过设定值
				{
					BUZZER_ON;
				}
				else
				{
					BUZZER_OFF;
				}

				if (fanFlag1 || fanFlag2)
				{
					printf("Fan On\r\n"); //风扇开
					FAN_ON;
				}
				else
				{
					printf("Fan Off\r\n"); //风扇关
					FAN_OFF;
				}
			}
		}
		KeyProcess();
	}
}


void KeyProcess(void)
{
    if (!KEY_SET) //按键加
    {
        delay_ms(20);
        if (!KEY_SET)
        {
            setIndex++;
            if (setIndex > 2)
            {
                setIndex = 1;
            }
			if (setIndex == 1)
			{
				LCD_DispOneChar(7, 1, '<');
				LCD_DispOneChar(15, 1, ' ');
			}
			else if (setIndex == 2)
			{
				LCD_DispOneChar(7, 1, ' ');
				LCD_DispOneChar(15, 1, '<');
			}
			else
			{
				LCD_DispOneChar(7, 1, ' ');
				LCD_DispOneChar(15, 1, ' ');
			}
		}
        while (!KEY_SET);
    }

    if (!KEY_ENTER) //按键加
    {
        delay_ms(20);
        if (!KEY_ENTER)
        {
            setIndex = 0;
			LCD_DispOneChar(7, 1, ' ');
			LCD_DispOneChar(15, 1, ' ');
        }
        while (!KEY_ENTER);
    }

    if (!KEY_ADD) //按键加
    {
        delay_ms(180);
        if (!KEY_ADD)
        {
            if (setIndex == 1)
            {
                tempMax++;
                if (tempMax >= 100)
                {
                    tempMax = 1;
                }
            }
            if (setIndex == 2)
            {
                hmMax++;
                if (hmMax >= 100)
                {
                    hmMax = 1;
                }
            }
			sprintf(dis0, "%02d", (u16)tempMax); // 打印温度阈值
			LCD_DispStr(3, 1, dis0);
			sprintf(dis0, "%02d", (u16)hmMax); // 打印温度阈值
			LCD_DispStr(12, 1, dis0);
		}
        // while (!KEY_ADD);
    }

    if (!KEY_SUB) //按键减
    {
        delay_ms(180);
        if (!KEY_SUB)
        {
            if (setIndex == 1)
            {
                tempMax--;
                if (tempMax < 1)
                {
                    tempMax = 99;
                }
            }
            if (setIndex == 2)
            {
                hmMax--;
                if (hmMax < 1)
                {
                    hmMax = 99;
                }
            }
			sprintf(dis0, "%02d", (u16)tempMax); // 打印温度阈值
			LCD_DispStr(3, 1, dis0);
			sprintf(dis0, "%02d", (u16)hmMax); // 打印温度阈值
			LCD_DispStr(12, 1, dis0);
		}
        // while (!KEY_SUB);
    }
}

设计文件:

链接:https://pan.baidu.com/s/1xA4tai60NRI4ZAHnlE4BfA?pwd=npkz

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值