STM32使用ESP01S连接阿里云物联网平台

一、ESP01S烧录MQTT固件准备

首先准备好烧录工具,可以从官网上进行下载。

MQTT固件官网网址:AT固件汇总 | 安信可科技 (ai-thinker.com)

进去后如下图界面,向下翻找找到MQTT固件(1471)下载固件即可。

烧录工具光网地址:开发工具清单 | 安信可科技 (ai-thinker.com)

进去后如下图界面,找到烧录WIFI固件工具

二、ESP01S烧录MQTT固件操作

准备好usb转ttl硬件设备,记得把驱动下载上。

esp01s有8个引脚,分别为3.3v、RX、TX、EN、IO0、IO2、GND,我们在烧录固件是需要3.3v、RX、TX、IO2、GND这几个引脚,与usb转ttl接线方式如下图所示:

usb  to ttl

esp01s
RXTX
TXRX
3.33.3
GNDGND

另外根据esp01s手册下载固件时需要将IO2拉低电平,所以需要另外一根线将esp01s的IO2跟供电设备的GND连接,可以使用开发板的GND引脚。

连接好的实物图如下图所示,如果使用开发板的GND线,需给开发板通上电。

接下来通过usb连接到电脑上,打开烧写工具

直接点击ok

之后进入到如图界面

按照图进行操作

清楚成功后在按START进行下载。

到此为止烧录便成功了,我们打开串口工具进行测试是否烧录成功,连接上wifi

ATAT+RSTAT+CWMODE=1AT+CIPSNTPCFG=1,8,"ntp1.aliyun.com"AT+CWJAP="你的收集热点名","你的手机热点密码"AT+MQTTUSERCFG=0,1,"NULL","deviceName(设备名,经过阿里云生成工具生成后的)","生成后的密码",0,0,""AT+MQTTCLIENTID=0,"ClientId(生成后的)"  //注意这里有个坑,需要每个逗号前价格\AT+MQTTCONN=0,"连接域名(生成后的)",1883,1AT+MQTTSUB=0,"订阅",1

现在先使用前4条固定指令连接wifi,后面连接阿里云在具体讲解参数的来源

前四条指令执行完成后手机端可以看见esp01s是否连接成功。

三、生成阿里云物联网三元组参数

创建阿里云物联网平台产品设备,按照下图步骤设置

到此添加设备成功,接下来复制算元组创建连接参数

打开阿里云物理平台配置(没有的去网上搜搜下载即可)

将生成的连接域名、ClientId、Username、Password这四个参数复制下来,填到我上面写的指令里面即可。

此时还剩下订阅一个参数,按照下列步骤执行

此时按照上面步骤执行剩下的四个指令即可成功连接成功阿里云。

四、使用stm32进行连接

编写esp01s.c文件

#include "stm32f10x.h" 
#include "usart2.h"
#include <stdio.h>
#include <string.h>
#include "delay.h"
#include "esp01s.h"const char* WIFI ="你的wifi名";
const char* WIFIASSWORD="你的wifi密码";
const char* ClintID="ClientId(生成后的,注意每个逗号前加个\)";
const char* username="username(生成后的)";
const char* passwd="密码(生成后的)";
const char* Url="连接域名(生成后的)";
const char* pubtopic="发布";
const char* subtopic="订阅";int fputc(int ch,FILE *f) //printf重定向
{USART_SendData(USART2,(uint8_t)ch);while(USART_GetFlagStatus(USART2,USART_FLAG_TC) == RESET);return ch;
}char esp_Init(void)
{memset(RECS,0,sizeof(RECS));printf("AT+RST\r\n");  //重启delay_ms(2000);printf("AT+CWMODE=1\r\n"); //Station模式delay_ms(1000);if(strcmp(RECS,"OK"))return 1;memset(RECS,0,sizeof(RECS));printf("AT+CIPSNTPCFG=1,8,\"ntp1.aliyun.com\"\r\n"); //阿里云云端时域和SNTP服务器delay_ms(20);if(strcmp(RECS,"OK"))return 2;memset(RECS,0,sizeof(RECS));printf("AT+CWJAP=\"%s\",\"%s\"\r\n",WIFI,WIFIASSWORD); //连接热点while(strcmp(RECS,"OK"));if(strcmp(RECS,"OK"))return 3;memset(RECS,0,sizeof(RECS));printf("AT+MQTTUSERCFG=0,1,\"NULL\",\"%s\",\"%s\",0,0,\"\"\r\n",username,passwd);//用户信息配置delay_ms(10000);if(strcmp(RECS,"OK"))return 4;memset(RECS,0,sizeof(RECS));printf("AT+MQTTCLIENTID=0,\"%s\"\r\n",ClintID);delay_ms(1000);if(strcmp(RECS,"OK"))return 5;memset(RECS,0,sizeof(RECS));printf("AT+MQTTCONN=0,\"%s\",1883,1\r\n",Url);delay_ms(1000);if(strcmp(RECS,"OK"))return 6;printf("AT+MQTTSUB=0,\"%s\",1\r\n",subtopic); //订阅消息delay_ms(500);if(strcmp(RECS,"OK"))return 7;memset(RECS,0,sizeof(RECS));return 0;
}

usart2.c文件

#include "stm32f10x.h"
#include "usart2.h"
#include "delay.h"
#include "esp01s.h"
#include <string.h>
#include <stdio.h>
#include "lcd.h"char RECS[250];
unsigned char i;
extern uint8_t keyAlliyun;/*
************************************************************
*    函数名称:    Usart2_Init
*
*    函数功能:    串口2初始化
*
*    入口参数:    baud:设定的波特率
*
*    返回参数:    无
*
*    说明:        TX-PA2        RX-PA3
************************************************************
*/
void Usart2_Init(unsigned int baud)
{GPIO_InitTypeDef gpio_initstruct;USART_InitTypeDef usart_initstruct;NVIC_InitTypeDef nvic_initstruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);//PA2    TXDgpio_initstruct.GPIO_Mode = GPIO_Mode_AF_PP;gpio_initstruct.GPIO_Pin = GPIO_Pin_2;gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &gpio_initstruct);//PA3    RXDgpio_initstruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;gpio_initstruct.GPIO_Pin = GPIO_Pin_3;gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &gpio_initstruct);usart_initstruct.USART_BaudRate = baud;usart_initstruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;        //无硬件流控usart_initstruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;                        //接收和发送usart_initstruct.USART_Parity = USART_Parity_No;                                    //无校验usart_initstruct.USART_StopBits = USART_StopBits_1;                                    //1位停止位usart_initstruct.USART_WordLength = USART_WordLength_8b;                            //8位数据位USART_Init(USART2, &usart_initstruct);  USART_Cmd(USART2, ENABLE);                                                            //使能串口USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);                                        //使能接收中断nvic_initstruct.NVIC_IRQChannel = USART2_IRQn;nvic_initstruct.NVIC_IRQChannelCmd = ENABLE;nvic_initstruct.NVIC_IRQChannelPreemptionPriority = 0;nvic_initstruct.NVIC_IRQChannelSubPriority = 0;NVIC_Init(&nvic_initstruct);}char *USART2_GetString(void)
{return RECS;
}void USART2_SendString(char *str)
{uint8_t stri = 0;while(str[stri] != '\0')USART_SendData(USART2,str[stri++]);
}void USART2_IRQHandler(void)
{   if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) //接收中断{RECS[i++] = USART_ReceiveData(USART2);if((RECS[i-2] == '\r') | (RECS[i-1] == '\n')){RECS[i-2] = '\0';i = 0;CommandAnalyse();}}        
}

主函数里面初始化usart2,调用esp初始化函数便可连接wifi和阿里云平台。

感谢大家的观看,因为本人在学习过程中走了不少弯路,所以出一期文章供大家参考,之后抽时间做一期上传阿里云平台数据的攻略。

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

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

相关文章

windows连接CentOS数据库或Tomcat报错,IP通的,端口正常监听

错误信息 数据库错误&#xff1a; ERROR 2003 (HY000): Cant connect to MySQL server on x.x.x.x (10060) Tomcat访问错误&#xff1a; 响应时间过长 ERR_CONNECTION_TIMED_OUT 基础排查工作 【以下以3306端口为例&#xff0c;对于8080端口来说操作是一样的&#xff0c;只需…

【java毕业设计】基于Spring Boot+vue的网上商城购物系统设计与实现(程序源码)-网上商城购物系统

基于Spring BootVue的网上商城购物系统设计与实现&#xff08;程序源码毕业论文&#xff09; 大家好&#xff0c;今天给大家介绍基于Spring BootVue的网上商城购物系统设计与实现&#xff0c;本论文只截取部分文章重点&#xff0c;文章末尾附有本毕业设计完整源码及论文的获取方…

Oracle闪回数据库【Oracle闪回技术】(二)

理解Oracle闪回级别【Oracle闪回技术】(一)-CSDN博客 Oracle默认是不开启闪回数据库的。如果开启闪回数据库的前提条件是,开启Oracle归档模式并启用闪回恢复区。 因为闪回日志文件存放在闪回恢复区中,如果在RAC环境下,必须将闪回恢复区存储在集群文件或者ASM文件中。 一…

揭秘APP广告变现:轻松赚取额外收入!

在移动应用&#xff08;APP&#xff09;的世界中&#xff0c;变现能力是衡量一个应用成功与否的关键指标之一。无论是个人开发者还是企业团队&#xff0c;如何通过应用创造收入&#xff0c;始终是一个备受关注的话题。今天&#xff0c;我们将深入探讨APP广告变现的路径&#xf…

使用nmcli命令在各Linux系统上统一的配置网络

前言&#xff1a;原文在我的博客网站中&#xff0c;持续更新数通、系统方面的知识&#xff0c;欢迎来访&#xff01; 使用nmcli命令在各Linux系统上统一的配置网络https://myweb.myskillstree.cn/123.html 你是否会遇到在不同的Linux系统中配置网络时&#xff0c;修改的配置文…

Element UI 表单验证详解与实践

Element UI 作为一款流行的Vue.js UI框架&#xff0c;提供了丰富的表单组件和强大的表单验证功能&#xff0c;极大地简化了前端开发中的表单处理流程。本文将深入探讨Element UI的表单验证机制&#xff0c;包括基本的验证规则、自定义验证规则、以及一些高级应用场景&#xff0…

C语言初阶(6) - 指针

目录 1.指针是什么&#xff1f; 2. 指针和指针类型 2.1 指针 - 整数 2.2 指针的解引用 3. 野指针 3.1 野指针成因 3.2 如何规避野指针 4. 常量指针和指针常量 (const) 4.1.常量指针 4.2.指针常量 5. 指针运算 5.1 指针-整数 5.2 指针-指针 5.3指针的关系运算 6.…

[openwrt-21.02]MT7981+MT7976 WiFi debug指令

openwrt版本信息 NAME="OpenWrt" VERSION="21.02-SNAPSHOT" ID="openwrt" ID_LIKE="lede openwrt" PRETTY_NAME="OpenWrt 21.02-SNAPSHOT" VERSION_ID="21.02-snapshot" HOME_URL="https://openwrt.org/&qu…

【Python】selenium爬虫常见用法和配置,以及常见错误和解决方法

欢迎来到《小5讲堂》 这是《Python》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言无执行文件代码报错信息错误路径手动下载自动下载 选项配置Ch…

Ansible 自动化运维工具 - 了解和模块应用

目录 一. Ansible 的相关知识 1.1 Ansible 工具的简介 1.2 Ansible的四大组件 1.3 运维自动化工具 1.4 Ansible 和其它自动化运维工具对比 1.5 Ansible 的优缺点 二. Ansible 环境安装部署 2.1 管理端安装 ansible 2.2 配置主机清单 三. ansible 命令行模块 3.1 comm…

在编程中,什么是类的继承?

什么是继承 举个栗子&#xff0c;你是某披萨店的员工&#xff0c;你每天的工作就是在一张基础面饼上涂抹不同的香料制作不同的口味&#xff0c;假如某位顾客点了一份番茄味的香肠披萨&#xff0c;你可以直接在这张基础面饼上摊好香肠和番茄酱&#xff0c;而不是从头制作&#x…

拷贝构造、赋值运算符、运算符重载

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

Electron 报错:WinState is not a constructor

文章目录 问题分析 问题 在使用 electron-win-state 库时报错如下 代码如下&#xff1a; const WinState require(electron-win-state) const winState new WinState({ defaultWidth: 800,defaultHeight: 600,// other winState options, see below })const browserWindow…

京东手势验证码-YOLO姿态识别+Bézier curve轨迹拟合

这次给老铁们带来的是京东手势验证码的识别。 目标网站&#xff1a;https://plogin.m.jd.com/mreg/index 验证码如下图: 当第一眼看到这个验证码的时候&#xff0c;就头大了&#xff0c;这玩意咋识别&#xff1f;&#xff1f;&#xff1f; 静下心来细想后的一个方案&#xf…

原来pip是有默认路径的。

今天一直报错&#xff1a; bash: /root/data1/anaconda3/envs/li_3_10/bin/pip: /root/lsc/anaconda3/envs/li_3_10/bin/python: bad interpreter: No such file or directory 原来是root/data1/anaconda3/envs/li_3_10/bin/pip: 这个位置的pip 自身带默认路径&#xff0c;然…

Python 正则表达式(一)

文章目录 概念正则函数match函数正则表达式修饰符意义&#xff1a; 常用匹配符限定符原生字符串边界字符 概念 正则表达式是对字符串操作的一种逻辑公式&#xff0c;就是用事先定义好的一些特定字符、及这些特定字符的组合&#xff0c;组成一个“规则字符串”&#xff0c;这个…

【问题解决】本地pnpm版本与packageManager中pnpm版本不一致

问题&#xff1a;ERR_PNPM_BAD_PM_VERSION  This project is configured to use v8.6.10 of pnpm. Your current pnpm is v9.1.0 解决&#xff1a;If you want to bypass this version check, you can set the “package-manager-strict” configuration to “false” or set…

Navicat 17 的数据分析

上周的博客预告了 Navicat 17&#xff08;英文版&#xff09;即将发布&#xff0c;目前正在测试阶段&#xff0c;并计划于 5 月 13 日发布。如我们所见&#xff0c;版本 17 推出了众多令人兴奋的新功能。其中最大亮点是数据分析工具&#xff0c;只需点击按钮&#xff0c;即可为…

万字长文——前端开发必看的KeepAlive原理详解

前言 本文将从原理应用源码(Vue2和Vue3)的角度全面介绍 组件&#xff0c;全文共计16000字&#xff0c;阅读时间大概30min&#xff0c;建议码住在看&#xff0c;相信看完本文的你会对该组件有一更深刻的认识。 一、<KeepAlive>是什么&#xff1f; <KeepAlive>是一个…

【数据结构】单链表和双链表

文章目录 一、链表的概念及结构二、链表的分类三、无头单向非循环链表1.单链表创建2.尾插和头插3.尾删和头删4.打印5.查找6.插入7.删除8.销毁 四、带头双向循环链表1.双链表的创建2.初始化3.判断链表是否为空4.尾插和头插5.尾删和头删6.查找7.插入8.删除9.销毁 五、总结链表和顺…