基于STM32单片机毕业设计__物联网远程wifi控制智能定时LED台灯源代码程序+原理图+ESP8266WiFi模块+光敏传感器模块+定时器中断+0.96OLED显示屏+LED+按键

一、设计简介

本毕业设计项目是基于STM32单片机物联网远程wifi控制智能定时LED台灯,可是设置定时开关灯,光敏传感器模块实现检测环境光,从而实现自动开关灯,通过单片机PWM控制,调节三档LED亮度,应用wifi模块esp8266实现手机AP与stm32单片机通信,手机app远程控制LED,通过app或者按键设定LED开关模式,并且将实时亮度及定时时间显示在0.96OLED显示屏上,也可上传至手机app查看。

二、功能设计

ESP8266wifi模块:与单片机进行串口通信,传输数据到手机app,手机app下发数据控制单片机。

光敏传感器模块:检测环境光照强度,自动调节LED灯光亮度

定时开关灯:设定定时开关机

亮度调节:通过PWM控制调节三档亮度

OLED显示:使用0.96OLED实时显示当前不同亮度等级以及定时时间

三、所需硬件以及传感器模块

STM32F103C8T6 最小系统板(或其他 STM32 系列)

WiFi模块esp8266

光敏传感器模块

0.96OLED显示屏

蜂鸣器,电阻,LED,按键等LED 指示灯(用于显示状态)

四、软件环境

Keil5 MDK:stm32单片机源代码程序编写及下载代码

ST-Link 驱动程序:用于下载程序到 STM32。

五、所需硬件以及传感器模块

1.1 stm32f103c8t6(1个)

STM32F103C8T6单片机是一款非常用的单片机型号,可以方便灵活的进行嵌入式系统开发。首先,它的处理器基于Cortex-M3内核,最高工作频率达72MHz。STM32F103C8T6拥有64KB闪存和20KB SRAM,非常适合中小型单片机开发项目。

具有非常丰富的外设接口,如串口USART、SPI通信、I2C通讯、CAN通讯和USB,在与单片机外设通信方面非常方便。有多个GPIO通用IO口,定时器,中断系统,灵活配置为输入,输出、模拟输入或PWM输出,可以连接各类传感器和模块。

内部集成的12位逐次逼近型ADC和DAC,支持高精度模拟信号处理。STM32F103C8T6还支持低功耗模式,适合电池供电的应用场景。结合强大的STM32开发生态,包括库函数和工具链,可以让开发者很方便的完成单片机项目的开发。

1.2 0.96OLED显示屏(1个)

本程序采用的是4针0.96oled屏幕,stm32f103c8t6的I2C驱动程序。主控单片机使用stm32f103c8t6。

0.96oled屏幕分辨率为 128*64 ,多种接口方式;4线IIC 接口方式和七线的SPI接口。

I2C接口

1. GND 电源地

2. VCC 电源正(3~5.5V)

3. SCL OLED 的 D0 脚,在 IIC 通信中为时钟管脚

4. SDA OLED 的 D1 脚,在 IIC 通信中为数据管脚

1.3 wifi模块ESP8266(1个)

ESP8266是有乐鑫公司开发的一套高度集成的WIFI芯片,可以方便进行而二次开发。将芯片作为一个WIFI模块,不需要自己再对芯片进行开发,只需要根据模块提供的接口,用AT指令和ESP8266模块进行通信,让模块去接入网络。

在单片机开发设计中对WIFI模块进行使用,需要了解以下知识:

TTL信号通信
(Tx,Rx,GND,VCC)通过高低电平进行通信,TX负责发送,Rx负责接收,MCU芯片(如51单片机,ARM芯片)都是通过TTL和Esp8266进行通信,将指令发给Esp8266,告诉它让它去完成相应的功能。这是单片机通信的基础,通常将TTL转化成232或者485信号。有时候也称作uart信号。

AT指令
这是和Esp8266交流的语言,因为通常是" AT+(内容)"的格式发送,所以叫它AT指令。

比如如下指令

1、AT                                              //功能:测试8266能否工作
2、AT+CWMODE=3                       //功能:设置工作模式。1:station模式;2:ap模式;3:ap+station复位保存当前值

3、AT+RST                                      //功能:复位

AT指令是比较多的,进行单片机设计开发室选择自己需要的指令即可。

1.4 光敏电阻传感器模块(1个)

模块使用说明1、光敏电阻模块对环境光线最敏感,一般用来检测周围环境的光线的亮度,触发单片机或继电器模块等;2、模块在环境光线亮度达不到设定阈值时,DO端输出高电平,当外界环境光线亮度超过设定阈值时,DO端输出低电平;3、DO输出端可以与单片机直接相连,通过单片机来检测高低电平,由此来检测环境的光线亮度改变;4、DO输出端可以直接驱动继电器模块,由此可以组成一个光控开关。

六、原理框图及设计流程图

七、程序代码

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "PWM.h"
#include "Key.h"
#include "Timer.h"
#include "Serial.h"
#include "LightSensor.h"

uint8_t Num;				//定义定时器自增变量
uint16_t Data1;			//定义串口接收数据变量
uint8_t KeyNum;			//定义按键键值
uint8_t Light=0;		//定义PWM调节亮度变量
uint8_t Flag=0;			//手动自动标志位

int main(void)
{
	/*模块初始化*/
	OLED_Init();		//OLED初始化
	PWM_Init();			//PWM初始化
	Key_Init();     //按键初始化
	Timer_Init();		//定时器初始化
	Serial_Init();	//串口初始化
	LightSensor_Init();	//光敏初始化

	Delay_ms(1000);
	Serial_SendString("AT+CIPMUX=1\r\n");	//ESp8266开启多链接模式
	Delay_ms(200);
	Serial_SendString("AT+CIPSERVER=1,8080\r\n");	//启动TCP/IP,端口8080,实现基于网络控制
	Delay_ms(200);
		
	OLED_ShowString(1,1,"Light:");				//OLED显示字符串Light:
	OLED_ShowString(1,10,"%");
	OLED_ShowString(2,1,"Time:");					//OLED显示字符串Time:

	while (1)
	{
		KeyNum=Key_GetNum();		

		if(Flag==0&&KeyNum==1)					      	//切换灯的亮度以及关灯,三挡可调
		{
			Light+=30;
			if(Light>100)Light=0;	
		}
		if(Flag==0&&KeyNum==2)		 							//启动定时功能	
			TIM_Cmd(TIM3, ENABLE);
		if(Flag==0&&KeyNum==3)							    //定时功能,设置四个定时时间,按键依次增加时间
		{ 
			TIM_Cmd(TIM3, DISABLE);
			Light=30;
			Num-=10;	
			if(Num>41)Num=30;	
		}			
		if(Flag==0&&KeyNum==4)					      	//关闭定时功能
		{
			TIM_Cmd(TIM3, DISABLE);
			Num=0;	
		}					
		if(KeyNum==5)					      	//切换手动自动模式
		{
			Flag=!Flag;	
		}	
		if(Num==40)										//定时时间到,关灯
		{
			Light=0;
			Num=0;
			TIM_Cmd(TIM3, DISABLE);	    //关闭定时器3
		}
	 if((Flag==1)&&LightSensor_Get()==1)Light=30;			//检测到光线暗开灯
   if((Flag==1)&&LightSensor_Get()==0)Light=0;					//光线亮关灯
					
		PWM_SetCompare2(Light);				//PWM调节灯的亮度
		OLED_ShowNum(1,7,Light,3);		//OLED显示灯的亮度%
		OLED_ShowNum(2,6,(40-Num),2);			
	 if(Flag==0)
		 OLED_ShowString(3,1,"Manual");
//	 Delay_ms(200);
	 if(Flag==1)
		 OLED_ShowString(3,1,"Auto  ");		 
	}
}

void TIM3_IRQHandler(void)					//定时器3中断函数,给灯定时开关功能提供定时
{
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)
	{
		Num++;																	//每隔1s自增一次
		if(Num==41)Num=0;	
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update);			//清除中断标志位
	}
}	

void USART1_IRQHandler(void)
{

	if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)				//判断是否是USART1的接收事件触发的中断
	{
		Data1=USART_ReceiveData(USART1);										//读取数据寄存器,存放在接收的数据变量
		if(Data1==0x30)																			//通过手机App发送关灯指令
		{
			Light=0;
			if(Light>100)Light=0;	
		}
		if(Data1==0x31)Light=30;						//通过手机App发送低挡亮度指令
		if(Data1==0x32)Light=60;						//通过手机App发送中挡亮度指令
		if(Data1==0x33)Light=90;						//通过手机App发送高挡亮度指令
		if(Data1==0x34&&Flag==0)											//通过手机App发送定时亮灯指令,亮灯10s
		{
			Light=30;
			Num=30;
			TIM_Cmd(TIM3, ENABLE);
		}
		if(Data1==0x35&&Flag==0)											//通过手机App发送定时亮灯指令,亮灯20s
		{
			Light=30;
			Num=20;
			TIM_Cmd(TIM3, ENABLE);
		}
		if(Data1==0x36&&Flag==0)											//通过手机App发送定时亮灯指令,亮灯30s
		{
			Light=30;
			Num=10;
			TIM_Cmd(TIM3, ENABLE);
		}
		if(Data1==0x37&&Flag==0)											//通过手机App发送定时亮灯指令,亮灯40s
		{
			Light=30;
			Num=0;
			TIM_Cmd(TIM3, ENABLE);
		}	
		if(Data1==0x38)										//通过手机App发送定时关闭指令
		{
			Num=0;
			TIM_Cmd(TIM3, DISABLE);	
		}	
		if(Data1==0x39){Flag=0;Light=30;	}									//通过手机App切换手动模式
		
		if(Data1==0x40)	Flag=1;									//通过手机App切换自动模式
		USART_ClearITPendingBit(USART1, USART_IT_RXNE);									//清除标志位
	}
}

八、手机APP

 

九、资料清单内容

百度网盘资料下载https://pan.baidu.com/s/1D1XnQaPm4_r98YFW35YEhQ?pwd=68p6

作者:铭创电子设计

物联沃分享整理
物联沃-IOTWORD物联网 » 基于STM32单片机毕业设计__物联网远程wifi控制智能定时LED台灯源代码程序+原理图+ESP8266WiFi模块+光敏传感器模块+定时器中断+0.96OLED显示屏+LED+按键

发表回复