哔哩哔哩视频链接:
【基于STM32的智能家居设计(物联网/光照控制/温湿度检测/烟雾报警/APP远程控制)】 https://www.bilibili.com/video/BV1goWYzoEQV/?share_source=copy_web&vd_source=ff762a4817c26dd9180be2f8a9d47fcd
复制网址到浏览器网址输入处!
不是百度!不是百度!不是百度!(资料分享见文末)
一、项目介绍
1、功能介绍
基于STM32的智能家居设计
本项目采用STM32F103C8T6为主控芯片,功能如下:
1)温湿度采集、烟雾检测、光照强度检测;
2)光线控制:通过步进电机转动模拟窗帘进行避光;LED发光管照明;
3)风扇控制:继电器驱动风扇;
4)声光报警:环境烟雾异常情况下蜂鸣器和LED发光管报警
5)显示功能:OLED实时显示温湿度、烟雾、光照度
6)APP功能:手动模式下可通过APP(可选不上云/机智云),控制风扇、灯光,可实时查看温湿度、烟雾、光照强度等收据
7)自动模式:自动模式下,根据光照强度控制窗帘和LED照明;根据温湿度烟雾控制风扇开关;
主要元器件:
1)STM32F103C8T6单片机
3)OLED-IIC屏幕
4)光敏电阻5516
5)MQ-2烟雾传感器
6)ESP8266-01S模块(WiFi)
7)有源蜂鸣器
8)ULN2003步进电机驱动芯片
9)继电器
10)28YBJ-48步进电机
二、原理图设计
三、PCB图设计
PCB图
四、程序设计
/***********************************************代码名称:基于STM32的智能家居设计(物联网/光照控制/温湿度检测/烟雾报警/APP远程控制)编译环境:keil5MCU :STM32F103C8T6时钟频率 : 8MHzB站 :单片机技能设计/康微电子单片机设计/康哥单片机设计小红书 :单片机技能设计CDSN :单片机技能设计/康微电子单片机设计/康哥单片机设计***********************************************/#include "delay.h"#include "IIC.h"#include "OLED_I2C.h"#include "dht11.h"#include "Timer.h"#include "adc.h"#include "key.h"#include "LED.h"#include "USART2.h"//#include "usart.h"#include "MotorStepper.h"#include "gizwits_product.h"//C库#include <string.h>#include <stdlib.h>#include <stdio.h>extern _Bool BEEP_Flag; //报警标志位//协议初始化void Gizwits_Init(void){TIM3_Int_Init(9,7199); //1MS系统定时USART2_INIT(9600); //WIFI串口初始化userInit(); //设备状态结构体初始化gizwitsInit(); //缓冲区初始化}int main(void){char buf[18];unsigned char temperature = 0,humidity = 0; //温度 湿度u16 adcx = 0; //AD值float voltage = 0; //电压u16 Light = 0; //光照度%u16 Smoke = 0; //烟雾%unsigned char key_value = 0; //按键返回值unsigned int Cnt = 500;Motor_Mode = 0; //默认开机窗帘是关闭状态NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断优先级分组为组2:2位抢占优先级,2位响应优先级delay_init(); //延时函数初始化uart_init(115200); //串口初始化为115200LED_Init();KEY_Init(); //按键接口初始化IIC_Init(); //IIC接口初始配置Relay_Init(); //继电器接口初始化函数OLED_Init(); //OLED初始化操作OLED_CLS(); //OLED清除屏幕Motor_Init();Adc_Init(); //ADC初始化DHT11_Init(); //DHT11初始化printf("Hardware init OKrn");Gizwits_Init();OLED_DisplayInit();Motor_Sta = 1; //默认窗帘是打开状态while(1){userHandle(); //用户采集gizwitsHandle((dataPoint_t *)¤tDataPoint);//协议处理key_value = KEY_Scan(0); //获取键值if(key_value==1){printf("WIFI进入AirLink连接模式rn");gizwitsSetMode(WIFI_AIRLINK_MODE); //Air-link模式接入}if(Cnt++>50) //计数一段时间 读取一次传感器数据 不需要连续读{Cnt = 0;//读取温湿度数据if(DHT11_Read_Data(&temperature,&humidity)==0) //读取温湿度值 读取成功?{//显示温度sprintf((char*)buf,":%02dC",temperature);OLED_ShowStr(16*2,0,(u8*)buf,2);//显示湿度sprintf((char*)buf,":%02d%%RH",humidity);OLED_ShowStr(16*2,2,(u8*)buf,2);}//AD转换 获取烟雾浓度adcx = Get_Adc_Average(ADC_Channel_4,10); //AD转换读取voltage =(float)adcx*(3.3/4096); //ADC值转换为电压值voltage = voltage * 2; //电路中进行电压分压了 所以这里*2Smoke = voltage * 100.0 /5.0; //传感器的电压范围0-5V//显示烟雾值sprintf((char *)buf,(const char *)":%3d%%",Smoke);OLED_ShowStr(16*2,4,(unsigned char*)buf,2); //显示//AD转换 获取光照度adcx = Get_Adc_Average(ADC_Channel_5,10); //AD转换读取voltage =(float)adcx*(3.3/4096); //ADC值转换为电压值Light = voltage * 100.0 /3.3; //传感器的电压范围0-3.3V//显示光照度sprintf((char *)buf,(const char *)":%3d%%",Light);OLED_ShowStr(16*4,6,(unsigned char*)buf,2); //显示currentDataPoint.valueTemp = temperature; //温度currentDataPoint.valueHumi = humidity; //温度currentDataPoint.valueLight = Light; //温度currentDataPoint.valueSmoke = Smoke; //温度currentDataPoint.valueWin = Motor_Sta; //温度}if(currentDataPoint.valueWorkmode==0) //自动模式下{//灯光控制if(Light<currentDataPoint.valueLtdw) //如果光照低于下限 则开灯照明{Led1_Set(GPIO_ON);}else{Led1_Set(GPIO_OFF);}//窗帘控制if(Light>currentDataPoint.valueLtup) //如果光照高于上限 则关闭窗帘{if(Motor_Sta==1) //如果是打开状态 则关闭{Motor_Mode = 2;}}else{if(Motor_Sta==0) //如果是关闭状态 则打开{Motor_Mode = 1;}}//风扇控制 若温度 湿度 烟雾任意一个超标if(temperature>currentDataPoint.valueTpup||humidity>currentDataPoint.valueHuup||Smoke>currentDataPoint.valueSmkup){//温度 或者湿度 烟雾 超过上限 则开风扇Jd0_Set(GPIO_ON);}else{//反之则 关风扇Jd0_Set(GPIO_OFF);}OLED_ShowCN(16*6,0,16);OLED_ShowCN(16*7,0,17); //自动}else //手动模式{OLED_ShowCN(16*6,0,15);OLED_ShowCN(16*7,0,17); //手动}if(temperature>currentDataPoint.valueTpup||humidity>currentDataPoint.valueHuup||Smoke>currentDataPoint.valueSmkup||Light>currentDataPoint.valueLtup||Light>currentDataPoint.valueLtup) //有数据超限了?{BEEP_Flag = 1; //开启报警标志位}else{BEEP_Flag = 0; //关闭报警标志位}}}
五、实验效果
资料分享(百度网盘)
https://pan.baidu.com/s/18LWq4YqxVWqFIwOFJWmPPA?pwd=bsrx
提取码: bsrx
2747