STM32部分
1.新建工程
打开串口1的异步通讯,作为打印的数据串口。
打开串口2的异步通讯,作为ESP8266通讯的串口。
将频率修改为72M
LCD配置:神秘链接
2.添加源文件
源文件链接:https://pan.baidu.com/s/1iMf45oi4QBp2OQcmAYmzoQ 提取码:6a3i
添加文件路径。
3.修改esp8266.h
需要修改的部分已经通过箭头指出,在这些宏定义中 转移符 \ 不可以随意删除,会导致指令发送失败。
4.初始化
在初始化位置添加初始化函数。初始化函数在esp8266.c中可自行查看。
HAL_UART_Receive_IT(&huart2, (uint8_t *)&a_esp8266_buf, 1);
LCD_Init();
ESP8266_Init_ALIYUN();
需要勾选MicroLIB的库,否则printf不可使用,会导致LCD_Init 函数卡死
同时在USART.C的如下位置添加如下代码,进行串口重定向。
#include<stdio.h>
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
需要使用串口2的中断接收数据。
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART2)
{
if(esp8266_cnt >= 512)
{
esp8266_cnt = 0;
memset(ESP8266_Buf,0x00,sizeof(ESP8266_Buf));
HAL_UART_Transmit(&huart2, (uint8_t *)"data overflow", 10,0xFFFF);
}
else
{
ESP8266_Buf[esp8266_cnt++] = a_esp8266_buf;
}
HAL_UART_Receive_IT(&huart2, (uint8_t *)&a_esp8266_buf, 1);
}
}
至此,stm32通过esp8266就成功的接入了阿里云。
5.功能定义
在产品的详情界面中点击功能定义 ,再点击编辑草稿。
点击添加自定义功能添加自己设置的功能模块。
如图。
添加完成过后记得发布上线,否则不会更新。
6.订阅和发布的Topic
选择属性上报的第一个作为设备属性上报的Topic。
在C语言中有一个函数可以将字符串按照格式写进数组中。sprintf 教程
因为 AT+MQTTPUB 这个AT指令只支持256字节以内的消息发送,所以我我们只需要定义一个256个大小的数组去作为我们指令的存储的数组。
代码如下:
char data[256];
memset(data, 0, sizeof(data));
sprintf(data,"AT+MQTTPUB=0,\"/sys/hq42unqMiBQ/test/thing/event/property/post\",\"{\\\"params\\\":\\\"LED1\\\":%d\\\,\\\"LED2\\\":%d}\\\,\\\"method\\\":\\\"thing.event.property.post\\\"}\",0,0\r\n",1,0);
while(ESP8266_SendCmd(data,"OK"));
需要将发送的间隔拉大一些,如下,通过延时函数和计数数将时间拉大到10s发送一次。
将代码烧录之后,运行完成可以在物模型数据看到发送到平台的数据。
下一步是创建web小程序并解析来自平台的数据
链接:神秘链接。