视频教程
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物联网的智能台灯已做好,演示视频,欢迎大家一起学习,语音控制,远程控制

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐