最近参加电子设计大赛,在做智能车的时候用到了蓝牙,摆弄了好长时间;校赛的时候又需要远程控制,因此有想玩蓝牙。一次偶然的机会,结识了一个网友,在他的指导下实现了,esp8266接入机智云。一开始是想用阿里云做,但是由于种种原因换成了机智云,对于机智云最难的应该是代码移植了,我搜索了好多文件,问了好多人,最终调试成功,在这里写一下教程,希望小白不要走弯路。
为了保证此教程的完整性,从头开始。
STM32F103开发板一块(当然也可以使用最小系统,只要接线正确就可以)
杜邦线若干
数据线一根
stm32 | esp8266 |
---|---|
3.3v | VCC |
GND | GND |
TXD | RXD |
RXD | TXD |
开发者中心
#####################################################################################
注册账号(自己完成)
######################################################################################
(参考http://docs.gizwits.com/zh-cn/deviceDev/ESP8266%E4%B8%B2%E5%8F%A3%E7%83%A7%E5%86%99%E8%AF%B4%E6%98%8E.html#1-%E4%B8%8B%E8%BD%BDESP8266%E5%AF%B9%E5%BA%94%E7%9A%84%E5%9B%BA%E4%BB%B6)
创建新的产品
添加数据点
可以进行虚拟调试
下载机智云APP 扫描二维码进行调试
之后进入MCU开发 选择单片机型号
这里用的是其他平台
》》》》》》》》》》product Secret在产品信息————基本信息下查看》》》》》》》》》
然后生成代码包,并下载。。。。。。。
官方自动自动生成源程序结构如图
机智云官方使用的是hal库,我没有接触过,我买的开发板是普中的,因此需要代码移植。
首先将这两个文件夹(Gizwits 和 Utils)发复制到自己熟悉的标准库工程文件夹中(工程是之前自己仿照普中的写的)
需要用到串口3和串口1,以及定时器4
控制LED当然需要led.h
按键控制进入Airlink模式或者复位模式
在此处将刚才复制的文件夹包含到工程中
操作完成后
别忘记将文件路径添加进去,不然会报错–找不到文件
下面进行代码移植
1.修改usart3
(串口3是用来进行单片机与esp8266通信的,串口1是打印提示信息的,所以说串口1不用修改,当然也可以选择其他串口)
在 usart3.c 文件中添加串口 3 的初始化和中断服务函数,将中断接收的数据写入到 gizPutData()函数
void USART3_Init(u32 bound),,,这是串口初始化函数,相信大家都懂,这里就不贴出来了
2.修改 time.c 文件
在定时器 4中断服务函数中添加 gizTimerMs()函数,并且添加 gizwits_product.h 头文件,在这里会有一个警告,意思是头文件gizwits_product.h 中没有对 gizTimerMs()函数做声明,因此在gizwits_product.h 中应添加声明语句void gizTimerMs(void );
添加后警告消失
3.修改 gizwits_product.c 文件
printf定义在 usart.c 文件(不是普中的,我自己照着写的)已经有添加了,我们不需要再添加,需要添加代码如下:
因为我在main函数中定义了void userHandle(void)函数,一次需要将 gizwits_product.c 中的相应函数删除,不然会出现重定义
<1> 函数 int32_t uartWrite(uint8_t *buf, uint32_t len) 中添加代码如下:(因为用到了串口3,因此需要加入相应的头文件)
USART_SendData(USART3,buf[i]);
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET);
USART_SendData(USART3,0x55);
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET);
<2>函数 int8_t gizwitsEventProcess(eventInfo_t *info, uint8_t *gizdata, uint32_t len) 中添加代码如下:
(用到了LED灯的点亮,因此需要就加入led.h,,,千万不要忘记加入位代头文件,,不然会报错的)
<3> 函数 void mcuRestart(void) 中添加代码如下:
__set_FAULTMASK(1);
NVIC_SystemReset();
<4>修改main.c内容
这里我就直接贴代码了 ,有参考过正点原子的
当然你的头文件和我的可能不一样,这就需要你自己修改了(ps:无论你参考什么教程,这个是无法避免的)
main函数中定义的按键和你的开发板不一定匹配,请注意修改自己的管脚定义,避免出错
还有就是那个led8使用来提示系统正常运行的,不用的话可以删掉,那个延时不要加太多,不然影响传输速度
#include "led.h"
#include "SysTick.h"
#include "key.h"
#include "usart.h"
#include "time.h"
#include "usart3.h"
#include "gizwits_product.h"
//用户区当前设备状态结构体
dataPoint_t currentDataPoint;
//协议初始化
void Gizwits_Init(void)
{
TIM3_Init(9,7199);//1MS 系统定时
USART3_Init(9600);//WIFI 初始化 波特率必须为 9600
memset((uint8_t*)¤tDataPoint, 0, sizeof(dataPoint_t));//设备状态结构体初始化
gizwitsInit();
} //数据采集
void userHandle(void) {
//判断当前 LED1 开关量
if(led1==0)
currentDataPoint.valuepower = 1;
else
currentDataPoint.valuepower = 0;
}
//主函数
int main(void)
{
int key;
SysTick_Init(72); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置 NVIC 中断分组 2:2 位抢占优先级,2 位响应优先级
USART1_Init(115200); //串口初始化为 115200
LED_Init(); //LED 端口初始化
KEY_Init(); //按键初始化
Gizwits_Init(); //协议初始化
printf("-------初始化完成----------\r\n");
printf("KEY_UP:AirLink 连接模式\t KEY_DOWN:复位\r\n\r\n");
while(1)
{
userHandle();//用户采集
gizwitsHandle((dataPoint_t *)¤tDataPoint);//协议处理
key = KEY_Scan(0);
if(key==KEY_UP)//KEY_UP 按键
{
printf("WIFI 进入 AirLink 连接模式\r\n");
gizwitsSetMode(WIFI_AIRLINK_MODE);//Air-link 模式接入
}
if(key==KEY_DOWN)//KEY_DOWN 按键
{
printf("WIFI 复位,请重新配置连接\r\n");
gizwitsSetMode(WIFI_RESET_MODE);//WIFI 复位
}
led8=!led8;
delay_ms(100);
}
}
代码移植到此结束,之后就可以配置esp8266入网了
软件商店下载机智云app,登录后
点击右上角的+,选择一键配置,在这里你的手机需要连接可以上网的WiFi(你家里的WiFi,可以上网的那种),输入密码,
进入到下面的界面
然后按下开发板上定义的按键,进入到AirLink模式,点击我已完成上述操作。。即可
本教程仅仅做个人技术交流分享,如有不对之处,请留言,本人及时更改。