基于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
作者:铭创电子设计