STM32项目分享:室内无线控制系统

目录

一、前言

二、项目简介

1.功能详解

2.主要器件

三、原理图设计

四、PCB硬件设计

PCB图 

五、程序设计 

六、实验效果 

七、资料内容

扫描二维码关注公众号,回复: 17583438 查看本文章

项目分享


一、前言

项目成品图片:

哔哩哔哩视频链接:

STM32室内无线控制系统

(资料分享见文末) 

二、项目简介

1.功能详解

基于STM32室内无线控制系统

功能如下:

  1. 环境监测:温湿度、光照信息实时监测并在OLED上显示
  2. 防盗报警:当有人闯入时触发蜂鸣器报警
  3. 自动控制:根据光照强度大小控制灯光和窗帘的开关
  4. 空调控制:根据环境温度信息判断是否超出阈值范围打开空调
  5. 按键控制:按键可以手动开关防盗报警、照明灯和窗帘的控制
  6. 机智云平台:通过连接机智云APP远程查看环境信息数据,并可以手动控制窗帘、照明灯的开关
     

2.主要器件

  • STM32F103C8T6单片机
  • OLED 屏幕
  • DHT11温湿度传感器
  • ESP8266-01S  WiFi模块
  • 光敏传感器
  • 继电器
  • 风扇模块
  • 大功率LED灯模块
  • 有源蜂鸣器
  • 步进电机
     

三、原理图设计

四、PCB硬件设计

PCB图 

五、程序设计 

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"
#include "OLED.h"
#include "DHT11.h"
#include "sys.h"
#include "usart.h"
#include "usart2.h"
#include "string.h"
#include "stdio.h"
#include "timer.h"
#include "mq2.h"
#include "Motor.h"
#include "gizwits_product.h"
#include "Delay.h"

//显示全局变量===============================================================================================================================
uint16_t ADValue;
uint16_t Voltage;
u8 temp = 0,humi = 0;
u8 hongwai=0;
int key_num;      //按键返回值

//得到数据变量===========================================
void shuju()
{
		ADValue = AD_GetValue();	
		Voltage = 99 - 99 * ADValue / 4095;
		DHT11_Read_Data(&temp,&humi);	
}
//按键==========================================
u8 mode_flag = 0;   //模式控制:0-自动 ,1-手动
u8 alarm_flag=0;
u8 chuanglian_flag=0;
u8 guangzhao_flag=0;
void anjian()
{
		key_num=Key_GetNum();
//		OLED_ShowString(3,14,":");
		//OLED_ShowNum(3,14,key_num,1);	
		if(key_num==1)  {hongwai=1;}	
		else{hongwai=0;}
		
//		if(key_num == 2)
//			{
//				if(++mode_flag==2)mode_flag=0;
//			}	
		//报警
		if(key_num==3)  
			{
				if(++alarm_flag==2)alarm_flag=0;
			}	
		//窗帘		
		if(key_num==4)  
			{
				if(++chuanglian_flag==2)chuanglian_flag=0;
			}	
		//光照
		if(key_num==5)  
			{
				if(++guangzhao_flag==2)guangzhao_flag=0;
			}				
}
//自动控制============================================
//u8 flag=0;
u8 kongtiao_1=0;
void auto1()
{
		//照明控制
	if(guangzhao_flag==0)
	{
		if(Voltage>50)
		{	
			LED1_ON();
		}
		if(Voltage<=50)
		{	
			LED1_OFF();
		}	
	}
	//窗帘控制
	if(chuanglian_flag==0)
	{
		if(Voltage>50&&flag==0)
		{
				flag=1;
				for(int i=0;i<=(8*16);i++)    
				{
					Motor_One(5);
				}
		}
		if(Voltage<=50&&flag==1)
		{
				flag=0;
				for(int i=0;i<=(8*16);i++)    
				{
					Motor_One1(5);
				}
		}
	}

	//报警控制
	if(alarm_flag==0)
	{
		if(hongwai==1)
		{		
			BEEP_OFF();
		}
		else
		{
			BEEP_ON();
		}
	}
	//风扇控制
	if(temp>30)
	{	
		FAN_ON();
		WARM_ON();
		kongtiao_1=1;
	}
	if(temp<20)
	{	
		FAN_ON();
		WARM_OFF();
		kongtiao_1=1;
	}
	if(temp<=30&&temp>=20)
	{
		FAN_OFF();
		WARM_ON();	
		kongtiao_1=0;		
	}
}

//显示界面==============================================================
void xianshi()
{
	//第一行
		OLED_ShowChinese(1,1,0); //温
		OLED_ShowChinese(1,2,1); //度	
		OLED_ShowString(1,5,":");
		OLED_ShowNum(1,6,temp,2);
		OLED_ShowChinese(1,5,2); //湿
		OLED_ShowChinese(1,6,1); //度	
		OLED_ShowString(1,13,":");
		OLED_ShowNum(1,14,humi,2);
	
	//第二行
		OLED_ShowChinese(2,1,4); //空
		OLED_ShowChinese(2,2,5); //调
		OLED_ShowString(2,5,":");
		if(kongtiao_1==1)
		{
			OLED_ShowChinese(2,4,16); //开
		}
		else
		{
			OLED_ShowChinese(2,4,17); //关
		}
//		if(mode_flag==0)
//		{
//			OLED_ShowChinese(3,8,21); //自
//		}
//		else
//		{
//			OLED_ShowChinese(3,8,20); //手
//		}
			
//		OLED_ShowNum(2,6,kongtiao,1);
		OLED_ShowChinese(2,5,6); //窗
		OLED_ShowChinese(2,6,7); //帘	
		OLED_ShowString(2,13,":");
		if(flag==1)
		{
			OLED_ShowChinese(2,8,16); //开
		}
		else
		{
			OLED_ShowChinese(2,8,17); //关
		}
//		OLED_ShowNum(2,14,chuanglian,1);

	//第三行
		OLED_ShowChinese(3,1,8);  //光
		OLED_ShowChinese(3,2,9);  //照
		OLED_ShowChinese(3,3,18); //强
		OLED_ShowChinese(3,4,19); //度
		OLED_ShowString(3,9,":");
		OLED_ShowNum(3,11,Voltage,2);	
		
	//第四行
		OLED_ShowChinese(4,1,10);  //是
		OLED_ShowChinese(4,2,11);  //否
		OLED_ShowChinese(4,3,12);  //有
		OLED_ShowChinese(4,4,13);  //人
		OLED_ShowChinese(4,5,14);  //闯
		OLED_ShowChinese(4,6,15);  //入
		OLED_ShowString(4,13,":");
		if(hongwai==1)
		{
			OLED_ShowChinese(4,8,10); //是
		}
		else
		{
			OLED_ShowChinese(4,8,11); //否
		}		
//		OLED_ShowNum(4,15,hongwai,1);
}

void userHandle(void)
{

    currentDataPoint.valuealarm = hongwai;//Add Sensor Data Collection
    currentDataPoint.valuekongtiao = kongtiao_1;//Add Sensor Data Collection
    currentDataPoint.valuetemp = temp ;//Add Sensor Data Collection
    currentDataPoint.valuehumi = humi ;//Add Sensor Data Collection
    currentDataPoint.valueliangdu = Voltage ;//Add Sensor Data Collection

}

int main(void)
{
	Delay_init();
	LED_Init();
	OLED_Init();
	DHT11_Init();  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
	TIM2_Int_Init(72-1,1000-1);//定时1ms   72,000,000Hz/1,000Hz=72,000=72*1000
	uart_init(115200);	 	//串口1初始化为115200
	uart2_init(9600);
	userInit();
	AD_Init();
	Key_Init();
	Motor_Init();
	gizwitsInit();
	gizwitsSetMode(WIFI_AIRLINK_MODE);	
	Delay_ms(1000);
	Delay_ms(1000);
	while (1)
	{
		shuju();
		xianshi();
		anjian();
		auto1();
		userHandle();
		gizwitsHandle((dataPoint_t *)&currentDataPoint);
	}
}

六、实验效果 

七、资料内容

项目分享