|
|
本帖最后由 易记 于 2021-8-21 14:05 编辑 f* t$ G S) Y- g, ?- f/ M8 B9 Q
& }" Q( O! w! o- X/ `最近玩ESP8266,想做个天猫控制开关。
4 k, ^+ X+ k1 l/ v. c4 L* \但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。 |; r0 a6 v& X9 t
还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。
! W9 c) a' Z6 T+ @& w3 N5 @# _
) |! N, b5 Q8 R' W9 g9 k- w' m1 @7 I( S2 n7 b' e- D
9 x# F& W u" \7 p7 X
问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。
' K8 Q2 f( H" x" s o* T, D" N, n( ~! }* ?7 w, ^, C( C8 C j
7 l2 W( K) J8 E5 m6 a1 k2 m# U9 B$ B" D/ z$ }& m& ]
6 L8 P) b. _1 c4 o+ v. V7 ~
3 L8 {9 f- \9 `" `到手,当然是拆拆拆。9 h# n& \9 z( b% O4 ^) I
" ?+ [6 P( I# }- s8 b
3 Y' ~+ I7 N5 o n/ T
$ b' o% ~" F2 Y& ~5 p# @) ^联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。' H) C+ k+ I3 w# }4 `* d7 U& m, ^
# G/ q$ W+ P, M1 l# G9 J/ z4 I9 p! h& Q/ f9 C+ j3 v' H
$ c6 n9 h3 ?% G: D( B9 U8 U继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。
9 |+ \: Q" v/ I1 \
$ g9 z' h$ `# x
8 I. D" U* Q; n# |0 a: Y% D) J
4 e. b$ q2 w9 ?0 J% J+ M* @, ` x) Y/ c5 o' l, r/ c
电源芯片
" }7 E) `0 ~( Y2 I# t( x$ X) ^- m+ I. I* w% W" P& F: Y
; k2 r v" [1 ?( p$ u8 w3 F2 ~
Y7 q/ a0 w) m0 Y2 h有一个按钮,按钮有二个蓝色LED灯
; ? N- j; }$ s3 {0 \3 _
1 X& G H, B6 K; @* N) Q
+ x w* C" V9 P/ a/ O$ j/ e- K. p
* n9 K: ?1 _: z9 S2 V# }& ]
8266
* g9 m9 {3 Y, @: g" m+ {& ~1 Y
+ U* @! |6 ~( @( B) m
Y8 P/ Y7 ?: z6 k8 E
5 T ]0 [3 }5 ]( `1 C1 Q) z+ M7 z7 ]" {6 l, M7 L
* a4 v: t; u0 N接下来就是刷机了,版子上面都预留测试点。
! W' Z6 t B/ L" _7 m# I接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。
! `! F: o( a6 C0 @0 H$ h0 ^# Q
- c8 G! Y4 w' f6 V9 p, k+ |1 H, t& O注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。
+ p1 Q9 i/ L& f- {0 z要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 | / ?9 {4 O$ U0 a- x! u5 t8 M
" d: R8 j9 k" z/ M L3 D& z! r$ I
( l: p e9 B. S2 s4 g/ f
/ K$ e* U( {# g- M: _. [5 z+ e; E$ r
7 \% C' B1 ?/ u: f7 ~# Q: @7 G
$ D4 P p P; {5 ` Z) P, _. M$ }3 Z 5号脚位是继电器输出& o# j- \& o5 G, A
12号脚位是灯输出
7 s# r, g" t. r1 m 4号脚位是按键! g& y1 B1 X# ~/ f# B
& F. e" ?# A w M+ ^
\0 [$ o7 d. Y% W
- p' s+ R) r/ F7 G
# E- H! p# y. h& `
卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库
5 k1 |/ V4 Y; U0 a' _* O - #define BLINKER_MIOT_LIGHT // 设置小爱灯类库
V2 j5 c; j v3 Q+ Y - #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库+ W5 V+ `5 J3 Y& k
- #define BLINKER_PRINT Serial //串口协议库
r) f# H, }5 H# B- b' [ - #include <Blinker.h> //官方库
) ]( w( t# N" u. o - #include <ESP8266WiFi.h> //官方库2 R4 {3 J# k8 C M3 Q5 Y6 V
- WiFiServer server(80); // 服务器端口号/ p% W5 v4 |+ L8 t# S, m+ T
- + C! x, u+ y' }1 X
- char auth[] = "c4942fb1d5e4"; //设备key
, V- {3 I0 Z7 Q - char ssid[] = "wanboshi"; //路由器wifi ssid' S7 ^8 F. [ `; T0 e( A& |
- char pswd[] = "1365662999813586348220"; //路由器wifi 密码
8 E. l1 |. o& G W4 n* A' ~) G - W7 @, |4 Q4 Z/ }! V
- bool oState = false;% D4 F- O- o5 _, v; d3 A. t) d
- 4 H+ \1 Z, g$ Y3 A" `( L/ r$ ~" }
- int kg=5;//继电器输出7 Z& \$ a `5 ~$ y
- int de=12;//灯输出
( ~5 L8 U& ~- v+ { v - int key=4 ;//按键
+ L* H% N3 P8 ?/ b& N: q/ c - //*******新建组件对象
2 w+ ]% J; b( e8 {& c# \( Y - ' e9 h( z5 i+ C) ^! ^5 d* x
- BlinkerButton Button1("btn-abc"); //设置app按键的键名9 M/ z0 V$ \) ~5 S
- //*******app上按下按键即会执行该函数app里按键: m X* b# J3 I5 o% c
- void button1_callback(const String & state)' y$ B4 C, l: Y. Z( V: N! o! Z
- {
+ z3 N# K5 P8 o: {+ d3 L& c: O - if (digitalRead(kg)==LOW), t/ J: ~- U+ E5 Q" U) o
- {) |$ Q) O1 H) M' @) L- M8 d# A9 q
- BLINKER_LOG("get button state: ", state);
- n1 C. Z- J+ a! @* R6 s. ` - digitalWrite(kg, HIGH);
) {2 v! A! g! k' ?5 [3 I/ ] - digitalWrite(de, LOW);6 I8 A3 l- W! O5 Y; p
- Button1.print("on");
9 G$ P$ _0 q+ O ]2 `4 G - Button1.color("#0000FF"); //设置app按键是浅蓝色3 ?' G3 m: ?7 p: s& x1 }
- Button1.text("开启中");
5 L4 j' U( J* T# S - }
8 L3 l# K/ Q0 a6 `! S3 P- x7 U - else if (digitalRead(kg)==HIGH)
6 T/ r. [. U, A. [# H6 e - {6 X2 _" s6 n) H: s/ X; o( h
- BLINKER_LOG("get button state: ", state);
6 ]: V2 U7 V, O - digitalWrite(kg, LOW);
# u# h, a! y9 j1 d! ` - digitalWrite(de, HIGH);
2 U+ J' \# N ^( B8 [ - Button1.print("off");
: U7 _) b; G+ g, J# w - Button1.color("#00FFFF"); //设置app按键是深蓝色6 l. S; T4 z" m( V) ^
- Button1.text("关闭中");
/ v7 Y. Z# |% M. b2 J& C+ [8 Y - }
) t9 V# |( Y8 w( w* E - }, }" X% J/ E1 P& w
- - }+ _) I' ]1 Y# t. G$ E4 w
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++7 I' q( r% i2 t9 J
- $ H6 F2 n, p7 y- a: {7 v
- //*******如果小爱有对设备进行操作就执行下面7 K- V& z, j* t% d& Q
- void miotPowerState(const String & state)( M o' L1 d" C) K, [
- {$ Q' C& k7 j+ l! c* a
- BLINKER_LOG("小爱语音操作!"); //串口打印6 W! S- y6 i' T% H5 Z, M$ F) U! c
- if (state == BLINKER_CMD_ON){
; C | f2 |8 S" P# O7 n9 w -
" v7 E5 {9 U8 [ - digitalWrite(kg, HIGH);' C0 B4 F" y I# q; @: U; D# C
- digitalWrite(de, LOW);
% u0 d+ @( N. I m- Y' p; D$ ^3 d' I" W - Button1.print("on"); L0 k5 U/ u+ K1 V* e
- Button1.color("#0000FF"); //设置app按键是浅蓝色& c+ ~$ {+ b+ B" P! b0 o7 F
- Button1.text("开启中");/ z1 |1 J) \0 B* F6 g/ U
- BlinkerMIOT.powerState("on");
, H; @4 c( T/ C$ M0 Y- K. o. w# B - BlinkerMIOT.print();. [" | E5 K$ Q" y: P s) t0 t
- }
8 X0 O9 y2 P O f% g; s) t - else if (state == BLINKER_CMD_OFF)% _3 ?# u4 Z: T0 ?, R# R" k
- {
8 e6 ^4 Y4 G" Z! x# S5 _. t: | - 3 M/ C1 ]* h( ?0 f. N9 f
- digitalWrite(kg, LOW);( S. ?: Q5 f" d7 I# v6 _
- digitalWrite(de, HIGH);0 a& } ?- h) `9 S: p
- Button1.print("off");
; p' A {9 ? r1 \" |' c& i& @ - Button1.color("#00FFFF"); //设置app按键是深蓝色
: m- T) M! W6 t: ~; c/ X4 a - Button1.text("关闭中");
3 a% _; Z9 V* b, Z$ n9 [: `" M - BlinkerMIOT.powerState("off");* I; y, @5 ` b2 | {
- BlinkerMIOT.print();$ Y2 R/ w/ O. ~: ~5 p
- }% h( N }( I7 v3 U: J' ^' x
- . x: O- U: ~# K- U0 Q/ S
- 3 h8 ~) b( F+ m/ J+ t b
- }. ]: i ^3 B1 H, O7 Q
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
, J# l2 D- L* a0 G - //*******如果天猫精灵有对设备进行操作就执行下面& b, h( l# i# ]- F! K, G7 b; z
- void aligeniePowerState(const String & state)
% w6 k% H9 y8 `7 t$ p0 d, N - {
) R$ ?! Y' o4 D5 ]( z - BLINKER_LOG("need set power state: ", state);; ~3 c" P1 T4 R6 \% O
- if (state == BLINKER_CMD_ON)" C) c! d. T, Z
- {
/ D% k- Y1 u- ~2 G% E1 O& S4 b4 y - # a& a. `4 C/ M% z
- digitalWrite(kg, HIGH);
# a- r1 |0 k: c% o - digitalWrite(de, LOW);" W, z' Q8 a+ x- \
- Button1.print("on");
- L! C+ h- P% l1 y - Button1.color("#0000FF"); //设置app按键是浅蓝色
/ s0 O' S- {8 P; B( } - Button1.text("开启中");
1 g. C" R! q) v0 @ - BlinkerAliGenie.powerState("on");7 X, H; }; L3 w* C( {$ l% [, a
- BlinkerAliGenie.print();
; h/ F, w, j: y# w& ~/ K - }
& S# b! |) ~4 n# i - else if (state == BLINKER_CMD_OFF)
3 T8 K$ H2 O& N& R: C: O - {! ~5 O- e& ] Q; o* l1 M
-
: h2 U2 a* q2 B; d/ @ w0 G/ ~/ p - digitalWrite(kg, LOW);* C& I+ }2 b+ V% n) }
- digitalWrite(de, HIGH);. C/ e6 [) R4 H: C; i
- Button1.print("off");
& i; k7 p8 W% k( q5 V8 } - Button1.color("#00FFFF"); //设置app按键是深蓝色+ p. [4 {$ |& y" C0 X
- Button1.text("关闭中");
3 \% d" ^. c* L - BlinkerAliGenie.powerState("off");: f1 l! n1 V6 G. U7 z
- BlinkerAliGenie.print();* s* T. e" ?9 t/ ?
- }. B! \' L, u2 {% F+ Y2 o
-
+ r+ h0 ^9 }$ P- ?6 _ - 7 r4 w$ n6 e' o
- }
! {$ v" r% m# L - //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次1 |( \ z1 S# Q0 K! G) M6 y( Q
- void heartbeat()* ~( s$ C) ^% A$ T& |% G* Q# h8 [
- {
- ~1 u9 y3 ~+ }/ b( f - BLINKER_LOG("状态同步!"); ) o. `' H8 k: o" b8 l% f1 a
- if (digitalRead(kg)==HIGH)
^* r! {4 j0 N# O. s k5 G - {
1 l5 _; |- ` H2 g3 v& ] - Button1.print("on");
& u2 H$ |, }) Q$ {7 H - Button1.color("#0000FF"); //设置app按键是浅蓝色
( }1 o0 b8 j# y7 S - Button1.text("开启中");
5 J/ @& n$ U2 _; d" L - }% i% K0 u. l m8 r' Q, X
- else
) {1 f$ v! p( f/ k) ]8 i - {( I) W# Q5 v4 m7 H1 g+ a* ~
- Button1.print("off");+ V% S/ s/ ~! Y4 @; W, h
- Button1.color("#00FFFF"); //设置app按键是深蓝色+ j& O7 n2 r9 t* X* n5 x+ ]
- Button1.text("关闭中");
4 x( j8 `$ g2 D% l+ } - 7 G. Z7 _# I6 Y" @
- }$ N! h9 z$ X8 a6 D* r0 O# ]0 \
- }
7 X, b) \& V1 f1 ~. \ - //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++. [, F5 u. E, m8 v7 P
- void setup()# _: A% p0 |$ f! @; e% N6 e. p
- {+ @6 o5 D# ]; D+ y
- // 初始化串口
: N9 t `9 J& i& s5 P - Serial.begin(115200);
% T, m6 s9 u( h( _7 d1 B. l. Q1 { - delay(10);1 C* D+ ] \. W- f! a
- BLINKER_DEBUG.stream(Serial);0 ^, M- i6 c- i, }: h q3 S- ~
- // 初始化有LED的IO8 [" b: ]" j3 J. u4 Q
- pinMode(kg, OUTPUT);
3 ?' I' \6 v! s$ C - digitalWrite(kg, LOW);//初始化继电器上电状态 1 f5 R5 J) _! [% p
- pinMode(de, OUTPUT);
' \) y1 V" M7 M' w: w - digitalWrite(de, HIGH);
& _" g: i B3 F! `. u - pinMode(key, INPUT); - F; Z. a$ ?% D) a3 ?& B7 P1 d
- Serial.println();& k' w, c( N* Z M2 Y& ^% D
- Serial.print("Connecting to ");$ h/ v/ P: M H* }' R- c) U
- Serial.println(ssid);. W' W, X' a' f. A
- WiFi.begin(ssid, pswd);0 ?! f/ Z! Q5 w4 D' W
- while (WiFi.status() != WL_CONNECTED) {4 ]. \3 C( a% i( f3 m0 o+ d' W6 l" ?
- delay(500);
1 ~7 _4 e0 W( M+ m: ] Q! J - Serial.print(".");: Y9 j$ X8 j' ^& a4 s; a- {* m
- }
! ]6 V8 w1 X T, `3 p7 { - Serial.println("");8 O8 d- K X. j5 m/ O6 q; Y
- Serial.println("WiFi connected");
# y' K; N1 R. B0 U+ d - server.begin();
. o* Q5 V' ]" N8 a - Serial.println("Server started @ ");
5 K& A" t7 w5 Q% ]& H' s6 m/ c2 I - Serial.println(WiFi.localIP());
) M' D7 j6 |# f o: M! r; \/ g7 c1 A - //打印出IP地址,后期可以制作显示器来外部硬件显示ip
) s# C Q! U# u# U7 w - Serial.println("To control GPIO, open your web browser.");& g( q3 O" E5 V! a8 T
- Serial.println("To set GPIO 0 high, type:");
! L8 ]8 p9 Q0 r8 P( I h$ r - Serial.print(WiFi.localIP());
) j, ]) m# t2 ~ - Serial.println("/gpio/1");2 i, ?$ m- M* V4 ?3 V8 E
- Serial.println("To set GPIO 0 low, type:");& ]) P& @9 }# K8 x7 [2 l% ~
- Serial.print(WiFi.localIP());
7 o. O, a, {* @1 p - Serial.println("/gpio/0");, d* H: R5 [# l. ~6 x* ]7 k( d K
- Serial.println("To toggle GPIO 0, type:");
6 k# ]. f0 f1 S- A - Serial.print(WiFi.localIP());
+ r0 M1 u0 r0 A& b3 u - Serial.println("/gpio/4");/ Y; J& n+ c; T2 x! [, P4 Q
8 f- ]* ]4 J4 w, q6 P( Z( ?* w- // 初始化blinker
1 _; o$ m/ C8 z - Blinker.begin(auth, ssid, pswd);
0 l, ^$ S8 y( e# X - BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数; J) `/ `6 \* L# }
- BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数2 F' K, {3 m6 V* A3 {; \, Q( }$ E( z
- Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。* q) ?; U! F2 H2 b- j6 f. q
- $ ~4 P' x+ `, w5 Z/ P: r6 @
- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback
# _. N9 x4 U- `; L) \1 M) r - }' } a. c+ J3 {8 M
- void dataRead(const String & data)# t8 w6 ^+ Z, S0 `; J3 [: Z O# k3 ?) I
- {
, H( O' _5 I0 ]9 a5 P3 Y - BLINKER_LOG("Blinker readString: ", data);
* ?' ^ }/ u6 I" @
" l8 t8 G8 Y& Q- Blinker.vibrate();
" I. R9 B' y" b1 P, Q+ H; b; e -
3 {1 f! m6 S& k0 ~3 o3 W - uint32_t BlinkerTime = millis();. B: L/ X+ [& [0 k2 J
-
/ F: H; X1 P( L - Blinker.print("millis", BlinkerTime);
( L4 h2 {7 w$ ~8 \0 X! Y - }4 t k- C: f( Y) H! ]' }, m
- void loop()
; j& m- m& J0 U% h4 M8 U+ e - {4 O' O$ V- j# S7 Q) ~
- Blinker.run();+ U, R v/ J5 Z4 N; W7 I
- if (digitalRead(key)==LOW)) T0 E2 l9 _' S+ }
- {7 y, p# R8 `. y% X/ p+ E
- Blinker.delay(200);( s9 f+ J" N2 o% {1 \3 l i
- if (digitalRead(key)==LOW)6 w* z- g2 E3 D3 L# }
- {
: V1 ^- n8 Q2 ^! d* V% R* b3 ^ - if (digitalRead(kg)==LOW)
' i7 `4 z3 e# M! ^ - {
' B' R0 I; r# C2 j* z" e2 C -
7 }* ?% u. ]2 {! ^1 S: o2 q, W: C - digitalWrite(kg, HIGH);2 ^- ]3 `3 O% ?4 W: m/ u, y
- digitalWrite(de, LOW);9 P' S: W, z: o( A
- Button1.print("on");
8 n6 t/ |$ m: } o- d- m6 C* A - Button1.color("#0000FF"); //设置app按键是浅蓝色4 h A7 z1 A& D1 v' [% m
- Button1.text("开启中");
/ j6 v) p! f9 B- L6 Y' R - }/ `2 m5 e* U8 {: T. \4 n- T9 H( @! X! J5 M
- else if (digitalRead(kg)==HIGH)2 {0 m6 ^* U9 k9 N @' e. e [
- {
9 E# t& X9 @6 M- }9 x2 n - digitalWrite(kg, LOW);$ d* E- D0 O# B9 H5 n' `9 }- M5 @
- digitalWrite(de, HIGH);8 ~4 z3 A+ X# Y6 Y& c9 w7 c
- Button1.print("off");. c* C; v6 Y% z
- Button1.color("#00FFFF"); //设置app按键是深蓝色
) z$ p2 V* D" S7 i! | - Button1.text("关闭中");' Q" d* w) z' Y) p% X/ f
- }1 \% H% l2 ]/ T$ I" J8 ^
- }
" s4 M: I- \3 _. R - }
$ Y9 j0 M6 [" K- {! D7 y - }
复制代码 6 _0 [% V/ |" P
7 }. Q# G+ Q: E3 |# t
我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html
/ H v# @! | j5 A: Q/ ^" P' Q8 R$ n2 Z7 K% h1 {" J
把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。 _$ b5 _* G" h0 A: _5 Z6 N
. Q( f' C8 T0 y$ ~# n4 w
. p3 P) v$ R& A ?( O& m2 q |
|