新闻  |   论坛  |   博客  |   在线研讨会
基于STM32的智能灯光控制系统
霄耀在努力 | 2022-11-18 12:39:43    阅读:6402   发布文章

基于STM32的智能灯光控制系统

一、题目背景和意义:

随着社会不断进步市场在不断变化,高科技应用含量决定着产品发展的新趋势和前景,智能化技术在电子产品领域的应用意义深远。随着电子产品的快速发展,家用电器也越来越偏向智能化,本文介绍一款基于STM32的智能光照灯。

回想一下,日常生活中使用灯光时是否有以下情景“老公关一下灯、老公帮我开一下灯,我够不着”、“石头剪刀布,谁输了谁去关灯”、“以及寝室中住在最边上负责开关灯的同学..........由于我就是这个位置,深有感受啊!!!”。照明灯已是千家万户的必需生活用品,但每次要去开关灯的时候总是千难万阻,基于此,本项目研发了一款智能灯光系统,具备手机app控制灯光、语音控制等功能,更加方便快捷,彻底解决住在下铺兄弟的烦恼,哈哈哈哈。

 

二、项目整体展示:

智能光照灯”使用STM32作为系统的MCU,由于单片机IO口驱动电流过小,搭配三极管放大电流从而满足光照强度需求,且将单片机IO配置成PWM输出,以便于调节不同的光强度,也就是一档、二档、三档。在此基础上增加WiFi模块搭配手机APP可实现在手机端控制灯光使用su-03t语音识别模块可实现语音控制灯光等,其他额外功能在下文介绍。所需材料如表1所示。

1 材料清单

序号

名称

数量

1

STM32核心板

1

2

三极管

3

3

LED灯板

2

4

WiFi模块

1

5

Su-03t芯片

1

6

oled屏幕

1

7

超声波模块

1

8

dht11

1

9

按键

4

10

蜂鸣器

1

 

 

项目整体展示如图1

image.png 

1 项目整体展示

 

三、主要电子模块介绍:

1、STM32核心板:

STM32是“意法半导体”生产的基于“ARM公司Cortex-M3内核”的32位MCU,其性能强大,资源丰富,被广泛应用于嵌入式系统的开发,也是高校学生接触嵌入式的敲门砖。最小系统板如图2所示,其由处理器、电源、复位、晶振电路等组成,可独立的完成相应的控制任务,在本次工程中核心知识就是PWM输出,I/O口引脚电平判断。

image.png

2  STM32最小系统板

2、三极管:

三极管的放大作用就是:集电极电流受基极电流的控制(假设电源能够提供给集电极足够大的电流的话),并且基极电流很小的变化,会引起集电极电流很大的变化,且变化满足一定的比例关系:集电极电流的变化量是基极电流变化量的β倍,即电流变化被放大了β倍至于三极管的控制,如图3所示及其简单,在图片中所标的A引脚初,输出高电平就能导通三极管,上方VCC的电源就能流过三极管。

image.png

3 三极管内部电路

3、WiFi模块:

本项目所使用的WiFi模块是ESP-01S,是ESP8266系列的一种,其可以连接环境中的WiFi,从而使设备上网。本项目主要使用了该模块串口功能,通过串口与stm32单片机连接,WiFi模块通过周围环境中的WiFi信号连接云平台,如此将WiFi模块作为中介,可以实现单片机与云平台的信息交互。WiFi模块与单片机连接引脚如图4:

image.png

4  WiFi模块连接图

4、su-03t语音识别模块:

su-03t是一款低成本、低功耗、小体积的离线语音识别的模组,无需编程,使用刷词条的方式进行开发,可谓是不爱编程的福音啊。本项目使用该模块的串口功能,通俗一点讲就是模块识别到相应的语音命令后,通过串口输出一个数据。关于该模块的配置,本文再次不过多阐述。该模块引脚如图5所示:

image.png

5  SU-03T引脚展示图

 

5、超声波模块:

超声波模块为HC-SR04如图6所示超声波测距模块可提供约2cm~400厘米的非接触式距离感测功能,测距精度可达高到3毫米该模块由****装置与接受装置组成,****装置****超声波,接受装置接受超声波并将电平做出相应转变。

image.png

6 超声波模块

6、OLED

OLED显示屏是利用有机电自发光二极管制成的显示屏。由于同时具备自发光有机电激发光二极管,不需背光源、对比度高、厚度薄、视角广、反应速度快、LCD屏幕显示效果更好一些,但由于现有技术限制,目前OLED屏幕无法做的很大。本项目主要使用OLED屏幕显示台灯的当前状态、温湿度信息、以及万年历时钟灯,相关显示如图7所示。

image.png  image.png  image.png

7 相关显示结果

 

四、项目制作

4.1、先让灯亮起来

正如章节3中所说,灯带是通过三极管驱动的,单片机的IO口连接三极管基极,可以将其看成控制信号,当该引脚输出高电平时,可以认为三极管导通,电流由****极提供,由集电极输出,本设计中****极连接VCC,也就是用电源给等待供电,这个电流远大于IO口直接输出的电流,足以满足等待的需求。

4.2、调节灯光亮度

刚刚已经介绍过如何使用三极管点亮灯带。那么又该如何控制灯的亮度哪?也就是如何控制电流呢?这就需要常说的PWM输出了,可以将三极管看成一个“水龙头”,PWM可以理解为我们拧水龙头的力气,通过调节不同的占空比,使得三极管“打开不同的口子”,控制逻辑如下:

PWM占空比大→“打开的口子大”→输出的电流大→灯带更亮

PWM占空比小→“打开的口子小”→输出的电流小→灯带更暗

在程序中首先将IO口配置为PWM输出,本设计选用的定时器4的通道3与通道4产生PWM(两个灯,一个冷光一个暖光,需要两路PWM输出)具体程序见程序1

程序1

void Motor_PWM_Init(u16 arr,u16 psc)

{  

    GPIO_InitTypeDef GPIO_InitStructure;

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    TIM_OCInitTypeDef  TIM_OCInitStructure;

    

     

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能定时器4时钟

     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟

    

     

       /*****输出TIM4_CH3TIM4_CH4和的PWM脉冲波形*****/

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9; //TIM_CH3TIM_CH4

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO

     

       /********************初始化TIM3*******************/

    TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值

    TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值

    TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim

    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式

    TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

    

    /*******初始化TIM4 Channel3TIM4 Channel4 PWM模式********/  

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2

      TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能

    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性高

    TIM_OC3Init(TIM4, &TIM_OCInitStructure);  //初始化外设TIM4 OC3

    TIM_OC4Init(TIM4, &TIM_OCInitStructure);  //初始化外设TIM4 OC4

     

       /*******使能预装载寄存器********/

    TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);  

    TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);  

     

    TIM_Cmd(TIM4, ENABLE);  //使能TIM4

}

如此PWM的输出就已经配置好了,下面就在主循环中调用修改PWM占空比函数即可,具体程序见程序2,该程序修改了三个不同的占空比,以对应灯光的一档、二档、三档。

程序2

/********两端都使能 1**********/

TIM_SetCompare3(TIM4,800);    

TIM_SetCompare4(TIM4,800);

 

/********两端都使能 2**********/

TIM_SetCompare3(TIM4,2000);

TIM_SetCompare4(TIM4,2000);

/********两端都使能 3**********/

TIM_SetCompare3(TIM4,5000);

TIM_SetCompare4(TIM4,5000);

 

4.3、远程控制功能

正如上文所说,远程控制功能实现的原理是,手机app开发时连接上云平台,手机APP相应按键触发时,将相应的控制指令上传至云平台,esp-01s通过周围的WiFi信号连接云平台,获取云平台上的数据,并通过串口将该数据传输给STM32单片机,单片机解析数据并完成相应的驱动。接下来就分布实现开发,分为手机端app的制作,手机连接云平台、设备连接云平台。

4.3.1手机端app的制作

本项目使用一款麻省理工研发的开发安卓app的平台——appinventor该平台基于图形化编程,是不愿意编程党的福音,不需要使用代码开发app,使用一些逻辑关系模块完成开发。首先在主页面拖放好各种想要的按键,之后再编程界面拖放逻辑关系模块,完成开发(与labview相似)。

4.3.2手机端连接云平台

在使用appinventor开发的过程中,调用连接云平台接口,连接云平台,博主使用的是巴法云平台,再巴法云官网有详细的教程。打开巴法云官网其界面如图8所示,点击图片中所圈的地方“实例指南”进入八法开放论坛,之后在论坛中找到“APP inventor编写安卓app控制ESP8266”这篇文章,如图9所示,里面有详细的制作过程。

image.png 

8 巴法云界面

image.png 

9 论坛内容

额外说一下这个云平台接口,ClientSocketAI2Ext,这个不是appinventor的原生组件,需要再Extension下导自行导入插件。

 

另外,有想学习appinventor的可以看一下这个博主的网课,我当时就是跟随这个博主学的,很详细,很好学,两天完成。学习链接:老巫婆的程序世界的个人空间_哔哩哔哩_bilibili

 

4.3.3设备(单片机)连接云平台

esp-01s也是一个MCU,通过编程开发,本设计通过arduino平台开发相关的功能,值得注意的是esp-01s通过wifi信号连接云平台,所以环境中必须要有WiFi,由于此处程序过多,仅展示重要的地方。

①云平台定义及主题相关定义见程序3

程序3

#include <ESP8266WiFi.h>

#include<SimpleDHT.h>

 

//巴法云服务器地址

#define TCP_SERVER_ADDR "bemfa.com"

//服务器端口,tcp创客云端口8344

#define TCP_SERVER_PORT "8344"

 

//********************需要修改的部分*******************//

#define DEFAULT_STASSID  "HUAWEI P30 Pro+"     //WIFI名称,区分大小写,不要写错

#define DEFAULT_STAPSW   "18253858772"        //WIFI密码

String UID = "23f9a5f2d3584dc8516409db14b4827c";  //用户私钥,可在控制台获取,修改为自己的UID

String TOPIC1 ="TD00light";         //主题名字,可在控制台新建

String TOPIC2 = "TD00temp";       //用户私钥,可在控制台获取,修改为自己的UID

const int LED_Pin = 0;              //单片机LED引脚值,GPIO0引脚

int pinDHT11 = 2;

//**************************************************//

 

②接下来是连接服务器,向服务器发送指令cmd=1&uid="+UID+"&topic="+

TOPIC1+"rn,其中的UIDTOPIC1就是程序3中相关的定义具体程序见程序4

程序4

void startTCPClient(){

    if(TCPclient.connect(TCP_SERVER_ADDR,atoi(TCP_SERVER_PORT))){                            Serial.print("nConnected toserver:");

    Serial.printf("%s:%drn",TCP_SERVER_ADDR,atoi(TCP_SERVER_POR T));

    String tcpTemp="";  //初始化字符串

    tcpTemp = "cmd=1&uid="+UID+"&topic="+TOPIC1+"rn"; //构建订阅指令

    sendtoTCPServer(tcpTemp); //发送订阅指令

    tcpTemp="";//清空

    

    preTCPConnected = true;

    preHeartTick = millis();

    TCPclient.setNoDelay(true);

  }

  else{

    Serial.print("Failed connected to server:");

    Serial.println(TCP_SERVER_ADDR);

    TCPclient.stop();

    preTCPConnected = false;

  }

  preTCPStartTick = millis();

}

 

③获取云平台传来的数据,并通过串口传输给STM32,具体程序见程序5

程序5

if (TCPclient.available()) //若有数据传来

{

   char c =TCPclient.read();

   TcpClient_Buff +=c;        //数据存储

   TcpClient_BuffIndex++;

   TcpClient_preTick = millis();

   if(TcpClient_BuffIndex>=MAX_PACKETSIZE - 1)

   {

      TcpClient_BuffIndex = MAX_PACKETSIZE-2;

      TcpClient_preTick = TcpClient_preTick - 200;

    }

    preHeartTick = millis();

 }

if((TcpClient_Buff.length() >= 1) && (millis() - TcpClient_preTick>=200))

{

   TCPclient.flush();

   Serial.println(TcpClient_Buff);    //串口传输

   if((TcpClient_Buff.indexOf("&msg=11") > 0))

{

      turnOnLed();

    }else if((TcpClient_Buff.indexOf("&msg=10") > 0))

{

      turnOffLed();

    }

   TcpClient_Buff="";

   TcpClient_BuffIndex = 0;

  }

如此就可以将云平台中的控制指令传输给STM32STM32进行解析并完成相应的控制,由于本设计还添加了语音识别功能,所以相关控制的实现等讲解完语音识别后在进行讲解。

 

4.4语音识别功能

语音识别功能主要采用了SU-03T离线语音识别模块,这个模块不需要编程,使用厂家提供的云平台开发,正如前文所说本设计主要用了该模块的串口功能,该模块的串口与STM32单片机的另一个串口连接,当识别到相应的语音时,串口输出相应的控制指令给STM32。该模块相关配置如图10所示。

image.png 

10 su-03t平台配置

 

4.5STM32解析指令并完成相关驱动

正如前文所说,WiFi模块与su-03t都是使用串口与STM32单片机建立联系的,所以我们首先需要完成串口的相关配置,在此以WiFi模块对应的usart3为例,配置串口,具体程序见程序5

程序5  

void usart3_init(u32 bound)

{  

NVIC_InitTypeDef NVIC_InitStructure;

    GPIO_InitTypeDef GPIO_InitStructure;

    USART_InitTypeDef USART_InitStructure;

 

/***********使能时钟************/

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);                                          RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);

    USART_DeInit(USART3);  //复位串口3

 

/*******配置输出引脚*******/

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB10

   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出

   GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB10

   

   /*******配置输入引脚*******/

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;

   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入

   GPIO_Init(GPIOB, &GPIO_InitStructure);  //初始化PB11


/********串口相关配置********/

    USART_InitStructure.USART_BaudRate = bound;//波特率一般设置为9600

    USART_InitStructure.USART_WordLength = USART_WordLength_8b//字长为8位数据格式

    USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位

    USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位

   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制

    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

    USART_Init(USART3, &USART_InitStructure); //初始化串口3

 

    USART_Cmd(USART3, ENABLE);                    //使能串口

    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启中断   


/*******设置中断优先级********/

    NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级3

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //子优先级3

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能

    NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器


    TIM3_Int_Init(1000-1,7200-1);  //10ms中断

    USART3_RX_STA=0;         //清零

    TIM_Cmd(TIM3,DISABLE);   //关闭定时器7

}

至此WiFi模块对应的串口就配置完成,su-0t对应的串口配置与该串口相似,WiFi模块传输来的数据是需要解析的,而su-03t直接传输的十六进制,不需要解析,所以接下来就是解析WiFi模块通过串口传来的数据,具体程序见程序6

程序6

if(USART3_RX_STA&0X8000)  //接收到一次数据了

{

    rlen=USART3_RX_STA&0X7FFF; //得到本次接收到的数据长度

    USART3_RX_BUF[rlen]=0;  //添加结束符

     

    //数据提取

    if(strncmp(USART3_RX_BUF,"cmd=2",5)==0)

    {

        for(i=0;i<strlen(USART3_RX_BUF)+1;i++)

         {

            data_tiqu[s]=USART3_RX_BUF[i];

            s++;

        }

        printf("%s",data_tiqu);

        for(i=0;i<strlen(data_tiqu);i++)

        {

            if(data_tiqu[i]==cmd[0])

        {

        k=i;

        k++;

        for(j=1;j<strlen(cmd);j++)

        {

            if(data_tiqu[k]==cmd[j])

            {

                k++;

                flag=1;

             }

            else

            {

                flag=0;

             }

        }

    }  

}

    s=0;

    //数据提取结束

    printf("rnrn");

    if(flag==1)

    {

        for(i=k+1;i<strlen(data_tiqu)+1;i++) //此时 i为传输接受数据的索引

        {

        data[s]=data_tiqu[i];

        s++;

        }

        printf("%s",data);

        printf("zaici");     //作用:程序定位

        printf("rn");

        }

    }

    if(strncmp(USART3_RX_BUF,"cmd=0&res=1",11)==0)

    {

        printf("%s",USART3_RX_BUF);

    }

    USART3_RX_STA=0;

}

解析好的数据就存放在data这个数组中,接下来就在主循环中判断data数组中存放的数据以及su-03t通过串口直接传来的十六进制指令即可,根据相应的指令完成相关外设的驱动,具体程序见程序7

程序7

/******************驱动控制**************************/

//判断APP控制开关灯

if((data[0]=='1'&&data[1]=='1') || (temp == 0x11))

{

    GPIO_SetBits(LED0_PORT,LED0_PIN);   //LED0

    GPIO_ResetBits(LED1_PORT,LED1_PIN); //LED1

    TIM_SetCompare3(TIM4,800);     //两端都使能 1

    TIM_SetCompare4(TIM4,800);

    

    temp=0;

    state_flag_temp=11;

    state_flag[0]=1;  //冷亮

    state_flag[2]=1;  //一档

    display_on[5] = 24;    //已为您打开灯(oled显示的汉字在数组中的索引)

    display_on[6] = 0;      //已为您打开灯(oled显示的汉字在数组中的索引)

}

if((data[0]=='1'&&data[1]=='0') || (temp == 0x10))

{

    GPIO_ResetBits(LED0_PORT,LED0_PIN); //LED0

    GPIO_ResetBits(LED1_PORT,LED1_PIN); //LED1

    temp=0;

    state_flag_temp=10;

    state_flag[0]=0;   

    state_flag[1]=0;

    state_flag[2]=0;  

    display_off[5] = 24;

    display_off[6] = 0;

}

 

//判断APP控制冷暖光调节

if((data[0]=='2'&&data[1]=='1') || (temp == 0x21)) //冷亮暖灭

{

    GPIO_SetBits(LED0_PORT,LED0_PIN); //IN1—开冷光LED0

    GPIO_ResetBits(LED1_PORT,LED1_PIN); //IN3—关暖光LED1

    temp=0;

    state_flag_temp=21;

    state_flag[0]=1;  //冷亮

    state_flag[1]=0;  //暖灭

    display_on[5] = 26;             

    display_on[6] = 25;             

}

if((data[0]=='2'&&data[1]=='2') || (temp == 0x22))  //冷灭暖亮

{

    GPIO_ResetBits(LED0_PORT,LED0_PIN); //IN1—关冷光LED0

    GPIO_SetBits(LED1_PORT,LED1_PIN);  //IN3—开暖光LED1

    temp=0;

    state_flag_temp=22;

    state_flag[0]=0;  //冷灭

    state_flag[1]=1;  //暖亮

    display_on[5] = 27;          

    display_on[6] = 25;

}


//判断APP控制123档位

if((data[0]=='3'&&data[1]=='1')|| (temp == 0x31))     //1

{

    TIM_SetCompare3(TIM4,800);     //两端都使能 1

    TIM_SetCompare4(TIM4,800);

    temp=0;

    state_flag_temp=31;

    state_flag[2]=1;     //一档

    display_now[5] = 37;              

}

if((data[0]=='3'&&data[1]=='2')|| (temp == 0x32))     //2

{

    TIM_SetCompare3(TIM4,2000);     //两端都使能 2

    TIM_SetCompare4(TIM4,2000);

    temp=0;

    state_flag_temp=32;

    state_flag[2]=2;   //二档

    display_now[5] = 38;

 

}

if((data[0]=='3'&&data[1]=='3')|| (temp == 0x33))      //3

{

    TIM_SetCompare3(TIM4,5000);     //两端都使能 3

    TIM_SetCompare4(TIM4,5000);

    temp=0;

    state_flag_temp=33;

    state_flag[2]=3;   //三档

    display_now[5] = 39;

}

至此台灯的控制功能已经全部开发完毕,已经实现了APP远程控制、语音控制功能。

 

4.6、超声波识别坐姿

还记得在第二章节所介绍的超声波模块HC-SR04,该模块主要是用于把该系统做成台灯时使用,用于检测坐姿规范的,若是开发家里的照明灯,可不加该模块。该模块实现测距的主要原理是:****装置****超声波,同时打开定时器,超声波遇到障碍物反弹,被接收装置接受,此时获取定时器的时间,然后根据速度计算距离。其坐姿判断逻辑如下:

HC-SR04测距低于阈值→坐姿不对,距离桌面过近→蜂鸣器报警

HC-SR04测距高于阈值→坐姿正确,距离桌面适宜→蜂鸣器正常

具体程序见程序8

程序8

//一次获取超声波测距数据 两次测距之间需要相隔一段时间,隔断回响信号

//为了消除余震的影响,取五次数据的平均值进行加权滤波。

float Hcsr04GetLength(void )

{

    u32 t = 0;

    int i = 0;

    float lengthTemp = 0;

    float sum = 0;

    while(i!=5)

    {

        TRIG_Send = 1;      //发送口高电平输出

        Delay_Us(20);

        TRIG_Send = 0;

        while(ECHO_Reci == 0);      //等待接收口高电平输出

        OpenTimerForHc();        //打开定时器

        i = i + 1;

        while(ECHO_Reci == 1);

        CloseTimerForHc();        //关闭定时器

        t = GetEchoTimer();        //获取时间,分辨率为1US

        lengthTemp = ((float)t/58.0);//cm

        sum = lengthTemp + sum ;

        }

lengthTemp = sum/5.0;

return lengthTemp;

}

 Hcsr_num++;

if(Hcsr_num == 5)

{

    Hcsr_num = 0;

    length_C = Hcsr04GetLength();                 //测距离

    printf("距离为:%.3frn",length_C);

    if(length_C < 20)

    {

        state_flag[3] =1;

        BEEP =~ BEEP;

        delay_ms(300);

    }

    else

    {

        state_flag[3] =0;

         BEEP = 0;

    }

    if(Hcsr_flag != state_flag[3])

    {

      Hcsr_flag = state_flag[3];

      display_all_flag=1;

    }

}

 

4.7OLED屏显示状态

本文第二章也介绍了一个OLED模块,以及展示了相关显示图片,这部分实现的原理是,在上方介绍相关控制功能时会更改相应的标志位,然后在主程序中检查该标志位的状态,当标志位发生改变时,修改OLED屏幕的显示,具体程序见程序9

程序9

switch(Dis_mode)

{

    case 0:              //在显示控制状态界面

    switch(state_flag_temp)     //定时显示界面

    {

        case 11:control_part_display(2,6,display_1,display_on);break;      //显示以为您打开灯

        case 10:control_part_display(2,6,display_1,display_off);break;     //显示以为您关闭灯

        case 21:control_part_display(1,7,display_1,display_on);break;      //显示以为您打开冷灯

        case 22:control_part_display(1,7,display_1,display_on);break;      //显示以为您打开暖灯

        case 31:control_part_display(1,7,display_1,display_now);break;     //显示当前亮度为一档

        case 32:control_part_display(1,7,display_1,display_now);break;     //显示当前亮度为二档

        case 33:control_part_display(1,7,display_1,display_now);break;     //显示当前亮度为三档

    }

    data[0]='0';               //清空控制指令

    data[1]='0';

    state_flag_temp=0;

    if(display_all_flag)       //状态整体显示界面

    {

        display_all_flag=0;

        control_all_display(state_flag);

        TIM_Cmd(TIM2,DISABLE);      //关闭TIM2定时器

    }

    break;

     

    case 1:          //始终显示界面

        RTC_Display();        //显示时钟

    break;

 

至此,智能灯光系统的相关功能已全部开发完毕,给电路板接上电源后,可使用APP控制、语音控制两种方式,实现灯光的开关、一档二档三档的的调节、冷暖光的调节、以及姿势纠正等功能。

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客