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

前言
其实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-TTLVCC		-----	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"   // 连接指定WIFIAT+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)
{// 连接指定WIFIsprintf((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;   // 开关控制标志位
#endifvoid App_Sg90_LedCtrl (void)
{Med_SG90_Uartrece_Pares();   // 接收串口内容并解析#if ONLY_CLOSEif (gRecCloudOrder == 1){Med_Sg90_Spin(CLOSEANGLE);   // 舵机旋转关灯delay_ms(500);Med_Sg90_Spin(99);   // 舵机归零delay_ms(500);gRecCloudOrder = 0;}#elif CLOSE_AND_OPENif (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.rhkb.cn/news/152363.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习Consul中踩过的坑

一、杀不死的consul 通过mac的homebrew安装了consul以后&#xff0c;手动启动consul报8300端口已被占用&#xff0c;通过lsof -i:8300和lsof -i:8500查看端口占用情况&#xff0c;发现consul已经启动了。然后手动kill -9对应的进程id&#xff0c;再启动consul&#xff0c;还是…

ChatGPT私有数据结合有什么效果?它难吗?

ChatGPT的出现可谓是惊艳了全世界&#xff0c;ChatGPT的问答能力通过了图灵测试&#xff0c;使其回答问题的方式与人类几乎无法区分。大家不甘于只在官方的对话页面问答&#xff0c;想利用 GPT 模型的自然语言能力结合私有数据开拓更多的应用场景。 | ChatGPT私有数据结合特点 …

[Java] 服务端消息推送汇总

前言&#xff1a;当构建实时消息推送功能时&#xff0c;选择适合的方案对于开发高效的实时应用至关重要。消息的推送无非就推、拉两种数据模型。本文将介绍四种常见的消息实时推送方案&#xff1a;短轮询&#xff08;拉&#xff09;、长轮训&#xff08;拉&#xff09;、SSE&am…

c++视觉处理---高斯滤波

高斯滤波处理 高斯滤波是一种常用的平滑滤波方法&#xff0c;它使用高斯函数的权重来平滑图像。高斯滤波通常用于去除噪声并保留图像中的细节。在OpenCV中&#xff0c;可以使用cv::GaussianBlur()函数来应用高斯滤波。 以下是cv::GaussianBlur()函数的基本用法&#xff1a; …

vue实现echarts中 9种 折线图图例

let datas [{ DivideScore: 7, UserScore: 7.2, Name: 目标制定 },{ DivideScore: 7, UserScore: 7, Name: 具体性 },{ DivideScore: 7, UserScore: 7.5, Name: 可衡量性 },{ DivideScore: 7, UserScore: 7, Name: 可实现性 },{ DivideScore: 7, UserScore: 7, Name: 时间限定…

简单强大的时序图绘制工具

今天分享一个简单强大的时序图绘制工具——WaveDrom。 WaveDrom Digital Timing Diagram everywhere WaveDrom draws your Timing Diagram or Waveform from simple textual description. It comes with description language, rendering engine and the editor. WaveDrom edi…

基于Springboot实现房屋租赁租房平台系统项目【项目源码+论文说明】

基于Springboot实现房屋租赁租房平台系统演示 摘要 在网络高速发展的时代&#xff0c;众多的软件被开发出来&#xff0c;给用户带来了很大的选择余地&#xff0c;而且人们越来越追求更个性的需求。在这种时代背景下&#xff0c;房东只能以用户为导向&#xff0c;所以开发租房网…

MongoDB-介绍与安装部署

介绍与安装部署 1.MongoDB简介a) 体系结构b) 数据模型c) MongoDB的特点c.1) 高性能c.2) 高性可用性c.3) 高拓展性c.4) 丰富的查询支持 2.单机部署a) Windows系统中的安装启动b) Shell连接(mongo命令)c) Linux系统中的安装启动和连接 1.MongoDB简介 MongoDB是一个开源、高性能、…

【网络安全入门】学习网络安全必须知道的100 个网络基础知识

前言 话不多说&#xff0c;完整的资料已经上传至CSDN官方&#xff0c;需要的可以点击链接自取【282G】网络安全&黑客技术零基础到进阶全套学习大礼包&#xff0c;免费分享&#xff01; 1 什么是链接? 链接是指两个设备之间的连接。它包括用于一个设备能够与另一个设备…

k8s containerd查看镜像

直接查看crictl image会报错&#xff1a; 1) crictl config runtime-endpoint unix:///run/containerd/containerd.sock 2) vi /etc/crictl.yaml 3) systemctl daemon-reload 此时&#xff0c;再查看image:

Python —— UI自动化之八大元素定位

1、基础元素定位 1、id定位 使用html中标签的id元素去定位&#xff0c;在一般定位中优先选择&#xff0c;举例&#xff1a; from time import sleep from selenium import webdriver from selenium.webdriver.common.by import Bydriver webdriver.Firefox() driver.get(&q…

CI/CD工具中的CI和CD的含义

CI/CD工具中的CI和CD的含义&#xff1f; CI/CD 是现代软件开发方法中广泛使用的一种方法。其中&#xff0c;CI 代表持续集成&#xff08;Continuous Integration&#xff09;&#xff0c;CD 则有两层含义&#xff0c;一是持续交付&#xff08;Continuous Delivery&#xff09;…

Pyside6 QPushButton

Pyside6 QPushButton QPushButton使用QPushButton继承关系QPushButton的函数(Function)和信号(Signal)QPushButton信号 QPushButton例程界面设计clicked信号测试pressed信号测试released信号测试toggled信号测试按键长按测试按键长按间隔测试完整程序界面程序主程序 按键或命令…

redis学习(二)——redis常见命令及基础数据类型

数据类型 基础数据类型 字符串 String abcMap集合 Hsah {name:“zhangsan”,age:18}列表 List [a, b, c, d]Set集合 Set {a,b,c}有序Set集合 SortSet {a:1,b:2,c:3} 特殊数据类型 GEO 地理坐标 {A:(100.2,35.1)}BitMap 位图&#xff0c;只存储0和1 01101011101HyperLog 基数…

详解CAN通信的标识符掩码和标识符列表两种过滤机制

CAN 通信的应用非常广泛&#xff0c;本文不涉及CAN通信的基础配置&#xff0c;重点分析一下STM32和GD32的CAN通信两种ID过滤方式。 首先&#xff0c;不管是STM32还是GD32&#xff0c;实现CAN通信ID过滤的机制和原理一定是一样的&#xff0c;只是用到的寄存器有差别。 1. ID过…

计算机视觉简介(1)

任何计算机视觉处理流程都始于成像系统&#xff0c;它从景物中捕获反射出来的光线&#xff0c;并将光信号转换成计算机可以读取和处理的图像格式 在计算机成像技术发展的早期&#xff0c;图像通过把胶卷或印刷图像素 化后获得&#xff1b;而现在图 像通常直接由数码相机获取&a…

消息驱动 —— SpringCloud Stream

Stream 简介 Spring Cloud Stream 是用于构建消息驱动的微服务应用程序的框架&#xff0c;提供了多种中间件的合理配置 Spring Cloud Stream 包含以下核心概念&#xff1a; Destination Binders&#xff1a;目标绑定器&#xff0c;目标指的是 Kafka 或者 RabbitMQ&#xff0…

记录一次springboot使用定时任务中@Async没有生效的场景

环境说明 jdk21springboot 3.0.11 springcloud 2022.0.0 spring-cloud-alibaba 2022.0.0.0 在开发一个定时触发的任务的时候&#xff0c;由于开发执行任务的函数比较耗费时间&#xff0c;所以采用异步解决问题。 发现并没有按照预期的触发 经询问后&#xff0c;发现当前类的…

2023年中国隆鼻行业发展历程及趋势分析:隆鼻手术市场将实现进一步增长[图]

隆鼻术就是以各种植入材料置入为主要方法&#xff0c;隆起或抬高鼻部形态为主要目的的鼻整形术式。隆鼻术可能是开展最多的整形美容手术之一。隆鼻术也是一种很成熟的美容手术&#xff0c;操作较为简单、安全、风险较小&#xff0c;也易于接受。 隆鼻行业分类 资料来源&#x…

这道面试题工作中经常碰到,但 99% 的程序员都答不上来

小时候都被问过一个脑筋急转弯&#xff0c;把大象放进冰箱有几个步骤&#xff1f;我们一开始都会抓耳挠腮&#xff0c;去想着该如何把大象塞进冰箱。最终揭晓的答案却根本不关心具体的操作方法&#xff0c;只是提供了 3 个步骤组成的流程&#xff0c;「把冰箱打开&#xff0c;把…