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

一、前言
项目成品图片:
哔哩哔哩视频链接:
STM32室内无线控制系统
(资料分享见文末)
二、项目简介
1.功能详解
基于STM32室内无线控制系统
功能如下:
- 环境监测:温湿度、光照信息实时监测并在OLED上显示
- 防盗报警:当有人闯入时触发蜂鸣器报警
- 自动控制:根据光照强度大小控制灯光和窗帘的开关
- 空调控制:根据环境温度信息判断是否超出阈值范围打开空调
- 按键控制:按键可以手动开关防盗报警、照明灯和窗帘的控制
- 机智云平台:通过连接机智云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 *)¤tDataPoint);
}
}
六、实验效果
七、资料内容