STM32实战项目——WIFI远程开关灯

news2024/11/16 23:36:38

前言
其实WIFI开关灯在几个月前就想做了,但是对于没有云平台调试经验的我,一开始有些摸不着头脑,所以就搁置了。十一假期与老同学聊天时了解到他也在做一个远程开关灯的小项目,所以就重新开始了WIFI远程开关灯的小项目。

本文使用到的AT固件,固件烧录工具,烧录方法以及调试上位机,全部在文末公众号中,关注并私信“ESP8266资料”,可以免费获取!

本文设计的PCB工程文件可以关注文末公众号,私信“远程开关灯PCB”获取!

文章目录

  • 一、项目简介
  • 二、硬件选型
  • 三、连接腾讯云测试
    • 3.1 AT固件烧录
    • 3.2 云平台配置
      • 3.2.1 新建产品
      • 3.2.2 配置产品
    • 3.3 上位机调试
  • 四、所需AT指令
  • 五、程序编写
    • 5.1 ESP8266发送指令程序
    • 5.2 接收云平台信息
    • 5.3 舵机控制
  • 六、PCB设计
  • 七、优化方向

一、项目简介

本项目使用STM32F103C8T6作为主控芯片,搭配ESP8266,通过WIFI连接腾讯云来实现远程开关灯。腾讯云有自带的APP“腾讯连连”,但是目前苹果用户不能下载,不过他也有配套的小程序,十分友好。开关灯的功能由sg90舵机来实现。

目前只完成了第一版的软件开发,将功能分成了两种,一种是只需要关灯,也就是收到云平台的指令,就关灯,开灯需要手动。另一种就是既可以远程关灯,也可以远程开灯。之所以分成两种功能,是因为博主的需求只是能够睡前关灯,不再摸黑找床就够了!

二、硬件选型

  • 主控芯片:STM32F103C8T6
  • ESP8266:暂时使用的是正点原子的ESP8266,由于价格相对不太美丽,后续可能会更换。
  • 舵机:sg90

对于ESP8266和sg90不甚了解的小伙伴不要慌,可以移步博主的“STM32外设系列专栏”查看!

三、连接腾讯云测试

其实上云的方法,除了需要了解掌握云平台的配置方法,其他与STM32外设专栏中介绍的,利用WIFI模块访问API并无太大的差别。在上云之前,我们需要先做好前期准备。

3.1 AT固件烧录

安可信提供了可连接腾讯云的AT固件,下载链接在评论区贴出!有需要资料的小伙伴可以直接关注文末公众号,私信发送“ESP8266资料”,获取本文全部资料。

直连腾讯云AT固件
获取到固件后,下一步就是使用固件烧录工具将固件烧录到我们的ESP8266中。这里需要用的USB转TTL,固件烧录工具以及烧录方法全部打包在公众号资料中,这里暂时不在做介绍。

值得注意的是,我们在给正点原子的ESP8266模组烧录固件时,需要注意一下接线方式,这里说明一下

ESP8266			USB-TTL

VCC		-----	5V
GND		-----	GND
TXD		-----	RXD
RXD		-----	TXD
IO_0	-----	GND

在烧录完固件后,再将IO_0置空,重新上电即可。

3.2 云平台配置

首先进入腾讯云平台,连接放在评论区。注册账号后进入到“实例管理”。

进入腾讯云

这里因为已经创建过,所以和最开始使用的小伙伴显示的有所不同,但是不影响介绍配置步骤。

3.2.1 新建产品

点击进入公共实例,点击“新建项目”,输入相关信息。

新建项目

新建完项目后,点击进入新建的项目,然后点击“新建产品”,按照下图选择并输入相关信息。

新建产品

3.2.2 配置产品

首先是“物模型”,我们是需要实现开关灯,这里我们只配置一个简单的属性。点击“新建自定义功能”,按照下图配置并输入相关信息。

新增自定义功能

添加完成后点击下一步,进入“设备开发”,选择“基于模组开发”。

设备开发

选择模组时选择下面的模组

选择模组

点击下一步之后,进入“交互开发”。除了下图的“配网引导”需要按照下图选择,其他的可自行配置。

配网引导

配置完成后,来到“设备调试”,新建完设备后,云平台部分就配置完成。新建完设备后点击产品,进入后可以看到设备信息。设备信息中的“设备名称”、“产品ID”、“设备密钥”在后续会使用到。

设备信息

3.3 上位机调试

上位机使用公众号资料中提供的上位机。用USB转TTL连接上ESP8266,打开上位机,`打开对应串口。输入上面的设备信息。

上位机

点击“直接连接WIFI”,输入要连接的WIFI名称和WIFI密码。等待连接上WIFI后,点击连接腾讯云。此时可以去云平台的设备调试中看一下设备是否处于在线状态。设备在线后,需要订阅主题,订阅主题时需要输入

$thing/down/property/产品ID/设备名称

订阅完成后就可以在云平台进行控制。点击云平台上在线调试中的“发送”,串口就可以收到服务器发送的消息。
上位机

四、所需AT指令

上面介绍了如何利用上位机来实现上云,并且收到云平台发送的指令。我们可以看到,实际上位机也是使用发送AT指令的方式实现的,所以我们在利用单片机+ESP8266上云时,模仿上位机去发送这些AT指令,一样可以上云。这里按发送顺序列举一下需要用到的几条AT指令。

AT+CWJAP="WIFINAME","WIFIPASSWORD"   // 连接指定WIFI

AT+TCDEVINFOSET=1,"PRODUCTID","DEVICENAME","DEVICEKEY"   // 发送设备信息

AT+TCMQTTCONN=1,5000,240,1,0   // 配置MQTT参数

AT+TCMQTTSUB="$thing/down/property/PRODUCTID/DEVICENAME",0   // 订阅主题

需要注意的是,每条AT指令后面都需要加换行和回车!

五、程序编写

5.1 ESP8266发送指令程序

发送指令程序如下

/*
 *==============================================================================
 *函数名称:Med_Esp8266_CheckLink
 *函数功能:检查ESP8266连接状态
 *输入参数:str:要发送的指令;
 *返回值:无
 *备  注:调用前先将需要发送的内容利用sprintf()函数转换成字符串
					串口1发送指令,串口2返回信息
 *==============================================================================
 */
void Med_Esp8266_SendCmd (u8 *str)
{
	while (!gSetSuccessFlag)
	{
		// 发送AT指令
		USART_Send(UART1,str);
		
		// 这里延时4s,防止出现虚假上云现象
		delay_ms(1000);
		delay_ms(1000);
		delay_ms(1000);
		delay_ms(1000);
		
		gSendCunt = gSendCunt + 1;   // 发送次数加1
		
		// 检测接收内容
		Med_Esp8266_Uartrece_Pares();
		
		if (gSendCunt > 10)
		{
			// 发送失败
		}
	}
	
	gSendCunt = 0;   // 清零发送次数
	gSetSuccessFlag = 0;   // 清零配置成功变量
}

其实实质是利用串口1,将需要发送的字符串发送出去。关于串口发送程序,可以到“STM32速成笔记”专栏查看,这里就不再做详细介绍了。

发送AT指令的完整程序如下

/*
 *==============================================================================
 *函数名称:App_Esp8266_Init
 *函数功能:ESP8266初始化
 *输入参数:无
 *返回值:无
 *备  注:检测ESP8266连接状态,并连接指定WIFI
 *==============================================================================
 */
void App_Esp8266_Init (void)
{
	// 连接指定WIFI
	sprintf((char*)gString,"AT+CWJAP=\"%s\",\"%s\"\r\n",WIFINAME,WIFIPASSWORD);
	Med_Esp8266_SendCmd(gString);
}
/*
 *==============================================================================
 *函数名称:App_Esp8266_Connect_Tencentcloud
 *函数功能:连接腾讯云
 *输入参数:无
 *返回值:无
 *备  注:无
 *==============================================================================
 */
void App_Esp8266_Connect_Tencentcloud (void)
{
	// 设置平台设备信息
	sprintf((char*)gString,"AT+TCDEVINFOSET=1,\"%s\",\"%s\",\"%s\"\r\n",PRODUCTID,DEVICENAME,DEVICEKEY);
	Med_Esp8266_SendCmd(gString);
	
	// 配置MQTT连接参数
	sprintf((char*)gString,"AT+TCMQTTCONN=1,5000,240,1,0\r\n");
	Med_Esp8266_SendCmd(gString);
	
	// 订阅MQTT主题信息
	sprintf((char*)gString,"AT+TCMQTTSUB=\"$thing/down/property/%s/%s\",0\r\n",PRODUCTID,DEVICENAME);
	Med_Esp8266_SendCmd(gString);
}

5.2 接收云平台信息

其实针对云平台信息的接收很简单,是否收到云平台消息的标准是,接收到的字符串中是否有关键词“led”。接收判断程序如下

/*
 *==============================================================================
 *函数名称:Med_SG90_Uartrece_Pares
 *函数功能:解析串口接收内容
 *输入参数:无
 *返回值:无
 *备  注:无
 *==============================================================================
 */
void Med_SG90_Uartrece_Pares (void)   // 串口接收内容解析函数
{
	u16 tempVar = 0;   // 临时循环变量
	
	if (gReceEndFlag  == 1)   // 如果接收完成
	{
		// 解析接收内容
		for (tempVar = 0;tempVar < gReceCount;tempVar ++)
		{	
			// 腾讯云下发消息解析
			if (gReceFifo[tempVar] == 'l' && gReceFifo[tempVar + 1] == 'e' && gReceFifo[tempVar + 2] == 'd')
			{
				// 解析开关灯指令
				gRecCloudOrder = 1;
				break;
			}
		}
		
		// 清空接收数组
		for (gClearCount = 0;gClearCount < gReceCount;gClearCount ++)
		{
			gReceFifo[gClearCount] = ' ';
		}
			
		gReceEndFlag = 0;   // 清除接收完成标志位
		gReceCount = 0;   // 清零接收计数变量
	}
}

关于如何解析接收字符串,如果看上面的程序还是不理解,可以到“STM32外设系列”专栏中WIFI篇查看。或者到“STM32实战项目”专栏中密码锁篇查看。

5.3 舵机控制

舵机使用TIM2的PWM通道2来控制,关于sg90的详细控制资料,可以到“STM32外设系列”专栏查看,程序工程可关注文末公众号私信获取。

这里定义了一个函数,可以控制舵机旋转到指定角度。

/*
 *==============================================================================
 *函数名称:Med_Sg90_Spin
 *函数功能:SG90旋转到指定角度
 *输入参数:angle:旋转到的指定角度
 *返回值:无
 *备  注:无
 *==============================================================================
 */
void Med_Sg90_Spin (u16 angle)
{
	TIM_SetCompare2(TIM2,195 - angle / 9);   // 旋转到指定角度
	delay_ms(500);
}

上面介绍了,项目有两种不同的功能,可以利用宏定义开关。舵机根据宏定义开关的不同,可以实现不同的功能。舵机开关灯程序如下

// 以下变量在其头文件中进行了全局声明
u8 gRecCloudOrder = 0;   // 收到云平台指令标志位

/*
 *==============================================================================
 *函数名称:App_Sg90_LedCtrl
 *函数功能:SG90开关灯
 *输入参数:无
 *返回值:无
 *备  注:根据需求选择宏定义开关
 *==============================================================================
 */
#if CLOSE_AND_OPEN
u8 gOpenCloseCtrlFlag = 0;   // 开关控制标志位
#endif

void App_Sg90_LedCtrl (void)
{
	Med_SG90_Uartrece_Pares();   // 接收串口内容并解析
	
	#if ONLY_CLOSE
		if (gRecCloudOrder == 1)
		{
			Med_Sg90_Spin(CLOSEANGLE);   // 舵机旋转关灯
			delay_ms(500);
			Med_Sg90_Spin(99);   // 舵机归零
			delay_ms(500);
			gRecCloudOrder = 0;
		}
	#elif CLOSE_AND_OPEN
		if (gRecCloudOrder == 1)
		{
			gOpenCloseCtrlFlag = gOpenCloseCtrlFlag + 1;
			
			// 范围限制
			if (gOpenCloseCtrlFlag >= 3)
			{
				gOpenCloseCtrlFlag = 1;
			}
		}
		if (gRecCloudOrder == 1 && gOpenCloseCtrlFlag == 1)
		{
			Med_Sg90_Spin(CLOSEANGLE);   // 舵机旋转关灯
			delay_ms(500);
			Med_Sg90_Spin(99);   // 舵机归零
			delay_ms(500);
			gRecCloudOrder = 0;
		}
		else if (gRecCloudOrder == 1 && gOpenCloseCtrlFlag == 2)
		{
			Med_Sg90_Spin(OPENANGLE);   // 舵机旋转开灯
			delay_ms(500);
			Med_Sg90_Spin(99);   // 舵机归零
			delay_ms(500);
			gRecCloudOrder = 0;
		}
	#endif
}

六、PCB设计

本项目的第一版PCB已经设计完成,如有需要,可关注文末公众号,私信“远程开关灯PCB”获取,这里贴一下PCB的3D预览图。

PCB的3D预览图

七、优化方向

  • 未加入ESP8266连接异常检测程序。
  • 如果需要修改连接的WIFI,需要重新烧写程序。可以尝试使用HC-05来输入要连接的WIFI信息,如果小伙伴有其他好的办法,欢迎私信讨论或者评论区讨论。
  • PCB没有加入电源部分电路,后续考虑使用电池供电。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1073450.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

你不会还在人工巡检UPS设备吧!?大神技巧学起来!

在现代生活和商业中&#xff0c;依赖电力已经成为不可或缺的一部分。因此&#xff0c;UPS监控成为了保障业务连续性和设备运行的关键要素。 UPS监控的目标是提供对电力系统的全面可视化和控制&#xff0c;以及在电力故障或其他问题发生时采取即时行动。 客户案例 企业数据中心…

剑指offer——JZ86 在二叉树中找到两个节点的最近公共祖先 解题思路与具体代码【C++】

一、题目描述与要求 在二叉树中找到两个节点的最近公共祖先_牛客题霸_牛客网 (nowcoder.com) 题目描述 给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值 o1 和 o2&#xff0c;请找到 o1 和 o2 的最近公共祖先节点。 数据范围&#xff1a;树上节点数满足1≤n≤1…

软件安全测试包含哪些内容?测试流程步骤有哪些?

泽众云测试通过专业的安全测试设备与经验丰富的实施人员从应用代码、服务器、数据库、通信交互等方面针对安全性风险进行全方位的检测&#xff1b;凭借专业的安全测试设备以及积累的安全测试用例为客户出具安全测试报告&#xff0c;并为客户提供科学的修复建议。 安全测试解决的…

c++视觉---中值滤波处理

中值滤波&#xff08;Median Filter&#xff09;是一种常用的非线性平滑滤波方法&#xff0c;用于去除图像中的噪声。它不像线性滤波&#xff08;如均值滤波或高斯滤波&#xff09;那样使用权重来计算平均值或加权平均值&#xff0c;而是选择滤波窗口内的像素值中的中间值作为输…

[硬件基础]-快速了解555定时器

快速了解555定时器 文章目录 快速了解555定时器1、555 定时器内部组成2、555 定时器的工作原理3、555 定时器的操作模式3.1 单稳态3.2 双稳态3.3 非稳态 555 定时器振荡器或通常所说的 555 定时器是一种非常流行的计时相关应用 IC。 它们坚固耐用且用途广泛&#xff0c;因为它们…

提高网站性能的10种方法:加速用户体验和降低服务器负担

在今天的数字时代&#xff0c;网站性能对于吸引和保留用户至关重要。一个快速加载的网站不仅提供更好的用户体验&#xff0c;还有助于降低服务器负担。以下是10种提高网站性能的方法&#xff0c;旨在加速页面加载速度和减少服务器的工作负荷。 压缩网页资源 利用压缩算法如gzi…

CVE-2023-36845:Juniper Networks Junos OS EX远程命令执行漏洞

Juniper Networks Junos OS EX远程命令执行漏洞(CVE-2023-36845) 复现 0x01 前言 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#…

16-bit 内置基准模数转换器:MS1100

MS1100 是一款高精度 16bit 模数转换器。内部集成 2.048V 基 准源&#xff0c;差分输入范围达到 2.048V 。使用了 I 2 C 兼容接口。电源电 压范围为 2.7V 到 5.5V 。 MS1100 转换速率为 15 、 30 、 60 或 240SPS &#xff0c;集成有可编程增 益放大器&…

Zookeeper集群安装部署、Kafka集群安装部署

目录 1. Zookeeper简介 2. Zookeeper安装 2.1 首先&#xff0c;要确保已经完成了集群化环境前置准备环节的全部内容 2.2 【node1上操作】下载Zookeeper安装包&#xff0c;并解压 2.3 【node1上操作】创建软链接 2.4 【node1上操作】修改配置文件 2.5 【node1上操作】…

Python Django 详解(基础)

文章目录 1 概述1.1 安装 django1.2 创建 django 项目1.3 创建 app 2 启动 Django2.1 settings.py&#xff1a;注册 app2.2 view.py&#xff1a;URL和视图对应2.3 启动 Django2.4 访问 3 快速上手3.1 templates&#xff1a;html 模板3.2 static&#xff1a;静态文件3.3 模板语法…

前端JavaScript入门到精通,javascript核心进阶ES6语法、API、js高级等基础知识和实战 —— JS进阶(一)

思维导图 一、作用域 1.1 局部作用域 let和const声明的才有块作用域 1.2 全局作用域 1.3 作用域链 1.4 JS垃圾回收机制 1.5 闭包 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Comp…

Qt元对象系统 day5

Qt元对象系统 day5 内存管理 QObject以对象树的形式组织起来&#xff0c;当为一个对象创建子对象时&#xff0c;子对象回自动添加到父对象的children()列表中。父对象拥有子对象所有权&#xff0c;比如父对象可以在自己的析构函数中删除它的孩子对象。使用findChild()或findC…

怎么压缩ppt文件?

怎么压缩ppt文件&#xff1f;造成ppt文件体积太大的原因主要有两个&#xff1a;① 图片和媒体文件&#xff0c;PPT中使用高分辨率、大尺寸的图片或视频文件会增加文件大小。如果未经压缩或优化&#xff0c;这些文件可能会占用较大的存储空间&#xff1b;② 动画和特效&#xff…

【Unity3D编辑器开发】Unity3D中制作一个可以随时查看键盘对应KeyCode值面板,方便开发

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 在开发中&#xff0c;会遇到要使用监控键盘输入的KeyCode值来执…

十七、C语言内存函数

1 memcpy函数的使用和模拟实现 //memcpy函数的声明 void* memcpy(void* destination, const void* source, size_t num);memcpy函数可以给内存进行拷贝&#xff0c;由于不知道要拷贝的内存中存放的是哪一种类型的数据&#xff0c;所以memcpy函数的返回类型设置成了void*。 me…

【2023全网最全最火】Selenium WebDriver教程(建议收藏)

在本教程中&#xff0c;我将向您介绍 Selenium Webdriver&#xff0c;它是当今市场上使用最广泛的自动化测试框架。它是开源的&#xff0c;可与所有著名的编程语言&#xff08;如Java、Python、C&#xff03;、Ruby、Perl等&#xff09;一起使用&#xff0c;以实现浏览器活动的…

如何使用jest

最近在研究单元测试&#xff0c;虽说前端如果不是大且的项目不必要加&#xff0c;但至少得会&#xff0c;因此花了些时间研究&#xff0c;以下是我总结jest的使用。 jest是什么&#xff1f; Jest是 Facebook 的一套开源的 JavaScript 测试框架&#xff0c; 它自动集成了断言、…

bert入门

bert是什么 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是一种自然语言处理&#xff08;NLP&#xff09;中的预训练模型&#xff0c;它是基于Transformer架构的一种深度学习模型。BERT的主要目标是在大规模文本语料库上进行预训练&a…

自动求导,计算图示意图及pytorch实现

pytorch实现 x1 torch.tensor(3.0, requires_gradTrue) y1 torch.tensor(2.0, requires_gradTrue) a x1 ** 2 b 3 * a c b * y1 c.backward() print(x1.grad) print(y1.grad) print(x1.grad 6 * x1 * y1) print(y1.grad 3 * (x1 ** 2))输出为&#xff1a; tensor(36.) …

uniapp-vue3-弹出选择组件wo-pop-selector

wo-pop-selector弹出选择组件采用uniapp-vue3实现, 支持H5、微信小程序&#xff08;其他小程序未测试过&#xff0c;可自行尝试&#xff09; 可到插件市场下载尝试&#xff1a; https://ext.dcloud.net.cn/plugin?id14879 使用示例 <template><view><view c…