|
|
本帖最后由 易记 于 2021-8-21 14:05 编辑
; }6 i; K/ b: c6 v! P8 }; J
, n) ~7 @9 [! F/ ^ ?最近玩ESP8266,想做个天猫控制开关。" C. D- O8 G! e4 i
但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。
$ k1 t' X- w( F" w0 B4 ^& G还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。' c) [3 o# g6 \; [
) Z9 k; D, a" n5 H
6 F& z* ?0 q9 b) J# y
8 X. Q; |2 \8 f" o问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。" L; l2 D. D& w. P+ `
: W- Y8 T( M3 o0 \4 J Q/ i
2 p8 t/ n2 ]( U5 k( j% h+ ?
( Y/ o* c2 W1 N
6 A, _1 w( ~% ~, @. B
) }' E/ s6 X! l+ e
到手,当然是拆拆拆。
# u; P' `6 ?2 Z* _, R
- {' f l! m0 d* j; f4 B: B7 ]
) ]( r3 \( Y: H1 P& X7 w( d9 ]' v' H2 @! u2 d) `
联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。
% k% }/ z2 X u# i3 ~# j' W
, Q" T; J1 O \: }1 o+ f4 q3 N1 q" x5 n9 R7 _
# ^* m6 x" b) X) X- G2 E+ F, t7 l继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。 T; D8 B4 T# \' _7 X
! N& N& e( V# t
; V7 W3 b ` y" M5 O+ U
) f% C: w% R6 X' t
% n a0 T) r4 x ~" W; `. b电源芯片
# }4 E! f! k. R0 X+ O/ ]+ W" C2 N7 B$ p% {
) K! |3 s8 R+ c+ \. a
% Q& M2 u% i7 P1 l# y
有一个按钮,按钮有二个蓝色LED灯
( d: \( P0 {/ W% p
( |0 t$ M" v0 b1 o# n
8 i: @: i( X$ k8 Y0 K4 i* A, M2 O' W
8266
; F5 j5 G( A! E+ _' N! w
8 V' i& ]5 i7 I' _" V1 `. w
* E$ M' |- c: ?! Q0 O/ z
4 q3 x; K6 Q: p. O' F; @4 u5 V7 _- `& y4 z9 H7 I% A) `9 V
7 b8 f) D2 k7 T+ V
接下来就是刷机了,版子上面都预留测试点。- J; j* I8 c/ j
接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。/ y& O4 O1 L: @' X1 O
4 ~8 G9 K! D4 [4 @
注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。0 Y( V2 S8 g# E( [+ @
要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 | 8 t/ X+ l t/ d# K3 D1 J# M2 H
2 x% u# I# e; _& L% a
- E1 U/ r7 K- c5 d# |9 K) ^
% M. _& F0 g: P. `7 ~
4 p8 ~, Q. I5 h8 v& Q$ Y# I( H
) [6 d! _7 v# _- r4 {5 @' l& f6 L! y 5号脚位是继电器输出+ |) z7 F/ T' o, |+ B
12号脚位是灯输出3 p6 ~( N- R0 J: ]/ n
4号脚位是按键& a* O& V6 ~ J, q1 }) L2 H
3 O2 Z, o& ?! n; A
/ {: e7 o$ P5 S' u; p- L% j F5 q( s/ S" Q& \6 G: l
1 c3 N* l4 `) I卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库
H/ C2 E3 h6 D( y! G; t0 F- i0 n - #define BLINKER_MIOT_LIGHT // 设置小爱灯类库
' M* r. I p% K; h - #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库: q5 ]/ o9 x: D
- #define BLINKER_PRINT Serial //串口协议库' ~4 i' F6 ~+ l$ d6 p" S* T
- #include <Blinker.h> //官方库
5 C8 E) F* Z4 `5 a+ j2 t - #include <ESP8266WiFi.h> //官方库
: b) l/ F- I. \; B; c - WiFiServer server(80); // 服务器端口号4 [, P/ O1 E D* M Z H& U
( C2 G K9 m8 T2 N G& T( P( B1 [ a- char auth[] = "c4942fb1d5e4"; //设备key" ?% f# J+ E2 J# s2 j% h0 {6 W
- char ssid[] = "wanboshi"; //路由器wifi ssid
/ u L# V+ S: s$ _' E - char pswd[] = "1365662999813586348220"; //路由器wifi 密码
! ]( ]: Y) b- ^( G+ S+ ~; h - : I; L: u+ h0 V+ \# v6 P
- bool oState = false;
( e' H+ d; Z3 ^% m- @ - - C: R6 y% u4 W4 z6 @! F: Q4 s+ d
- int kg=5;//继电器输出
4 M# h" C" d2 ]. \: R, P - int de=12;//灯输出! M) e2 n, U) ^! Z. Q2 i9 g M3 u
- int key=4 ;//按键1 z3 t! o/ F" T0 ~3 G0 P0 N, p4 P
- //*******新建组件对象
- i |% @7 E; h- _, ~ @7 ]7 }6 N
% i1 K4 B" Q; I; M. P2 ]" Y w- BlinkerButton Button1("btn-abc"); //设置app按键的键名+ e5 I2 \3 m* u
- //*******app上按下按键即会执行该函数app里按键8 q: A8 W/ G" u
- void button1_callback(const String & state)0 w C8 Z' K5 w
- {
1 _$ m i p0 Q/ |. }5 [ - if (digitalRead(kg)==LOW)
% h0 Y# g' b! V* I4 h( K! A5 g - {
$ {' t$ C' q- C% P - BLINKER_LOG("get button state: ", state);
+ \6 T e6 I* x _3 ` - digitalWrite(kg, HIGH);
4 u, v* _" ]" { - digitalWrite(de, LOW);, m) [5 I- }9 S
- Button1.print("on");
! A0 r& R! Z0 }; Q+ G5 n6 S - Button1.color("#0000FF"); //设置app按键是浅蓝色
! O, z/ \9 `+ N- |+ ~! [. E" D - Button1.text("开启中");. o! _. K, L$ l J8 @8 I
- }1 o" E5 ]+ v5 [4 x; j7 t( v8 W- q' s
- else if (digitalRead(kg)==HIGH)7 j1 \/ t2 @" M# K
- {
3 [' `* R- g4 j8 R - BLINKER_LOG("get button state: ", state); ^- X4 W& I" F- h; V4 l
- digitalWrite(kg, LOW);
" Q5 u2 w/ S0 w y0 g3 z - digitalWrite(de, HIGH);4 j V7 b* f% u0 z( D) m
- Button1.print("off");
, {, P- b; C* U) x: u) J6 \ - Button1.color("#00FFFF"); //设置app按键是深蓝色
* k( ~/ h7 v/ {9 i+ k- U2 Q - Button1.text("关闭中");
. P8 ~$ s- w/ e$ | - }
& o' W$ u) F' k/ \ - }, [8 S& b$ k: {7 r
- 4 s& T; q! R, K" ]. Q
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++& R" j5 n# _) A
) t. R4 l6 t4 M0 |! ]% z( \- //*******如果小爱有对设备进行操作就执行下面9 |* z, _/ z& t' f7 n7 @$ c
- void miotPowerState(const String & state)
' J" k8 t1 W! T9 K1 k - {5 u0 x8 r, M9 D5 t
- BLINKER_LOG("小爱语音操作!"); //串口打印
6 `! V' S# M4 p. A0 g) ?' z - if (state == BLINKER_CMD_ON){
) w/ `( v9 v# Q7 d, S -
5 ?9 o; N, z* }1 P9 { R/ P - digitalWrite(kg, HIGH);
/ F/ K' G3 {+ F/ s - digitalWrite(de, LOW);
* k& J* U# M" p - Button1.print("on");) |- ~2 \: L+ p; y, U
- Button1.color("#0000FF"); //设置app按键是浅蓝色. o! B% D+ m' T v5 m3 ?' f
- Button1.text("开启中");* A+ w; ]* e! }8 b
- BlinkerMIOT.powerState("on");& m- A) X$ y9 ^ P# V
- BlinkerMIOT.print();
; \+ Y0 n, C) ^2 \6 { - }/ s) P. j& ?9 a, |
- else if (state == BLINKER_CMD_OFF)( u0 D$ ?! z! @0 ?: K0 z I5 E/ a
- {; n" p+ F" n5 U1 {& u8 G
-
+ m: L" C9 w7 V( c) f - digitalWrite(kg, LOW);; d3 {( t. O) D; X+ b
- digitalWrite(de, HIGH);
! {% d' C) y; S - Button1.print("off");
+ V& O6 Y$ I/ C - Button1.color("#00FFFF"); //设置app按键是深蓝色+ G/ r1 `( q; G1 |4 X' ~' C/ R
- Button1.text("关闭中");
: v; P6 }) o: N( Z/ [' p& m- u" x - BlinkerMIOT.powerState("off");
7 H, B) r6 X# q& P - BlinkerMIOT.print();4 r# E+ M% a. P4 \/ _' k
- }
+ N7 h# L& \, E; @3 M - ( H- Z, e" f. Z( G! q7 R3 m* s
- _9 ~* A8 O: w O8 F
- }6 j) r: ?, N, @4 U* y$ H( R
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
i! m, B; R6 [/ j* y4 y- k2 Y - //*******如果天猫精灵有对设备进行操作就执行下面
]! m4 Q; |3 |0 ` - void aligeniePowerState(const String & state)
( I- Z; u% R8 ]8 H [ - {
2 A1 ]# S0 W* |% z& `1 L5 X& z5 h - BLINKER_LOG("need set power state: ", state);
9 g2 ?+ I# J: s) S; Q0 h% n$ m - if (state == BLINKER_CMD_ON)! M- j' H; F& Y2 u3 o% x
- { o9 J! e( W1 z: Y0 Q
-
$ p, B9 {4 w: a2 D - digitalWrite(kg, HIGH);, j. c5 t" i8 ~0 w, d! c6 M0 O2 i
- digitalWrite(de, LOW);* U, I5 J7 A* [( }% i
- Button1.print("on");) H4 l# h) g% }. @! ?" ?" r3 u
- Button1.color("#0000FF"); //设置app按键是浅蓝色0 X% {) z1 F/ s! d. e( I" C+ _
- Button1.text("开启中");: {& S* _' v. _) n' M
- BlinkerAliGenie.powerState("on");
5 B6 ^0 b+ q. k% Z4 ? - BlinkerAliGenie.print();
) I, A, R" d- I: l+ ^ - }
& r7 T4 Y! C, g! v - else if (state == BLINKER_CMD_OFF)% `$ u" u/ X/ R- F( \
- {
7 K8 V5 P) I# u9 z- u1 a \ - ; z2 @; T- B& T% W+ s
- digitalWrite(kg, LOW);" m r; ?5 x% U$ W& B9 ?" [
- digitalWrite(de, HIGH);
) B! m* K! a9 L - Button1.print("off");3 J j) W v6 _! d. l6 j7 i
- Button1.color("#00FFFF"); //设置app按键是深蓝色
% v3 a3 N! I L+ z+ k, D% T5 ? - Button1.text("关闭中");, M" d- x" y2 q1 K6 c
- BlinkerAliGenie.powerState("off");, i Y+ j) @: J* V
- BlinkerAliGenie.print();
5 p+ }8 p: w+ J' p% F* } - }; ^8 g% M3 O: c! O8 Q- Q
-
/ _1 u- N! e S. F
1 R) e: F, N O* ^8 ]; U b- }3 P0 S5 O O4 v0 i+ i
- //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次
1 |" q; C/ T- r9 ~% u! H9 o" P& A O( J$ b6 B - void heartbeat()1 V; `/ o9 U5 V" r) q6 b7 B$ h
- {
8 h y5 O* Y5 h, c0 M$ _ - BLINKER_LOG("状态同步!");
6 R" n& u9 F) d5 O7 G - if (digitalRead(kg)==HIGH)
5 z/ U1 b( k* R8 o5 i' n3 L - {
* ~8 ]* h- C: Z% g3 f& D0 p4 T( l, D - Button1.print("on");- T2 T, r7 K: e. V% Z
- Button1.color("#0000FF"); //设置app按键是浅蓝色: @3 U. ~& x( ~, `
- Button1.text("开启中");
, s+ g9 x! \9 h- `# _9 t4 C3 a7 I - }* Y5 o4 a7 {' b8 H
- else ' \4 Z; k/ I7 k1 Z$ G
- {
+ e8 [' D& m1 G! V. H/ z4 c, N - Button1.print("off"); Y0 O: V( J' F( C
- Button1.color("#00FFFF"); //设置app按键是深蓝色
" x. B; m# o: p4 s; ~ - Button1.text("关闭中");# y9 Z: P9 C3 l+ j# w/ e
- & G$ ^# s5 d$ Z1 \3 n
- }! ?/ `* S! [. \" h5 Z: r3 [
- }
7 P0 ? O( V; x2 Y6 o - //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++2 d& U7 W5 F) q7 c" c6 I4 `6 ^
- void setup()
9 R4 i3 z/ D o- \ - {
( m( V6 I( {. g: C6 S- r" m4 X- P - // 初始化串口
8 \- L" G, {4 p4 n) {1 `0 s - Serial.begin(115200);
4 v; @3 v3 ~" X* e" r1 _ - delay(10);
' a# b. v0 }6 s2 s; q. j% m2 X. X/ Z - BLINKER_DEBUG.stream(Serial);
0 L4 H* C; D' P8 d: x - // 初始化有LED的IO
5 ^) F. d! a" r- K0 @ - pinMode(kg, OUTPUT); % ~. Q' M' |. @4 X
- digitalWrite(kg, LOW);//初始化继电器上电状态
$ @5 h" o. |! h4 W: j9 e. e$ u9 ~3 D& V - pinMode(de, OUTPUT);$ Y _8 M- p1 g7 G3 G1 g, r
- digitalWrite(de, HIGH);" `. E9 b8 y8 T2 n1 z5 c. N' q9 C
- pinMode(key, INPUT);
% W/ k X( \" g5 W% q - Serial.println();
6 A$ F7 p- j& K$ e1 d4 p4 O - Serial.print("Connecting to ");& w; D; \$ Q) Y, F# n
- Serial.println(ssid);1 y: M. }$ J& M% G! P0 m
- WiFi.begin(ssid, pswd);
" t+ }8 w5 ~5 Y/ `7 h0 M# V* x - while (WiFi.status() != WL_CONNECTED) {
, e( {/ x. `4 q) a( g3 c" ` - delay(500);& W% Q" c4 _" Y% e8 @4 R5 S. V7 h4 Y
- Serial.print(".");3 a# h, G' `% t4 ]; E; B. \; G0 A
- }
3 Z1 o, o. K7 i. v5 O% X" w; v - Serial.println("");# p0 u, A- F7 ]' q, \4 M
- Serial.println("WiFi connected");
6 ]2 A9 V; Z( X- n - server.begin();
5 `0 T$ M: @, _; @1 q" i) V& ~ - Serial.println("Server started @ ");& M; F1 y2 j2 t4 x K% _
- Serial.println(WiFi.localIP());
5 t; Z; V. t0 }" V% j$ O) h% w, d - //打印出IP地址,后期可以制作显示器来外部硬件显示ip. P F* C: _6 N. u" d! \2 Q
- Serial.println("To control GPIO, open your web browser.");+ W! C7 E Q5 ?5 X K# r
- Serial.println("To set GPIO 0 high, type:");
! n$ }( R* h8 G$ p* T* J - Serial.print(WiFi.localIP());
* V* P7 n% v! s6 @- c8 X- V# g0 c - Serial.println("/gpio/1");
' z9 e3 n1 w, e6 f% U - Serial.println("To set GPIO 0 low, type:");
9 \2 G/ S# W/ o - Serial.print(WiFi.localIP());
6 R% O, g7 E6 E# U - Serial.println("/gpio/0");6 w$ f) N- I9 N9 ~0 W" E
- Serial.println("To toggle GPIO 0, type:");
- W3 ~* `; M0 o8 @: k$ g( J% ^ - Serial.print(WiFi.localIP());
) b3 G$ J2 K7 j - Serial.println("/gpio/4");
; N& F* {# D4 F
2 m* m1 K( k) _9 D$ ]5 `- N- // 初始化blinker
* \1 w( j! m+ m- k0 f$ ? - Blinker.begin(auth, ssid, pswd);; r5 t; H4 r8 n; K7 B7 O; S" ~, `' V
- BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数& k1 u5 |" F8 k/ N) b3 E
- BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数* U! I" K2 e+ h
- Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。* x, Q; l, N& B( ~; J3 _% R: @
* }; ?$ N v& T/ T. K- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback
" j$ o9 q4 B8 J9 E/ a$ V3 z3 t, @! Q - }
* }- a) B0 R l F# r9 s - void dataRead(const String & data)
) c# `$ }4 ^3 @, X4 M7 D - {/ a* q, g& X# k* Q& D
- BLINKER_LOG("Blinker readString: ", data);) M+ q# J/ ~' s+ ~3 a$ I
- 1 b) V% W7 C! j& d1 }" u9 d3 L9 a
- Blinker.vibrate();0 X8 X# g: E% f C9 t
-
# A/ ~9 f- _' y) i+ c1 X( Z - uint32_t BlinkerTime = millis();
8 K/ f5 ^1 ^# @5 i# e5 d+ K -
' a) E. _0 X8 B3 n - Blinker.print("millis", BlinkerTime);4 O [" m2 K- X" r6 L9 G
- }( h' F) v$ ?7 N- V
- void loop()& M$ X) ?0 T! e) G
- {5 p$ W/ h7 j3 w
- Blinker.run();8 Y) K& a: G/ d% m2 k; ^7 P
- if (digitalRead(key)==LOW)$ _2 k5 a9 r8 S9 d2 o3 b/ [6 V
- {: E" |1 e0 i5 T Y( @. O
- Blinker.delay(200);
5 v3 P: c, I4 C7 f6 }5 w# e* I - if (digitalRead(key)==LOW) y( l$ R+ I8 o( C$ Y
- {
7 [0 `7 ?/ j3 [. [2 Z2 ~, _ - if (digitalRead(kg)==LOW)5 I7 _% U. m* z6 ^: U* U4 p
- {$ ]* w0 ^# J8 K9 Q: Q) F
-
( g) ` m- ?) g1 q( Y - digitalWrite(kg, HIGH);% _3 i3 X1 p- |2 y- _
- digitalWrite(de, LOW);1 Y( F ?! m* }9 I' X n% X
- Button1.print("on");9 X5 [1 e% H9 S/ E3 u, R4 _
- Button1.color("#0000FF"); //设置app按键是浅蓝色
2 ^) ?) }, c0 I. @9 Z, M - Button1.text("开启中");
9 U% u! b0 t' \& N; b: N - }
2 r' B. v' z) Q, I - else if (digitalRead(kg)==HIGH): [& f- O: i Z0 l
- {8 Z2 l" m4 r4 _% N. k& h+ p6 M
- digitalWrite(kg, LOW);4 }3 l; Y( T$ q0 }( Y
- digitalWrite(de, HIGH);: d6 o9 x1 p% j. W9 s2 i7 {
- Button1.print("off");
8 j$ D6 j$ b0 s4 N: s; | - Button1.color("#00FFFF"); //设置app按键是深蓝色8 N+ q- C. {6 M& u
- Button1.text("关闭中");6 U/ c( R1 H, r G$ }& Q
- }0 l1 i, k7 t. A9 S C! ?- F, U$ A5 Z
- }5 }, F% J% ?) r+ x' C5 C7 L9 L1 ~
- }% y$ w- N* k! R) E- S2 ]
- }
复制代码 : m- j. J2 q3 e; l$ @4 J
8 B0 R! B4 z, n+ V/ N3 D我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html
! ?. Y+ u. z7 K2 v8 Q8 ]: V/ n
/ X* K8 f9 u1 a. n- m$ S1 `把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。
' W M; |3 E( Y$ Y2 Z& w4 ^ B2 @+ V! C7 j4 p, A
8 ~9 k! W# Y( X0 I, R. A% t |
|