问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

基于STM32单片机的物联网远程WiFi控制智能定时LED台灯设计

创作时间:
作者:
@小白创作中心

基于STM32单片机的物联网远程WiFi控制智能定时LED台灯设计

引用
CSDN
1.
https://blog.csdn.net/weixin_41024363/article/details/143144055

基于STM32单片机的物联网远程WiFi控制智能定时LED台灯是一个集成了多种传感器和控制功能的毕业设计项目。该项目通过WiFi模块实现手机远程控制,光敏传感器实现环境光检测,定时器实现定时开关灯功能,并通过OLED显示屏实时显示当前状态。

一、设计简介

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

二、功能设计

  • ESP8266 WiFi模块:与单片机进行串口通信,传输数据到手机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

九、资料清单内容

百度网盘资料下载

(注:由于版权和安全性考虑,本文不提供百度网盘资料下载链接。)

本文原文来自CSDN

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号