文章目录

  • 一、项目简介
  • 二、项目组成
  • 三、原理图设计
  • 四、源码设计
  • 五、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远程控制相关推荐

  1. 毕业设计——基于STM32的智能窗户系统(物联网、智能家居、APP控制、APP显示温湿度等信息、自动工作模式)

    本工程包括一下功能:1.远程控制工作功能:手机端app远程控制窗户开关(手机app自主开发) 2.自动监测工作功能:自动监测天气,并控制窗户开关 3.远程监测数据功能:温度.可燃气体浓度及各种状态在手 ...

  2. 【毕业设计】基于STM32的智能路灯设计与实现 - 物联网 嵌入式 单片机

    文章目录 1 简介 2 绪论 2.1 项目背景 2.2 需求分析 3 系统设计 3.1 功能设计 3.1.1 系统角色分析 3.1.2 开发环境 3.2 总体设计 3.3 硬件部分 3.3.1 整体架 ...

  3. 智能手环功能模块设计_基于STM32实现智能手环设计

    龙源期刊网 http://www.qikan.com.cn 基于 STM32 实现智能手环设计 作者:付海生 陈婷婷 韩百科 涂曾兵 来源:<科学导报 · 学术> 2017 年第 10 期 ...

  4. 基于STM32的智能储物柜设计

    本设计是基于STM32的智能储物柜设计,主要实现以下功能: 1.实现快递箱.快递员和客户之间的手机通信功能 2.实现设置6位密码.密码开锁 3.实现快递箱控制,区分箱体大.中.小 4.实现OLED显示 ...

  5. 基于STM32的智能鞋柜设计与实现--“臭臭没了”

    Hello,大家好,我是阿金,本文仅供参考,提供一些建议.如有不对,还请指正.谢谢~ 随着5G网络的迅速普及,"万物联网"的时代指日可待.针对传统鞋柜及目前市场上现有的智能鞋柜功能 ...

  6. 基于STM32的智能万年历设计

    [ps:该文章排版有点错乱,如果需要,有PDF版本和WORD版本可供下载观看,还有资源免费下载,请移步作者主页下载,仅供学习参考.该设计是学校要求的课程设计,也是第一次做,很多函数并没有进行封装,部分 ...

  7. 【毕业设计】基于树莓派的智能小车设计 - 物联网 单片机 嵌入式 stm32

    文章目录 1 简介 2 实现功能 主控开发板:树莓派 电机和控制器 避障功能 3 实现效果 5 部分实现代码 6 最后 1 简介 Hi,大家好,这里是丹成学长,今天向大家介绍一个单片机项目 ** 基于 ...

  8. 81、基于STM32单片机智能台灯 PWM调光坐姿矫正 灯光控制定时台灯设计

    毕设帮助.开题指导.技术解答(有偿)见文末. 目录 摘要 一.硬件方案 二.设计功能 三.实物图 四.原理图 五.PCB图 六.硬件框图 七.流程图 八.程序源码 九.资料包括 摘要 随着社会在不断进 ...

  9. 基于STM32的智能窗户设计

    基于STM32智能窗户设计 程序编译器:keil 5 编程语言:C语言 编号C0006 [腾讯文档]C0006 网盘链接 资料下载链接 功能说明: 1.智能模式:传感器采集的风力.雨水.温度.湿度.P ...

最新文章

  1. 你的4nm安卓旗舰芯片来了!骁龙8 Gen 1:支持8K HDR,功耗降30%,雷军:小米12首发...
  2. pixhawk PX4FMU和PX4IO最底层启动过程分析
  3. php函数汉语,PHP汉字截取函数:UTF-8、GB2312双支持
  4. 文本框输入限制,数字,字母,下划线
  5. 命名空间中不存在名称_原木定制中不开裂的木材真的存在吗?
  6. ajax渲染的页面tp怎么赋值,【Vue】前后端不分离的情况下,TP5的视图页面中如何使用vue来接受和传递数据?...
  7. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_08-vuejs研究-vuejs基础-v-if和v-for指令...
  8. 8月5日发布卡巴斯基授权许可key-卡巴斯基key
  9. Delphi 字体修改一例 (转)
  10. c语言程序设计精髓第五章编程题
  11. 前端清除缓存的集中方法
  12. python 判断回文数
  13. c语言错误L104,KEILC51编译问题ERROR L104
  14. [CF1383A]String Transformation 1
  15. 区块链,屌丝逆袭的最后机会
  16. 日常英语口语收集汇总
  17. 大数据项目之电商数仓DataX、DataX简介、DataX支持的数据源、DataX架构原理、DataX部署
  18. Cookie重名问题处理
  19. 大数据面前无隐私 到底谁才是老大哥
  20. 关于Python choice() 函数介绍

热门文章

  1. c++ switch语句
  2. 医院信息集成平台现状总结
  3. 七周成为数据分析师01-数据分析思维
  4. 谷款量子计算机用了多少光子,中国光量子计算机诞生 脑容量小的别看
  5. python中answer_Python初学之学生和老师的question和answer问题
  6. MATLAB R2009a完美安装及下载
  7. iOS小知识:如何使用教育商店购买Apple M1 Max
  8. Shader实战(1):Unity中使物体不受光照影响(不区分明暗面)
  9. 哎,又跟HR在小群吵了一架!
  10. RGBA图像的四通道详细分析