扫码加入

  • 正文
  • 相关推荐
申请入驻 产业图谱

STM32项目-基于STM32的智能家居设计

2025/11/10
2747
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

哔哩哔哩视频链接:

【基于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单片机

2)DHT11温湿度传感器

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);	 							//串口初始化为115200    LED_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 *)&currentDataPoint);//协议处理			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;                              //电路中进行电压分压了 所以这里*2            Smoke = 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

 

相关推荐

登录即可解锁
  • 海量技术文章
  • 设计资源下载
  • 产业链客户资源
  • 写文章/发需求
立即登录

单片机、硬件、物联网

微信公众号