stm32接入机智云(二)——代码移植和app连接

以正点原子精英版为例,接入机智云,实现控制LED。

1、stm32接入机智云(一)——ESP8266 固件烧录
2、stm32接入机智云(二)——代码移植和app连接
3、机智云官网,点击开发者中心创建产品

1 新建工程

新建 keil 文件工程不再赘述。将机智云下载的程序包里的 Utils 和 Gizwits 文件夹添加到工程。如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zbxatyoI-1621653241186)(AA8CE638E965499C8FC0AD9CE245FDEA)]

2 代码移植gizwits_product.c

2.1 修改 gizwits_product.c(从下往上的顺序)
2.1.1 实现 uartWrite()串口发送数据

修改红色框代码,并添加 while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); 不然会连接不成功,会一直打印log“One Packet!” ,其实就是因为发送的数据不完全。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8WchnGAd-1621653241189)(4C0EF633414F4166A5FE59974E2B300A)]

#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 实现数据采集

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KuXislLy-1621653241193)(EDC4C2001C1E43779BB41D7A7808734C)]
修改

#include "led.h"    

void userHandle(void)
{
    //判断当前 LED0 开关状态
    if(LED0==0)
        currentDataPoint.valueled = 0;
    else 
        currentDataPoint.valueled = 1;
}
2.1.3 实现 gizwitsEventProcess()控制命令的具体执行

用户事件处理,可以理解为你在机智云操作了什么,ESP8266会发送指令给主机完成相应的任务。比如,在机智云上开灯,主机就会收到开灯的指令并执行。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TK1KhPHA-1621653241194)(9C2A488E129E4917A9E2A1D161824DFF)]
比如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*)&currentDataPoint, 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 *)&currentDataPoint);//协议处理,上报当前数据
		
		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
GNDGND接地引脚GND
RXDUART_RXD,异步串口接受端PB10
TXDUART_TXD,异步串口发送端PB11
RST外部复位引脚,低电平有效,默认高电平PA4
IO0GPIO 0引脚PA15

4 连接机智云 APP

如下图,配置好后等待连接就可以了。特别注意:WiFi不支持5G频段

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值