|
|
本帖最后由 易记 于 2021-8-21 14:05 编辑 % y/ p5 h( b) p1 c0 N! o
9 @+ ^2 r- Y/ a2 p3 l1 S
最近玩ESP8266,想做个天猫控制开关。( h. o: [( k7 z9 h
但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。
# a. j. {! r8 T5 y* t还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。
* c5 L) t! m x
" Y1 O+ B0 Z! S$ `. t# L9 n& P8 j) X
' T2 J' k. \* j* E E
) F8 h- U0 [: X& O1 g+ G& {问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。
( G8 ~/ ]* _& t: v( \$ u& X p, c/ z7 @! c) r
- e0 A* @5 p9 \6 c! T
: [$ m: \. p% k# |& N/ a
: k/ `/ r( q! J- y* ]: j3 K' }* `4 f$ ?5 S9 i8 W% P
到手,当然是拆拆拆。
7 @2 |9 s! `. q, [% P3 T5 n
: W: H! v- o) f: D5 E+ F) y
( p/ V* v, c1 S) K* c/ w! g) j
# V' \. ?7 s/ |1 k, L联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。
: r, R( _1 n) N6 l" A: U
2 z8 z( K) N) u( [ D) T6 ^; u* H# Z& c) e0 A# X! w6 j
_6 H, e% w# _& {9 H, s继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。
5 ]$ ?: w% {2 |0 R- u& Y9 Y2 z
/ A# I. g! G- v& k( X
' I6 j7 t' \7 W6 B
: ] \- U/ V/ W. V
( T8 P* u/ ]) l7 X电源芯片* k% P1 S! P+ L2 }, r1 \ O+ h
; S! ]+ U$ p- {- u' B% z5 y" K# B) c
! w- }/ E5 m- c0 {+ {0 E1 M( J8 f; s
有一个按钮,按钮有二个蓝色LED灯9 g m7 _9 |% ~ ?& r
7 v7 [/ p" a T5 I+ Y
$ R, u0 X. [1 ?- ~! \9 \" V; N* ]
+ u9 q9 V2 }+ b- e7 Q# b8266! `8 ?; D+ y# q* t: A* i0 U
/ \5 c" n. K9 d6 V" q& Z) C
3 M& a! A) M- j# }) i
1 l7 n" y# f4 ~" _: |7 Q/ Z' b6 g7 u3 m
0 b( r9 i8 Q# F8 o5 }接下来就是刷机了,版子上面都预留测试点。
# m: z& {# _8 M$ S+ D" @: ^接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。
6 ^3 C! f( w" u
! y3 S6 T; C$ Z) m注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。
5 t6 g2 M% ^9 z要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 | # r3 ?1 t+ H) `2 D5 }( Q
! f1 N' `3 W% v/ K% Z+ p+ S, q6 _( {% t. y9 I# ~3 |& V+ e% q
. f; \) i% W8 `- M! q' Q0 b
`, v% [& L; ~2 T
1 p6 h2 f7 D% ^" ^. q0 q" M 5号脚位是继电器输出4 R4 G* ~, f2 C! m- E
12号脚位是灯输出: v: R# U" C `7 x7 B
4号脚位是按键/ Q$ r8 a+ O; V$ p8 V
2 X9 L, n# J# p* @0 Q z2 u( k
) A% @3 f% @! l' V2 J
- b8 V ]6 u- e0 o7 o6 Q& D+ W5 @3 m2 Z% X/ L r
卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库! o+ M% l8 F, v* y! ^
- #define BLINKER_MIOT_LIGHT // 设置小爱灯类库$ |8 ?* `+ H. y+ U) T( [
- #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库/ I+ d0 t: L9 W) |& W- R2 _
- #define BLINKER_PRINT Serial //串口协议库
2 E, X8 ]) O0 R, W, O6 S - #include <Blinker.h> //官方库6 {- Y- K1 N7 s: p
- #include <ESP8266WiFi.h> //官方库
- |: I0 M% n' O4 \* }& |5 Y - WiFiServer server(80); // 服务器端口号- Z9 C+ M% D* o: H9 M, r
( v. U, a8 b1 ]1 E- char auth[] = "c4942fb1d5e4"; //设备key5 _" z, d% t8 \& Q7 c O9 _
- char ssid[] = "wanboshi"; //路由器wifi ssid" _5 j) Z% f% h% R4 E
- char pswd[] = "1365662999813586348220"; //路由器wifi 密码
6 z( E w( W& J/ D' y2 {
& t4 k" Y! i R/ v7 I5 A9 S. h$ \- bool oState = false;$ o Z# @+ |+ p
* l9 d/ d$ t. E7 D- O- int kg=5;//继电器输出$ } D- P8 u( u' S/ |% u/ x+ i5 y. W
- int de=12;//灯输出8 j1 s# K" p9 L
- int key=4 ;//按键1 v3 i k0 R+ e+ [$ q6 s; \
- //*******新建组件对象+ y; D) |2 K8 C+ E% r7 J `
- 3 T) K3 J/ V0 k, |
- BlinkerButton Button1("btn-abc"); //设置app按键的键名
1 K7 B, p( v7 s n - //*******app上按下按键即会执行该函数app里按键
8 J1 F$ h b# Y0 c# U - void button1_callback(const String & state)
% u* D# u% o; V: {" o - {) M a' Z; n/ V1 i4 h3 L* V* z
- if (digitalRead(kg)==LOW)
& f, K; K s ` - {4 x7 T$ I) ^: g s9 W
- BLINKER_LOG("get button state: ", state);
/ d4 V# s1 O8 X- u# f - digitalWrite(kg, HIGH);
5 k, ]" o# C2 R& C A/ q - digitalWrite(de, LOW);
+ U4 G8 N: \ a - Button1.print("on");2 R9 V: B0 b/ q( B- G
- Button1.color("#0000FF"); //设置app按键是浅蓝色
0 P e: U8 L9 i8 @0 z# S - Button1.text("开启中");
: ^+ K, d% k; T, [3 G' V% p - }
$ ~ K2 w7 J# K! D% m# o - else if (digitalRead(kg)==HIGH)4 ]8 W {" ~$ m9 c) e, ]
- {
3 ] f& Y2 k! N# v; C* Y3 B/ ` - BLINKER_LOG("get button state: ", state);
, t" o+ w8 U1 N$ {2 J( Z0 Z9 \+ A - digitalWrite(kg, LOW);
0 ^7 k' }- X! ~ - digitalWrite(de, HIGH);
; ^+ d) `4 a# c/ |( p; v - Button1.print("off");
: o/ l" p) U8 {; Q% C% n# M. B - Button1.color("#00FFFF"); //设置app按键是深蓝色
( U2 c8 j. q$ k/ Y( U: F - Button1.text("关闭中");6 g# y3 H* I5 h' @; P8 U! T5 y
- }
8 J: u1 \) j; L6 u - }
6 @9 k1 L" X e$ g# Q - : W* u6 m6 k( Z- x
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++( e- Q* B% x5 ^/ V+ _! ~2 [. k
- # ?. U. f3 `& J1 E6 S1 z8 C
- //*******如果小爱有对设备进行操作就执行下面9 B0 e, c5 G9 }" C$ u8 q. X
- void miotPowerState(const String & state)
5 s' ] ]! d. g7 `8 w3 f' I - {0 p z8 P8 N6 m; Q' i- k( d. d
- BLINKER_LOG("小爱语音操作!"); //串口打印* A/ J3 i# G9 e/ _5 o
- if (state == BLINKER_CMD_ON){
: ~5 r4 k/ P) d' D$ I4 V6 b: ^ - ; W* F2 u; D1 ], R" U; _4 W/ C
- digitalWrite(kg, HIGH);$ C$ j3 [- I/ J* `* Q9 H) s8 c
- digitalWrite(de, LOW);
2 k ^* N }( @; R - Button1.print("on");" i2 m- U2 r. R' S
- Button1.color("#0000FF"); //设置app按键是浅蓝色. \% Q& z( Y$ o( k; E3 \
- Button1.text("开启中");
, O% K/ M6 x. A7 w$ P9 c - BlinkerMIOT.powerState("on");
+ |3 Y O& T% ^. k9 w+ Q. ] - BlinkerMIOT.print();5 t( V9 f0 u+ Y4 a8 }7 r
- }
% k- J1 F5 M% O* e2 T9 t - else if (state == BLINKER_CMD_OFF)
9 T! D0 k2 P4 Z/ O* w - {- J0 W% K9 Q( `0 c$ ^* Q# I
- * Y' q( y* Z: y* d# g
- digitalWrite(kg, LOW);; s/ ?$ N- O- Q8 B
- digitalWrite(de, HIGH);/ ^& P1 Y8 j9 p9 W& K q7 c# |) m
- Button1.print("off");
# B3 O/ T; Q. B$ C' W% l" k" ? - Button1.color("#00FFFF"); //设置app按键是深蓝色* k& [3 }6 e' z9 V) K1 ?4 _
- Button1.text("关闭中");8 `, i) Q; U' v; [( k- Y( }
- BlinkerMIOT.powerState("off");
) D ~! ]+ b# J/ j+ X5 J - BlinkerMIOT.print();
5 f2 J; ^1 A, o0 S - }6 M. B% r g. K& c) Y- l L6 h
- * y1 n, X o4 x- \# {
-
. a' m# i, x% a - }
1 j, C: [9 t$ l# k/ Z - //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++6 g2 V9 r u, X% Q2 |/ j% @ q
- //*******如果天猫精灵有对设备进行操作就执行下面* T; o0 h1 w+ X4 c
- void aligeniePowerState(const String & state)
* F6 n$ ^$ {: o& D" k - {' i7 C1 k# i8 F. S3 }
- BLINKER_LOG("need set power state: ", state);
/ m0 F1 ~) i6 ]9 g+ d3 f - if (state == BLINKER_CMD_ON)# I9 V: B) g" Z/ E n
- {: l) ` M; j3 }) \+ y
-
. N- y# W9 @( a) Q8 B - digitalWrite(kg, HIGH);
" _1 M! o4 w: m$ s \, l; U - digitalWrite(de, LOW);
* i4 u: g6 l7 Q4 F( M - Button1.print("on");* N! y) y. [1 \6 V
- Button1.color("#0000FF"); //设置app按键是浅蓝色; H4 i2 b) U0 P$ P; |$ F5 f: o3 J
- Button1.text("开启中");9 D1 U$ r' y2 h# T
- BlinkerAliGenie.powerState("on");
( q* q- E3 P+ S `4 P* x! x - BlinkerAliGenie.print();: i( T% G/ G& m! t
- }) c1 [1 e( S5 z) u' Q$ J
- else if (state == BLINKER_CMD_OFF)6 n( g& J# E( T( @8 b ^) ]* |
- {$ L0 q/ T5 u4 r5 X7 B9 ~- ^
-
0 f y M: v' a) R' @: Q& k - digitalWrite(kg, LOW);6 ~1 n7 n3 Q i
- digitalWrite(de, HIGH);: R. b @8 Y0 F8 H5 w1 Q4 U+ i( X. ~3 W
- Button1.print("off");' o" k: Y; Z1 b- L: k2 B z
- Button1.color("#00FFFF"); //设置app按键是深蓝色, B: q. Y2 C: A' E: b
- Button1.text("关闭中");
! X- M3 Z! _6 {5 C2 _0 k - BlinkerAliGenie.powerState("off");
. J2 ^2 h4 ~6 y3 { - BlinkerAliGenie.print();
$ a$ P A* ?0 e6 |- q: z l6 A - }1 e2 J9 e' z, }2 I. [4 q2 O/ m+ v
- 9 V' |5 ?$ n3 Q( H: N; @! C1 Z7 [
2 c5 d$ o0 [+ t- }
- y3 b2 L; p" G1 {, r - //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次
7 J6 p$ z. z: c2 U - void heartbeat()
6 N% O4 L b# \ `# Y - {
/ [; A2 G% D5 s5 L0 v- k5 Y/ {8 | - BLINKER_LOG("状态同步!");
6 ?$ |3 t2 e' C/ @ - if (digitalRead(kg)==HIGH)
2 `/ b/ ~5 B" d$ j' g - { 3 B: ~# l/ Y) a$ h, a {' o) z
- Button1.print("on");+ H& P/ X' W8 [
- Button1.color("#0000FF"); //设置app按键是浅蓝色
5 g0 i4 i6 [+ E0 C" u( D+ m; p: S - Button1.text("开启中");( o/ }: x5 w/ j9 V) [: ?
- }/ {) Z/ Y! t. B4 m/ A
- else
$ `+ O9 L4 g ^ - {2 S+ G; O( c3 }2 a0 k
- Button1.print("off");
3 [7 e6 |! ? s6 l1 v# ~ - Button1.color("#00FFFF"); //设置app按键是深蓝色
+ Q" U: ^% |0 x( K* \ - Button1.text("关闭中");( w2 Z0 L5 W* ~. X
-
1 L+ ]. U4 e2 ^9 s+ F% k: a - }! F) j7 _( ^ Q* t' J1 s* H+ Y
- }/ f# o6 F+ C. V9 R( E' `+ r3 V
- //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++, y2 d! u) H7 X; k
- void setup()
/ s& w4 K9 k F4 | a; B w6 Y7 W - {
( ]0 O/ W5 z" n - // 初始化串口- z: u! Q$ \! x/ M U( `
- Serial.begin(115200);
3 e' A" q, h5 m4 r7 g - delay(10);
% u" y0 L% e- ?; v9 k" k1 \ - BLINKER_DEBUG.stream(Serial);
& U! V1 s9 K9 D* w% c( c4 g$ c& a - // 初始化有LED的IO
# H; ]. e/ g# P: x Y8 b - pinMode(kg, OUTPUT); ; R6 n9 o: E" y" D. O! D
- digitalWrite(kg, LOW);//初始化继电器上电状态 " {" C* l( H. N [( U
- pinMode(de, OUTPUT);
: `& G) N) }6 p. T' r5 S8 Q - digitalWrite(de, HIGH);& o+ {: |, W1 E: i5 g4 o: N
- pinMode(key, INPUT); 5 n$ V1 O6 |1 s% j1 ~
- Serial.println();/ x7 X, z. N5 z1 G- F
- Serial.print("Connecting to ");. \/ S& r" Y" E- i8 Q- z& \
- Serial.println(ssid);% I, U4 v9 o% P5 n
- WiFi.begin(ssid, pswd);
1 l5 H$ l7 p5 b6 H - while (WiFi.status() != WL_CONNECTED) {5 s6 g& T3 A6 D# ~
- delay(500);
5 L: h/ y7 q7 T2 u' F - Serial.print(".");, T% ~2 y! w! V, h( X+ \3 w
- }& `1 a' B8 Y' D% R0 X% [) g3 ^
- Serial.println("");
% p) c) t2 j9 z. s+ B( v - Serial.println("WiFi connected");* w: ]* V$ l- l% f
- server.begin();
4 y: C& v8 \. V" u - Serial.println("Server started @ ");
4 U9 w1 H6 s! X9 l* Z7 v - Serial.println(WiFi.localIP());; O* N9 H% ~- f$ u- z3 O
- //打印出IP地址,后期可以制作显示器来外部硬件显示ip8 t Q3 h; N! D. ^# n0 ^4 F2 e
- Serial.println("To control GPIO, open your web browser.");: j# ?; H/ e9 [8 a' O& }& w
- Serial.println("To set GPIO 0 high, type:");
8 R( }- o: ]5 Y$ |/ X) ~+ e. e$ z - Serial.print(WiFi.localIP());
5 v5 b4 O0 D; z5 S; z - Serial.println("/gpio/1");
1 S, O! u2 b* f# n - Serial.println("To set GPIO 0 low, type:");) y! O* E! [% J' w1 t% `/ X) L
- Serial.print(WiFi.localIP());' d5 t( U, Q( H1 C
- Serial.println("/gpio/0");
9 G/ p8 H7 B2 `3 d% x) T5 F - Serial.println("To toggle GPIO 0, type:");
1 y# x! Z+ P4 h5 v6 h1 v! F - Serial.print(WiFi.localIP());- u* d. x4 W4 y- s
- Serial.println("/gpio/4");5 i5 U# D* {" q8 w Q
- $ T' p4 q7 M z; @$ W
- // 初始化blinker( I9 {+ e' a0 o' K* e7 H7 }
- Blinker.begin(auth, ssid, pswd);# }2 m, a1 f9 b% j& q. w& ^: n6 G
- BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数) F p7 \( @/ y
- BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数9 k8 f& n& A8 L" z( ?7 E* J
- Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。
% v5 a! }9 K/ m: p! Z2 z
! T) {( |4 ~% C9 U% c2 L/ V- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback) T4 ?' Q% E u# {5 V; g
- }! C2 h# E: B1 ~1 w( d# _; w( u
- void dataRead(const String & data)
6 S# Y) s3 e, R6 }9 K. r; h- N - {# g) t6 P1 O$ O4 e9 Z
- BLINKER_LOG("Blinker readString: ", data);
9 n: ~% O7 A# u% N/ V. J G" p& ~3 s - ; D1 C9 `3 y( {
- Blinker.vibrate();
4 k# G8 d3 m( H8 ~' x -
_5 r. L- d g( U - uint32_t BlinkerTime = millis();0 A. x! C6 V2 @. k* M R" J
- " v$ r. F9 v* z: l
- Blinker.print("millis", BlinkerTime);# C' W* }" S! P6 {
- }
0 D# `. h% C- |) t - void loop()$ G$ Y5 X+ g8 w* c
- {
9 }. O- V8 V. j- p. A) v - Blinker.run();" D* a; G8 c9 u0 @
- if (digitalRead(key)==LOW)2 t, \+ l [ ?1 o* V% U) t1 `% @ P
- {
: m; S3 V% H* F2 I) r - Blinker.delay(200);. Y b' t$ Y2 C5 F* M: b4 k( Z
- if (digitalRead(key)==LOW)
) m- \4 i; e# t. r5 f) l - {& B/ O, l! [' `. u: I; G
- if (digitalRead(kg)==LOW)% A8 U& {: f5 k9 I& U4 x I
- {# Y2 I& ~3 Z- Q" W( C: T
-
6 f$ X9 f3 C1 d; ]. h - digitalWrite(kg, HIGH);$ t/ w1 E$ m) e
- digitalWrite(de, LOW);: j5 u" S# [" ]- u" F" U
- Button1.print("on");/ u/ ~1 |- o: F A( K
- Button1.color("#0000FF"); //设置app按键是浅蓝色
3 C' t3 R, C: e* V - Button1.text("开启中");0 E! G8 y k6 X1 Q, x; S
- }; q! }5 c( k5 I. u/ G
- else if (digitalRead(kg)==HIGH)4 I# l( O6 l( S$ Q
- {
/ o% C/ x# \7 m7 m - digitalWrite(kg, LOW);- \* F1 ~0 a5 l( E8 q, z9 e
- digitalWrite(de, HIGH);
# U9 u6 I2 l7 u9 y: K. E - Button1.print("off");1 r# Y+ L& W' R
- Button1.color("#00FFFF"); //设置app按键是深蓝色5 _+ G- u& \0 V$ p* r$ b
- Button1.text("关闭中");
# o) C# A5 ^/ N( e - }2 o8 q3 i8 F( P+ q, s& G
- }
' D% K3 }7 z6 _. o4 X5 l" W - }, ^% V, [* [2 r- J( O, S4 v1 n
- }
复制代码
' `/ j( ?$ l2 p$ k$ P+ P, s/ |! P) [, {
我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html
+ q, z, P" |% Q& v7 d/ g& y3 ^% `6 _$ `" @# n. k4 U$ _5 X
把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。# H Z3 M( m: r1 w
/ D( k4 q1 v; y7 S( d8 W( g @& I. P# ^) O1 ~1 P
|
|