1.引言

本人购买了一个ESP8266的WiFi模块,想做一个物联网控制小灯的demo。
本文记录了基于机智云平台,移植代码,实现物联网小灯详细操作步骤。

并不是移植步骤很麻烦,
只是文章真的写的极其详尽了

如此良心的文章,求个赞吧~~

文章目录

  • 1.引言
  • 2.准备材料
    • 2.1硬件准备
      • 2.1.1.ESP8266模块
      • 2.1.2.单片机及杜邦线等
    • 2.2 外设接线说明
      • 2.2.1.ESP8266接线
      • 2.2.2.其他外设接线
    • 2.3.软件准备
      • 2.3.1.STM32软件准备
      • 2.3.2.ESP8266固件准备
    • 3.源码分享
      • 3.1.声明
      • 3.2.参考代码工程下载:
  • 4. 移植详细步骤
    • 4.1机智云新建项目
      • 4.1.1.新建项目
      • 4.1.2.新建数据点
      • 4.1.3.输入数据点的各个属性
    • 4.2下载并导入代码包
      • 4.2.1.下载移植代码包
      • 4.2.2.导入移植代码包
    • 4.3.配置单片机基础外设
      • 4.3.1.串口配置
      • 4.3.2.定时器配置
      • 4.3.2.按键配置
      • 4.3.3.LED配置
    • 4.4.接入机智云接口
      • 4.4.1 机智云读取串口3数据
      • 4.4.2 机智云发送数据
      • 4.4.3 机智云系统时间基准
      • 4.4.4 实现系统复位
      • 4.4.4 实现配置入网
      • 4.4.5.数据下行
      • 4.4.6.数据上行
      • 4.4.7.主函数代码
  • 5.实验结果验证
    • 5.1.单片机操作
    • 5.2.手机APP操作
  • 6.常见问题分析

2.准备材料

2.1硬件准备

使用自制的STM32F103C8开发板为例,用杜邦线连接ESP8266模组,实现物联网控制小灯。
使用到的单片机外设:

  • 定时器,定时1ms
  • 串口1,打印调试信息
  • 串口3,连接ESP8266
  • 按键,用于配网控制
  • LED,用于观察实验现象

硬件准备材料包括:
ESP8266模块和STM32F103C8单片机(板载串口1和3,LED)

2.1.1.ESP8266模块

外观:


引脚图:

可能不同批次模块的引脚命名会略有不同,但是对应功能应该是相同的。
下面附上我所用模块的引脚功能说明:

名称 说明
VCC 电源
GND
UTXD 异步串口发送端(TTL 电平,可以直接接单片机RXD)
URXD 异步串口接收端(TTL 电平,可以直接接单片机TXD)
GPIO16(/RST复位) 外部复位引脚(默认电平是高电平,低电平有效)
GPIO0 GPIO 0引脚用于区分工作模式:悬空状态,Flash下载模式和工作模式;下拉状态:串口固件烧写模式
CH_PD(EN使能) EN使能端口(高电平有效,低电平模块不工作)
GPIO2 GPIO 2引脚,默认高电平,上电时禁止下拉
2.1.2.单片机及杜邦线等

自制的STM32F103C8单片机,板载串口1和3,LED,按键等外设。

2.2 外设接线说明

2.2.1.ESP8266接线
ESP8266引脚 接口
VCC 单片机VCC(3.3V)
CH_PD(EN使能引脚) 单片机VCC(3.3V)
GND 单片机GND
UTXD 单片机串口3的RXD引脚(即USART3_RX PB11)
URXD 单片机串口3的TXD引脚(即USART3_TX PB10)
GPIO0 悬空
GPIO16(/RST复位) 外部复位引脚(默认电平是高电平,低电平有效),这里悬空或者接VCC3.3V
GPIO2 悬空
2.2.2.其他外设接线
外设 引脚
按键 PA0
LED0 PA8
串口1 PA9,PA10

2.3.软件准备

2.3.1.STM32软件准备

忠言相劝:

本博客经过本人21年多次移植验证的,是可行的。
编写代码要一步一步来调试,没有问题了再进行下一步。
别直接一股脑的移植代码,不少小伙伴直接移植也不管前面外设是否正确,出了问题我也无法快速找到。
这时候 “认为辣鸡博客,浪费时间”,这个锅实在不应该我来背

回到正题
请先确保按键、定时器、串口、LED都是可以正常工作的,
再进行机智云的代码移植。
比如:先验证按键可以控制LED,串口可以正常收发,定时器定时打印输出等。

2.3.2.ESP8266固件准备

ESP8266要先烧录了机智云的固件。
教程参见:烧录机智云固件详细教程
烧录程序工具包下载:烧录固件工具包下载

3.源码分享

3.1.声明

本博客及代码只做学习交流,不做商业用途。
旨在帮助大家,在移植时少走点弯路。
纯粹用爱发电,简洁无套路,有帮助的话,麻烦点赞评论收藏支持一下。
可以的话,求个关注。

3.2.参考代码工程下载:

方式一:代码工程打包下载
财力雄厚,麻烦支持一下。感谢。
方式二:见评论区置顶的那条。(括号是防止和谐,若失效了,评论或私聊)

4. 移植详细步骤

4.1机智云新建项目

4.1.1.新建项目

百度进入机智云官网,登录机智云(没有账号就先注册)。
在开发者中心新建项目,这里产品名称,我暂定命名为test

4.1.2.新建数据点

4.1.3.输入数据点的各个属性

如想控制LED亮灭。各个属性填写如下图。不懂的,点问号有提示。


下面简单解释一下。

  • 标识名:与单片机代码中的变量名称相关。不要用中文,只可以用字母数字下划线。
  • 读写类型:这里我需要控制点亮或者熄灭led。故选可写。
  • 数据类型:只有点亮或者熄灭led两个状态,故选bool值。
  • 备注:这个给人看的,就写一些自己可以看懂的注释信息即可。

然后,应用修改。

4.2下载并导入代码包

4.2.1.下载移植代码包

复制秘钥,因为下载需要填写。

如下图生成代码包。

下载代码包:

4.2.2.导入移植代码包

下载后解压,将下图俩个复制到自己的工程。

导入代码包到STM32工程。

记得包含头文件位置。


注意:路径地址因人而异。

4.3.配置单片机基础外设

再次强调,
请先确保按键、定时器、串口、LED 等基础外设都是可以正常工作的,并进行简单验证后,再进行机智云代码接口的接入。
“4.3.配置单片机基础外设”均作为外设配置的参考。

4.3.1.串口配置
  • 串口1(用于printf打印调试信息)
    感谢用户_tony_jia的反馈,让我更加完善博客的分享。
    这里贴出串口的所有代码。
    uart.c的代码如下:
#include "sys.h"
#include "usart.h"
//
//如果使用ucos,则包括下面的头文件即可.
#if SYSTEM_SUPPORT_OS
#include "includes.h"                 //ucos 使用
#endif
//
//此段代码参考自正点原子@ALIENTEK
//    //加入以下代码,支持printf函数,而不需要选择use MicroLIB
#if 1
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{ int handle; }; FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
_sys_exit(int x)
{ x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{      while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   USART1->DR = (u8) ch;      return ch;
}
#endif /*使用microLib的方法*//*
int fputc(int ch, FILE *f)
{USART_SendData(USART1, (uint8_t) ch);while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}  return ch;
}
int GetKey (void)  { while (!(USART1->SR & USART_FLAG_RXNE));return ((int)(USART1->DR & 0x1FF));
}
*/#if EN_USART1_RX   //如果使能了接收
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误
u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
//接收状态
//bit15, 接收完成标志
//bit14, 接收到0x0d
//bit13~0,   接收到的有效字节数目
u16 USART_RX_STA=0;       //接收状态标记   void uart_init(u32 bound){//GPIO端口设置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟//USART1_TX   GPIOA.9GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   //复用推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9//USART1_RX     GPIOA.10初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  //Usart1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;       //子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //IRQ通道使能NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器//USART 初始化设置USART_InitStructure.USART_BaudRate = bound;//串口波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;   //收发模式USART_Init(USART1, &USART_InitStructure); //初始化串口1USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断USART_Cmd(USART1, ENABLE);                    //使能串口1 }void USART1_IRQHandler(void)                 //串口1中断服务程序{u8 Res;
#if SYSTEM_SUPPORT_OS       //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.OSIntEnter();
#endifif(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾){Res =USART_ReceiveData(USART1); //读取接收到的数据if((USART_RX_STA&0x8000)==0)//接收未完成{if(USART_RX_STA&0x4000)//接收到了0x0d{if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始else USART_RX_STA|=0x8000;  //接收完成了 }else //还没收到0X0D{   if(Res==0x0d)USART_RX_STA|=0x4000;else{USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;USART_RX_STA++;if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收   }      }}          }
#if SYSTEM_SUPPORT_OS   //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.OSIntExit();
#endif
}
#endif

uart.h代码:

#ifndef __USART_H
#define __USART_H
#include "stdio.h"
#include "sys.h" #define USART_REC_LEN            200     //定义最大接收字节数 200
#define EN_USART1_RX            1       //使能(1)/禁止(0)串口1接收extern u8  USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符
extern u16 USART_RX_STA;                //接收状态标记
//如果想串口中断接收,请不要注释以下宏定义
void uart_init(u32 bound);
#endif
  • 串口3(用于和esp模块通信)
    本文中,将esp模块连接在串口3,故需要配置串口3。
    初始化串口3参考代码:

//初始化IO 串口3
//与ESP8266模块通信波特率:9600
//pclk1:PCLK1时钟频率(Mhz)
//bound:波特率
void usart3_init(u32 bound)
{  NVIC_InitTypeDef NVIC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  // GPIOB时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); //串口3时钟使能USART_DeInit(USART3);  //复位串口3//USART3_TX   PB10GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB10GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   //复用推挽输出GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB10//USART3_RX   PB11GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOB, &GPIO_InitStructure);  //初始化 PB11USART_InitStructure.USART_BaudRate = bound;//波特率设置USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;   //收发模式USART_Init(USART3, &USART_InitStructure); //初始化串口3USART_Cmd(USART3, ENABLE);                    //使能串口 //使能接收中断USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启中断   //设置中断优先级NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;     //子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //IRQ通道使能NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器USART3_RX_STA=0;     //清零}
4.3.2.定时器配置

定时器用于和给esp模块提供基准时钟。
本文采用定时器3,需要配置1ms的定时。
参考代码:


// 定时器3,定时1ms
void TIMER3_Init()
{TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStruct;NVIC_InitTypeDef  NVIC_InitStruct;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//初始化TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;// 72MHzTIM_TimeBaseInitStruct.TIM_Period=10-1;TIM_TimeBaseInitStruct.TIM_Prescaler=7200-1;TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);TIM_ClearFlag(TIM3, TIM_IT_Update);TIM_ITConfig(TIM3, TIM_IT_Update,ENABLE);NVIC_InitStruct.NVIC_IRQChannel=TIM3_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;NVIC_Init(&NVIC_InitStruct);TIM_Cmd(TIM3,ENABLE);
}
4.3.2.按键配置

按键用于机智云配网。
本文采用外部中断方式实现按键控制配网。
按键PA0,当按下时,接地。故配置上拉、下降沿。
参考代码:

   //外部中断0服务程序
void KEY_EXTIX_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能//初始化 WK_UP-->GPIOA.0     上拉输入GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //PA0设置成上拉输入GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);   //使能复用功能时钟//GPIOA.0   中断线以及中断初始化配置 下升沿触发 PA0  WK_UPGPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0); EXTI_InitStructure.EXTI_Line=EXTI_Line0;EXTI_InitStructure.EXTI_LineCmd=ENABLE;EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//选择外部中断而不是外部事件EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//下降沿产生中断EXTI_Init(&EXTI_InitStructure);      //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;          //使能按键WK_UP所在的外部中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;   //抢占优先级0, NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;                 //子优先级0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                             //使能外部中断通道NVIC_Init(&NVIC_InitStructure); NVIC_Init(&NVIC_InitStructure);     //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器}
4.3.3.LED配置

LED的IO初始化。

//LED IO初始化
void LED_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能PA端口时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;                //LED0-->PA.8 端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;          //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //IO口速度为50MHzGPIO_Init(GPIOA, &GPIO_InitStructure);                     //根据设定参数初始化GPIOA.8GPIO_SetBits(GPIOA,GPIO_Pin_8);                       //PA.8 输出高}

4.4.接入机智云接口

注:以下步骤,执行一步就编译一下。
若现在找不到XX函数,则包含对应的头文件或者声明函数
注意要清除所有的警告。

4.4.1 机智云读取串口3数据

接口函数:gizPutData(&value, 1)
参考调用代码:

void USART3_IRQHandler(void)
{u8 value = 0;     if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)//接收到数据{   value = USART_ReceiveData(USART3);    //读取接收到的数据gizPutData(&value, 1);// USART_SendData(USART3,value);}
}   
4.4.2 机智云发送数据

补充完整接口函数:int32_t uartWrite(uint8_t *buf, uint32_t len)
位置:gizwits_product.c

让其调用串口3的发送。
补充后参考代码:

int32_t uartWrite(uint8_t *buf, uint32_t len)
{uint32_t i = 0;if(NULL == buf){return -1;}#ifdef PROTOCOL_DEBUGGIZWITS_LOG("MCU2WiFi[%4d:%4d]: ", gizGetTimerCount(), len);for(i=0; i<len; i++){GIZWITS_LOG("%02x ", buf[i]);}GIZWITS_LOG("\n");#endiffor(i=0; i<len; i++){//USART_SendData(UART, buf[i]);//STM32 test demo//Serial port to achieve the function, the buf[i] sent to the moduleUSART_SendData(USART3, buf[i]);while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);if(i >=2 && buf[i] == 0xFF){//Serial port to achieve the function, the 0x55 sent to the module//USART_SendData(UART, 0x55);//STM32 test demoUSART_SendData(USART3, 0x55);while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);}}return len;
}
4.4.3 机智云系统时间基准

在前面配置的定时器3(注意是:1ms定时),
中断服务函数中调用接口gizTimerMs()
参考代码:

void TIM3_IRQHandler()
{if(TIM_GetITStatus(TIM3, TIM_IT_Update)){TIM_ClearITPendingBit(TIM3, TIM_IT_Update);gizTimerMs();}
}
4.4.4 实现系统复位

补充接口:mcuRestart
实现系统复位功能。
位置:如图

参考代码:

/**
* @brief mcuRestart* MCU Reset function* @param none
* @return none
*/
void mcuRestart(void)
{__set_FAULTMASK(1);NVIC_SystemReset();
}
4.4.4 实现配置入网

支持 SoftAp 和 AirLink 两种方式配置入网,相应接口为 gizwitsSetMode()
这里我希望ESP8266和手机连接同一WiFi,AirLink 更方便,本设计采用外部中断按键调用的方式。

参考代码:

//外部中断0服务程序
void EXTI0_IRQHandler(void)
{delay_ms(10);//消抖if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==0)      //下降沿触发{      gizwitsSetMode(WIFI_AIRLINK_MODE);printf("\r\nWIFI_AIRLINK_MODE\r\n") ; // 打印调试信息}EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中断标志位
}

至此,stm32已经可以联网了。

4.4.5.数据下行

本文以控制LED0点亮、熄灭为例。
在下图位置添加控制代码。

参考代码:这里使用LED0 = 1或0控制亮灭。

int8_t gizwitsEventProcess(eventInfo_t *info, uint8_t *gizdata, uint32_t len)
{uint8_t i = 0;dataPoint_t *dataPointPtr = (dataPoint_t *)gizdata;moduleStatusInfo_t *wifiData = (moduleStatusInfo_t *)gizdata;protocolTime_t *ptime = (protocolTime_t *)gizdata;#if MODULE_TYPEgprsInfo_t *gprsInfoData = (gprsInfo_t *)gizdata;
#elsemoduleInfo_t *ptModuleInfo = (moduleInfo_t *)gizdata;
#endifif((NULL == info) || (NULL == gizdata)){return -1;}for(i=0; i<info->num; i++){switch(info->event[i]){case EVENT_LED:currentDataPoint.valueLED = dataPointPtr->valueLED;GIZWITS_LOG("Evt: EVENT_LED %d \n", currentDataPoint.valueLED);if(0x01 == currentDataPoint.valueLED){//user handleLED0 = 0;// 低电平点亮}else{//user handle   LED0 = 1;  // 高电平熄灭          }break;case WIFI_SOFTAP:break;case WIFI_AIRLINK:break;case WIFI_STATION:break;case WIFI_CON_ROUTER:break;case WIFI_DISCON_ROUTER:break;case WIFI_CON_M2M:break;case WIFI_DISCON_M2M:break;case WIFI_RSSI:GIZWITS_LOG("RSSI %d\n", wifiData->rssi);break;case TRANSPARENT_DATA:GIZWITS_LOG("TRANSPARENT_DATA \n");//user handle , Fetch data from [data] , size is [len]break;case WIFI_NTP:GIZWITS_LOG("WIFI_NTP : [%d-%d-%d %02d:%02d:%02d][%d] \n",ptime->year,ptime->month,ptime->day,ptime->hour,ptime->minute,ptime->second,ptime->ntp);break;case MODULE_INFO:GIZWITS_LOG("MODULE INFO ...\n");#if MODULE_TYPEGIZWITS_LOG("GPRS MODULE ...\n");//Format By gprsInfo_t#elseGIZWITS_LOG("WIF MODULE ...\n");//Format By moduleInfo_tGIZWITS_LOG("moduleType : [%d] \n",ptModuleInfo->moduleType);#endifbreak;default:break;}}return 0;
}
4.4.6.数据上行

函数接口:void userHandle(void)
添加方法如图:

本教程没有建立上行数据点。故没有代码。

4.4.7.主函数代码

参考代码:
注意波特率为9600

//机智云初始化
void MyGizwistInit(void)
{TIMER3_Init();//1msusart3_init(9600);//gizPutData((uint8_t *)&aRxBuffer,1);userInit();//用户信息初始化,目前只是把结构体信息复位gizwitsInit();//机智云的初始化printf("gizwitsInit智能云初始化\r\n");}
// 主函数
int main(void)
{   delay_init();            //延时函数初始化    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//1设置中断优先级分组为组2:2位抢占优先级,2位响应优先级uart_init(115200);      // 串口1初始化LED_Init();             // 初始化LEDKEY_EXTIX_Init();     // 初始化KEYMyGizwistInit();while(1) {   userHandle();//数据上行gizwitsHandle((dataPoint_t *)&currentDataPoint);}}     

5.实验结果验证

5.1.单片机操作

编译烧录程序,连接串口,打开调试助手。

5.2.手机APP操作

在机智云官网下载安装对应的app。
参考连接:https://download.gizwits.com/zh-cn/p/98/99

打开手机app,依次进行操作:
这里选择工作WiFi,需要自己手动选择WiFi并输入密码。
确保WiFi和密码正确,且手机和ESP8266能连接上同一个WiFi。

单片机按下按键,进入配网。 等待配网完成

注意:
如果进度走完,还没有连接成功,会显示连接超时,大概率是配置有问题
请检查:

  • 1.挨个步骤检查移植配置:外设、机智云接口接入等(建议消除所有警告)
  • 2.确保手机与ESP可以连接同一WiFi,且能正常访问互联网
  • 3.WiFi不能是5gHz的频段(若WiFi是另外一台手机的热点,不要限制连接个数,也不要将ESP拉黑,ESP无法连接wifi会导致配网超时)

正常连接的串口打印调试信息,如下。

手机界面会出现设备。
点击连接"test"(前面输入的产品名称)。


点击开启,即可以点亮LED了。
步骤操作到这里,就恭喜大家成功联网控制。
谢谢大家的阅读。
有问题欢迎评论交流。
码字不易,麻烦点赞评论收藏支持一下

6.常见问题分析

形如串口打印如下错误:

检查原因:
1.串口波特率错误,esp通信波特率9600.
2.串口配置引脚错误。rx与tx要反接,引脚、端口不要写错。
注意esp接了别的串口,对应的串口的代码都要改过来。
其他情况:
3.定时器计算错误,定时器应该为1ms。
4.按键配置出错,配置打印调试,确保按键有效。
5.玄学问题–接触不良,或者接错线,,,,,
6.使用问题,比如gizwitsHandle()要多调用,上面的代码是放在了主循环。注释了这个函数可能直接导致联网失败。。。
7.编译警告。某些警告会导致移植失败,建议规范编程,清除掉所有警告。。。

【STM32移植机智云】超详细教程#2ESP8266移植机智云教程‘代码移植’相关推荐

  1. stm32移植paho_如何在STM32上移植Linux?超详细的实操经验分享

    原标题:如何在STM32上移植Linux?超详细的实操经验分享 刚从硬件跳槽为嵌软时,没有任何一丝的准备.一入职,领导就交代了一项特难的任务--在stm32上移植linux! 瞬间我就懵了,没办法硬着 ...

  2. win10图标变白纸_超详细的纯净版win10安装教程,手把手教你学会,小白秒变大神!...

    最近很多用户问怎么安装纯净版的win10系统,那么今天针对这个问题,和大家分享一下超详细的纯净版win10安装教程,手把手教学,大伙们赶紧收藏哦! 如何安装?这一完整教程分为4个部分: 准备工作→系统 ...

  3. 华硕笔记本电脑计算机专业,超详细华硕笔记本电脑重装系统图文教程

    原标题:超详细华硕笔记本电脑重装系统图文教程 重装系统难吗?不难,难的是你不愿意尝试迈出第一步.今天给大家分享的是超详细华硕笔记本电脑重装系统图文教程,通过使用小白一键重装系统工具可以让我们快速的了解 ...

  4. url获取网站信息不包含网页源文件内的标签_超详细的网站内部seo优化教程

    很多人把seo分为站内和站外,也有人把seo分为搜索需求覆盖,收录,排序,展现和数据分析,结果是一样的,看待seo的角度有所不同.网站内部即站内seo优化教程主要从站内讲解如何做seo.另外,一篇文章 ...

  5. 超详细|ChatGPT辅助论文降重教程100%降至13%

    超详细|ChatGPT辅助论文降重教程100%降至13% 1. ChatGPT指令 1.1 同义词替换 1.2 同义词替换+改变语序 1.3 扩充字段 1.4 学术化内容 1.5 扩充+删减字段+学术 ...

  6. EfficientDet(EfficientNet+BiFPN)论文超详细解读(翻译+学习笔记+代码实现)

    前言 在之前我们介绍过EfficientNet(直通车:[轻量化网络系列(6)]EfficientNetV1论文超详细解读(翻译 +学习笔记+代码实现) [轻量化网络系列(7)]EfficientNe ...

  7. 【小白入门】超详细的OCRnet详解(含代码分析)

    [小白入门]超详细的OCRnet详解(含代码分析) OCRnet 简介 网络结构 具体实现(含代码分析) 实验结果 本文仅梳理总结自己在学习过程中的一些理解和思路,不保证绝对正确,请酌情参考.如果各位 ...

  8. 【轻量化网络系列(2)】MobileNetV2论文超详细解读(翻译 +学习笔记+代码实现)

    前言 上一篇我们介绍了MobileNetV1,主要是将普通Conv转换为dw和pw,但是在dw中训练出来可能会很多0,也就是depthwise部分得到卷积核会废掉,即卷积核参数大部分为0,因为权重数量 ...

  9. 最新版项目部署到腾讯云超详细教学

    目录 1.购买腾讯云服务器或者免费试用腾讯云服务器 1.1尚未拥有腾讯云服务器请参照如下步骤: 1.2已拥有腾讯云服务器,但是系统不是centOS的情况 2.登录腾讯云服务器 3.安装jdk+tomc ...

  10. Vue - 超详细 “纯前端“ 将阿里云 OSS 文件删除流程,支持单个 / 批量删除文件(附带完整示例运行源码,保证新手小白 100% 轻松实现删除功能)

    前言 如果您需要纯前端将文件上传到阿里云 OSS,请访问:Vue - 上传文件到阿里云 OSS 详细教程 / 各种常见问题! 本文站在新手的角度,从 0-1 完成前端 "阿里云oss&quo ...

最新文章

  1. sql server 中将由逗号“,”分割的一个字符串,转换为一个表,并应用与 in 条件...
  2. 微服务实践分享(9)文档中心
  3. AE 模板 天使之城
  4. egg --- 初始化一个egg项目基本结构说明
  5. wordcloud python3.7_[原创]win7/64位系统+python3.7.2下安装wordcloud库失败之解决——一个莫名其妙的方法...
  6. 算法训练 数的划分 动态规划
  7. 9.霍夫变换:圆——圆的算法、投票使用技巧、优点和缺点_2
  8. 特征级融合_多知识图谱的融合算法探索
  9. HarmonyOS IoT首著,走进万物互联的世界!
  10. CICD详解(五)——SVN安装与配置
  11. API开放平台基于accessToken实现
  12. Educational Codeforces Round 45 (Rated for Div. 2)
  13. 汽车汽配行业供应链协同管理系统一体化管理,SCM供应链提升企业竞争力
  14. 支付宝支付时提示“长时间没操作,请重新发起请求”的错误处理
  15. 我的服务器开发之路-服务器SSH默认端口22和ftp默认端口21修改
  16. graphlan/iTOL画进化树记录
  17. 谷歌 发布android 8,2017谷歌大会正式发布Android 8.0!
  18. treegrid 的使用介绍
  19. XSS 绕过思路 bypass 之日天日地日空气
  20. vue中调用百度地图 获取经纬度

热门文章

  1. 小羊驼和你一起学习cocos2d-x之三(进度条、CCProgressTimer)
  2. 创业第9天,竞价助手3.0 测试预览版发布!
  3. 南航计算机科学与技术学院老师,关于南航计算机科学与技术学院第七期科创基金项目教师课题征集的通知...
  4. 读懂人工智能、机器学习、神经网络和深度学习的关系
  5. 2021-03-27 Python根据vasp-dos数据绘制曲线并计算d带中心
  6. Duplicate entry ‘xxx‘ for key ‘PRIMARY‘
  7. 教你如何建设一个多语言版的ASP网站
  8. 简析京东、当当、红孩子平台B2C的品牌策略
  9. 网络云存储技术Windows server 2012 (项目十一 NAS服务器磁盘配额的配置与管理)
  10. AndroidRuntime java.lang.AbstractMethodError解决方案