【毕业设计】基于STM32的智能台灯设计 物联网 电子信息 APP远程控制
本设计是基于一款STM32的物联网智能台灯设计,使用STM32F103C8T6最小系统作为主控,使用HLK_V20语音识别模块进行语音控制开关灯,使用ESP8266_WIFI模块与云平台通信进行手机APP远程控制,使用HC-SR04超声波传感器检测人与台灯的距离判断坐姿是否异常,使用L298N电机驱动模块来控制台灯的亮度,使用RTC实时时钟来获取当前时间,使用0.96寸的OLED显示屏来实时显示时
·
视频教程
1.项目开题
2.原理图讲解
3.程序讲解
4.实物展示
一、项目简介
本设计是基于一款STM32的物联网智能台灯设计,使用STM32F103C8T6最小系统作为主控,使用HLK_V20语音识别模块进行语音控制开关灯,使用ESP8266_WIFI模块与云平台通信进行手机APP远程控制,使用HC-SR04超声波传感器检测人与台灯的距离判断坐姿是否异常,使用L298N电机驱动模块来控制台灯的亮度,使用RTC实时时钟来获取当前时间,使用0.96寸的OLED显示屏来实时显示时间日期距离等信息,使用12V冷光灯条和暖光灯条来进行不同风格的照明,使用按键来控制灯的开关,档位的调节和冷暖光的切换。
二、项目组成
系统框图
三、原理图设计
四、源码设计
main.c
//单片机头文件
#include "stm32f10x.h"
//网络协议层
#include "onenet.h"
//网络设备
#include "net_device.h"
//硬件驱动
#include "led.h"
#include "oled.h"
#include "delay.h"
#include "usart.h"
#include "hwtimer.h"
#include "SysTick.h"
#include "system.h"
#include "iwdg.h"
#include "fault.h"
#include "selfcheck.h"
#include "info.h"
#include "key.h"
#include "yykz.h"
#include "pwm.h"
#include "rtc.h"
#include "TIM1.h"
#include "UltrasonicWave.h"
//C库
#include <string.h>
_Bool LED_Q=0;//0灯关 1灯开 u8 D_W=0; //0亮度30% 1亮度60% 2亮度100% u32 J_L=0;
_Bool LED_C=0;//0暖白 1白
//数据流 DATA_STREAM dataStream[] = {
{"LED_Q", &LED_Q, TYPE_BOOL, 1},
{"LED_C", &LED_C, TYPE_BOOL, 1},
{"D_W", &D_W, TYPE_UCHAR, 1},
{"J_L", &J_L, TYPE_UINT, 1},
}; unsigned char dataStreamLen = sizeof(dataStream) / sizeof(dataStream[0]);
/*
************************************************************
* 函数名称: Hardware_Init
*
* 函数功能: 硬件初始化
*
* 入口参数: 无
*
* 返回参数: 无
*
* 说明: 初始化单片机功能以及外接设备
************************************************************
*/ void Hardware_Init(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断控制器分组设置 Delay_Init(); //systick初始化 Led_Init(); //LED初始化 Usart1_Init(115200);
//初始化串口 115200bps TIM1_Configuration(); UltrasonicWave_Configuration(); netDeviceInfo.reboot = 0; TIM2_Int_Init(49, 35999); //72MHz,36000分频-500us,50重载值。则中断周期为500us * 50 = 25ms TIM3_Int_Init(1999, 35999); //72MHz,36000分频-500us,2000重载值。则中断周期为500us * 2000 = 1s //定时检查网络状态标志位 UsartPrintf(USART_DEBUG, "3.Hardware init OK\r\n"); //提示初始化完成 }
/*
************************************************************
* 函数名称: main
*
* 函数功能:
*
* 入口参数: 无
*
* 返回参数: 0
*
* 说明:
************************************************************
*/ int main(void) { u16 i; u8 k; u8 t; u8 flag=0; unsigned char *dataPtr; unsigned int runTime = 0; _Bool sendFlag = 0; SysTick_Init(48); Hardware_Init(); //硬件初始化 NET_DEVICE_IO_Init(); //网络设备IO初始化 NET_DEVICE_Reset(); //网络设备复位 NET_DEVICE_Set_DataMode(DEVICE_CMD_MODE); //设置为命令收发模式(例如ESP8266要区分AT的返回还是平台下发数据的返回) OLED_Init(); KEY_Init(); Yyds_Init(); TIM4_PWM_Init(899,0); TIM_SetCompare3(TIM4,900); TIM_SetCompare4(TIM4,900); while(RTC_Init()) //RTC初始化 ,一定要初始化成功 { } OLED_ShowString(0,0,"DATE:"); OLED_ShowString(0,2,"TIME:"); OLED_ShowString(0,4,"JULI: CM"); while(1) { if(flag==0) { if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4) == 0) {
flag=1;
LED_Q=1; } } else { if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4) == 1) {
flag=0;
LED_Q=0; } } //超声波测距 J_L=UltrasonicWave_StartMeasure(); UsartPrintf(USART_DEBUG,"\r\ndistance:%d cm\r\n",J_L); OLED_ShowNum(40,4,J_L,3,16); //小于设置距离LED亮 if(J_L<=30) { Led1_Set(0);
} else { Led1_Set(1); } //显示时间日期 if(t!=calendar.sec) { t=calendar.sec; OLED_ShowNum(40,0,calendar.w_year,4,16); OLED_ShowNum(80,0,calendar.w_month,2,16); OLED_ShowNum(100,0,calendar.w_date,2,16); OLED_ShowNum(40,2,calendar.hour,2,16); OLED_ShowNum(70,2,calendar.min,2,16); OLED_ShowNum(100,2,calendar.sec,2,16); } k=KEY_Scan(0); switch(k) { //按键1控制开关灯 case KEY0_PRES: //开关灯 if(LED_C==0) {
if(LED_Q==0)
{
LED_Q=1;
}
else
{
LED_Q=0;
} } else {
if(LED_Q==0)
{
LED_Q=1;
}
else
{
LED_Q=0;
} } break; //按键2控制灯光切换 case KEY1_PRES:
if(LED_C==0)
LED_C=1;
else
LED_C=0; //灯光切换 break;
//按键3控制调节亮度,一共三挡 case KEY2_PRES:
if(D_W==0)
{
D_W=1;
}
else if(D_W==1)
{
D_W=2;
}
else if(D_W==2)
{
D_W=0;
} //亮度调节 break; }
if(LED_C==0) { if(LED_Q==0) {
TIM_SetCompare3(TIM4,900);
TIM_SetCompare4(TIM4,900); } else if(LED_Q==1) {
if(D_W==0)
{
TIM_SetCompare3(TIM4,900);
TIM_SetCompare4(TIM4,500);
}
else if(D_W==1)
{
TIM_SetCompare3(TIM4,900);
TIM_SetCompare4(TIM4,300);
}
else if(D_W==2)
{
TIM_SetCompare3(TIM4,900);
TIM_SetCompare4(TIM4,0);
} } } else if(LED_C==1) { if(LED_Q==0) {
TIM_SetCompare3(TIM4,900);
TIM_SetCompare4(TIM4,900); } else if(LED_Q==1) {
if(D_W==0)
{
TIM_SetCompare3(TIM4,500);
TIM_SetCompare4(TIM4,900);
}
else if(D_W==1)
{
TIM_SetCompare3(TIM4,300);
TIM_SetCompare4(TIM4,900);
}
else if(D_W==2)
{
TIM_SetCompare3(TIM4,0);
TIM_SetCompare4(TIM4,900);
} } } delay_ms(100); if(oneNetInfo.netWork == 1) { OLED_ShowNum(110,6,1,1,16); /****************************************************************************** 数据与心跳
******************************************************************************/ if(timInfo.timer6Out - runTime >= 100) //25s一次(25ms中断) {
runTime = timInfo.timer6Out;
if(sendFlag)
{
TIM_Cmd(OS_TIMER, DISABLE);
OneNet_HeartBeat(); //心跳连接
TIM_Cmd(OS_TIMER, ENABLE);
}
else
{
TIM_Cmd(OS_TIMER, DISABLE);
OneNet_SendData(kTypeSimpleJsonWithoutTime, dataStreamLen); //数据发送
TIM_Cmd(OS_TIMER, ENABLE);
}
sendFlag = !sendFlag; }
/****************************************************************************** 平台下发命令解析
******************************************************************************/ if(oneNetInfo.netWork && NET_DEVICE_Get_DataMode() == DEVICE_DATA_MODE) //当有网络 且 在命令接收模式时 {
dataPtr = NET_DEVICE_GetIPD(0); //不等待,获取平台下发的数据
if(dataPtr != NULL) //如果数据指针不为空,则代表收到了数据
{
OneNet_App(dataPtr); //集中处理
} }
/****************************************************************************** 错误处理
******************************************************************************/ if(faultType != FAULT_NONE) //如果错误标志被设置 {
UsartPrintf(USART_DEBUG, "WARN: Fault Process\r\n");
Fault_Process(); //进入错误处理函数 }
/****************************************************************************** 数据反馈
******************************************************************************/ if(oneNetInfo.sendData) {
oneNetInfo.sendData = OneNet_SendData(kTypeSimpleJsonWithoutTime, dataStreamLen); } } else { OLED_ShowNum(110,6,0,1,16); /****************************************************************************** 初始化网络设备、接入平台
******************************************************************************/ if(!oneNetInfo.netWork && (checkInfo.NET_DEVICE_OK == DEV_OK)) //当没有网络 且 网络模块检测到时 {
NET_DEVICE_Set_DataMode(DEVICE_CMD_MODE); //设置为命令收发模式
if(!NET_DEVICE_Init()) //初始化网络设备,能连入网络
{
OneNet_DevLink(oneNetInfo.devID, oneNetInfo.apiKey); //接入平台
if(oneNetInfo.netWork)
{
runTime = timInfo.timer6Out; //更新时间
}
else
{
}
} }
/****************************************************************************** 网络设备检测
******************************************************************************/ if(checkInfo.NET_DEVICE_OK == DEV_ERR) //当网络设备未做检测 {
NET_DEVICE_Set_DataMode(DEVICE_CMD_MODE); //设置为命令收发模式
if(timerCount >= NET_TIME) //如果网络连接超时
{
UsartPrintf(USART_DEBUG, "Tips: Timer Check Err\r\n");
NET_DEVICE_Reset(); //复位网络设备
timerCount = 0; //清零连接超时计数
faultType = FAULT_NONE; //清除错误标志
}
if(!NET_DEVICE_SendCmd("AT\r\n", "OK")) //网络设备检测
{
UsartPrintf(USART_DEBUG, "NET Device :Ok\r\n");
checkInfo.NET_DEVICE_OK = DEV_OK; //检测到网络设备,标记
NET_DEVICE_Set_DataMode(DEVICE_DATA_MODE); //设置为数据收发模式
}
else
{
UsartPrintf(USART_DEBUG, "NET Device :Error\r\n");
} } }delay_ms(10); }
}
五、APP设计
六、成品展示
演示视频(APP是旧版本,现在使用的是如上面图片的新版本)
[智能台灯实物演示]基于STM32物联网的智能台灯已做好,演示视频,欢迎大家一起学习,语音控制,远程控制
更多推荐
已为社区贡献1条内容
所有评论(0)