【毕业设计】基于STM32的智能台灯设计 物联网 电子信息 APP远程控制
文章目录
- 一、项目简介
- 二、项目组成
- 三、原理图设计
- 四、源码设计
- 五、APP设计
- 六、成品展示
视频教程
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;elseLED_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物联网的智能台灯已做好,演示视频,欢迎大家一起学习,语音控制,远程控制
【毕业设计】基于STM32的智能台灯设计 物联网 电子信息 APP远程控制相关推荐
- 毕业设计——基于STM32的智能窗户系统(物联网、智能家居、APP控制、APP显示温湿度等信息、自动工作模式)
本工程包括一下功能:1.远程控制工作功能:手机端app远程控制窗户开关(手机app自主开发) 2.自动监测工作功能:自动监测天气,并控制窗户开关 3.远程监测数据功能:温度.可燃气体浓度及各种状态在手 ...
- 【毕业设计】基于STM32的智能路灯设计与实现 - 物联网 嵌入式 单片机
文章目录 1 简介 2 绪论 2.1 项目背景 2.2 需求分析 3 系统设计 3.1 功能设计 3.1.1 系统角色分析 3.1.2 开发环境 3.2 总体设计 3.3 硬件部分 3.3.1 整体架 ...
- 智能手环功能模块设计_基于STM32实现智能手环设计
龙源期刊网 http://www.qikan.com.cn 基于 STM32 实现智能手环设计 作者:付海生 陈婷婷 韩百科 涂曾兵 来源:<科学导报 · 学术> 2017 年第 10 期 ...
- 基于STM32的智能储物柜设计
本设计是基于STM32的智能储物柜设计,主要实现以下功能: 1.实现快递箱.快递员和客户之间的手机通信功能 2.实现设置6位密码.密码开锁 3.实现快递箱控制,区分箱体大.中.小 4.实现OLED显示 ...
- 基于STM32的智能鞋柜设计与实现--“臭臭没了”
Hello,大家好,我是阿金,本文仅供参考,提供一些建议.如有不对,还请指正.谢谢~ 随着5G网络的迅速普及,"万物联网"的时代指日可待.针对传统鞋柜及目前市场上现有的智能鞋柜功能 ...
- 基于STM32的智能万年历设计
[ps:该文章排版有点错乱,如果需要,有PDF版本和WORD版本可供下载观看,还有资源免费下载,请移步作者主页下载,仅供学习参考.该设计是学校要求的课程设计,也是第一次做,很多函数并没有进行封装,部分 ...
- 【毕业设计】基于树莓派的智能小车设计 - 物联网 单片机 嵌入式 stm32
文章目录 1 简介 2 实现功能 主控开发板:树莓派 电机和控制器 避障功能 3 实现效果 5 部分实现代码 6 最后 1 简介 Hi,大家好,这里是丹成学长,今天向大家介绍一个单片机项目 ** 基于 ...
- 81、基于STM32单片机智能台灯 PWM调光坐姿矫正 灯光控制定时台灯设计
毕设帮助.开题指导.技术解答(有偿)见文末. 目录 摘要 一.硬件方案 二.设计功能 三.实物图 四.原理图 五.PCB图 六.硬件框图 七.流程图 八.程序源码 九.资料包括 摘要 随着社会在不断进 ...
- 基于STM32的智能窗户设计
基于STM32智能窗户设计 程序编译器:keil 5 编程语言:C语言 编号C0006 [腾讯文档]C0006 网盘链接 资料下载链接 功能说明: 1.智能模式:传感器采集的风力.雨水.温度.湿度.P ...
最新文章
- 你的4nm安卓旗舰芯片来了!骁龙8 Gen 1:支持8K HDR,功耗降30%,雷军:小米12首发...
- pixhawk PX4FMU和PX4IO最底层启动过程分析
- php函数汉语,PHP汉字截取函数:UTF-8、GB2312双支持
- 文本框输入限制,数字,字母,下划线
- 命名空间中不存在名称_原木定制中不开裂的木材真的存在吗?
- ajax渲染的页面tp怎么赋值,【Vue】前后端不分离的情况下,TP5的视图页面中如何使用vue来接受和传递数据?...
- 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_08-vuejs研究-vuejs基础-v-if和v-for指令...
- 8月5日发布卡巴斯基授权许可key-卡巴斯基key
- Delphi 字体修改一例 (转)
- c语言程序设计精髓第五章编程题
- 前端清除缓存的集中方法
- python 判断回文数
- c语言错误L104,KEILC51编译问题ERROR L104
- [CF1383A]String Transformation 1
- 区块链,屌丝逆袭的最后机会
- 日常英语口语收集汇总
- 大数据项目之电商数仓DataX、DataX简介、DataX支持的数据源、DataX架构原理、DataX部署
- Cookie重名问题处理
- 大数据面前无隐私 到底谁才是老大哥
- 关于Python choice() 函数介绍