智能家具系统分为两个不同版本系列:

①系列一:手机app远程控制、远程检测温湿度显示在app,(云平台)    ---------本文章

②系列二:语音识别控制                https://blog.csdn.net/m0_59113542/article/details/123742383

硬件采购链接:

步进电机及相关驱动 https://m.tb.cn/h.fLxkuAl?tk=MrPE2ToToDL 第三个套餐
舵机 https://m.tb.cn/h.fnz3dn4?tk=VWlc2f8Y0NY 两个都行
风扇 https://m.tb.cn/h.fNySVjC?tk=56Yc2f800lH 第一个套餐
stm最小系统板 https://m.tb.cn/h.fNy7pcW?tk=XKLr2f8YwWD 第三个套餐
esp-01s https://m.tb.cn/h.fLxmnU5?tk=Lbbp2TohFoT
dht11 https://m.tb.cn/h.fLxNKIY?tk=RMYX2ToSomh 第二个套餐

手机app及相关程序开源,百度网盘下载,放在最下方。

一、项目介绍

功能:1、手机app远程控制相应外设                             APP→单片机

2、单片机采集温度远程发送到手机显示             单片机→APP

 3、 OLED显示万年历及外设的工作状态

实现:本设计由STM32驱动相关外设,ESP-01S(8266)连接云平台(巴法云),手机app也连接云平台,以此进行远程信息交互。

远程控制:手机app连接巴法云平台,esp-01s(esp8266)也连接平台,当手机按键按下时向云平台发送控制信息,esp8266接收到该信息,并传输给stm32,由stm32完成相应的控制功能。

温度显示:本项目使用esp-01s(esp8266)驱动dht11测温,然后直接上传云平台数据,手机订阅平台,从而显示温湿度。

(大白话就是:手机将数据放到云平台,stm32通过esp联网去云平台读数据)

OLED屏显示:本项目额外开发显示功能,屏幕具有两种显示:其一显示万年历,其二显示外设的工作状态,两种显示使用按键K0切换。

①显示万年历:上电后自动显示,当时间不对时,可点击K1按键进入时间设置界面,然后通过K2、K3按键进行时间修改。

②显示外设工作状态:当手机端发送控制指令时,STM32完成相关驱动后,屏幕会进入定时显示界面,待定时结束后进入通体显示界面。

1、总体展示图:

2、

              

总体显示界面                    定时显示界面                万年历显示界面                时间修改界面

了解完工作过程,接下来就和闯关游戏一样,一关关的闯,打怪升级,消灭怪兽,营救公主,最终和公主殿下过上了幸福的生活。。。。。哈哈哈,扯远了,说正事、说正事。

开始闯关:

大家可以想一下万恶的新冠病毒的传播,传染源→传播途径→接收端感染人群。。。。病毒传染首先得有传染源吧,不可能和孙悟空一样从石头里蹦出来吧。(与本工程信号产生装置贴合,也就是手机app)    然后是传播途径(也就是远程传输 巴法云平台)   然后是接受端(也就是我们的stm32)

系统的开发分为以下三步:

1、手机app制作及如何向云平台发送信息。

2、联网(既然要远程控制,肯定是需要走网络的啊,让我们的信号通过网络“飞过去”,这是esp-01s的工作)

3、stm32接收到命令后的外设驱动

二、逐步闯关---分步实现

接下来就是具体的闯关打怪时间。

第一关:手机app制作及如何向云平台发送信息

闯关吗,肯定要有法宝啊,在这里向大家介绍一个很nice的"法宝",appinventor,一款麻省理工研发的开发安卓app的平台,是不是一听"麻省理工",感觉嘎嘎高大上,是我们能学会的吗!!!!,其实appinventor嘎嘎简单,比我们用的c语言简单一万倍。

大白话说说他的功能,就是将一些按键、文本框拖入手机界面,然后图形化编程当按键按下的时候实现什么功能就行。

                        

右边这个图像就是编程的,用模块化编程,拼积木都会吧,嘎嘎简单吧!!!!

然后如何让这个app联网呢,这就是另一个"法宝"  巴法云平台了。

大家登录网站后,点击我标记的地方,这里有详细的介绍如何使用。

第二关:ESP-01s联网

esp-01s本来就是一个wifi模块,它是通过连接周围的wifi从而上网,连接巴法云平台的。

且esp-01s可以用AT指令进行配置,也可以用arduino进行二次开发,本人选择二次开发,我会将程序放在下面,大家直接简单修改几个参数就能用了。

就修改这几个参数,就能用啦,而且以后想做远程控制的东西,都可以这么用。一劳永逸是不是YYDS。嘿嘿嘿

语言总是最无力的,说再多也不一定能解释清楚,楼主呕心沥血给大家找了一个4分钟的视频,讲解的嘎嘎清楚。https://www.bilibili.com/video/BV1zy4y1k7Mn?spm_id_from=333.337.search-card.all.click

除此之外还有一个详细的介绍文章,用一句话说就是通透:

esp8266-01s接入巴法云,开源app远程控制,微信小程序控制 - 巴法云 - 博客园 (cnblogs.com)

第三关:stm32接收到命令后的外设驱动

esp8266-01s接收到平台数据后,通过串口发送给stm32,stm32要做的事就是解析命令,并驱动外设。

我们做的是智能家具的模型,不可能真的去改装家具,这里采用模拟的方式,用步进电机模拟窗帘,用舵机模拟开关门,led灯,风扇,继电器。

大家可以发挥自己的想象,用别的外设,这就需要大家自己探讨了。

三、程序实现

main.c

通过USART3与esp8266-01s连接,接受数据,在主函数中解析命令,并相关操作。

#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "usart3.h"
#include "esp8266.h"
#include "Servo_motor.h"
#include "step_motor.h"
#include "string.h"
#include "timer.h"
#include "led.h"
#include <stdio.h>
#include <string.h>
/*
项目的主要内容:STM32配合ESP8266模块与服务器数据交互ESP8266的连接:USART3(PB10、PB11)如何判断数据接收完全?
1、出现了换行符;
2、如果超过10ms了都没有下一条数据(TIM7来进行10ms的定时)。
*/int main(void){   u16 rlen=0;//保存接收到的数据长度// u16 t,len;//串口1调试char data_tiqu[100];//将接收到的数据保存到该数组u8 data[10];//最终提取的数据int k=0,s=0;//保存cmd2开头的数据的下标int i=0,j=0;char cmd[]="msg";int flag=1;//收到正确数据标志位,默认为1,u8 timex=0;//每200发送1次心跳包的标志位delay_init();                                           //延时函数初始化     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断优先级分组为组2:2位抢占优先级,2位响应优先级LED_Init();servo_init();Step_Motor_GPIO_Init();uart_init(115200);                               //串口初始化为115200usart3_init(115200);servo_angle(80);                                                             //私服电机初始角度(关门状态)while(1){timex++;if(USART3_RX_STA&0X8000)          //接收到一次数据了{ rlen=USART3_RX_STA&0X7FFF;   //得到本次接收到的数据长度USART3_RX_BUF[rlen]=0;         //添加结束符 //printf("%s",USART3_RX_BUF);   //发送到串口//数据提取if(strncmp(USART3_RX_BUF,"cmd=2",5)==0){for(i=0;i<strlen(USART3_RX_BUF)+1;i++){data_tiqu[s]=USART3_RX_BUF[i];s++;}printf("%s",data_tiqu);for(i=0;i<strlen(data_tiqu);i++){if(data_tiqu[i]==cmd[0]){k=i;k++;for(j=1;j<strlen(cmd);j++){if(data_tiqu[k]==cmd[j]){k++;flag=1;}else{flag=0;}}}         }s=0;//数据提取结束printf("\r\n\r\n");if(flag==1){for(i=k+1;i<strlen(data_tiqu)+1;i++)   //此时 i为传输接受到数据的索引{data[s]=data_tiqu[i];s++;}printf("%s",data);printf("zaici");     //作用:程序定位printf("\r\n");//判断APP控制开关灯if(data[0]=='1'&&data[1]=='1'){GPIO_ResetBits(GPIOC,GPIO_Pin_13); //开LED0GPIO_SetBits(GPIOB,GPIO_Pin_7);  //关LED0}if(data[0]=='1'&&data[1]=='0'){GPIO_SetBits(GPIOC,GPIO_Pin_13);  //关LED0GPIO_ResetBits(GPIOB,GPIO_Pin_7); //开LED0}//判断APP控制开关风扇if(data[0]=='2'&&data[1]=='1'){FS=1;}if(data[0]=='2'&&data[1]=='0'){FS=0;}//判断APP控制开关窗帘if(data[0]=='3'&&data[1]=='1'){motorNcircle(64,(bool)1);  //步进电机正传}if(data[0]=='3'&&data[1]=='0'){motorNcircle(64,(bool)0);  //步进电机反传}//判断APP控制开关门if(data[0]=='4'&&data[1]=='1'){servo_angle(175);delay_ms(500);}if(data[0]=='4'&&data[1]=='0'){servo_angle(80);delay_ms(500);}}}if(strncmp(USART3_RX_BUF,"cmd=0&res=1",11)==0){printf("%s",USART3_RX_BUF);}USART3_RX_STA=0;}if((timex%200)==0){u3_printf("cmd=0&msg=ping");//心跳包timex=0;}}}

Servo_motor.c

舵机的驱动,舵机是用PWM的不同占空比来转动不同的角度

#include "Servo_motor.h"
#include "delay.h"//高级定时器1pwm输出初始化
//arr:自动重装值(周期)  psc:时钟预分频数
void tim1_pwmInit(uint16_t arr, uint16_t psc)
{GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;TIM_OCInitTypeDef  TIM_OCInitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); // 使能定时器1的外设时钟RCC_APB2PeriphClockCmd(TIM1_CH1_GPIO_CLK, ENABLE);  //使能GPIO外设时钟使能                                //设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形GPIO_InitStructure.GPIO_Pin = TIM1_CH1_PIN; //TIM_CH1GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(TIM1_CH1_PORT, &GPIO_InitStructure);TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值  80KTIM_TimeBaseStructure.TIM_Prescaler = psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能//TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低TIM_OC1Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMxTIM_CtrlPWMOutputs(TIM1,ENABLE);   //MOE 主输出使能 TIM_Cmd(TIM1, ENABLE);  //使能TIM1
}void servo_init(void)
{tim1_pwmInit(SERVO_TIM_ARR,SERVO_TIM_PSC);TIM_SetCompare1(TIM1,150);  //使舵机恢复到中间位置
}//0.5ms--0°  2.5ms--180°
void servo_angle(uint16_t angle)
{uint16_t pulse;//针对舵机可转角度限辐if(angle <= 5)angle = 5;if(angle >= 175)angle = 175;//将角度值转换为脉冲值  pulse = (uint16_t)(50 + angle * 100/90.0);  //此转换公式需根据pwm的arr及psc配置来做相应变化TIM_SetCompare1(TIM1, pulse);}void servo_debug(void)
{uint8_t i;for(i = 0; i < 10; ++i){delay_ms(500);servo_angle(80);  //中间位置delay_ms(500);servo_angle(175);}
}

开关灯与开关风扇就不用多说了,就是GPIO输出高低的问题,还有步进电机,在我另一篇博客上有详细介绍

stm32驱动步进电机

完整工程链接:https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-24450682672.14.7aa61b42erNczw&id=678372943522

欢迎大家指正交流,有空可以一起讨论代码啊。

制作不易,感谢大家支持,感谢!!!!!!

--------------一个正在努力的人

感觉未分享清楚、有疑惑

咨询问题、了解具体内容、需要帮助者 可私信联系

毕业设计——基于STM32的智能家具控制系统(ESP-01S(8266)、手机app远程控制、远程显示温度)相关推荐

  1. 智能灯控制页面用HTML编写,一种基于STM32的智能灯控制系统的制作方法

    本发明涉及电子系统控制领域,具体是一种基于STM32的智能灯控制系统. 背景技术: 随着我国教育业的发展,学校照明用电量急速增加,电能损失也呈现出增大的趋势.目前,国内外照明自动控制装置基本都采用被动 ...

  2. 毕业/课程设计——基于STM32的智能灯光控制系统(物联网、智能家居、手机APP控制、语音控制)

    文章首先介绍本系统所包含的功能,主要包含六方面功能,之后逐步分享开发过程,其流程如下:点亮灯带(三极管)→调节灯光亮度(PWM)→为系统添加远程控制功能→为系统添加语音识别功能→添加超声波姿态监测功能 ...

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

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

  4. 【毕业设计】基于stm32的智能饮水控制系统 - 单片机 嵌入式 物联网

    文章目录 1 简介 2 功能要求 3 相关器件 4 实现效果 5 部分实现代码 1 简介

  5. 基于STM32设计智能家居控制系统(OneNet)_2022

    1. 前言 随着科学技术的发展,人们的生活方式发生着巨大改变,基于物联网技术实现的智能家居使我们的生活变得更加方便快捷.本次设计结合现代生活的具体需求,设计出一套基于物联网技术的智能家居电子系统设计, ...

  6. 毕业设计 基于stm32的智能快递仓库环境监控系统 - 物联网 嵌入式

    本次设计的快递仓库的火灾报警系统通过主控单元将各个传感器的参数值采集回来,包括与消防安全相关的温度.湿度.烟雾等,主控制器. 数据采集回来之后通过无线的方式将数据上传到远端的上位机上,由于这些参数都是 ...

  7. 物联网毕业设计 基于stm32的智能婴儿车系统(源码+硬件+论文)

    文章目录 0 前言 1 设计思路 2 硬件设计(原理图) 3 核心软件设计 4 实现效果 5 最后 0 前言

  8. 毕业设计 基于stm32的智能婴儿车系统(源码+硬件+论文)

    文章目录 0 前言 1 设计思路 2 硬件设计(原理图) 3 核心软件设计 4 实现效果 5 最后 0 前言

  9. 毕业设计 基于STM32的智能宠物投喂系统(全套资料)

    文章目录 0 前言 1 系统说明 2 背景意义 3 系统设计 3.1 总体方案 3.2 硬件设计 3.2.1 STC89C52 3.2.2 CLS150TD舵机 3.2.3 压力传感器 3.2.4 H ...

最新文章

  1. 洛谷P3688/uoj#291. [ZJOI2017]树状数组
  2. Evernote中国版、优秀的笔记软件
  3. OpenShift — 架构设计
  4. 牛客小白月赛5 E 面积 计算三角形面积模板 波尔约-格维也纳定理 匹克公式
  5. SharedPreference.Editor的 apply 和commit 方法异同
  6. 【解题报告】Leecode 700. 二叉搜索树中的搜索——Leecode每日一题
  7. 2.3 Factory Method(工厂方法)
  8. Vue的过滤器,生命周期的钩子函数和使用Vue-router
  9. 【汇编优化】之MIPS架构优化
  10. .NET Core中延迟单例另一种写法【.NET Core和.NET Framework的beforefieldinit差异】
  11. 拓端tecdat|使用markdown,knitr和pandoc在R语言中编写可重现的报告
  12. vue源码分析系列之响应式数据(三)
  13. Axure RP 8.0安装和汉化
  14. 学校计算机考试是win几,计算机一级考试考的是什么系统
  15. 在endnote中制作GB/T7714《文后参考文献著录规则》的输出格式 及 编辑Output Styles中特殊符号说明
  16. 联想智能云教室安win7_用“联想智能云教室”部署系统完成后,操作卡顿?
  17. Pytorch报错解决:The size of tensor a (4) must match the size of tensor b (3) at non-singleton dimensio
  18. 一枚菜鸟前端工程师月度工作总结
  19. linux mysql 邮件_linux中mysql 自动备份发邮件 到指定邮箱代码
  20. 《生活,是很好玩的》读书日记

热门文章

  1. 利用Python的turtle画一个奥运五环
  2. 300页超全大数据平台数据治理规划方案模板
  3. 第一周 Introduction
  4. 江协科技课程代码汇集1
  5. VC/MFC实现版本的在线升级提示和下载(服务器配置文件的方法)
  6. 狗屁不通生成器问题(动态规划)
  7. 三星c1116 android5.0,三星C1116(GALAXY K Zoom 联通3G)一键救砖教程,轻松刷回官方系统...
  8. 0604 HTTP协议
  9. 外盘期货配资软件的行情源
  10. 刘怡光在川大计算机学院职位,刘怡光