资讯详情

【毕业设计】基于STM32的智能台灯设计 物联网 电子信息 APP远程控制

文章目录

  • 一、项目简介
  • 二、项目组成
  • 三、原理图设计
  • 四、源码设计
  • 五、APP设计
  • 六、成品展示
视频教程 1.项目开题 2.解释原理图 3.程序讲解 4.实物展示

一、项目简介

本设计以一款为基础STM32物联网智能台灯设计,采用STM32F103C8T6使用最小系统作为主控HLK_V语音控制开关灯采用语音识别模块ESP8266_WIFI手机通信模块和云平台APP远程控制,使用HC-SR04超声传感器检测人与台灯的距离,判断坐姿是否异常,使用L298N使用电机驱动模块来控制台灯的亮度RTC实时实时钟获取当前时间.96寸的OLED使用12个显示屏实时显示时间、日期、距离等信息V不同风格的照明采用冷使用按钮控制灯的开关、档位调整和冷暖光切换。 在这里插入图片描述

二、项目组成

系统框图

三、原理图设计

四、源码设计

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

标签: 10灯条连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台