|
|
本帖最后由 易记 于 2021-8-21 14:05 编辑 * p: I) Z+ E3 \; u- j
% G* O; k( D" p A: B
最近玩ESP8266,想做个天猫控制开关。7 t/ R' J8 a3 Z3 j. K; }
但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。2 i6 W- I" t3 f- {
还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。
0 K+ j& M" r- @. ^
! l1 s9 T4 K$ C+ p4 X; I$ X, z5 o8 d3 ^9 g$ J
) @ E, i- B" g" L- P+ i6 B" d4 L问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。
7 t1 e( U% G( G6 b8 B9 M# l7 R& W) U& P. P
* y6 M O7 V9 y! w# T9 ^1 X7 w# W% }% O% R7 Y* M" V
7 b3 {+ k+ k5 v* `. }# `9 J* v( |" T' y) L
到手,当然是拆拆拆。
( T: R$ U: ]' w9 O0 i
8 O r! f! d! D q+ y$ A8 q
+ y1 [7 v' b- S, t8 X
8 m$ u" y- q7 \) |, Q9 f" @
联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。; p% Y) P8 ]0 Z/ I e7 k
7 @- H. H* q% L7 s8 d
- U) o2 @% T( A. s% k) r+ M, N/ @* S @' R: f
继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。2 C( ?" W$ q" O$ w( S/ o! j0 H
( v g/ h w$ s: ]! {" o9 L- U- ~! v1 r
7 X% c: b% c3 w7 Z- D
) H1 j1 Z- A. u4 K, F: B电源芯片
9 R' W+ p9 s8 C6 c! u1 d. B$ y w; G* k
0 b* c- h# h# ?8 L$ s8 M# ^- C/ c6 n& }7 b- q0 e9 I
有一个按钮,按钮有二个蓝色LED灯
. F4 V `/ }& J7 S% Z) \- g
" M$ c! i% @! [& [7 p( u0 X z7 W8 o, S e5 S/ r
, A" u" ?7 L8 J m
8266
5 U, L# `& h$ ?9 P/ b
; Y$ j, M/ p: a/ W0 o* W( h
, I4 r% P! L* c0 _& I; g9 w2 p. q" `3 e
* B! O# y4 s+ d
! c+ t; r. E! I4 g: N& T接下来就是刷机了,版子上面都预留测试点。5 X) H% A/ u! Z! j
接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。 u. y5 v; v* e' A6 G5 D
, a' k, m$ @. C' t# i3 Q注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。
3 `* G$ m: R3 A' O! p! E要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 |
1 V& K- _, Z2 l9 o% U" V) P2 B7 e% z4 s
5 F/ B& S( K: \; e( ^3 O7 T1 p/ g! |, G. O$ Y
7 X+ u- ]7 E, m5 W( N
& N1 \, {+ U1 }2 V& H. R
5号脚位是继电器输出( v- |' H/ U& B4 D
12号脚位是灯输出
) d. r1 A8 v0 m0 `' T: h) T4 ] 4号脚位是按键: q0 R+ \: x; r3 j
4 `1 o5 C: j: ?4 T
7 T8 V% [1 n4 W, B5 [* P
4 p. _! _ U) e; J! P! R
& e. n1 a; d% u4 N) W
卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库
0 B/ }7 o' a1 i q! I3 y - #define BLINKER_MIOT_LIGHT // 设置小爱灯类库
- ]: `2 B1 x5 f$ c5 n. P ^ - #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库7 i w Q& Q) D, M9 l* i
- #define BLINKER_PRINT Serial //串口协议库. Q1 J0 I0 V6 V5 [3 u, V- N
- #include <Blinker.h> //官方库* h/ e8 v, c1 M) N7 M2 A
- #include <ESP8266WiFi.h> //官方库+ G. O5 e1 ~7 i1 e4 `' Q- |
- WiFiServer server(80); // 服务器端口号
/ ? Z) Z0 T& |* i0 D l
- M; `) v9 t1 I, \- char auth[] = "c4942fb1d5e4"; //设备key2 R8 K8 f- m s& k9 ^/ T& y
- char ssid[] = "wanboshi"; //路由器wifi ssid
' q2 b* m- J- C6 |8 F9 K - char pswd[] = "1365662999813586348220"; //路由器wifi 密码
& H& t1 O9 Z" O; t
' X6 _. k2 I$ ?# p- G7 G9 y2 M6 V- bool oState = false;
7 y$ k" I/ O# }3 Q# c - 7 C) G! D7 N4 r. {2 R- Y( }: R
- int kg=5;//继电器输出
J* @1 g. O2 b% G# G3 y - int de=12;//灯输出
5 ^) y% F' g0 @/ t - int key=4 ;//按键
) K" l' J8 L2 U4 R - //*******新建组件对象: H# Z7 P' z" X7 o5 J5 X1 M) \1 o' }
( s" q( o9 e- R( h1 ^! w- BlinkerButton Button1("btn-abc"); //设置app按键的键名
$ E; ~4 K% `0 L* J; H/ l U - //*******app上按下按键即会执行该函数app里按键
6 i, L2 I# ?) l) y: i& Y - void button1_callback(const String & state)- T/ _* U" j. @* {( k
- {6 [. l% s9 j& I' k' v
- if (digitalRead(kg)==LOW)
2 ^' G3 f4 v# U" |" ] - {$ C- b$ g% t1 ]9 ^- O& k/ _
- BLINKER_LOG("get button state: ", state);$ a- G5 p: b! \; b5 }: P% f
- digitalWrite(kg, HIGH);
3 n; [; ~' S0 J - digitalWrite(de, LOW);$ ^% _0 E5 E7 g/ m1 R$ i. \
- Button1.print("on");
: v' J" a+ D3 B8 F - Button1.color("#0000FF"); //设置app按键是浅蓝色
) i" u. i; P# p! V4 z; I - Button1.text("开启中");$ O( o" M* C+ D+ X5 ^8 P
- }
% q9 e0 {7 O7 [0 i, _ - else if (digitalRead(kg)==HIGH)( B( l1 D6 l! Z# \ w" s
- {
( I, |4 {) z% x6 O1 K o - BLINKER_LOG("get button state: ", state);; x" E: A( H. G
- digitalWrite(kg, LOW);7 P( Z" q% Z9 m( W8 D# E- v
- digitalWrite(de, HIGH);
8 l0 E! i6 e* z6 B! u# r - Button1.print("off");
q+ s9 f9 q8 E! z/ ~ - Button1.color("#00FFFF"); //设置app按键是深蓝色
5 E0 e: m3 p: K: D - Button1.text("关闭中");
" q! B- o! {1 c$ a- _5 d6 F - }
' c6 X- F7 m: ~; I - } ]( H8 c3 m/ ^) H$ i% ` V
- 0 l) |- e$ g0 ]6 M' y; V( B7 t
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++2 C1 u7 T1 V# S" c3 w! X
- $ {+ D0 O; U8 [
- //*******如果小爱有对设备进行操作就执行下面' x" ]( M" E- a; n
- void miotPowerState(const String & state)
0 q9 ~( n/ k5 y. S: M - {
9 D4 ~# `; Z$ B. u+ { - BLINKER_LOG("小爱语音操作!"); //串口打印1 K. S/ |( [( N! U& M
- if (state == BLINKER_CMD_ON){
1 ]) ~% Y) Z o - 2 ?! J6 g- c4 z8 `8 y! y; f! J
- digitalWrite(kg, HIGH);
/ z/ u7 S5 R( G - digitalWrite(de, LOW);
4 ?. ^; L; W, X8 c4 X, K% I - Button1.print("on");
* J u) c/ G" Z8 Z& y% l) r - Button1.color("#0000FF"); //设置app按键是浅蓝色
& H" ~' H' a; Z6 {7 e2 S3 ]. s - Button1.text("开启中");
+ x, N7 }5 k. R% [ u2 m2 j( f - BlinkerMIOT.powerState("on");2 `5 C6 Q$ `! _6 E+ y( n, f
- BlinkerMIOT.print();
/ `0 t z4 L7 F. Y: E, Q. D: ] - }% H) ~9 e! d+ j% v' R2 N! }5 A3 h9 v# ^
- else if (state == BLINKER_CMD_OFF)
& S- z' R2 P* F2 V9 x' _ - {7 g6 s) L" ?! ]8 d
- * p3 K( y: m/ k! h) ^3 X
- digitalWrite(kg, LOW);* m2 u* F. t7 Z' d0 r
- digitalWrite(de, HIGH);7 Z- F- o* N$ r3 @
- Button1.print("off");
5 S0 ]! W! }$ m+ l - Button1.color("#00FFFF"); //设置app按键是深蓝色/ P6 K! u: \6 ^8 @; @; ]
- Button1.text("关闭中");
, f" I+ p$ ]/ g - BlinkerMIOT.powerState("off");
: ~4 b+ t. v- k; U9 h5 d) m2 b - BlinkerMIOT.print();4 D6 ~6 Z: G& I% A/ B
- }
0 b8 f T' S% G$ ?. E0 F - * V% v2 |3 }0 D$ N2 `. G% c0 I' a
- 6 z! h3 ]: Q' k
- }0 [. X0 y# ~/ E, i( g1 |: l6 z; j
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
% C U D. t$ X! T, x6 z8 a - //*******如果天猫精灵有对设备进行操作就执行下面: D# I7 m. q. C! D* B
- void aligeniePowerState(const String & state)
0 G4 b% ^% X4 e6 a9 L1 c m - {" i) B, y9 o' Z
- BLINKER_LOG("need set power state: ", state);& w3 d4 u+ a3 j4 h
- if (state == BLINKER_CMD_ON), Z& G3 u. u2 U8 q4 L+ F3 J
- {) y2 ?+ E; j& R7 j" d- ^# \
- ' V7 o& b* Q8 W, v$ M6 L6 o6 N; _
- digitalWrite(kg, HIGH);: t7 J! f5 J" N+ @3 ]' Q
- digitalWrite(de, LOW);* P# f+ U- u6 z& t* r- N, s
- Button1.print("on");
6 h+ x$ g' n" D u1 u% O - Button1.color("#0000FF"); //设置app按键是浅蓝色
! f5 p! B3 I( i; T" p6 u - Button1.text("开启中");
: Z) C# o: R- x7 A' ~/ K - BlinkerAliGenie.powerState("on");
6 d2 Y0 h# Y, T; C( E: ?6 {8 q' N - BlinkerAliGenie.print();, c# Y- T6 ~' L: ] S5 p4 n" h
- }5 P0 V7 i: v! }7 k; O1 s
- else if (state == BLINKER_CMD_OFF)
" k. [6 Q: \4 R' D2 x; \* e, C$ Q - {
+ X: |; m. f0 A7 D7 [1 M" g -
8 ?* }, z% Y1 h& ?% V - digitalWrite(kg, LOW);7 j4 {" ]+ r$ h3 ]' w( k, r
- digitalWrite(de, HIGH);" _4 R2 Q. Z% U) C7 e9 x* ]
- Button1.print("off");
; z+ S! S4 u8 ]' V0 P( g - Button1.color("#00FFFF"); //设置app按键是深蓝色6 T6 w' d+ i0 C
- Button1.text("关闭中");: y! G- a$ @( t, L9 [
- BlinkerAliGenie.powerState("off");
( s: z7 V& B: n: N. j- E - BlinkerAliGenie.print();# l* T% D3 W6 G/ [4 B3 d$ C
- }
/ b) B. z0 \- D# h5 g - 9 x' ?6 p. I% g, ]7 k# N
+ @) w% J5 y" { |. q2 p- }
- c* l6 n" O3 q$ J) G u - //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次' V7 A7 m1 s; W/ U: K& s
- void heartbeat()' Y# o7 f8 k, i2 F! \
- {
3 i- e8 {% v# p - BLINKER_LOG("状态同步!");
$ b9 D5 s' I) }' c - if (digitalRead(kg)==HIGH) : c" H" c" y9 w( X9 d1 B
- { M( w" c) O0 Z0 r
- Button1.print("on");
5 r1 H/ R7 Z# r. _1 N# X! K - Button1.color("#0000FF"); //设置app按键是浅蓝色
. o4 X* Z( f' d - Button1.text("开启中");! `) _: W. W6 d; G2 |( ^0 I
- }) j* ?* B" N8 J1 C
- else
8 Z1 b+ a {+ r9 f0 G - {
! t. @8 M) Z3 D( x+ D0 t - Button1.print("off");. z5 h. W. w+ z2 Z* a- o' {
- Button1.color("#00FFFF"); //设置app按键是深蓝色
/ ~7 B0 g# K4 E+ `% d - Button1.text("关闭中");
\6 X7 O/ P) i% |8 L1 V6 ?9 w2 ? -
# q- O; M& ? U% g1 U1 g4 y - }9 N) r/ i3 i: w, j) i
- }) c- q5 A. g# d4 z! O! L
- //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
0 |- M. o# z, |7 D! w! W - void setup()" ~ G1 {: B/ j- d9 ?- r' i
- {. @) |, _, S" S: ]. K0 x
- // 初始化串口* ]8 @( ?0 B% \
- Serial.begin(115200);
# R. S8 r i( C& e3 d: J - delay(10); D4 \! x( ^+ v% {, S
- BLINKER_DEBUG.stream(Serial);
+ \$ e K$ n) _: I - // 初始化有LED的IO8 d" Q& k" r1 V. L `
- pinMode(kg, OUTPUT);
" m3 q- ?/ b7 n0 r( I - digitalWrite(kg, LOW);//初始化继电器上电状态 / ~: M. [4 S8 ~
- pinMode(de, OUTPUT);: p- E3 Q4 v( k- A: n4 o
- digitalWrite(de, HIGH);
6 Z: N# h) _% e) o8 `1 E8 I - pinMode(key, INPUT); 2 F+ L/ A0 d( c! a2 N
- Serial.println();
3 L0 d$ P- v0 W% a9 \0 W! S5 { - Serial.print("Connecting to ");" _0 M! C' i* n* A; ~0 q6 P) M) u
- Serial.println(ssid);; z: E/ z: O' j( ?
- WiFi.begin(ssid, pswd);
+ m0 n$ y3 `# D& Z! g3 w - while (WiFi.status() != WL_CONNECTED) {/ N% [5 q- u. t! k0 f1 i
- delay(500);
- ?# ?! w' g. g' h4 w - Serial.print(".");7 k1 T6 j4 h$ }
- }
. j7 C. n) d0 ?/ o' F - Serial.println("");1 X: N" L8 p0 e# {
- Serial.println("WiFi connected");
1 t% K4 g# W" Q, }/ K( M - server.begin();$ Y' j$ L& e1 p& q* Z) O+ N
- Serial.println("Server started @ ");& C( k0 Q) m* g o
- Serial.println(WiFi.localIP());# ~7 T# [) e" H, j9 E N- A
- //打印出IP地址,后期可以制作显示器来外部硬件显示ip
- O! e+ G3 q8 l' m8 r0 m5 ~& S - Serial.println("To control GPIO, open your web browser.");
6 w4 w3 e3 d% g7 F" c0 Z. A - Serial.println("To set GPIO 0 high, type:");
7 m9 t* Y9 D7 h1 c. P# {; [8 |) A$ W: q/ n! B - Serial.print(WiFi.localIP());9 I/ a" E$ l7 ^5 e! G
- Serial.println("/gpio/1");0 o1 Y1 Y$ g0 M2 u4 j
- Serial.println("To set GPIO 0 low, type:");
2 O! T- {/ k* `$ Y# h" g' ~( ^ - Serial.print(WiFi.localIP());
, o4 ?0 v/ L# ^' x! ^ - Serial.println("/gpio/0");- N/ O; M4 A" }0 U3 w
- Serial.println("To toggle GPIO 0, type:");& S* m- R; T; v* O
- Serial.print(WiFi.localIP());2 S. W8 ]1 D" B
- Serial.println("/gpio/4");* \0 S. i, I/ K8 A. g4 T# B
- . }7 x/ ?$ g( B6 m
- // 初始化blinker
( j2 w7 W& V8 w6 H. l - Blinker.begin(auth, ssid, pswd);6 K2 f- E7 }- u! N" V
- BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数
+ @9 O9 n0 X( H+ s i4 U! F - BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数
1 C+ e2 f: R) p1 \$ w8 o' r, i - Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。; K8 P( ?3 M% c) M4 I/ Z; B
- , x5 b8 x6 B( z+ I% x. x/ _
- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback3 f. m6 g, G M
- }2 G* j% Z! V. Z4 L5 M
- void dataRead(const String & data)8 i+ \- ], d" p8 T
- {
+ o3 I6 E! G* x2 F" w - BLINKER_LOG("Blinker readString: ", data);. z3 d$ w: W. R+ b
/ V% F* J5 J% s% d9 v7 C0 X% S- Blinker.vibrate();
' k4 o; k; o7 {' a* Q -
& ^' I# W. Q- C - uint32_t BlinkerTime = millis();
e/ m$ [+ W) E -
- M5 b, l; a9 u/ o9 W - Blinker.print("millis", BlinkerTime);+ P& ]/ `/ X6 k' ~0 E7 h
- }1 U7 b; M, R/ p& u$ d( O
- void loop()
/ i x+ z m7 o& Q! m! t0 d - {0 T4 ^9 s4 f( i" o& q" B, K* n
- Blinker.run();
$ ~, W4 ?. ] N8 D6 u1 E" G - if (digitalRead(key)==LOW)$ Y+ h5 A2 f) [7 o6 G/ q
- {" I# t* O/ @# F% Q N
- Blinker.delay(200);
8 X9 U) Z. j+ j! r - if (digitalRead(key)==LOW)* C, ?- l6 V, b/ p
- {
`5 ]1 D. a1 R - if (digitalRead(kg)==LOW)6 e# g Z9 z- T0 e* t* {, [
- {
# P. s* G0 |, Z- C l: V+ @+ V - ) R3 X7 K3 d+ T5 U( W
- digitalWrite(kg, HIGH);. L# d6 l$ K0 p& ]
- digitalWrite(de, LOW);& `, }$ d% q$ k3 V, B D! w; _2 Q
- Button1.print("on");
4 l! L, I, X9 s; M - Button1.color("#0000FF"); //设置app按键是浅蓝色
, H- s8 j, O8 [+ Q4 h - Button1.text("开启中");
) |" x+ b& c0 Z) m4 y) k. a& C0 ?, ] - }1 W! x* i' u: k
- else if (digitalRead(kg)==HIGH)
1 {1 l4 Q. c* [* D4 Q2 b - {
; x6 i- v9 h1 H1 R' i' h - digitalWrite(kg, LOW);' {' _* b; ~0 B, B) v
- digitalWrite(de, HIGH);
+ H, i1 U$ `; D8 U - Button1.print("off");, v! i, |5 ^& T2 @$ [! z7 `; ~( D
- Button1.color("#00FFFF"); //设置app按键是深蓝色8 l$ m3 n; n7 i
- Button1.text("关闭中");! I$ e/ o) r# i$ @) w- b
- }7 e f- \+ l9 q$ t, X1 v0 O9 g/ e
- }) n6 Q. a2 X) }1 s
- }) L& z2 T! j4 ?& u
- }
复制代码
$ |) Y+ t& k4 x) t& D5 i% L
. v% A8 `$ T. k4 g我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html2 H t% w) W2 H1 V' y! |, ]
4 ~: n8 [- o* w! a
把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。' I& {3 e7 L- U' M v) {; k
. e6 r; x- u' e' a8 e2 z
# {& S- J" s4 p |
|