|
|
本帖最后由 易记 于 2021-8-21 14:05 编辑
# ~! ]# w" B8 g' s6 e" ]- r) p5 e# M" ?3 j
最近玩ESP8266,想做个天猫控制开关。
2 B0 b& {$ S, w: T; }* l. q但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。
) H }* G" i+ x, m% o$ ]还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。
& I/ I' B# H$ l& g0 |1 ~
+ h4 y( e* V# G2 C" g8 w
! s1 ^% @8 y3 A% D4 L0 t
) K1 m+ _. P7 j& d
问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。
Z) v3 V* x2 I: v( n: J" c
+ o& `' f: a, X+ F0 \ [+ j) ?
* U+ }2 f9 T1 J# p
, x, {3 ]$ z" c5 O9 A
" B: B7 J/ n3 y6 w, x
) @ Z/ l% H3 S( u
到手,当然是拆拆拆。
: v# I/ o. d5 ], ^! h
( C/ M+ \1 j* l0 a6 D% C; {. |7 @0 x8 l) H
}! Y W4 ~; s3 M
联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。& V1 j* L% w# E% f( e7 G
* M* E. b8 C( J" @5 c& @$ }+ }' m
: V0 S% h6 L7 }! L* L& J: |0 p
" G' n& I# k% W8 a0 q继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。/ x* p- Y( J6 A, }7 _& O! G
- r+ G+ O6 D( x8 H8 m' e
+ `1 c+ b. a) k# m, J
8 B- P: x1 O7 P- n
8 L. `2 P/ e9 E1 T {* y0 z. I
电源芯片/ F2 |" o5 `! P# |0 I6 `
3 k7 R! H$ K/ h' U) Z
8 k7 O. Z7 S! D
/ u7 q) x J% n: ~* f @* N% S
有一个按钮,按钮有二个蓝色LED灯: q J4 i) A2 A. R2 D
! [; B6 i& w2 g. s& H p& k
" \7 W0 L/ }; D% P! c# w# ~: ~' @
6 } P5 l: k" \1 z5 I82662 w9 [, I$ M; s9 p" e
2 w+ P( g; G2 B H' O- J6 p) ]! X4 `
# E% y& A$ E# I+ U+ k9 H
+ L9 j0 Z& u5 o2 ^- V$ K. f, p2 T6 ~0 u- B6 i; W
9 K! ^8 f0 ^5 U接下来就是刷机了,版子上面都预留测试点。
! O! h v5 j5 F: i8 q' M2 u, n接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。
, q0 ]! d6 E( i) X
9 d" E7 E) \# r7 Q) ^0 T* q
注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。. q7 p9 y B1 B) f4 i A
要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 |
/ n, E W5 w p! T( [; X5 H. f# m+ h8 {& F
6 h0 w3 D8 m' ^
: L2 g( |: e/ h
) y. v/ R) G8 w) X
( Q1 [/ t6 n; k* p 5号脚位是继电器输出
7 ^+ I$ i! q1 J3 \) C 12号脚位是灯输出
0 e8 u+ K2 H# i. f7 v4 c5 _" c' B# i 4号脚位是按键# f2 M" [. G& l( p& s6 ^+ P
. x; X" \8 q1 I, d& b3 l
4 s. g0 z% V- x1 m! }8 }3 e) }
~: v2 {# e8 J" X, s; k! B
. [% D- g- K- A' w1 u/ B卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库6 E4 f3 x( G% z
- #define BLINKER_MIOT_LIGHT // 设置小爱灯类库2 a1 f* Y0 [6 H: i
- #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库7 [5 F2 M9 ]4 s h. @: h
- #define BLINKER_PRINT Serial //串口协议库
, w% C) h5 c! ~; N0 h) a - #include <Blinker.h> //官方库
% t5 i; g) Y) o - #include <ESP8266WiFi.h> //官方库4 r5 a# H% W) b" K* Y0 j: e6 F
- WiFiServer server(80); // 服务器端口号- z1 c& e( Z4 _
- 5 K, r7 j7 l' V2 x: T$ h, U2 \2 e0 z
- char auth[] = "c4942fb1d5e4"; //设备key
. ^7 w2 Z( D5 P; k! k- p: t - char ssid[] = "wanboshi"; //路由器wifi ssid
2 H9 [. y" i) v - char pswd[] = "1365662999813586348220"; //路由器wifi 密码
3 I" S6 q# h) \8 ]* O! F6 f
6 J5 j* d( L- [% f( \7 R- bool oState = false;& ]! j4 ~$ ^' o7 e. V- B
- , ?" |: C1 S% N4 D0 S/ }1 @
- int kg=5;//继电器输出% v0 I+ T W0 }& A2 M( K
- int de=12;//灯输出* P- D' M) W. k( \: }, S; Y
- int key=4 ;//按键
W/ F8 H; I; P - //*******新建组件对象1 e$ r6 Q( S0 i" R; k+ C {
7 D9 \ |$ w1 V- BlinkerButton Button1("btn-abc"); //设置app按键的键名5 I, I2 `% @. ]8 V$ [ c
- //*******app上按下按键即会执行该函数app里按键
: e: D; U' F7 g% B4 u7 s - void button1_callback(const String & state)- s' o7 W5 G9 D4 s
- {
1 R3 j$ Y. |. d% y, d. W - if (digitalRead(kg)==LOW)! J$ I# p* \) D) W- a& K
- {2 [9 d9 x) m/ M% e% }1 H m
- BLINKER_LOG("get button state: ", state);
/ H* c# n" ~7 U% r: R7 m - digitalWrite(kg, HIGH);- \1 Z% F3 z1 Z8 `3 J! x0 Q0 {
- digitalWrite(de, LOW);1 M# k' B! ?. o$ o
- Button1.print("on");
# T, z9 v9 B: J- M1 t - Button1.color("#0000FF"); //设置app按键是浅蓝色9 B/ C! c1 j9 k3 M; @ L
- Button1.text("开启中");
/ t/ p2 @. l2 x7 u - }0 T8 X9 d) f( A: i" M
- else if (digitalRead(kg)==HIGH)
8 z; R3 E' j" `0 h: _ - {0 a5 d! ^7 N/ @6 T8 [3 f
- BLINKER_LOG("get button state: ", state);+ h* G( D- \' c" Z2 T& A, U7 D; q
- digitalWrite(kg, LOW);# i1 M* P( H! v6 Z) }
- digitalWrite(de, HIGH);
& H# F0 P+ d$ N8 o& x7 y( n, | - Button1.print("off");' ^( s% m$ y5 V% h$ X i) _
- Button1.color("#00FFFF"); //设置app按键是深蓝色. s f! z+ g1 x* x. e9 v
- Button1.text("关闭中");
* S- B1 X) Y# W( f - }9 Z0 j3 D6 N& h! \/ n5 U( A
- }
& ~; q+ V0 q) E: k
_1 a" H* M) D3 h1 C0 V- //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ u# ^; y& }. ? ~
- 8 F- U$ m0 l% }
- //*******如果小爱有对设备进行操作就执行下面& C0 H. {6 k- [
- void miotPowerState(const String & state)
) Q) ?; d3 ]4 E1 }) P' v9 e" R - {* n1 u& f# B* D: L
- BLINKER_LOG("小爱语音操作!"); //串口打印
' H' j7 A& B6 S2 m0 @ - if (state == BLINKER_CMD_ON){5 [: E: _% k0 @5 a5 W% q; k
- ; p) C9 M" e6 t; e
- digitalWrite(kg, HIGH);
, l% W) o5 t& B6 P7 {- R - digitalWrite(de, LOW);
! P7 `3 g" e' A - Button1.print("on");
m% e' _4 {: v! _5 V - Button1.color("#0000FF"); //设置app按键是浅蓝色: ^% u* w1 y9 `# k3 F
- Button1.text("开启中");( k% ^. [. P6 h7 \
- BlinkerMIOT.powerState("on");
. R9 Y( W! m' e: M4 w+ C - BlinkerMIOT.print();
7 v& D* O, f( A1 l% K1 K* L - }, S4 Q/ I2 T# |
- else if (state == BLINKER_CMD_OFF)
u7 Q+ H" G( Z) a) Y% V0 A; I - {0 D7 f7 Y- r; `$ V: f- [- V# j
- / D; u' [$ i9 d, N( o2 F& D7 e
- digitalWrite(kg, LOW);" G4 o1 q+ b0 f. w2 ^4 r5 W
- digitalWrite(de, HIGH);5 X3 @4 z& w6 R+ v
- Button1.print("off");$ Q' h' J Y' C" x$ s
- Button1.color("#00FFFF"); //设置app按键是深蓝色
/ }/ D( f7 |& W7 ^8 j" X( E; h; P - Button1.text("关闭中");
% A; B, Y' C% y) G+ W - BlinkerMIOT.powerState("off");
: `' O% `# e$ D) `* X8 B- v - BlinkerMIOT.print();
2 Q. k* A5 J0 z; o- [0 u& J. l - }
1 @" A9 G+ n4 Y# `3 i -
7 P% l3 G' B% k k# j7 Y6 ?" R -
( N7 K- p) M4 O+ ] - }
) A( r$ @" B" F1 R7 j, p/ b2 G - //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
8 Q9 ?) s4 B) s8 Q b - //*******如果天猫精灵有对设备进行操作就执行下面7 S( a2 Z# }/ U3 M% S
- void aligeniePowerState(const String & state)# m; @$ u5 A" c( K
- {
6 u# @( h, ^, P+ P7 F, ? - BLINKER_LOG("need set power state: ", state);: b) m* l7 q3 {9 ?) C( k
- if (state == BLINKER_CMD_ON)) B( k6 K: [ P
- {2 m0 v, ^/ H9 d: H
- % O/ q. c' O% ~' x( S/ g8 n a
- digitalWrite(kg, HIGH);
+ I" Z4 N3 r% B( F7 G: i) H/ K - digitalWrite(de, LOW);
+ ]3 }% q& @1 U( T8 ~ - Button1.print("on");% D, H% C' o: S, [% ?4 G. U* i
- Button1.color("#0000FF"); //设置app按键是浅蓝色
9 C- F. b# o/ y - Button1.text("开启中");% L: A$ C; g% r7 \0 i0 l! V- V
- BlinkerAliGenie.powerState("on"); }) y' Q1 y% ?" D3 F0 S6 N7 W0 `" C
- BlinkerAliGenie.print();1 A/ k \- y% }& k, S
- }! S7 @- H4 y2 N+ Q$ h$ a# e
- else if (state == BLINKER_CMD_OFF)% z9 r0 R2 O" ?; z
- {. p+ q" B- a D& E+ |' O
- " Z& U# G6 r: w
- digitalWrite(kg, LOW);( s B0 v5 X$ |' y7 l0 J
- digitalWrite(de, HIGH);' `3 i8 [( ? d: N
- Button1.print("off");
3 W' _/ F+ `! m' n7 A } - Button1.color("#00FFFF"); //设置app按键是深蓝色
m4 F! O2 k) P3 T - Button1.text("关闭中");3 N9 p5 E0 h& m9 `9 S
- BlinkerAliGenie.powerState("off");& A9 ]; F# S: y
- BlinkerAliGenie.print();
& m) ~5 Y2 R! D J6 K - }* I# N s5 ?$ Z5 Q
- 7 s& }! o9 m* X# \) v
- ) B6 {' K% s4 f$ H
- }
: i/ h- m7 S6 i) S% c7 o* ^ }8 V - //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次* g( o# I6 ?4 M& w5 m f8 S5 x
- void heartbeat()- @" \& q1 I L+ i
- {' R' r1 q, G( u
- BLINKER_LOG("状态同步!");
) U8 s K% ~) q$ I% ?: G$ M* w X - if (digitalRead(kg)==HIGH) - m, i% Q, F2 X, X1 ^
- { : \4 q# X* ^! t, C
- Button1.print("on");4 b5 M A6 m+ B* X# K9 O2 H
- Button1.color("#0000FF"); //设置app按键是浅蓝色$ n0 L2 l2 `; l: D8 |
- Button1.text("开启中");
% J: F) o- I6 C9 ^. _ - }( k' A9 L6 a, V. N9 i+ j- L1 {( P
- else
* t2 w1 v* k! ^' d+ f6 \) M - {
! f' r" u- m$ f0 Z8 q; X7 m. S - Button1.print("off");' B' a9 W+ c2 `3 i; `. o
- Button1.color("#00FFFF"); //设置app按键是深蓝色
0 L7 H Z" {( o/ C) Y - Button1.text("关闭中");
/ t5 j0 b; Q4 i) u5 E2 }8 \ -
9 x' l9 j, \$ _* o' i - }. D" p8 \3 Z3 P! B& L9 K" u
- }
, p5 a4 p" H( R8 x2 G0 q& Y - //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
! d! m( I# k0 r2 Y! v9 L6 o' w5 n - void setup()
& C# @2 r- X; [ K - {
, t) s6 r c: g - // 初始化串口
1 t: }! G1 c8 w6 S - Serial.begin(115200);6 S& o. @) c1 t8 U1 v( }3 E
- delay(10);" t6 X* O; ]& ?& H
- BLINKER_DEBUG.stream(Serial);
1 ]& \$ Y. c+ i9 e - // 初始化有LED的IO
! K3 G1 w7 }" h$ Y$ b# v - pinMode(kg, OUTPUT);
* m. u* e4 b- g6 N8 a - digitalWrite(kg, LOW);//初始化继电器上电状态
( l _2 [+ }2 n - pinMode(de, OUTPUT);
5 x: ?3 J# @. I5 Y4 K% b8 H - digitalWrite(de, HIGH);
& O( Z2 y+ w% B# S& E1 y( N - pinMode(key, INPUT);
, O% f, V9 x: `3 x - Serial.println();% o1 Z0 R9 V9 M8 g4 T( z+ ^0 _
- Serial.print("Connecting to ");- [. ]! D, }* k! ~8 |" F! L
- Serial.println(ssid);
( D; q# h8 K9 y - WiFi.begin(ssid, pswd);
. v# U' \8 ~5 I* j3 S" A" n: G - while (WiFi.status() != WL_CONNECTED) {' w% k) j) _' W+ K% O2 C7 `
- delay(500);
! a# d9 P. s1 y; \6 `; c$ C - Serial.print(".");( v3 w) F* w7 f* q0 N' Z
- }" a# }# ?: _9 t" H1 Z0 I# l
- Serial.println("");
& x' Z# T8 L( |0 L0 ^4 m - Serial.println("WiFi connected");3 }1 `; f. G5 ? y" k; E- `
- server.begin();& M8 O' T7 n/ T* ^1 e& B
- Serial.println("Server started @ ");
* F, j2 o' _4 w; ~) r - Serial.println(WiFi.localIP());
% W& u4 `/ U s- r0 ~: T- Q% p! \ - //打印出IP地址,后期可以制作显示器来外部硬件显示ip5 r9 }5 m! `: F' Z$ I" n2 }
- Serial.println("To control GPIO, open your web browser.");
8 m6 Z: U. B- e$ l" E2 R' J$ i0 _ - Serial.println("To set GPIO 0 high, type:");* @# B2 |: D1 _
- Serial.print(WiFi.localIP());
8 z% f: }( |) d+ p* V - Serial.println("/gpio/1"); W& Y) s( _6 T* L" p% S/ x
- Serial.println("To set GPIO 0 low, type:");
, z) P( J M7 N; `2 j/ ]4 ] - Serial.print(WiFi.localIP());
1 g+ [0 { e7 A4 B0 C; @, E1 d. B - Serial.println("/gpio/0");
6 I1 ?+ ~! G0 I y$ [! P" J' } - Serial.println("To toggle GPIO 0, type:");
, Q2 L5 y4 C1 H; o - Serial.print(WiFi.localIP());4 a4 O7 \# q5 i, O3 h9 G
- Serial.println("/gpio/4");
) _4 q% O* h; w" d2 J7 a. s - ; v4 W J) n# x
- // 初始化blinker
3 J2 C7 C, |) a2 J; u3 q3 ~ - Blinker.begin(auth, ssid, pswd);
+ T0 [" k; X* O2 H) s7 |9 ^5 _ - BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数
% g4 \8 H, D* s - BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数
1 E1 ?* j7 \7 n9 j - Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。" Y& z6 q" b+ V0 L, R9 C, E
- % [4 H1 K3 E2 N1 N& @" ^5 p2 K& @
- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback! I6 Q5 g- A. Y; o
- }$ C2 `% B$ H9 J, @
- void dataRead(const String & data)
! E0 j8 S8 k I2 h - {: B* L' s% o# A
- BLINKER_LOG("Blinker readString: ", data);
! x/ n# x) G; F: A - {- k( ~ r8 m2 k' d: @
- Blinker.vibrate();
; a( h( U$ M l* E7 W4 B/ U - 0 b% f8 V, k: `2 K
- uint32_t BlinkerTime = millis();
. Y; O! `2 {5 ?1 M2 f& I - $ f& q# f$ n/ A' d1 N7 B4 V' I, ]
- Blinker.print("millis", BlinkerTime);
( t6 \; k" {7 B p- f% M - }
7 o/ V( O; |$ m$ t. Y0 F8 P - void loop(), c6 @+ h. g! A5 K' g
- {0 D: o( W* Q5 M m$ F* v7 k
- Blinker.run();/ f5 d/ r! Y# X
- if (digitalRead(key)==LOW)& o; I4 N8 B ^' w) \: `' [* o
- {
# v6 m1 ^1 j/ l" k! J0 a; o - Blinker.delay(200);
' {' \ ^* Z2 q3 }$ W - if (digitalRead(key)==LOW)
4 O* b& x5 l% b1 l; X+ M - {
6 s4 c% {; n2 P( W8 t% i0 A# z - if (digitalRead(kg)==LOW)2 t# ?8 L( K& j* s
- {2 D: ^% a9 u( O7 O) j3 k0 {" ]6 J% U
-
, J, ^/ K% y' a* y+ A - digitalWrite(kg, HIGH);: D n5 Z( ]" F
- digitalWrite(de, LOW);% M% \6 Z" p7 |, n3 F
- Button1.print("on");
( o1 Q' \5 W& j* y! j - Button1.color("#0000FF"); //设置app按键是浅蓝色
! C$ l3 \) b- o8 f# M+ a! @ - Button1.text("开启中");) v/ M2 W# g5 D" R& H
- }3 a( {/ O* u5 W: Z7 U& r6 \! a
- else if (digitalRead(kg)==HIGH)
Z! a: u7 E. ~' p - {
: j; H4 W$ g" t, F x( W7 ^. D9 L - digitalWrite(kg, LOW);
1 U0 x: L5 X" \) V0 H - digitalWrite(de, HIGH);6 c: B f4 b2 F2 F! r. S' U
- Button1.print("off");
4 z, H3 K1 q, b* l! T - Button1.color("#00FFFF"); //设置app按键是深蓝色
/ q* n9 r8 Z G* [6 ]6 _0 X - Button1.text("关闭中");
- t0 G5 v, m$ i, U; p( j - }3 i, l- w' i( A6 j' d0 u: ^
- }
- l/ j4 S7 C9 ^; F4 z9 H' A5 ` - }2 v! [5 B/ u. {+ u
- }
复制代码
7 O. ~4 _' E2 v7 f g# c9 `) K W0 { k4 [) p7 O. \. z2 [4 H
我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html
X% k$ e& Y8 [' W, V$ K/ j4 N$ w, m$ U, f1 I& v( n1 V
把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。6 K( ]( v/ [9 u
2 d% |' z* |8 K( P! j" u/ [( O
' a+ b7 @% k. s+ B# N _ |
|