1、远程控制灯光:手机端app远程控制灯光开关(手机app自主开发)手机端通过触发相应的组件,将相应的控制命令上传至云平台,esp-01s通过wifi信号连接该云平台获取到该指令,由stm32控制灯光亮灭、暖光与冷光切换、一档、二档、三档调节。
2、语音控制功能:通过语音控制灯光采用高识别率离线语音识别模块,识别使用者的语音命令,通过说话的方式控制灯光亮灭、暖光与冷光切换、一档、二档、三档调节。

3、远程显示功能:环境温度、湿度在手机端显示系统具备dht11测温传感器,单片机驱动这个传感器工作,并将相应的数据通过esp-01s 、云平台,上传至手机app显示。
4、坐姿异常监测显示:超声波传感器测距身体的距离使用本系统制作台灯时,可添加该功能,监测坐姿是否规范,若距离过近,蜂鸣器报警,并在OLED屏幕上显示。
5、系统当前状态显示:灯光是否开启、挡位显示、坐姿是否异常等在OLED屏显示将当前时刻系统的工作状态显示在OLED屏幕上,包括灯光是否打开、挡位、坐姿是否异常,当以上状态发生变化时,OLED及时更改显示(既OLED始终显示最新的状态)。
6、RTC实时时钟:OLED显示实时时钟,且支持按键离线修改本项目利用核心板上的RTC时钟晶振,开发实时时钟,在时间显示界面可以观察到具体时间,且本项目支持“通过按键修改时间”。K1:进入时间设置界面、切换所修改的时间单位、返回时间显示界面,K2:时间加一个单位,K3:时间减一个单位
在时间显示界面触发K1按键,进入时间设置界面;之后触发K1按键设置不同的时间单位,刚进入时间设置界面时是对年份进行修改,再按一下K1对月份进行修改,如此递推(oled屏幕上有个小箭头,小箭头所指的就是当前正在修改的时间单位),当最后在按下一次K1时,返回时间显示界面,并进行时间更新。
二、详细阐述开发流程2.1、先让灯亮起来正如章节3中所说,灯带是通过三极管(NPN)驱动的,单片机的IO口连接三极管基极,可以将其看成控制信号,当该引脚输出高电平时,可以认为三极管导通,电流由集电极所连的VCC提供,也就是用电源给灯带供电,这个电流远大于IO口直接输出的电流,足以满足灯带的需求。
2.2、调节灯光亮度刚刚已经介绍过如何使用三极管点亮灯带。那么又该如何控制灯的亮度哪?也就是如何控制电流呢?这就需要常说的PWM输出了,可以将三极管看成一个“水龙头”,PWM可以理解为我们拧水龙头的力气,通过调节不同的占空比,使得三极管“打开不同的口子”,控制逻辑如下:
①PWM占空比大→“打开的口子大”→输出的电流大→灯带更亮
②PWM占空比小→“打开的口子小”→输出的电流小→灯带更暗
在程序中首先将IO口配置为PWM输出,本设计选用的定时器4的通道3与通道4产生PWM(两个灯,一个冷光一个暖光,需要两路PWM输出)具体程序如下:
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_CH3和TIM4_CH4和的PWM脉冲波形/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9; //TIM_CH3和TIM_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_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位/初始化TIM4 Channel3、TIM4 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 OC3TIM_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占空比函数即可,具体程序如下,该程序修改了三个不同的占空比,以对应灯光的一档、二档、三档。
/两端都使能 1档/TIM_SetCompare3(TIM4,5000);TIM_SetCompare4(TIM4,5000); /两端都使能 2档/TIM_SetCompare3(TIM4,10000);TIM_SetCompare4(TIM4,10000); /两端都使能 3档/TIM_SetCompare3(TIM4,20000);TIM_SetCompare4(TIM4,20000);
4.3、远程控制功能
正如上文所说,远程控制功能实现的原理是,手机app连接云平台,手机APP相应按键触发时,将相应的控制指令上传至云平台,esp-01s通过周围的WiFi信号连接云平台,获取云平台上的数据,并通过串口将该数据传输给STM32单片机,单片机解析数据并完成相应的驱动。接下来逐步进行开发,分为手机端app的制作,手机连接云平台、设备连接云平台。
4.3.1手机端app的制作:本项目使用一款麻省理工研发的开发安卓app的平台——appinventor,该平台基于图形化编程,是“不愿意编程党”的福音,不需要使用代码开发app,使用一些逻辑关系模块完成开发。首先在主页面拖放好各种想要的按键,之后在编程界面拖放逻辑关系模块,完成开发(与labview相似)。
4.3.2手机端连接云平台:在使用appinventor开发的过程中,调用连接云平台接口,连接云平台,博主使用的是巴法云平台,在巴法云官网有详细的教程。打开巴法云官网,其界面如图8所示,点击图片中所圈的地方“实例指南”进入巴法云论坛。
需要注意的是连接云平台的接口,ClientSocketAI2Ext,这个不是appinventor的原生组件,需要再Extension下导自行导入插件。
4.3.3设备(单片机)连接云平台esp-01s也是一个MCU,通过编程开发,本设计通过arduino平台开发相关的功能,值得注意的是esp-01s通过WiFi信号连接云平台,所以环境中必须要有WiFi,由于此处程序过多,仅展示重要的地方。
①云平台定义及主题相关定义,具体程序如下:
#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"; //用户私钥,可在控制台获取,修改为自己的UIDString TOPIC1 ="TD00light"; //主题名字,可在控制台新建String TOPIC2 = "TD00temp"; //用户私钥,可在控制台获取,修改为自己的UIDconst int LED_Pin = 0; //单片机LED引脚值,GPIO0引脚int pinDHT11 = 2;////
②接下来是连接服务器,向服务器发送指令cmd=1&uid="+UID+"&topic="+TOPIC1+"\r\n,其中的UID与TOPIC1就是上方程序中的相关定义。
具体程序如下:
void startTCPClient(){if(TCPclient.connect(TCP_SERVER_ADDR,atoi(TCP_SERVER_PORT))){ Serial.print("\nConnected to server:");Serial.printf("%s:%d\r\n",TCP_SERVER_ADDR,atoi(TCP_SERVER_PORT)); String tcpTemp=""; //初始化字符串 tcpTemp = "cmd=1&uid="+UID+"&topic="+TOPIC1+"\r\n"; //构建订阅指令 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,具体程序如下:
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;}
如此就可以将云平台中的控制指令传输给STM32,STM32进行解析并完成相应的控制,由于本设计还添加了语音识别功能,所以相关控制的实现等讲解完语音识别后在进行讲解。
4.4语音识别功能语音识别功能主要采用了SU-03T离线语音识别模块,这个模块不需要编程,使用厂家提供的云平台(智能公元)开发,正如前文所说本设计主要用了该模块的串口功能,该模块的串口与STM32单片机的另一个串口连接,当识别到相应的语音时,串口输出相应的控制指令给STM32。在此只展示打开灯光、关闭灯光、打开冷光、打开暖光对应的指令,分别为0x11、0x10、0x21、0x22
4.5、STM32解析指令并完成相关驱动正如前文所说,WiFi模块与su-03t都是使用串口与STM32单片机建立联系的,所以我们首先需要完成串口的相关配置,在此以WiFi模块对应的usart3为例,配置串口。
具体程序可进群免费领取!
!
!
点击这里找小助理0元领取:扫码进群领资料
至此WiFi模块对应的串口就配置完成,su-0t对应的串口配置与该串口相似,WiFi模块传输来的数据是需要解析的,而su-03t直接传输的十六进制,不需要解析,所以接下来就是解析WiFi模块通过串口传来的数据。
具体程序可进群免费领取。
解析好的数据就存放在data这个数组中,接下来就在主循环中判断data数组中存放的数据以及su-03t通过串口直接传来的十六进制指令即可,根据相应的指令完成相关外设的驱动。
具体程序可进群免费领取。
至此台灯的控制功能已经全部开发完毕,已经实现了APP远程控制、语音控制功能。
4.6、超声波识别坐姿超声波模块使用的事HC-SR04,该模块主要是用于把该系统做成台灯时使用,用于检测坐姿规范的,若是开发家里的照明灯,可不加该模块。该模块实现测距的主要原理是:发射装置发射超声波,同时打开定时器,超声波遇到障碍物反弹,被接收装置接受,此时获取定时器的时间,然后根据速度计算距离。其坐姿判断逻辑如下:
HC-SR04测距低于阈值→坐姿不对,距离桌面过近→蜂鸣器报警
HC-SR04测距高于阈值→坐姿正确,距离桌面适宜→蜂鸣器正常
具体程序可进群免费领取。
嵌入式物联网的学习之路非常漫长,不少人因为学习路线不对或者学习内容不够专业而错失高薪offer。不过别担心,我为大家整理了一份150多G的学习资源,基本上涵盖了嵌入式物联网学习的所有内容。点击下方链接,0元领取学习资源,让你的学习之路更加顺畅!
记得点赞、关注、收藏、转发哦!
点击这里找小助理0元领取:扫码进群领资料