|
本帖最后由 易记 于 2021-8-21 14:05 编辑
2 g x5 Y9 Z6 A/ X
. S. T5 q3 i; q g& O最近玩ESP8266,想做个天猫控制开关。
o, K. S( R* y0 K/ B' y/ E$ n0 @但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。& S% `2 w0 ]7 v9 {" v8 `& W) J
还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。$ u' S( e" L' m
2 n% A8 r }. ]6 }
- ~3 }5 V% ^1 h) s( S7 O, V3 v1 d5 n& w, M5 V0 r
问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。1 F. e: a8 C+ J/ J$ c: d
: M- r8 K8 ~5 O. o; A! U
{' o, V! A# O2 ]9 f3 W" Q
7 C6 i6 z; |) P# N6 l9 G* R5 X' F$ w+ b; V$ }# e8 a5 ]
0 p x7 m+ x. M到手,当然是拆拆拆。' \) l) [- y) B& A( y
6 `( @- s2 e- ?; U! n+ \8 x$ n
4 [. P n1 M0 S
6 }4 |! `& X9 S$ F+ E
联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。# {1 S. E( u% ~% [; O4 V$ W, u& h1 O
R9 S( a' |2 v4 A! f; L7 I
3 Z( h& Z& l) g* s# m4 r
2 d+ Y( m, m; r$ S" P) |, N
继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。' K0 v5 G: |# x& V3 D+ J( W( o
. O# V0 M @/ h
& o- @* q% E+ q
/ i5 G3 O1 a6 o6 N1 q5 M6 ?8 [7 H4 y# b. h& J' p8 g% a
电源芯片
" L' U& K2 {: j4 X$ F2 @
- J$ M0 i) `; F3 G0 J2 u0 z6 f$ c, l" G3 a! q
# U( r: F: \; O有一个按钮,按钮有二个蓝色LED灯9 i5 q: T/ ?0 `+ f* d
& Y6 u0 @8 S2 A; V- `
; t: F4 u. ]; x; D; A$ |% a
5 m2 n" P P e( A& ?# P$ S$ i, P7 O8266
( Y6 g+ L8 `( r4 t5 \4 }
5 A; r7 O2 K( {9 L
) j9 b" W3 C5 O# _7 ~" b
0 L# X; t" T. }. t9 _ F& B$ V& V: j$ `, i7 O# d
: {. V! _/ t% U' J0 P& N+ o& W
接下来就是刷机了,版子上面都预留测试点。
2 R9 i; m0 z0 K接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。: F8 b* w- W5 O: A6 a
* w6 o5 i& E p9 m) i' h m; r9 S注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。2 _ @: n7 Y8 W& z$ F! c/ Z- w# i
要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 | , J, V" l' C8 l+ h* G- f9 u
" K/ V5 `9 _. v# \) o
* {* N1 d$ s+ O* c" X2 r9 @; M8 f
1 M# K* V0 m8 x- i" T
* V" ~6 @5 R5 _) U E+ S 5号脚位是继电器输出
, ?8 k6 V9 @5 z3 } 12号脚位是灯输出
7 Z" L9 z6 u* Q5 F9 I6 Y 4号脚位是按键
: v1 b0 L0 ?* U& A( j+ t& r
% ? u2 k; z$ V
& ~1 U2 J1 u4 T) Z' \' j0 c& s$ Y4 h8 m# @; o
2 y. N! ?$ @+ |& r
卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库9 `+ u- k4 _6 G8 a2 m+ w# O% g
- #define BLINKER_MIOT_LIGHT // 设置小爱灯类库
, w& P% y# a+ |/ \+ |$ R3 w, n6 t - #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库
+ G/ V8 J# C0 l9 [" h - #define BLINKER_PRINT Serial //串口协议库
' g1 ?# ?+ V+ p5 C& |* g - #include <Blinker.h> //官方库
2 ^, B/ `5 a$ C a. n/ V - #include <ESP8266WiFi.h> //官方库2 z2 j2 n3 P1 j( `
- WiFiServer server(80); // 服务器端口号
- q' ?. j. M0 D& z) U7 X+ y6 ` - 8 A' `3 Z9 [- ~3 p
- char auth[] = "c4942fb1d5e4"; //设备key
) l. j+ X/ t2 p& D - char ssid[] = "wanboshi"; //路由器wifi ssid$ _' `) E: X. x" {
- char pswd[] = "1365662999813586348220"; //路由器wifi 密码
# w. z3 S; f$ ~" o1 c - $ N+ Q4 |+ ^! @$ y
- bool oState = false;' g( g8 J+ N$ J! O7 k
- * {8 F6 h3 G. R$ q6 b
- int kg=5;//继电器输出
0 ^( |3 J% P1 t" J# q - int de=12;//灯输出
3 O. i6 Z) i; r - int key=4 ;//按键6 S% ^: i% [2 _1 G+ S
- //*******新建组件对象6 j6 M9 s6 G5 X, x4 Z, W
- 1 p$ N$ w& G/ \7 e
- BlinkerButton Button1("btn-abc"); //设置app按键的键名
# O( s+ m$ a" h( j0 R - //*******app上按下按键即会执行该函数app里按键/ q ^4 c m. _) O" M. `
- void button1_callback(const String & state)& }4 u1 E$ z! T+ H( |! F
- {! F, e& a9 v% A1 n
- if (digitalRead(kg)==LOW)
: Q3 s( N; {- ~! t4 E2 A - {
. q$ @9 } t: Z, q4 q6 M: j - BLINKER_LOG("get button state: ", state);- p* n% \6 ]* t" ^" r/ D5 ^4 S
- digitalWrite(kg, HIGH);. V8 _, i( `5 v3 }' N. N
- digitalWrite(de, LOW);9 i0 u, _! e; T, x3 e: `$ \; Q
- Button1.print("on");( g; l, J; M: j
- Button1.color("#0000FF"); //设置app按键是浅蓝色
! W/ J1 I4 y) B% y8 ^ - Button1.text("开启中");2 G) A- C- T: J' a& x
- }
C, J+ Y+ i6 m: {" Q; T% n - else if (digitalRead(kg)==HIGH)0 \' E [& o" V4 y
- {
6 g& r/ W" b- }3 ` - BLINKER_LOG("get button state: ", state);. J2 r) N" U1 y
- digitalWrite(kg, LOW);8 |! ~& o! v! K; O: N4 L
- digitalWrite(de, HIGH);
0 q4 V6 _% u) E3 F# z - Button1.print("off");
- i% O9 f* ^* C- C" @/ w4 ^& \. y - Button1.color("#00FFFF"); //设置app按键是深蓝色5 V) a# J. e( I9 m- g
- Button1.text("关闭中");
3 `& X {9 D2 t( m1 ? K# ` - }% ?) A; `7 K6 r' a1 g3 C9 x6 ~
- }5 C5 t8 U5 N5 w" f. Z1 d$ z
- * B" O4 \3 Q3 n& C% \6 R
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++9 T* v/ K* {( U- F0 h! c
8 G1 Y6 w, @! Q- //*******如果小爱有对设备进行操作就执行下面# o" Y6 I1 d) a) e0 P0 r2 V
- void miotPowerState(const String & state)
% [# l0 K4 n a8 t' ^ - {
) }- G6 T$ F+ \7 Y* P- e, F - BLINKER_LOG("小爱语音操作!"); //串口打印
0 ?9 k c$ T! ^2 L# d - if (state == BLINKER_CMD_ON){
- y) \4 P# P( s5 S, w8 x -
( H" \9 t; x- Z - digitalWrite(kg, HIGH);, n0 |* i5 k( C! k1 s: r& ~; M
- digitalWrite(de, LOW);/ D, r" E4 h, u, ]6 e% A/ \, @
- Button1.print("on");. ], ^6 G! X; m) Z, H# d- X# ^
- Button1.color("#0000FF"); //设置app按键是浅蓝色# B0 w3 M: A( [! j8 m
- Button1.text("开启中");
4 f* G+ v% M( R0 A% ~! i - BlinkerMIOT.powerState("on");
- h$ ~4 G0 l& ]+ R/ M - BlinkerMIOT.print();
* n8 z0 X1 N9 @8 r - }
4 j- ]$ Z8 {0 p, A" [* T - else if (state == BLINKER_CMD_OFF), ?7 d/ l9 G% b9 X, ~
- {
4 B7 o) L. J, L ~ - % b% s. t0 |3 t7 `
- digitalWrite(kg, LOW);$ W2 E8 U2 R" a" Y) x
- digitalWrite(de, HIGH);
- P; k) O- T6 _; L. | - Button1.print("off");
) F3 [+ D+ L9 r7 c8 b - Button1.color("#00FFFF"); //设置app按键是深蓝色
, o. D7 K) d" s - Button1.text("关闭中");1 a, h6 X F6 c
- BlinkerMIOT.powerState("off");# J; C8 K/ a& \4 w
- BlinkerMIOT.print();
& y K. n; i& T8 l. x4 K - }
( Q' o6 [6 ~- H - % a* l7 y/ e: ?' {+ L
- . t( B) s- S4 ?" `( T- u
- } u- h. l6 K0 ^6 a( b# d: M/ B; f
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++* T. Q& S* q$ j) Z( X% e0 R" j
- //*******如果天猫精灵有对设备进行操作就执行下面' R# q2 M* Y; n7 x9 f
- void aligeniePowerState(const String & state)% ^" a* }( h, j# I! ]( c% V+ @
- {' Z9 A- R2 W- K. l0 q% g. s
- BLINKER_LOG("need set power state: ", state);. x+ N9 d: g P r& n: a4 G( Q
- if (state == BLINKER_CMD_ON)
6 i) d7 J2 A& N# z - {
& ?) B& I( T3 N" y# E -
_/ d8 r U2 X" u# ] - digitalWrite(kg, HIGH); |# z: p( z% y) f$ O$ T
- digitalWrite(de, LOW);9 | u W$ O% w% | _( A8 \* w5 X
- Button1.print("on");" T" O. v7 [% W7 ~; g) h
- Button1.color("#0000FF"); //设置app按键是浅蓝色
/ [0 y; K. V( Y. f0 P - Button1.text("开启中");5 k0 s! N! L0 Z6 D$ s2 T* `
- BlinkerAliGenie.powerState("on");
+ c1 K5 O* s: ~+ U5 [7 ~4 a - BlinkerAliGenie.print();0 y, |% ^. B' h2 l$ A% Z
- }
% D5 S# q- k# C6 D) e9 x - else if (state == BLINKER_CMD_OFF)5 `0 s! Z' i r: W7 T0 W
- {
" @4 s- D# Q2 j. _7 d9 N7 F - * z- J' Y, _/ P+ X6 |1 [( |3 B) i( }
- digitalWrite(kg, LOW);
h3 b" s- {7 ]% { - digitalWrite(de, HIGH);. m4 } _% ?4 \1 c1 {
- Button1.print("off");8 }+ O* e0 r: M6 t8 b" u/ G: J. m
- Button1.color("#00FFFF"); //设置app按键是深蓝色
( |$ _% l- J5 g+ s - Button1.text("关闭中");% K' \6 r4 F3 d% q9 L9 V6 u$ U
- BlinkerAliGenie.powerState("off");+ T [+ x' I0 i, w& r
- BlinkerAliGenie.print();
& a* t" }) z. b7 v8 A7 E0 G8 m - }9 r4 @ {7 ~' X6 \
- ( s: U% Z2 k; ]; M% R
% e! u+ X: _8 x" [8 }- }
, h0 }- o) G$ Y" F: ` - //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次6 @7 ?, ^# \1 [- `1 D" H9 y: k/ H1 S
- void heartbeat()
9 _4 R# V; O O, G - {# E- Z* U! u8 L7 d8 @ R
- BLINKER_LOG("状态同步!"); " V v% j) j: R, c' I
- if (digitalRead(kg)==HIGH)
' |& w, s0 C. `! A- h% f5 z* N2 j - { 2 \5 [! _+ D3 w9 D0 D# i3 C
- Button1.print("on");8 w2 H$ C/ f/ a3 {3 c5 R
- Button1.color("#0000FF"); //设置app按键是浅蓝色
: X7 T$ ^! a! K" o+ x# u4 W - Button1.text("开启中");/ Q5 C& s, D7 _1 r7 o
- }
! C6 M z$ o+ i$ t% H - else & w6 s& s3 Y$ Y. h5 P
- {
1 q6 w' h+ W G U* U9 \ ?5 d6 l - Button1.print("off");9 K' E5 M: T4 `
- Button1.color("#00FFFF"); //设置app按键是深蓝色- o$ H& T! x* M( ]5 H8 b& v/ E
- Button1.text("关闭中");0 A( X/ p) I6 @; ~3 a/ `
-
! h, o! v8 a& T6 K - }% ?( p; C. {, {; g( g+ D9 I( q. Y m
- }
P1 u. l/ q# p7 g6 H i6 A - //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++& g! N# V7 L0 ~
- void setup()
# m% m. c8 `$ \; [ W# m5 Z - {+ x2 ]6 N- O; ^5 V
- // 初始化串口
! z9 U$ S3 r# k/ b8 R& ` - Serial.begin(115200);
. V% T, R, J6 P# K6 u - delay(10);9 i5 f$ e0 \9 `# U
- BLINKER_DEBUG.stream(Serial);
2 M* ?2 F8 C! n6 r - // 初始化有LED的IO: j+ o' D* V* [$ `
- pinMode(kg, OUTPUT); 9 K4 I+ ^0 g0 O# A0 ?, j4 Y' }" q2 Z8 B1 t
- digitalWrite(kg, LOW);//初始化继电器上电状态 # W, D/ e! \) H- W. j
- pinMode(de, OUTPUT);& T+ X' M* V O* n1 [3 |
- digitalWrite(de, HIGH);
* X. X+ J0 G$ t1 ? - pinMode(key, INPUT);
4 f& |. M. {! I$ \ - Serial.println();6 M0 G4 K) H9 J7 `* Q
- Serial.print("Connecting to ");9 q+ ?* a) k, G" j
- Serial.println(ssid);
+ V+ k- O5 S, U8 [ - WiFi.begin(ssid, pswd);8 P" M" V+ Y" x
- while (WiFi.status() != WL_CONNECTED) {& P5 ^1 z0 F- n. `" c
- delay(500);+ K* q. P+ ~! r: t$ V
- Serial.print(".");
! g1 K# d/ Q" C- O8 H% q% { - }+ @% `# K: ?4 k2 l t
- Serial.println("");
) B/ V" @% @8 G! U+ p6 _! U - Serial.println("WiFi connected");9 k# a: _: Q6 G& h( z
- server.begin();
6 a6 N) D9 \ u - Serial.println("Server started @ ");
. D l0 d3 A. j8 u) S* z7 o - Serial.println(WiFi.localIP());
# V% b0 I5 B% u - //打印出IP地址,后期可以制作显示器来外部硬件显示ip
" P1 a9 \# m8 L - Serial.println("To control GPIO, open your web browser.");
4 u: E$ y9 H' F; [) ~9 D z% X' ^ - Serial.println("To set GPIO 0 high, type:");
T- ^% V! f1 w7 `2 w8 _ X, E - Serial.print(WiFi.localIP());
5 n! Y. ~7 e' m - Serial.println("/gpio/1");6 j2 M# r7 N# W9 A/ O. C
- Serial.println("To set GPIO 0 low, type:");
% @0 p5 ]0 g. m; ~ - Serial.print(WiFi.localIP());; i9 l7 m1 J, k. x' p" m
- Serial.println("/gpio/0");
, u% [7 T# A; n) r9 t5 W - Serial.println("To toggle GPIO 0, type:");% V; K) d! M6 J- i8 E8 o
- Serial.print(WiFi.localIP());
3 o0 Z) ~" b& Q9 b5 } - Serial.println("/gpio/4");( F! f/ k2 S2 {4 f# j9 s
1 K5 P: M& b3 a- // 初始化blinker. w( p- U+ {0 i1 J% B+ s/ O. ~) M
- Blinker.begin(auth, ssid, pswd);- x. l& j! ~ L% q& p- E
- BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数! x6 y5 E3 o$ e }7 ?/ n9 |
- BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数
9 ~. z& N% ^5 v* Z L: V( G8 t - Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。$ B9 ?7 f) q- ]0 z1 R% W
: Y) k" V: u/ Z3 B+ Z- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback; j9 E* x1 S. S5 F) ^( ^% \
- }
- Q7 R0 E3 p5 M1 l - void dataRead(const String & data)) w% h* m+ v7 B) J# |% _6 d
- {% `- T7 D! {& C- n
- BLINKER_LOG("Blinker readString: ", data);
! C5 r; L6 |/ @) x! X - " Q) N- D" c, R g% m5 Y1 X
- Blinker.vibrate();
" A0 P3 ^# f$ L( n+ u4 j - / f" f" A) Z$ l4 `6 ^8 p
- uint32_t BlinkerTime = millis();1 x) z3 Z' {/ f2 Q6 b5 f
-
+ I4 L* T% \1 @* C - Blinker.print("millis", BlinkerTime);5 `( W( ^( Q8 e" S g @
- }
y% M- u" e q, u- b - void loop()9 k# U/ n( d0 O2 J; O. X
- {
) U% a u0 n& ? - Blinker.run();
* J& A+ M2 p. P& |8 B8 _ - if (digitalRead(key)==LOW)
9 _8 @5 v0 J4 H3 m' h# |) n - {$ H: o8 y/ q# P& F. e: k
- Blinker.delay(200);
- E- ]' U* X/ C; I2 s: h - if (digitalRead(key)==LOW)
/ K* R! w, [ w' C - {
8 R$ o( \4 d# P! T j - if (digitalRead(kg)==LOW) e- n$ s* t& Y5 p+ j% ~+ H
- {& N5 E+ D0 Y0 u! k7 R. S- X- \9 o7 h
-
3 }. ?5 }3 K2 \ K+ r - digitalWrite(kg, HIGH);
5 u9 j. p: n1 Q5 t - digitalWrite(de, LOW);
9 `2 U" f9 z) h3 R# S+ r9 ] - Button1.print("on");
* P5 v1 h; \: F) H; { - Button1.color("#0000FF"); //设置app按键是浅蓝色1 {3 E/ R6 g+ C
- Button1.text("开启中");
( F1 a! N8 m" v5 r* c" M% s - }
) r) V" X: X/ @ - else if (digitalRead(kg)==HIGH)
( S& Z |; g3 I - {
$ [; Z) h k7 e# K% C - digitalWrite(kg, LOW);% |6 g/ z1 h4 c
- digitalWrite(de, HIGH);
& x4 I& @! W; X! U* Z - Button1.print("off");" v D# W/ ?2 J# {
- Button1.color("#00FFFF"); //设置app按键是深蓝色
' B7 r0 G% [7 @ - Button1.text("关闭中");
& b, _$ I5 I( B$ t2 Q0 I, F* w. P - }# J) w n% ]% `5 {& |3 t' P1 v
- }
) C0 j6 F# b0 I; `2 h - }
, j: s5 D. y* o6 h" f( _; G - }
复制代码
3 ]2 b }) o+ y& s! z' k0 c$ Y1 ]# n, ~* M- A% j
我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html6 b4 {' Y x5 b" z u7 e5 A! \5 M
{( O! U# X7 K1 J @* g0 B
把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。
; m: P6 M8 H3 C! ?
! O" ^( m' q- K- V. @2 L
6 C% ?* }. ?2 ?9 P- N |
|