以正点原子精英版为例,接入机智云,实现控制LED。
1、stm32接入机智云(一)——ESP8266 固件烧录
2、stm32接入机智云(二)——代码移植和app连接
3、机智云官网,点击开发者中心创建产品
1 新建工程
新建 keil 文件工程不再赘述。将机智云下载的程序包里的 Utils 和 Gizwits 文件夹添加到工程。如图:
2 代码移植gizwits_product.c
2.1 修改 gizwits_product.c(从下往上的顺序)
2.1.1 实现 uartWrite()串口发送数据
修改红色框代码,并添加 while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); 不然会连接不成功,会一直打印log“One Packet!” ,其实就是因为发送的数据不完全。
#include "usart3.h" //使用串口3发送数据,不要少了头文件
int32_t uartWrite(uint8_t *buf, uint32_t len)
{
uint32_t i = 0;
if(NULL == buf)
{
return -1;
}
#ifdef PROTOCOL_DEBUG
GIZWITS_LOG("MCU2WiFi[%4d:%4d]: ", gizGetTimerCount(), len);
for(i=0; i<len; i++)
{
GIZWITS_LOG("%02x ", buf[i]);
}
GIZWITS_LOG("\n");
#endif
for(i=0; i<len; i++)
{
USART_SendData(USART3, buf[i]);//STM32 test demo
//Serial port to achieve the function, the buf[i] sent to the module
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕
if(i >=2 && buf[i] == 0xFF)
{
//Serial port to achieve the function, the 0x55 sent to the module
USART_SendData(USART3, 0x55);//STM32 test demo
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕
}
}
return len;
}
2.1.2 实现数据采集
修改
#include "led.h"
void userHandle(void)
{
//判断当前 LED0 开关状态
if(LED0==0)
currentDataPoint.valueled = 0;
else
currentDataPoint.valueled = 1;
}
2.1.3 实现 gizwitsEventProcess()控制命令的具体执行
用户事件处理,可以理解为你在机智云操作了什么,ESP8266会发送指令给主机完成相应的任务。比如,在机智云上开灯,主机就会收到开灯的指令并执行。
比如LED的开关在机智云上设置了布尔值,0和1,led_VALUE0和led_VALUE1对应是开还是关看数据点的设置
switch(currentDataPoint.valueled)
{
case led_VALUE0:
LED0 = 0; //开灯
break;
case led_VALUE1:
LED0 = 1; //关灯
break;
default:
break;
}
2.2 修改 usart3.c
串口3使用来给主机和ESP8266通信用的,修改一下串口中断服务函数。
#include "gizwits_product.h"
//串口3中断服务函数
void USART3_IRQHandler(void)
{
u8 res;
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)//接收到数据
{
res =USART_ReceiveData(USART3);
gizPutData(&res, 1);//数据写入到缓冲区
}
}
2.3 修改 timer.c
在定时器 3 中断服务函数中添加 gizTimerMs()函数,并且添加 gizwits_product.h 头文件.
#include "gizwits_product.h"
//定时器3中断服务程序
void TIM3_IRQHandler(void) //TIM3中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除TIMx更新中断标志
gizTimerMs();//系统毫秒定时
}
}
注意:gizTimerMs()函数没有声明,需要在gizwits_product.h在添加声明:
void gizTimerMs(void);
2.4 修改 main.c
把程序包的main.c的主函数复制过来,并修改
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "usart3.h"
#include "timer.h"
#include "gizwits_product.h"
extern dataPoint_t currentDataPoint;
//协议相关初始
void Gizwits_Init(void)
{
TIM3_Int_Init(9,7199); //1MS 系统定时
usart3_init(9600); //WIFI 初始化 波特率必须为 9600
memset((uint8_t*)¤tDataPoint, 0, sizeof(dataPoint_t));//设备状态结构体初始化
userInit(); //数据点初始化
gizwitsInit(); //协议初始化
}
//系统初始化函数
void System_Init(void)
{
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//设置 NVIC 中断分组 2:2 位抢占优先级,2 位响应优先级
uart_init(115200); //串口初始化为 115200
LED_Init(); //LED 端口初始化
KEY_Init(); //按键初始化
Gizwits_Init(); //协议相关初始
}
int main(void)
{
u8 key = 0;
System_Init();
printf("--------机智云 IOT-LED 控制实验----------\r\n");
printf("KEY1:AirLink 连接模式\t KEY_UP:复位\r\n\r\n");
while(1)
{
userHandle(); //用户数据采集
gizwitsHandle((dataPoint_t *)¤tDataPoint);//协议处理,上报当前数据
key = KEY_Scan(0);
if(key==KEY1_PRES) //KEY1 按键
{
printf("WIFI 进入 AirLink 连接模式\r\n");
gizwitsSetMode(WIFI_AIRLINK_MODE);//Air-link 模式接入
}
if(key==WKUP_PRES) //KEY_UP 按键
{
printf("WIFI 复位,请重新配置连接\r\n");
gizwitsSetMode(WIFI_RESET_MODE);//WIFI 复位
}
delay_ms(200);
LED1=!LED1;
}
}
3 硬件连接
直接将ESP8266模块插到开发板的 ATK MODULE 接口(至少需要一个串口用于通信,这里用串口3,串口1用于打印log,可以没有)。
引脚 | 功能 | 连接 |
---|---|---|
VCC | 供电 | 5V |
GND | GND接地引脚 | GND |
RXD | UART_RXD,异步串口接受端 | PB10 |
TXD | UART_TXD,异步串口发送端 | PB11 |
RST | 外部复位引脚,低电平有效,默认高电平 | PA4 |
IO0 | GPIO 0引脚 | PA15 |
4 连接机智云 APP
如下图,配置好后等待连接就可以了。特别注意:WiFi不支持5G频段。