1、机智云协议代码下载" a2 g% v0 q- R% x# t0 s
生成代码时选择其他平台生成,生成后代码并将其下载解压,如下:
9 w; y# S+ t$ v/ I/ E1 ?; a" c* O! l/ I, g- k$ G
: X j: |' u- `2 @3 k
; ^/ e9 J& k6 P) z( N在我们移植之前,必须知道需移植的MCU是否具备以下条件
8 ` k3 b% o: b3 }" o! H" T/ z. l) X$ H6 l R7 b
①平台支持两个串口接口(至少一个,两个方便调试),一个负责与 wifi 模组间的数据收发,一个用于调试信息打印,WIFI通讯串口波特率必须是 9600。+ J) V' ~8 g; k5 p9 e, W
- r5 n# \$ x1 j& k. I②平台支持定时器(1ms 精确定时)为系统运行提供时基。8 F: }# k i) g) q3 Q
, C3 q- f0 m! o/ z③平台支持至少 2K 的 RAM 空间(可调整环形缓冲接收区大小,来解决数据协议的处理异常问题)。1 R& c# C6 W o9 B- a3 B
J0 ~' G* ^( h& f- C
2、工程模板准备! w" f7 \! E% E- l* M; d
因为要用到TIM、USART,所以我们直接使用原子的定时器工程进行移植,首先修改工程目录名字
X6 @, ^: P' M) w& r p8 `( M0 T0 P/ B
2 |) r: h: t b1 T% H
3 B4 s: T- _9 m# b
3、协议及外设移植
( D* F: G( o" ~+ I通过机智云生成的其他平台代码内的Gizwits、Utils文件夹复制到我们的工程目录5 h H( w w6 M- x. V2 O' o ~
7 |4 t' A7 v4 Q7 a8 Y0 C4 K: @+ w
- ^: w" t0 A% P: z6 H
`2 h5 ^" l; C+ v- G$ Z移植到工程中7 H5 C1 G* Z$ L4 B. f/ k
! ?3 x, z$ G; J: P/ z2 f& t
1 n! F k! M) d! t7 @( [
9 ~) O7 x( C+ g/ S
在HARDWARE里面创建KEY和USART对应的文件夹,并将写好相关代码
$ A/ ]/ Y2 U" o/ K! V
# _* m& ^+ {0 F
3 o* O: v4 e* ?( a7 R
2 @3 R" x: u: d) F+ Z. ]将串口、按键以及Gizwits的代码全部添加到工程中(对于怎么添加创建文件,指定头文件路径这些这里就不再赘述)
1 _1 g. X8 e5 i# h9 N7 K$ h
I: t% s/ x! q- a( K
) X& T' q8 @. }5 A; E$ _3 Z$ Y
" v E& ?' U3 @1 I1 b' i
4、代码修改; P' s# S" _ {" M9 f, X- h% ~5 L/ d! V
4.1、修改usart3.c文件0 ?; N0 H7 r" r, U2 T9 `
在usart3.c文件中编写串口3的初始化和中断服务函数,将中断接收的数据写入到gizPutData()函数,代码如下:0 a( n$ z7 s1 U: @0 o
+ _+ }4 g- r2 h8 d @* K( [/ W
( Z" V2 P+ R+ W# ?) I
2 k: x9 x: h) a3 q4.2、修改timer.c文件
' p. }; w$ t1 [+ ~$ f/ \* {在定时器 3 中断服务函数中添加 gizTimerMs()函数,并且添加 gizwits_product.h 头文件,代码如下:
+ c1 F D; I; `+ b; U+ g6 H# N6 T D& c4 y: D3 v
0 y! z% E$ |$ C2 z# ~0 F! }) I$ i9 y- m/ ]
(注意:gizwits_product.h 文件中没有对 gizTimerMs()函数做声明,需自己添加,否则编译会出现警报)
+ U+ {% n2 y3 k0 z. I$ V8 s2 {$ k5 d8 M4 O6 x/ D! z1 X" g1 L
o% |: ~* w% ^0 h/ t+ i1 Y* z- A8 x$ S
4.3、修改 gizwits_product.c 文件
6 R& r( y4 L/ \; m因为我们修改gizwits_product.c文件用到 LED和串口发送,所以要添加头文件 led.h 和usart3.h。
3 e1 q2 H5 [$ C
2 H4 h# i- d1 I2 _+ y6 J+ A+ S- z在uartWrite函数中添加串口3发送函数,而GIZWITS_LOG用到printf定义在工程SYSTEM分组下 usart.c 文件已经有添加了,我们不需要再添加,需要添加代码如下:; c8 Z! L$ f, M" f
$ y$ R6 l9 [% M7 l. b. ~
; l) E& i1 R( w1 t1 ~) G% V7 @$ A& V1 u
添加完串口发送函数后,回到 gizwitsEventProcess()用户处理事件函数中添加我们的用户事件逻辑,这里我们是控制 LED 的亮灭, 在 EVENT_LEDONOFF 事件中根据返回的开关量添加其 LED1的开关控制,代码如下
: |# M) `+ X& L) u$ x6 t
- \7 K9 }* [( i6 y( B
5 `0 c/ Z C# v* G; Z; a6 @" C
. |' x/ ?" ~" W H在mcuRestart()函数中添加软复位函数,代码如下:
) _2 l; u) M0 {7 z
# M5 w1 F/ V( E# D: A- Z
! R( w/ V+ E- w: c0 r% i* E
( V' I3 S H+ L7 e3 I1 |4.4、修改usart.c文件" b4 I7 e) r, @8 s* n! g
" ~5 p! {" v3 i7 ?# _0 e, G
' f* b4 s2 i4 _/ x) F' z1 R: F1 S6 F: [
, u: m @) C, l4 L4.5、添加main.c代码
6 f; G0 D5 J2 x/ f7 {1 \3 L) j- #include "led.h"
- B' Z1 L4 ]0 L9 n6 } A - #include "delay.h"
6 z" t% D) C1 n - #include "key.h"4 k) F6 Z3 \5 s- O
- #include "sys.h"% [8 L7 @' k# q2 j
- #include "usart.h", m G) u9 d6 u) E5 b3 z
- #include "timer.h"
2 \1 T! x9 \0 U3 k! R - #include "usart3.h"
7 V5 P. h5 }+ V& ~$ F3 k - #include "gizwits_product.h" G) v. [" r6 \3 j- w
- ) M9 o% h% @" l6 C/ M( Z
- //dataPoint_t currentDataPoint;; Z. C( _- w4 i' U0 w9 J5 @
p- Z5 n/ I! ~ y- void Gizwits_Init(void)( Q8 K }% }& t* E6 G0 j( I
- {
; V9 V: d8 @7 P - TIM3_Int_Init(10-1,8400-1); //1MS" P, o% W* U4 U% b# e
- usart3_init(9600);//WIFI
0 Q1 `. N' I& B - memset((uint8_t*)¤tDataPoint, 0, sizeof(dataPoint_t));! ]% B! o: ~, l9 [( B4 J
- gizwitsInit();//
0 Y* r/ K9 r3 S. N% h0 R8 l! R - }" g& C( f( M; X+ D- q
9 W0 [; P$ ~. y' D' W. \- //void userHandle(void)/ Z1 j' O2 ` d# `* I. U3 C& F
- //{: M3 l c# y) W$ }
- LED11 U8 g" _8 t# S3 U1 X
- if(LED1==0)
! X( N) y9 p: o. N5 o; n: r - currentDataPoint. valueLED_OnOff= 1;
4 l4 h: S* d- N8 W5 F' i% A - else if(LED1==1)+ |! d' f1 Z7 ^" {0 G
- currentDataPoint. valueLED_OnOff= 0;/ w. _& P# s- h `7 Y
- //}
1 _- p6 i6 e3 T4 l- ~
2 S) `( K% p ]& A- int main(void)
) f! |4 J! w* q% u% _1 ? - {1 d; A% U- f6 S* m
- int key;3 R% R% g- G8 Y% x9 Y
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
) F G c- v0 |7 s- Q. q/ g3 @1 w - delay_init(168);
# R3 o( \: J& K/ D; h! z( L - uart_init(115200); 9 y, \( j4 y* P* _6 \" C0 u8 z4 N5 `1 J
- LED_Init();
3 J( T) \1 H8 T- r( W - KEY_Init(); - H' _0 C# K! D
- Gizwits_Init();" w5 Q. O+ O5 W1 @6 [( N& h
-
% W* ?1 q) g+ l3 b - while(1)7 I& o$ N. v; Y! I2 W/ O
- {9 h# ?& n7 S- E& ?7 q
- userHandle();//Óû§²É¼¯
7 F; F2 T2 ~$ V1 g - 8 }: p" G8 H8 ^+ V" ]0 ]0 Z2 Y; t
- gizwitsHandle((dataPoint_t *)¤tDataPoint); \5 P1 i6 Q, u9 g
- key = KEY_Scan(0);0 I" j4 v* `5 z! V _+ ^; c
- if(key==KEY1_PRES)//KEY1 0 t0 _8 a X1 ^. c# e
- {
$ j: I+ U6 _7 p+ s; s6 \% Z1 d) X2 ^ - printf("WIFI ½øÈë AirLink ģʽ\r\n");
6 \0 _ _( ]+ K - gizwitsSetMode(WIFI_AIRLINK_MODE);//Air-link
( F5 [: A6 ]9 P' y - }
+ ?4 A/ q) k Z& E: V3 c7 K( E' c - if(key==WKUP_PRES)//KEY_UP + W, Z8 i% U. u I1 s' t! s! ]
- {
( l! A0 u% i) B: H5 ]7 I- A - printf("WIFI¸´Î»,ÇëÖØÐÂÅäÖÃ\r\n");
' n$ b! W) a0 t8 v/ v0 B - gizwitsSetMode(WIFI_RESET_MODE);//WIFI j9 R5 k; [4 F& N. D" m
- }
% R8 N P# j+ n$ x - delay_ms(200);
1 F$ M- {% C0 [6 o - LED0=!LED0;! ?8 E6 ]$ i8 r
- }
" I: F/ f4 x& V/ D - }
复制代码
0 h6 h% E6 C; w/ d6 f" n9 j5、编译及改错& H' k, \7 {( {: J
修改完成后编译下整个工程,应该会提示如下2个重复定义的错,保留其中一个,只需要去gizwits_product.c或者main.c删除或屏蔽掉即可:
* G4 W, G, |9 D# ]: ^( i6 K4 [1 y u
( e* l6 f4 ]! O- l$ Z2 n5 ~
9 a* ^$ P' P! B% ?
解决办法:
; i/ B, A6 ?# P4 M/ j: y5 u$ t# y5 l- a! x1 [, g) T5 a
删除或屏蔽gizwits_product.c里的userHandle
& o; h! J& ]/ Y/ p9 x6 y
& {, P+ @8 l' h8 Y
, X# R: _, w) E) n% n
^9 G5 A2 j. g( C) j+ n/ `; A
删除或屏蔽gizwits_product.c里的dataPoint_t currentDataPoint;0 g! x3 ~0 e6 O' [1 X4 \
6 Y; v% _- x7 ^' o! h4 V! i# O
- c+ m- [+ e+ b* ^! v/ D) R% q
" X: l, A9 g) E" M2 M @3 R6、功能测试' `7 X2 S1 {0 M* N
6.1、ESP8266接线方法0 e* `5 z3 }5 s( i- m" Q
将ESP8266对应的引脚接在开发板上的串口3上就可以了,接线方法如下图:
( o+ c( i5 g N1 U E2 ?3 o
% k9 A! U$ o7 ]
( X x+ I, Q5 i* Z- `4 _( k1 O/ Y( A
6.2、ESP8266配网1 w! q2 ]* ?, P J
按下KEY1按键,ESP8266进入AieLink模式(具体怎么配网我下一篇博客会聚集讲解),配网成功后会反馈一下信息,如下图所示:
& I) C! _+ j5 \! V$ H8 X% |% u( X s. z. U
2 l; U9 B! K8 J/ B
9 e9 c: w5 J: Z3 H$ l5 R6.3、APP控制" y# O1 K* s5 Z! { Q
成功后就可以通过Demo APP进行控制,控制灯和控制继电器原理都一样,都是高低电平导通!% h: M$ ~$ o: V, z- Q% ~
( |5 {- x2 e8 _* {
, D! ]2 s5 n& j" C# s( z
6 } _1 J9 k& @: @: u1 U0 r
, U- f+ z. g; e* y U9 \0 M# X0 P$ Q9 c6 s' ^8 M/ E
控制时串口助手上也会反馈相关数据,方便我们调试,如下图所示:9 e6 {: x8 i. t' z7 p+ s
9 I, W. C9 e! O- D# V
; \0 S1 x' I1 w! z4 k! X/ m
! X* @% k* s2 S9 s2 K, S( y% V那么我们就算是大功告成,此时,手机端把WIFI关掉,就可以直接用数据流量进行控制。配网成功后,只要硬件端不断电,那么我们就能随时随地的用手机去进行远程控制,这就是物联网应用。
& [( p6 x$ t! k+ b- |) Z% k$ D7 l3 @* Q
0 E7 ^$ W9 M$ n3 E7 d! R$ f
|