|
本帖最后由 易记 于 2021-8-21 14:05 编辑 . t) I/ f; }8 A' F; _
5 z7 ^/ Z2 P" _
最近玩ESP8266,想做个天猫控制开关。: q1 t8 p5 m# _7 j" A$ Z) \ _
但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。
8 N P4 b. C. h/ t8 M( A$ G还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。1 |5 ?9 H M1 ?$ l( E/ ^
# c! k8 W1 ]* _) y' Z* `
1 I3 @* k7 ]+ V1 p. g$ ~8 B" x9 T) B, v
问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。" D. E: x1 J6 J
3 `5 `$ n/ n* V G1 y; ]4 i7 I
& d" U5 ?1 n5 e! I( [, c! ]& ]! \
/ Y& ?3 L' W, [7 g5 y: W& V
* Y7 Y7 |' I$ q, N$ H% R4 e. g* A! h- N0 }, e
到手,当然是拆拆拆。9 Z+ h( H4 a) `" D$ d. e
; h* N1 u# w( T0 h) {% j
6 z2 G( ^; x! M A) l- i" {
# b: h7 r8 w) K; |! U
联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。
4 b6 F- Y1 v$ k1 M. C) {
1 K4 O: }* o( S9 A) l6 N9 P* ?% C+ l3 }/ f2 K5 G
% G! p( t/ F2 t1 L2 ~继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。* K1 h! }8 l, B+ C$ J
0 a5 G1 _% \# ^+ l) _9 t% k
% ^2 n- m: _9 @! [3 t
. m$ M9 b& t* ~- m1 e+ t2 m4 E8 d1 p1 _+ u5 c* D3 j3 y
电源芯片/ n. C) R, W1 S! z
9 J/ [; e1 e d, [9 b
; _" N% M! X: H- r; z- @4 f3 R/ N; k
有一个按钮,按钮有二个蓝色LED灯
3 P( A: }+ P0 B$ L
6 g! ]% {" @) p% g" g4 q, T
5 _1 ~! \: h% D( P
! [, Z" o" E0 I! |" t
8266
3 m9 G- w) C/ a, ]
# W1 }. E+ a+ G$ B( Z% d# T
' ~/ y5 o! z( V; ]% U/ e1 {& f8 r6 d" }1 W: h1 U
8 N% W7 N* ]7 ]- M# z$ e- @( i$ O
. i4 {8 H4 G! u, Q3 I* t接下来就是刷机了,版子上面都预留测试点。
" [/ s. |$ U- W0 C接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。 j) x( c) H& R) V! B$ c5 C' g% W
1 k" ?% i* P" N& E1 d
注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。
4 }9 r5 V+ A9 M2 Z要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 |
1 c: F$ l; m$ X- D8 H: F: g4 B+ Q$ y& C& J. \' X2 H/ q1 r
$ B9 Q9 V5 `% N8 ^
. N2 `1 ?! c+ m5 f* } A$ O: e7 ?* j$ e- m
! V# H% k+ E! l6 ] 5号脚位是继电器输出
) Y) s, m6 l( y: } G 12号脚位是灯输出4 E* ^4 h% g* D1 t
4号脚位是按键5 ~) B2 l" U, s& {4 ?" Z
/ h4 c2 N9 d4 b8 H( X* Q" {3 ]( M- [" I; V. J4 g
2 x' k( [+ v- m0 ~6 Y+ e$ W, f% R
卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库) f3 s. C- H% c: h1 V
- #define BLINKER_MIOT_LIGHT // 设置小爱灯类库
7 o( P; ]2 `. w5 y - #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库& S& o3 A1 L$ p- U/ A
- #define BLINKER_PRINT Serial //串口协议库
) s6 j' x& F# B4 l& ? - #include <Blinker.h> //官方库
- M7 |7 o8 C2 Q5 O3 U: G. o1 ` - #include <ESP8266WiFi.h> //官方库" Y4 N8 ^. Y5 Q: ]
- WiFiServer server(80); // 服务器端口号% e V0 A% C0 @# L& E
: S' g! w& h* P/ P9 x- char auth[] = "c4942fb1d5e4"; //设备key
; v' B z. A; f! w7 _- F* A - char ssid[] = "wanboshi"; //路由器wifi ssid6 q( c+ \( \6 Z1 k, F" W
- char pswd[] = "1365662999813586348220"; //路由器wifi 密码
: Y% p1 c% b; t2 K0 E - ! A5 d7 b, \# N' u m8 E
- bool oState = false;! m2 C' h7 @ ?4 M D5 ?4 `* i1 n, n( a
5 {9 p; W* E B+ @7 x' }8 P- int kg=5;//继电器输出
, E0 M2 V1 J6 e( z1 b5 e2 e, t - int de=12;//灯输出
" s: c4 p: |6 {# L! S' r' x A - int key=4 ;//按键& L. X% a3 \! k( p! B
- //*******新建组件对象& T4 a; O% N# L
# y: w( [; W. y) ^- BlinkerButton Button1("btn-abc"); //设置app按键的键名
% s- W; W4 O+ r% Y/ x - //*******app上按下按键即会执行该函数app里按键' \; f3 c9 ^# \, V& Y" n
- void button1_callback(const String & state)
. e" `* W8 o- k4 s6 f3 }1 c- g" y - {6 F7 F# W/ b2 M! A3 g) u
- if (digitalRead(kg)==LOW)! f! E3 c! R! e
- {
/ |$ _& \' n% V9 \ - BLINKER_LOG("get button state: ", state);
7 c8 U5 H3 s0 |# L - digitalWrite(kg, HIGH);% T( o3 z+ a& O$ C* s$ G) N
- digitalWrite(de, LOW);
V2 |: w8 M; B8 i! E( U. Q - Button1.print("on");$ |5 _! ]- S- B) g) N3 A( ~' T) r- d
- Button1.color("#0000FF"); //设置app按键是浅蓝色8 T- B; L# }- m1 e. |9 n/ L( |
- Button1.text("开启中");; G" {% q. D- D2 `' ^; v
- }8 E& s& @$ {$ Y7 y( R B
- else if (digitalRead(kg)==HIGH)) Z2 Y( k5 @5 Q/ Y, {7 E
- {
- i4 c) D% n" @/ G - BLINKER_LOG("get button state: ", state);, P5 A' Y( u% M3 p( X9 \
- digitalWrite(kg, LOW);% e, L" V2 e6 }+ C& L8 Z$ n
- digitalWrite(de, HIGH);
/ q! V" O9 g/ j - Button1.print("off"); K- y; i+ w) D. X5 G% J9 _" L
- Button1.color("#00FFFF"); //设置app按键是深蓝色; z" D% s. }' W& J. x
- Button1.text("关闭中");8 y( r0 i+ ]% E
- }
$ |+ d( D$ t3 U3 J2 z7 g6 z; U3 q - }" {0 p; r" L) L/ }
- # `0 A9 S- x% v) p1 x
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
& {4 N8 X, h0 _9 R) t8 S - ( ?3 q# V$ u* i* k: x: i
- //*******如果小爱有对设备进行操作就执行下面$ T! d: l# t W( [/ Q
- void miotPowerState(const String & state)
0 @( d3 T& _, A7 V( g - {
1 n/ m! m. p- ^. B; a6 ` I - BLINKER_LOG("小爱语音操作!"); //串口打印& Z( {/ j k c0 Q7 f! y. Z. h
- if (state == BLINKER_CMD_ON){
* l2 g9 i! {4 y2 n8 j - E/ {% b! x' e. d9 k/ V, B4 Y
- digitalWrite(kg, HIGH);. c2 o. Z8 @4 ?- |% ~) `
- digitalWrite(de, LOW);
4 A) b4 t! g/ }9 c- N0 T' l9 n - Button1.print("on");* x1 ]% b; {; e; W$ D
- Button1.color("#0000FF"); //设置app按键是浅蓝色
[# S2 t* q7 E" C9 E - Button1.text("开启中");
4 c4 ^* v* O" L" U" s - BlinkerMIOT.powerState("on");
4 i- \# M9 p. g' s$ F - BlinkerMIOT.print();
2 f' b+ Y; E$ e/ l3 h' C& D' m! Z# { - }
, e2 w+ `$ j6 @( h - else if (state == BLINKER_CMD_OFF)
; v7 K9 Q1 K2 ?9 X" _# h - {( V4 \, @; U$ t3 ^% g8 m
-
3 ?4 p5 E/ s5 E1 o8 V - digitalWrite(kg, LOW);
' \& L7 I9 \5 M, u8 }/ M$ k - digitalWrite(de, HIGH);! n$ o! _0 l: |
- Button1.print("off");( Y$ O2 u2 A4 w9 _
- Button1.color("#00FFFF"); //设置app按键是深蓝色
: \+ x# f" `- S9 [: }; i - Button1.text("关闭中");
6 S0 r5 P& z) N, ~ - BlinkerMIOT.powerState("off");
! D6 C# p4 | l, t; D - BlinkerMIOT.print();- ]1 j$ s Q! v/ {: s. ~
- }
' H1 I; N$ P9 q% ], @+ I2 a - : ]+ Y. q& H: M- x: r/ e7 A
-
& W2 I( Y/ S% V4 v - }
/ n' x4 d4 {/ |0 O+ x5 I - //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ]6 Y( [# v0 G1 [. y
- //*******如果天猫精灵有对设备进行操作就执行下面
, y% M& C3 `% b - void aligeniePowerState(const String & state)
7 _$ o7 r; ?. a& b _" w - {
) ?; M7 s" q% P6 |2 C5 ~. M - BLINKER_LOG("need set power state: ", state);9 k# {( @& {. p
- if (state == BLINKER_CMD_ON)
3 j9 q4 o- }- @+ \) t - {8 }4 Y: K* @8 _( i; g/ D! G( s
-
0 q6 o0 x% T: Q# g ] - digitalWrite(kg, HIGH);
5 d1 U; i0 _' V4 z3 [ - digitalWrite(de, LOW);
0 y8 M5 `" H0 }- | - Button1.print("on");3 N/ a- [" K9 j( t i" O& v
- Button1.color("#0000FF"); //设置app按键是浅蓝色0 p6 Q. h# |/ c0 p. P2 d( Q& U4 H( g
- Button1.text("开启中");
& H+ q& N6 f0 D0 b; }/ L7 D& W6 h% P - BlinkerAliGenie.powerState("on");& o6 w/ ` u$ L3 q. s
- BlinkerAliGenie.print();
# B% M9 A$ z$ b! W0 p; Q _ - }- f* V# d+ J* @' x% o" k
- else if (state == BLINKER_CMD_OFF)
7 w* j" V$ W, ]2 r( Z) @, C - {
" ~* x, D& V' B' l5 p3 c -
% _. H. @( L& g4 E/ l" D6 G - digitalWrite(kg, LOW);
. f" }2 O4 U6 `5 ?. X - digitalWrite(de, HIGH);
. L1 X0 N X/ G: m - Button1.print("off");
7 N: b) R% i/ x, N' A( z: U - Button1.color("#00FFFF"); //设置app按键是深蓝色
( [) e" ~6 L7 t3 J5 h - Button1.text("关闭中");
7 a( T& q; F' v& X - BlinkerAliGenie.powerState("off"); B- B2 J5 @5 t( ~7 o) z% a
- BlinkerAliGenie.print();* C' M+ k7 z2 z2 ~2 H3 Q* d
- }+ T3 F- V+ @: @; l: f8 R
-
+ `# c2 y* J5 g. _ e+ h - . i+ |7 h3 ^8 Z# N# x. @8 b, @
- }8 s& R7 ]' v( R* [
- //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次
4 X) o3 g( q; ]6 r n0 h5 U$ q - void heartbeat()3 h+ u0 A; `. r" v p8 g
- {& r( s1 b% w, c
- BLINKER_LOG("状态同步!");
7 z9 L* f0 V8 K+ v - if (digitalRead(kg)==HIGH) 9 v. M! `9 p5 @% n2 [, j' f% ], w1 y
- { 9 r2 A' c9 r) g4 ]7 w! ?
- Button1.print("on");! v* q5 U$ S. z: L, i2 \1 U# a
- Button1.color("#0000FF"); //设置app按键是浅蓝色# h- T# Y. D- n6 S
- Button1.text("开启中");
5 U! A) C2 T& U8 q( T5 V8 X - }
5 d& J# W2 L" C# ] V - else
! L( _1 l* ~& i/ u - {
5 M! Z! q/ _; `, j( i' G8 a) N( G - Button1.print("off");
" M3 `1 E# ]$ k* _# c# u$ t# \! ~ - Button1.color("#00FFFF"); //设置app按键是深蓝色, g- [+ K9 i% b! v1 S
- Button1.text("关闭中");: {+ ]2 ?; y: M+ Z+ x, [6 D: U
- : z9 H' [" D# m( |, q5 A
- }
0 ]4 Y+ M6 s; O/ L9 \7 { - }
& D8 M; o& X, n6 n( d - //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
( e7 G# ^$ V8 T; w) s: u - void setup()
7 J5 D5 M) Z. q! r7 c! t - {0 \/ x4 {4 p) u) X) {. _
- // 初始化串口
* k v' |* x" x& S/ A' ]' B - Serial.begin(115200);' X6 i/ g6 F0 s8 A
- delay(10);
: D1 w( ^/ r. _5 c. Z! p - BLINKER_DEBUG.stream(Serial);
. L# S1 ^ E- }: m5 O2 \ - // 初始化有LED的IO
& N) p/ d" ]9 _0 } - pinMode(kg, OUTPUT);
, G6 g' H5 f* c" M+ a# g( }, k! b- P - digitalWrite(kg, LOW);//初始化继电器上电状态
+ |# ^! S/ [0 a/ Z4 X# S7 k - pinMode(de, OUTPUT);3 q4 m+ I3 c( @
- digitalWrite(de, HIGH);
# z4 M; E1 ^2 H - pinMode(key, INPUT); # ^/ \: ]9 j7 S3 m6 S4 V! J
- Serial.println();
9 b- n |! B, @* S - Serial.print("Connecting to ");
& y7 U. f& c' p4 [) S- _5 Q, l& } - Serial.println(ssid);2 G. ^( d G" @% u/ L3 ?
- WiFi.begin(ssid, pswd);
: t. j3 w- B- r% O - while (WiFi.status() != WL_CONNECTED) {0 U0 C \: N* H6 \4 _9 p0 M0 u/ G
- delay(500);
& @9 x$ o% A# l* r& j - Serial.print(".");2 W" R5 F& n' t) T E ^* g
- }' D V+ D! y4 |) m, s2 Q3 [
- Serial.println("");
& t' {% {( L/ d( J+ K7 X6 e$ b - Serial.println("WiFi connected");3 u |' |1 y" y& I f& m6 l9 Y
- server.begin();
7 j g9 A. F8 J4 C6 ] [5 s8 s - Serial.println("Server started @ ");
% L5 q$ k: A: [8 d& r7 S - Serial.println(WiFi.localIP());3 b. m$ M. K4 C# |7 H
- //打印出IP地址,后期可以制作显示器来外部硬件显示ip% j* f/ l* y) M8 U$ _) c
- Serial.println("To control GPIO, open your web browser.");
7 c8 u. H2 z: O9 p. R0 F# t$ E/ Z$ m - Serial.println("To set GPIO 0 high, type:");! s4 n! d) f5 j0 l" [, Z) C4 }
- Serial.print(WiFi.localIP());
& U+ D" }9 h2 M5 p - Serial.println("/gpio/1");! C; @. B" Y. Z3 _: X8 O* ^* V+ G2 w
- Serial.println("To set GPIO 0 low, type:");/ l+ o$ O1 `- ]# b; O8 r
- Serial.print(WiFi.localIP());
8 [3 I+ a. i9 I; [4 q4 b. L6 G - Serial.println("/gpio/0");# \8 W* P+ i. d$ h1 X/ I" D
- Serial.println("To toggle GPIO 0, type:");
: Q" B7 h4 }- f4 w: h) E0 l - Serial.print(WiFi.localIP());2 b1 k/ D5 n D$ ~; I t" B
- Serial.println("/gpio/4");1 L Q+ Q: b5 H' I6 Z! N3 j
- , g8 }1 }5 F# \6 C' R
- // 初始化blinker
9 R8 E8 R* N4 ~& T7 w+ h$ B7 u - Blinker.begin(auth, ssid, pswd);+ U2 v' u& |1 |% ?) y0 \
- BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数
" l/ R% p* l: ]+ Y0 [3 \( D, z - BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数
' ?' ?, D" d* V0 J: f1 k - Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。
1 y2 f( n7 |8 W- ` W - / a+ ^8 I) r; }" ]7 l* P; y
- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback0 U& o$ h, E+ T% t4 ~; g1 Q& o
- }
) l" Q$ L, G+ R% m - void dataRead(const String & data), X/ x a" ?$ L/ d) D, M
- {
5 C) y6 F- N/ Z) l8 U) [3 G. S - BLINKER_LOG("Blinker readString: ", data);
( P6 \/ F7 i1 w- E! `# M6 L
/ b6 C! L1 Z& | O- Blinker.vibrate();
" J6 T9 d3 P, g0 L' u -
/ H8 u4 G6 E; C0 J2 S - uint32_t BlinkerTime = millis();
& i1 l# V. C) i( U) O, D - 8 y- U/ W' D8 d! Z5 r* s
- Blinker.print("millis", BlinkerTime);; P" ?0 _/ ~$ ^ M5 Z! F
- }/ F4 a- n" h/ ] Q# X0 c. y
- void loop()
. t) }' h% [/ s5 n4 f - {5 I6 m6 {7 j& j3 A4 u' a) G1 c
- Blinker.run();
/ B7 C0 q. K9 t- a ]6 @! G - if (digitalRead(key)==LOW)/ X% a. t0 v% ~( _2 n
- {! L8 `( ], {2 N' ~( a) V
- Blinker.delay(200);: P2 e( R+ T q+ }
- if (digitalRead(key)==LOW)
n. e* k7 _ c& R, Y - {( T# }0 ]( d2 V* y
- if (digitalRead(kg)==LOW)
9 V/ j) t+ \. M3 E* z+ ] - {
* I' F2 G, o: C0 x. F: y/ c- ^ - 0 G2 O; a) x" O* j. m: c# b
- digitalWrite(kg, HIGH);
8 ?- q8 \3 D5 i* m. F" N( o - digitalWrite(de, LOW);6 ?; W: l+ Z1 @3 f/ b5 u
- Button1.print("on");8 Z* V& L2 _! L) N5 {
- Button1.color("#0000FF"); //设置app按键是浅蓝色
9 m+ C, O! ?( p! V - Button1.text("开启中");
! d5 g9 _# |3 }2 |- n8 Y7 h - }
0 b: p: b/ k( t/ n - else if (digitalRead(kg)==HIGH)
8 f2 x$ b7 |2 |2 b$ u; J2 U - {" \5 r- `* M0 _7 a1 \0 i
- digitalWrite(kg, LOW);, r. ?( `( q& b
- digitalWrite(de, HIGH);
5 F g: p- L" m$ J( o9 _5 V/ } - Button1.print("off");0 v J* c5 I& [. I C; h
- Button1.color("#00FFFF"); //设置app按键是深蓝色8 v0 L$ I$ Y! l; w
- Button1.text("关闭中");
" {) ]$ T5 P1 m" C5 U4 C - }5 u) m9 N# S/ P5 V( B* I
- }' K7 l8 s+ N& y7 ?/ p
- }
! b/ c, j/ k4 y, M/ d/ j - }
复制代码
5 E7 e& v! i6 S4 v6 A2 I3 S. b, s
# A- @9 h, V, H& B) d我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html, f+ u# H) G7 f. o8 {
1 g; y- @ }$ W3 D; R( r! L把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。/ D; T l! |7 J/ b* Q
/ {$ F4 ]' B: p. F$ Z& M; c" }! R( H$ I& J1 ?5 }) H, @5 h5 I' D
|
|