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

简介: 本文介绍了如何利用正点原子ESP8266和STM32F103C8T6连接腾讯云,利用舵机实现远程开关灯。给出了详细的腾讯云配置和调试步骤,给出了部分程序设计。


🎀 文章作者:二土电子
🐸 期待大家一起学习交流!


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

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

一、项目简介

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

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

二、硬件选型

  • 主控芯片:STM32F103C8T6
  • ESP8266:暂时使用的是正点原子的ESP8266,由于价格相对不太美丽,后续可能会更换。
  • 舵机:sg90
对于ESP8266和sg90不甚了解的小伙伴不要慌,可以移步博主的“STM32外设系列专栏”查看!

三、连接腾讯云测试

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

3.1 AT固件烧录

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

cbc4013065eae2da7111a8f0bd572fcc_0d21ef3c20dc4d2f90f937e861ac294d.png

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

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

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

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

3.2 云平台配置

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

a4416daa3ebdbc11269371ae1f7f0292_8a92e6ec77e94286972e9af531547f2d.png

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

3.2.1 新建产品

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

ba3d8434b8d525c1865b2552da9c553b_3fe658ac5e5c4216a9f293b1b63537c7.png

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

0779a6c3b774c3e0cf5db2fbdf114ebc_108abab8e37f4f0f843eee30ef4320f7.png

3.2.2 配置产品

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

8972afb4e348a39671042cf6f72ee1e3_1e0eda00b8bb4f9a9898957228c6e112.png

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

5f0e90f8ef0fbbf231c77a19d29859c2_cdd94952ab8f400dbc43ec22f0089e52.png

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

0eab1736559837e6fe62834d1dcd3aca_d11f7a483e0341d78b9492480020c7f8.png

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

8406a7931b9238e2a893421514afacfe_1aa9adc71b8f444e8456a11f24300dd3.png

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

f60e7a5f16b18557f7eda512c96ca079_9e3d76d21da54ba7a83b7648f0c95ba4.png

3.3 上位机调试

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

133739d9818dc68144232a272aa55919_46ee701d68834572a6b9e398b4779595.png

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

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

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

8b049d239d1bb15ea27ae604438438c0_d41adaa6c2114f2aa4d50deeeaf4c476.png

四、所需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
}

六、优化方向

  • 未加入ESP8266连接异常检测程序。
  • 如果需要修改连接的WIFI,需要重新烧写程序。可以尝试使用HC-05来输入要连接的WIFI信息,如果小伙伴有其他好的办法,欢迎私信讨论或者评论区讨论。
  • PCB没有加入电源部分电路,后续考虑使用电池供电。
相关实践学习
快速体验阿里云云消息队列RocketMQ版
本实验将带您快速体验使用云消息队列RocketMQ版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
2月前
|
传感器 数据采集 算法
【免费开源】基于 STM32F4 的四轴飞行器设计与实现——从零开始到成功起飞(项目源码打包分享)
四轴飞行器作为一种低空、低成本的遥感平台,已经在多个领域展现出广泛的应用潜力。相比其他类型的飞行器,它在硬件上结构紧凑、安装方便,但在软件层面却充满挑战——从传感器数据融合到姿态解算,再到快速且稳定的控制算法,每一环节都需要精心设计,也正因此让四轴飞行器更具技术魅力。
348 73
|
2月前
|
传感器 机器人 物联网
【免费开源】基于STM32的蓝牙小车/智能小车项目详解(附源码)
通过本项目,你可以系统掌握STM32外设控制、蓝牙通信、电机驱动和传感器数据处理技术,实现一辆可远程控制并具备避障功能的智能小车。该项目具有高度可扩展性,后续可增加循迹、自动寻路、摄像头等高级功能。
458 42
【免费开源】基于STM32的蓝牙小车/智能小车项目详解(附源码)
|
2月前
|
存储 编解码 开发者
基于STM32和OLED的小恐龙游戏项目设计与实现【免费开源】
小恐龙游戏最初是作为浏览器离线小游戏而广为人知,其简单的操作与生动的画面使其深受用户喜爱。本项目将经典的小恐龙跳跃游戏移植到嵌入式平台上,使用STM32微控制器作为核心控制器,OLED屏幕进行显示,搭配按键或触摸实现用户交互。通过本项目,既可以体验游戏开发在嵌入式系统上的实现方式,又能掌握STM32 GPIO、定时器、OLED驱动、按键扫描及简单动画实现技术。
基于STM32和OLED的小恐龙游戏项目设计与实现【免费开源】
|
2月前
|
传感器 数据采集 物联网
基于STM32和FreeRTOS的智能手环项目设计与实现【免费开源】
随着可穿戴设备的普及,智能手环逐渐成为健康管理、运动监测和生活便捷的重要工具。本项目旨在设计一款基于STM32微控制器和FreeRTOS实时操作系统的智能手环,具备心率监测、运动计步、睡眠分析以及蓝牙通信功能。通过FreeRTOS实现多任务调度,提高系统响应效率和资源利用率,同时保证低功耗设计,延长手环续航。
基于STM32和FreeRTOS的智能手环项目设计与实现【免费开源】
|
8月前
|
存储 安全 数据安全/隐私保护
STM32 Customer BootLoader 刷新项目 (一) STM32CubeMX UART串口通信工程搭建
本文介绍了基于STM32的Customer BootLoader刷新项目的第一部分:使用STM32CubeMX搭建UART串口通信工程。项目采用正点原子探索者v2开发板,通过USB串口与上位机通信,实现固件刷新功能。主要内容包括: 1. 硬件原理图介绍:详细描述了开发板的串口连接方式及电路图。 2. STM32CubeMX工程搭建:从创建新工程、配置系统时钟、USART串口设置到生成代码,一步步详细说明。 3. 代码编写:展示了如何使用HAL库实现串口接收和发送数据,并提供了main.c的完整代码。 4. 工程下载和调试:编译并下载工程到开发板,通过串口调试助手验证通信功能。
STM32 Customer BootLoader 刷新项目 (一) STM32CubeMX UART串口通信工程搭建
|
8月前
|
芯片 内存技术
STM32 Customer BootLoader 刷新项目 (二) 方案介绍
本项目设计了一款基于STM32的二级BootLoader,旨在为客户自定义启动过程提供软件更新和操作后门。BootLoader架构分为三层:ST自带Boot(SB)、客户定制化Boot(CB)和应用层(APP)。CB通过USART与MCU通信,支持多种指令如版本查询、擦除扇区、写入数据等,实现灵活的软件管理和更新功能。Flash空间分配为Sector 0-1用于CB,Sector 2-11用于APP。整个方案详细介绍了内存布局、跳转逻辑及支持的指令集,确保系统稳定运行并支持未来的扩展需求。
 STM32 Customer BootLoader 刷新项目 (二) 方案介绍
|
传感器 数据采集 移动开发
基于STM32的智能手环wifi连接手机APP(下)
基于STM32的智能手环wifi连接手机APP(下)
628 0
|
传感器 存储 编解码
基于STM32的智能手环wifi连接手机APP(上)
基于STM32的智能手环wifi连接手机APP(上)
485 0
|
传感器 数据采集 人工智能
【STM32+k210项目】基于AI技术智能语音台灯的设计(完整工程资料源码)
【STM32+k210项目】基于AI技术智能语音台灯的设计(完整工程资料源码)
1147 2
|
存储 算法 测试技术
【STM32项目】基于Stm32c8t6-镭射激光打印机的设计(完整工程资料源码)(二)
【STM32项目】基于Stm32c8t6-镭射激光打印机的设计(完整工程资料源码)(二)
442 0