|
|
本帖最后由 易记 于 2021-8-21 14:05 编辑 3 [8 F- J' B( x9 d3 X
* a( |$ d: p0 b; H& }1 Z* L
最近玩ESP8266,想做个天猫控制开关。# S/ k: U2 a) g& V" W4 M+ `
但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。' @- l+ \# \; `# Z8 o, l8 n; p- n
还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。
9 Y( X, w o& M
; ]& b" I5 c1 R! u4 J. C$ N, r8 w6 g8 l
0 R, _0 @6 L" U& n$ I( U2 I
问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。
- y" E- }( H) ~: Y B
# I( P* v7 p: N9 C w; {: U% k( g
; m7 e2 h0 W7 w3 }, V, C' h: C- n
! ?5 d# C: s. J0 @: f, N
- w5 y M6 h! Q7 c到手,当然是拆拆拆。, S3 m+ C0 z/ R+ T C. p! ]$ X
6 U$ Y" _7 c& n9 ~
) X1 Y; i1 s* B0 R' f" o1 O3 R9 A$ k) [/ t( d
联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。% o* A* n# _$ f' Y
4 Z' y6 ^) c9 }% \" {
( y1 W- c- e- R# f6 Y+ J
0 m" q* H* z) N F& c
继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。* o' G% Y/ o& Q- G4 u8 n: @, b
7 S5 i2 V$ ]! U1 T \' J
: R7 I7 R0 {4 f
w9 n" Y: i) y" F+ H2 r" P- W1 I; p/ q3 _+ @# P
电源芯片) k8 D, |. N$ a5 H {, V1 u- u
* o$ P0 L0 A- |( Z8 n3 k
# n' K ^$ T, n* P" `( O! A& e3 z' o8 i0 f, k) q
有一个按钮,按钮有二个蓝色LED灯9 v! u- p2 E' A( R/ }
, T9 N9 S7 C- D- U6 B5 t
$ Y9 _) B: M* l3 r5 A+ {, P3 h
3 I( M. H, K/ @4 [0 Z- ?- K8266
' d V9 w9 {/ R* x5 p$ b
( i5 z2 X% b- N, C- V" R
0 }$ c! p! C$ ` T* c
1 ^$ Y( P$ g/ v
2 [7 Q8 A6 N6 [; {. l
! q* |7 N7 O e; y/ j接下来就是刷机了,版子上面都预留测试点。
. w3 M' g) C9 ]) a+ u R接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。6 W9 q, g; M2 `
/ W0 R# U( ]: M- T7 ^
注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。
/ M8 k$ Z8 {! Z2 y/ x0 o1 }要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 | ; ]7 k Y# Q: U2 `4 Y$ M/ \& j/ t
- ~* U" W: b3 a8 v3 {
# H1 s" K- }, [- C
5 W. S1 r- m9 d2 Y" O4 F& z
* @( `; |" T e; z9 I9 i& o% d% w: X( l& a4 B
5号脚位是继电器输出, k, b5 @# q# U- E+ y9 {
12号脚位是灯输出
8 p: ?" t# j. s) o 4号脚位是按键9 h1 v( P/ x# q& H* |5 u5 F9 w
4 c/ g6 @' a1 t2 {* Z: s
1 P3 |4 @ E8 ]9 h, [: \3 f9 l) {4 v* w' E& W
2 `7 j8 Z2 q% V( H' Z
卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库5 I5 L6 Z% S a0 [5 M# k) F
- #define BLINKER_MIOT_LIGHT // 设置小爱灯类库
% [3 Y4 K: s1 q' k9 v- Y) } - #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库
" `+ j+ s$ p" t6 N9 E0 f - #define BLINKER_PRINT Serial //串口协议库% K+ A! ^, r: K6 b0 v* o
- #include <Blinker.h> //官方库4 d1 H8 s4 I$ ~) E" M$ ?
- #include <ESP8266WiFi.h> //官方库. A# a9 K: ]) a7 D
- WiFiServer server(80); // 服务器端口号- e# C; L O$ ^
9 o7 x8 p x3 q* l+ h2 Z3 Y; y- char auth[] = "c4942fb1d5e4"; //设备key
( ?9 b& i" T+ @ - char ssid[] = "wanboshi"; //路由器wifi ssid9 F2 V* k- f1 X+ h& G' u. z0 p/ Y
- char pswd[] = "1365662999813586348220"; //路由器wifi 密码
/ D) B+ ^, o g+ _$ u7 Q
; w, X3 i6 u3 j: E# N; Q x, w! D& _- bool oState = false;
$ m0 k6 w8 [9 O7 n2 S8 e$ C
; k7 r5 O5 k( |0 ] I$ k7 S( _! V- int kg=5;//继电器输出3 T' X: ~( f" z. m# @6 Y' d$ x9 _
- int de=12;//灯输出1 `( `6 c4 X8 e* n9 m1 L, n' k
- int key=4 ;//按键
$ B( H$ r0 D# B1 D" \4 }4 A - //*******新建组件对象
# Y2 `2 d! B3 F% U' \/ w5 m
, X% Z) _7 R' g# e, |- x5 {' r- BlinkerButton Button1("btn-abc"); //设置app按键的键名
e( ?. m0 [8 I - //*******app上按下按键即会执行该函数app里按键% Z+ E8 l. I# b! j/ ~! `
- void button1_callback(const String & state)
0 T) [) S% Z6 j4 U - {
9 O2 r2 o# o/ x A - if (digitalRead(kg)==LOW) V; B* X1 s$ _- H
- {# ]4 U9 l% y7 O1 }
- BLINKER_LOG("get button state: ", state);5 m- _ Y, P1 Y! h9 v; p9 O
- digitalWrite(kg, HIGH);
I) q/ V* _) d; b c3 B2 X0 N- L - digitalWrite(de, LOW);% S; _% z/ |$ |
- Button1.print("on");
* N+ q! k! L! P: I - Button1.color("#0000FF"); //设置app按键是浅蓝色
8 N6 k, D" j$ z4 C - Button1.text("开启中");2 q% r. A! a4 w% C* I1 O3 G
- }3 T) t3 h" ~& ^: Q* L# x+ S
- else if (digitalRead(kg)==HIGH)
+ B6 I0 g3 q4 a( f - {1 b1 F6 O, W/ Y# A2 P
- BLINKER_LOG("get button state: ", state);3 A) P8 P( K" x& _& Z
- digitalWrite(kg, LOW);2 F+ \! _' i5 F# U' z
- digitalWrite(de, HIGH);
/ L& U2 S/ g! M L$ w' Z - Button1.print("off");
6 o3 c: r( n0 f5 C1 A# k- n - Button1.color("#00FFFF"); //设置app按键是深蓝色
% K, K! F# s% m+ J/ d - Button1.text("关闭中");6 L: X% |- E, z7 g0 G6 K( }' D
- }
& u; l, h4 `& d% K; r - }, s u" m+ h9 o, U' y
) e$ [0 ~0 o1 I. g2 B" P( ^- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' \) e9 L2 N% @$ J3 D% r' u
/ T, C0 A* Q) N1 u1 t( o- //*******如果小爱有对设备进行操作就执行下面
9 L0 a; L1 i7 J" s/ d) |0 F - void miotPowerState(const String & state)
0 v0 g0 r8 Q# G0 M/ U3 }$ x# E - {- o7 ?/ g, [% D+ t0 p: |2 K, c
- BLINKER_LOG("小爱语音操作!"); //串口打印
" r+ i' }: x4 a* o9 J7 d - if (state == BLINKER_CMD_ON){
/ h/ n3 ^" W8 o! x6 d( R - ' P8 a! D! c* c( o) g; C
- digitalWrite(kg, HIGH);
2 Q% R" M/ f3 M( O) }5 N - digitalWrite(de, LOW);
" p) r u5 q S* @# | - Button1.print("on");9 k- m7 X) Q+ g
- Button1.color("#0000FF"); //设置app按键是浅蓝色- t8 I$ v: V b! ~4 R
- Button1.text("开启中");
+ h J* d F3 ?+ m$ o - BlinkerMIOT.powerState("on");1 U( N8 v: c7 l
- BlinkerMIOT.print();% n* _. _# Q) Y0 h, b8 z$ Q8 i
- } ~/ `! _1 g" h# K$ w
- else if (state == BLINKER_CMD_OFF); W' ]- \5 M. @ s+ r
- {
+ z: q; ?4 V2 e$ x P( ` - 6 V3 N" l+ K/ p4 I
- digitalWrite(kg, LOW);9 ^! P& B z$ B2 E# Z, B
- digitalWrite(de, HIGH);
& O/ x7 N$ z/ c- h, _/ k. q - Button1.print("off");
. U( I' n+ f/ O1 m( \- Z* } - Button1.color("#00FFFF"); //设置app按键是深蓝色
$ ?, \" u7 u% { - Button1.text("关闭中");$ M' v. ?7 j! j
- BlinkerMIOT.powerState("off");
( ]( q, F2 [" {* a. q - BlinkerMIOT.print();7 e- \2 O5 ?2 m% L t1 e4 g5 }
- }
- W+ d" ~) m0 x$ z& S9 ]7 ~ - 4 ?2 ]6 P% j! m) v
-
% Y4 }+ I& M$ S2 Y9 p/ U4 C% m y3 K6 B* L - }
* Z% q* N- v7 i2 R - //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
! g2 B" h3 V) y8 x" J* m8 j$ [ - //*******如果天猫精灵有对设备进行操作就执行下面
2 O- R) g! s0 T9 @) r5 M: Y1 }, k- o - void aligeniePowerState(const String & state)
( I; y! p, P! C, J - {
) f( B( T; o( R# h$ B/ N8 z, { - BLINKER_LOG("need set power state: ", state);
# |4 [- G) z+ u9 i( ^6 G5 p/ e - if (state == BLINKER_CMD_ON)3 c, z0 b$ S. O0 s) M" {5 B
- {# F9 @8 d% X- S; Z
-
! p; z! \$ z! V/ J8 O1 v% N - digitalWrite(kg, HIGH);
* s( X; l$ Q2 {7 c- Y0 Y- k/ w - digitalWrite(de, LOW);
$ O7 Z- F$ ^9 ?% j+ [$ h! H* t - Button1.print("on");" o8 P3 j1 }9 k: }4 [- R
- Button1.color("#0000FF"); //设置app按键是浅蓝色2 k& T8 \$ m6 Z x c$ B# `
- Button1.text("开启中");( k9 _& ~- P* {1 I$ X
- BlinkerAliGenie.powerState("on");$ @- s- M: l$ j/ g
- BlinkerAliGenie.print();; @' G1 k' w4 l" s) k, j. |
- }
& I9 p( W0 f( m G - else if (state == BLINKER_CMD_OFF)
- P z; k4 l! j8 Q6 i5 O+ e" ? - {" ^4 U- V' J; Y4 ^
- 3 [& w9 b' v- Z5 S! j5 U5 y; r
- digitalWrite(kg, LOW);2 h) R- s: E t( I6 O$ u/ t o
- digitalWrite(de, HIGH);
* A0 t( E% b0 t/ g5 g | - Button1.print("off");
9 G. H+ Y/ H# e- F6 g - Button1.color("#00FFFF"); //设置app按键是深蓝色
3 G- e2 j! I p4 G1 N8 { - Button1.text("关闭中");
2 S4 |* k2 k, R& \ - BlinkerAliGenie.powerState("off");
2 ?1 _$ t9 b+ X! ~9 E, Z - BlinkerAliGenie.print();5 C" n8 U+ C% k. S+ ?: V
- }5 @0 R- m/ k' a% J7 ?- W
-
+ c3 M6 q5 d. q" R
# D$ T H/ s% z- }2 J+ v2 c8 e- c) n0 r) K, _9 v& U( s
- //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次
# w7 |9 l2 k( y2 X1 ^; n - void heartbeat()
2 @* \& g1 A7 x+ Z! a5 ~* l5 x- I - {% v& w: p& I. N' J; h9 U
- BLINKER_LOG("状态同步!"); 1 A* l% X# V6 M7 i
- if (digitalRead(kg)==HIGH) ; K6 r2 M: C G( r! w1 T" ?7 @
- {
" A0 `! a2 z: C5 s# {( l3 g1 M6 s - Button1.print("on");! X' ~7 l# f% p& W, a# }6 \6 O
- Button1.color("#0000FF"); //设置app按键是浅蓝色
7 R U5 \' T7 ]; r4 Z8 d - Button1.text("开启中");2 e6 ]5 [8 w! g
- }/ z& K5 b/ U9 A
- else 5 m2 c0 H" y0 `: H. }4 [/ Y. }
- {
5 Q) D) X4 l8 `) C - Button1.print("off");
2 c4 R* h& R2 C+ u( v6 r/ Z+ ^ - Button1.color("#00FFFF"); //设置app按键是深蓝色
) q m6 e5 M1 M+ G0 @ - Button1.text("关闭中");" Y5 m8 b. J, C
- 1 ]9 c6 A( ]* L( }2 ^. u
- }! k7 r/ y2 E& \ V$ Y& o
- }! T5 s. q! [8 ]+ f3 d
- //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' O' t; P; z9 N3 G2 u5 o - void setup()
" I- A3 _# e# \$ F - {9 z7 n. s2 P3 |/ C8 I
- // 初始化串口' Q9 ^( X* Y. t- m3 D' }
- Serial.begin(115200);
, \, L3 m% V! I6 H- ] - delay(10);
+ F7 d' @# z7 J/ n! p - BLINKER_DEBUG.stream(Serial);
; o9 _- d" t" Y2 N+ f - // 初始化有LED的IO
1 _+ n5 d+ o7 ] - pinMode(kg, OUTPUT); ( ?+ F+ `) r- U% K4 v. p
- digitalWrite(kg, LOW);//初始化继电器上电状态 " d; ^* _0 }! h5 \
- pinMode(de, OUTPUT);
4 d7 P: u% r* n: R6 L! j+ s - digitalWrite(de, HIGH);4 P( g z: G# Y# c" g( i9 M
- pinMode(key, INPUT);
( w7 g. A, c5 z/ {) Z - Serial.println();( k# Z- E$ r, N* L8 T
- Serial.print("Connecting to ");
7 G1 a1 o% d! Y - Serial.println(ssid);
4 E0 ~ I# Q/ ?& }7 N1 @1 W) \5 F - WiFi.begin(ssid, pswd);
0 O8 ^4 `- T; F& O7 t - while (WiFi.status() != WL_CONNECTED) {) [$ O( ]" G) V7 @
- delay(500);
, R: L0 `4 G2 y+ `* |. W% n - Serial.print(".");7 N, |2 z3 {0 P/ h9 c. R- V
- }
+ I# P2 L, f8 ^ - Serial.println("");
' Q6 y. }4 `7 G; f - Serial.println("WiFi connected");0 Y# Z, _4 K, j9 ?$ F; c4 n) s
- server.begin();
2 Q: T# t0 i+ |* J) ~* S6 } - Serial.println("Server started @ ");) m, m0 q! @0 _8 q0 I
- Serial.println(WiFi.localIP());- a4 o2 t, {2 E) u# j% q0 k( c
- //打印出IP地址,后期可以制作显示器来外部硬件显示ip* v4 B% P! C7 D
- Serial.println("To control GPIO, open your web browser.");
! @$ R/ q h" h; E7 M' [ - Serial.println("To set GPIO 0 high, type:");
9 z w5 R* M& G6 Q0 G/ r( S7 E - Serial.print(WiFi.localIP());
# ^* Q+ g9 ]; e2 p - Serial.println("/gpio/1");
: K8 ~' |( r* p9 Q; r* ` - Serial.println("To set GPIO 0 low, type:");- E; J/ D" R$ ?
- Serial.print(WiFi.localIP());1 L2 X$ l- o* T' d& v& T
- Serial.println("/gpio/0");
/ s& m: ^; m/ k6 o- P6 |1 z7 m( g - Serial.println("To toggle GPIO 0, type:");9 w: g' V1 }( |- U0 i" y
- Serial.print(WiFi.localIP());+ B: s$ ?& ^- l% P6 M3 J) D! `
- Serial.println("/gpio/4");2 a0 E' o$ R- U8 B* x" \, m
- 4 K. g( R) R) p' n7 x8 N% a
- // 初始化blinker1 `& u/ \1 ]* G
- Blinker.begin(auth, ssid, pswd);
& q5 n4 p. z6 l Z7 R0 w - BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数
3 k2 ]4 [1 z# N& \ - BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数
: K* I- C: C4 V4 R4 P - Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。
x2 s6 X @& \/ P9 ^. f
, V! X! y5 d0 I( w& ~5 l. J% x- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback
+ ^7 ]( v7 g; \) {% r - }
3 v& o' @9 \5 J) W& p, p) O' @0 b - void dataRead(const String & data)9 l5 O2 D/ R- k0 }, R
- {7 B2 P0 j. V0 W8 U2 u
- BLINKER_LOG("Blinker readString: ", data);
V" Q$ u( S; k4 D7 y& L8 H. T - ' i( ` f" X8 J" _1 @
- Blinker.vibrate();) O! G3 t' Y; W7 m% O) c+ P, n
- ) y" e ^* d: N* ]& x2 c3 T
- uint32_t BlinkerTime = millis();9 {4 I5 X) N2 z3 A
-
; `% ^9 Q0 k9 Y8 _4 Q1 c; Y - Blinker.print("millis", BlinkerTime);
" K: U" k4 ?9 s/ n* ]$ R* w3 F - }) j9 G4 W6 w9 H# F
- void loop()
! w( M6 e6 I, ^( k9 R- {+ x& K - {$ ]) z) h- E7 u/ M0 h
- Blinker.run();+ i) }, K0 K- |6 p* I
- if (digitalRead(key)==LOW)
0 v. E2 O6 N+ a( g g& ]4 j2 ~ - {
4 W8 C9 A& A$ s; o - Blinker.delay(200);" l. m) [/ _& j3 {9 W+ f/ _
- if (digitalRead(key)==LOW)9 U) r; Z4 d& r! L
- {$ x2 j' q4 a& Q$ q/ }, k4 ~
- if (digitalRead(kg)==LOW)
7 ~( w2 E; l: X4 R5 g% A$ x- S - {$ C: l O( m8 f
- * N2 Q" z8 Q* ~# z3 D
- digitalWrite(kg, HIGH);
' H+ b* h7 M0 D2 J - digitalWrite(de, LOW);
, p L7 O) {" L ]" I* @' Q - Button1.print("on");( Y) t5 J/ d9 k
- Button1.color("#0000FF"); //设置app按键是浅蓝色
& r, W+ [6 h$ N# ^2 d: t - Button1.text("开启中");
1 E! O* [9 c" h7 | - }
/ o0 Z* h5 o o% Z9 F' y - else if (digitalRead(kg)==HIGH)% A5 Y7 X0 l- I
- {# A7 X, I) ~' o' L
- digitalWrite(kg, LOW);
9 w6 _! f9 x" ^$ u7 p9 a% W - digitalWrite(de, HIGH);
0 a) }2 U: u' E: u - Button1.print("off");6 H$ _( {( X0 i6 t/ T) y
- Button1.color("#00FFFF"); //设置app按键是深蓝色9 Z# i( A% F0 U' ~
- Button1.text("关闭中");2 M" s9 Q6 ~% m
- }
+ E! I" [* M$ z5 f! {5 b3 r - }- E8 ?* C# ~* T% B H5 }1 G5 o
- }
$ G* p! V+ B5 A( ~# z% L - }
复制代码
2 k& x; \+ X+ X ^( g, g3 k: k
我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html9 f6 y* ^$ G$ a# C; r( s1 [
) ^' H. m" M3 I4 [" n6 S, F8 f6 I8 E% ?! {把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。( U7 R: L2 |/ \# P! J8 u1 G
: _9 d( N$ h3 E. e9 A
# k9 @; |9 m" L. e |
|