一、Stm32用Esp01s连接至阿里云飞燕平台
飞燕平台是阿里云的物联网平台,至于为什么选择这个平台,是因为我的队友选择的。。。但是都一样,没什么区别。
二、使用步骤
1.接入阿里云
和我之前的文章stm32+ESP01s连接到腾讯云物联网开发平台IOT类似:
//ESP8266模块和PC进入透传模式
void esp8266\_start\_trans(void)
{
//设置工作模式 1:station模式 2:AP模式 3:兼容 AP+station模式
esp8266\_send\_cmd("AT+CWMODE=1","OK",50);
//让Wifi模块重启的命令
esp8266\_send\_cmd("AT+RST","ready",20);
delay\_ms(1000); //延时3S等待重启成功
delay\_ms(1000);
delay\_ms(1000);
delay\_ms(1000);
//AT+CIPSNTPCFG=1,8,"ntp1.aliyun.com"
esp8266\_send\_cmd("AT+CIPSNTPCFG=1,8,\"ntp1.aliyun.com\"","OK",200);
//让模块连接上自己的路由
while(esp8266\_send\_cmd("AT+CWJAP=\"123\",\"12345678\"","WIFI GOT IP",600));
//=0:单路连接模式 =1:多路连接模式
esp8266\_send\_cmd("AT+CIPMUX=0","OK",20);
//建立TCP连接 这四项分别代表了 要连接的ID号0~4 连接类型 远程服务器IP地址 远程服务器端口号
// while(esp8266\_send\_cmd("AT+CIPSTART=\"TCP\",\"172.20.10.10\",8080","CONNECT",200));
esp8266\_send\_cmd("AT+MQTTUSERCFG=0,1,\"NULL\",\"test&a1oirJ5GTNy\",\"CD5221CE7AF744BB0F6A2F83ABA7E6C8C9136909\",0,0,\"\"","OK",200);
esp8266\_send\_cmd("AT+MQTTCLIENTID=0,\"NULL|securemode=3\\,signmethod=hmacsha1|\"","OK",200);
while(esp8266\_send\_cmd("AT+MQTTCONN=0,\"a1oirJ5GTNy.iot-as-mqtt.cn-shanghai.aliyuncs.com\",1883,1","OK",200));
esp8266\_send\_cmd("AT+MQTTSUB=0,\"/sys/a1oirJ5GTNy/test/thing/event/property/post\",1","OK",50);
esp8266\_send\_cmd("AT+MQTTSUB=0,\"/sys/a1oirJ5GTNy/test/thing/service/property/set\",0","OK",50);
//是否开启透传模式 0:表示关闭 1:表示开启透传
esp8266\_send\_cmd("AT+CIPMODE=1","OK",200);
//透传模式下 开始发送数据的指令 这个指令之后就可以直接发数据了
esp8266\_send\_cmd("AT+CIPSEND","OK",50);
}
2.新加模块
ULN2003芯片驱动步进电机
/\*ULN2003芯片驱动步进电机\*/
/\*motor.h\*/
typedef enum {
STOPPED,
FORWARD,
BACKWARD
} MotorDirection;
typedef struct {
MotorDirection direction;
int step;
int speed; // new field, speed in milliseconds per step
} Motor;
/\*motor.c\*/
#define STEPS\_PER\_REVOLUTION 4096
const uint8\_t Steps[8] = {0x01, 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x09};
void setup\_gpio\_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC\_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO\_Init(GPIOA, &GPIO_InitStructure);
}
void motor\_step(Motor\* motor)
{
if (motor->direction != STOPPED)
{
if (motor->direction == FORWARD)
{
GPIO\_Write(GPIOA, Steps[motor->step]);
motor->step = (motor->step + 1) % 8;
}
else
{ // BACKWARD
GPIO\_Write(GPIOA, Steps[motor->step]);
motor->step = (motor->step - 1 + 8) % 8;
}
delay\_ms(motor->speed);
}
else
{
GPIO\_Write(GPIOA, 0);
}
}
void motor\_rotate(Motor\* motor, MotorDirection direction, int degrees, int speed)
{
motor->direction = direction;
motor->speed = speed;
int steps = (degrees \* STEPS_PER_REVOLUTION) / 360;
for(int i = 0; i < steps; i++)
{
motor\_step(motor);
}
motor->direction = STOPPED;
}
光敏传感器
void ADC2\_Init(void)
{
GPIO_InitTypeDef ADC_GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC\_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
RCC\_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, ENABLE);
RCC\_ADCCLKConfig(RCC_PCLK2_Div6);
// 初始化 PA5 用于采集
ADC_GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
ADC_GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO\_Init(GPIOA, &ADC_GPIO_InitStructure);
// 初始化ADC2
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC\_Init(ADC2, &ADC_InitStructure);
// ADC2, 通道5
ADC\_RegularChannelConfig(ADC2, ADC_Channel_5, 1, ADC_SampleTime_55Cycles5);
ADC\_Cmd(ADC2, ENABLE);
ADC\_ResetCalibration(ADC2);
while(ADC\_GetResetCalibrationStatus(ADC2));
ADC\_StartCalibration(ADC2);
while(ADC\_GetCalibrationStatus(ADC2));
ADC\_SoftwareStartConvCmd(ADC2, ENABLE);
}
float ADC2\_GetValue(void)
{
uint32\_t Value = 0;
float ret = 0.0;
for(uint8\_t i = 0; i < 30; i++)
{
ADC\_SoftwareStartConvCmd(ADC2, ENABLE);
while(!ADC\_GetFlagStatus(ADC2, ADC_FLAG_EOC));
Value += ADC\_GetConversionValue(ADC2);
}
Value /= 30;
ret = 30.303 \* (3.3 - Value \* (3.3/4095));
return ret;
}
解包
这个是因为阿里云下发数据的格式是JSON格式,我们利用了stm32的jansson库对数据进行解析
int parse\_LED\_value(char\* str)
{
json\_error\_t error;
json\_t \*root, \*params, \*led;
const char \*json_start = strstr(str, "{\"method\":\"thing.service.property.set\"");
if (!json_start) {
// 错误处理:找不到JSON的开始
return -1;
}
root = json\_loads(json_start, 0, &error);
if (!root) {
// 错误处理:无法解析JSON
return -2;
}
params = json\_object\_get(root, "params");
if (!params) {
// 错误处理:'params'对象不存在
json\_decref(root);
return -3;
## 最后
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**
**深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。**
**因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/dea43807cfb4e44fecd026a79ff2292a.png)
![img](https://img-blog.csdnimg.cn/img_convert/e1c5fc9af3a3119fc54d9d42f3d3ce3f.jpeg)
![img](https://img-blog.csdnimg.cn/img_convert/31d6d4db2bffb4b0d7aa4dd66962a0ef.png)
![img](https://img-blog.csdnimg.cn/img_convert/88115ca8aecc47fbf71d09fba288910c.png)
![img](https://img-blog.csdnimg.cn/img_convert/cdbe34ae1b8654c5180afd3aa2653b65.png)
![img](https://img-blog.csdnimg.cn/img_convert/f7fd4b60637edf2b3f0af3577e85cdef.png)
![](https://img-blog.csdnimg.cn/img_convert/a248db5c1b83c1a89e36b972e4708ce2.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**
[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!
WbMe6H-1715608431920)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**
[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!