|
本帖最后由 易记 于 2021-8-21 14:05 编辑
0 e7 f6 t4 j T* \3 q$ g; D/ I Z$ S- \3 B( x1 Z' O' H3 z1 `6 y
最近玩ESP8266,想做个天猫控制开关。
( _$ p/ B9 _6 x" M- b) j" g& f: l. \- X% ^但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。- c V, U, W& ]; R* d. d$ b
还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。" y+ ^& s6 J& k+ q; U. A0 `7 U
6 [1 D- d+ K" e$ t, \
( y5 Q: C9 k' a/ I. r r6 T7 p; m& D1 E. \$ C5 `. Y: z2 l
问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。
4 ^- u4 f R) J, x: S. w0 W' Z* x) |% l; A6 p. Y
, W( F9 S9 e5 c
* z/ [* ^0 q0 u9 i7 V2 I# i( R2 x: d+ A' I! U3 _9 n
8 c1 w, G6 K a
到手,当然是拆拆拆。/ h: O$ @5 s W* ~- {
/ w$ _5 E1 o, Z* _9 d) P: J* d# C
3 D3 C2 j. [7 U+ i% \# }
: B- V, L) n& t" c5 E ^1 N
联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。! _/ D( t1 a& v& x
8 }: @' ~0 F1 N
% O3 t3 e* f& r5 h( S7 Y- M2 T
* u$ c$ ?2 H: h9 d/ D: K9 ]5 B; f继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。* g9 I( N* T& h) g1 s) D- ]
$ {" R1 V9 V1 U5 z$ E" ?
3 P, k7 l8 F: k2 {* V0 i4 C
# v6 X. e) L% c" `
) W C; _7 A0 d0 n电源芯片0 [3 j# J2 n1 Q- i# W* ~9 {1 S
5 K [1 a. v; J5 Y0 W/ s
8 y5 F6 j; n1 ^9 S" Z6 }! V& k
* M3 W. f2 n7 a( H# Q# I5 P$ N有一个按钮,按钮有二个蓝色LED灯
% L& ~/ R0 q4 E! x9 R. n1 ^9 H
" H4 V6 r. S, B: H3 R! r2 i1 _
/ k. i6 E- c+ ^3 d, V Q# G( l. v3 q) M( c
8266
4 E1 [7 ~3 B+ M% g Y' Z S
4 S' ~) U6 \3 }7 w" ~; |5 { ?! B7 q) [' g6 U
+ M: k) F( w3 _8 Q" H2 x
1 K( @0 e1 t% L+ M* h/ k0 o
* A( z ?- e# g! }: H接下来就是刷机了,版子上面都预留测试点。8 D3 Y: z+ m) @* t( c1 I
接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。
9 @3 s% z) u! k, E
+ L1 x8 O: R5 s注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。( E, q1 @ e1 D5 l6 k9 D
要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 |
# l" r) H4 C0 B* f3 `5 J2 R; { A" u) \& [; A! ]9 e! |
- q) n2 B& U, Y5 t
5 s1 y, q& y7 h9 J5 |5 t. |, b! }* m# u2 D
- r5 l$ l. A C( h3 L4 T1 S. k- N 5号脚位是继电器输出9 }# S9 ]. n# V- P
12号脚位是灯输出( H' _: }3 H. g( t$ Y. ?
4号脚位是按键7 P" n- d- Z1 g: Y! a3 ]% V+ |
8 h% ^3 d1 O& p& s4 S8 ? ^
% _7 e7 a, A2 L* D' Q3 l% R
. c) t5 s) Z# J! Y2 Q# T# [% `; y: K5 a+ k/ I
卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库: ~8 R) }. ]3 H4 U& l- [4 c( {
- #define BLINKER_MIOT_LIGHT // 设置小爱灯类库
- L4 ]0 j9 B: v/ l+ Q' r5 L - #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库 V8 l: P) T% ?7 ?
- #define BLINKER_PRINT Serial //串口协议库
, c9 w& S* M+ [6 Q. v3 o2 Z3 F - #include <Blinker.h> //官方库- ^6 o8 F" b2 L* A! O6 a, i: ^6 U
- #include <ESP8266WiFi.h> //官方库
; i! W& x9 B5 M& {4 M! f - WiFiServer server(80); // 服务器端口号
1 B: q1 I5 r" n. E; o! @ - . K8 L( Q$ K+ e8 _* M
- char auth[] = "c4942fb1d5e4"; //设备key( J P# {! Z: h- i7 s
- char ssid[] = "wanboshi"; //路由器wifi ssid1 S- i4 H! `7 g) _+ H/ i; p) U' Q; }
- char pswd[] = "1365662999813586348220"; //路由器wifi 密码4 `# G; G$ F" x' H) j
- ; j% h! d N9 G4 Q: U& r/ ^: D* B
- bool oState = false;0 [. y$ I) D6 @$ o3 S, O
) X+ Z1 G- a3 l) j- int kg=5;//继电器输出
5 C) q; f1 N- z8 @' y - int de=12;//灯输出( G4 {2 N# z% a# |
- int key=4 ;//按键) c7 I) K( f6 |3 k" s
- //*******新建组件对象- D3 D: P! F+ O$ V$ K1 n: m& \4 I
: Z1 {7 c+ F# R# \4 y4 a- BlinkerButton Button1("btn-abc"); //设置app按键的键名
: x1 C+ ~0 q* \' \0 g( i3 q8 W - //*******app上按下按键即会执行该函数app里按键
( o2 v. }. t" ]9 _ - void button1_callback(const String & state)
1 M( `$ c8 r$ a7 `* j/ N" K1 o - {0 f" f% P/ o, I: S; ]) g3 r8 n
- if (digitalRead(kg)==LOW)# }" |3 Z( w0 O$ g9 M; j
- {
: q/ m) c3 R7 t6 b# `/ F - BLINKER_LOG("get button state: ", state);$ E. _3 B$ J* x; l3 [; G& X
- digitalWrite(kg, HIGH);; n0 c h5 E2 d/ t& ` H
- digitalWrite(de, LOW);+ }' } n2 B# G
- Button1.print("on");
$ l: `$ c4 A" s- v( Y( F# X- ]5 q - Button1.color("#0000FF"); //设置app按键是浅蓝色9 D; P4 f, l! d3 d- {
- Button1.text("开启中");+ w1 b- p/ q7 m3 A1 ~
- }
0 r4 I2 @; X- N# v0 k% L0 P* g - else if (digitalRead(kg)==HIGH)5 s) v3 G* a) }2 a
- {3 e9 l% g' O1 ?% r! Y, F2 T
- BLINKER_LOG("get button state: ", state);
3 B4 S' z8 L. z1 m - digitalWrite(kg, LOW);& u6 M% L+ k; W
- digitalWrite(de, HIGH);* y# e; _ I" b& j8 f
- Button1.print("off");' l5 K2 B0 z" B3 Q+ n6 L
- Button1.color("#00FFFF"); //设置app按键是深蓝色/ @: u: `4 P" [* L* e' |2 l
- Button1.text("关闭中");
' Y7 ]& ~- i7 S4 d1 J - }( j/ r9 }* n L$ @4 E& u/ a: M
- }
# Z6 l) o7 ?% ~/ q1 ?
1 j% E$ c" M6 C" x8 |$ d- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- }) L4 R( l$ b2 B' G5 ~7 N( G0 h
/ o( }" f9 [7 \- //*******如果小爱有对设备进行操作就执行下面( G. ^# ^4 k* B1 x. h
- void miotPowerState(const String & state)1 v# {1 ], A) ]
- {: p/ ~% f" `$ n$ y
- BLINKER_LOG("小爱语音操作!"); //串口打印
l5 d, q Z8 f: `8 D - if (state == BLINKER_CMD_ON){! }2 R, L% R2 H2 z- ~1 e0 o
-
1 c6 S; O0 v$ V' v4 C5 ` - digitalWrite(kg, HIGH);
8 \# f' ]- Y) o( E$ D0 D - digitalWrite(de, LOW);% [7 B8 \ X T o( ?& J+ e
- Button1.print("on");
& i2 o K8 C5 U( i6 b- y' e - Button1.color("#0000FF"); //设置app按键是浅蓝色
$ U( W9 X7 @' B/ C% N0 i' G - Button1.text("开启中");
C: C' G b* z& [7 | - BlinkerMIOT.powerState("on"); m7 G( O% [/ W
- BlinkerMIOT.print();
; u2 ?4 |3 X2 V( ~3 S - }) q( d5 v5 e k4 `) c
- else if (state == BLINKER_CMD_OFF)
K( W$ P/ u% j; A0 z T+ ~ - {7 v7 [! T4 L. K% Z
- 3 X* m- Q, P8 a# [& R3 C. T
- digitalWrite(kg, LOW);
9 c9 u( N% Z* _% k - digitalWrite(de, HIGH);
! j6 Y4 ]) K% o; J6 t* v - Button1.print("off");. k6 b3 J$ j* ~. K- {: i3 |* x+ q& u& m
- Button1.color("#00FFFF"); //设置app按键是深蓝色5 e$ J" \; \; N6 [ i5 L
- Button1.text("关闭中");
6 c2 l8 P4 N+ z2 @" Q9 Q6 q8 p3 S - BlinkerMIOT.powerState("off");
+ I/ q' o6 W: U( q* s2 @ - BlinkerMIOT.print();. [& i5 O8 K5 p, v8 l
- }
( ~$ t+ u. L4 ^2 f, w -
6 v# N7 E3 w# T( b -
- W I. ^* z5 ~. @ - }
/ N0 P8 c6 ~/ g* @/ F2 [$ [! P9 s - //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/ b/ w6 R$ \9 X3 W! x# K3 H - //*******如果天猫精灵有对设备进行操作就执行下面
6 V Q4 A- c% e& B& ` - void aligeniePowerState(const String & state)
1 I" Z# M" F3 d* x' ~: p0 h - {$ u' g8 O4 z) m& Y) J# A5 W
- BLINKER_LOG("need set power state: ", state);
4 s* {6 B6 D$ s* H - if (state == BLINKER_CMD_ON)
1 j4 e$ _6 O2 K- D$ O - {
' K/ O0 t+ c; Y/ m. |/ u -
% l* g$ z5 k% P1 F& I) s c - digitalWrite(kg, HIGH);
6 W: E/ `: u. s9 } - digitalWrite(de, LOW);2 D7 ^" [+ w3 C5 v. D
- Button1.print("on");
( e' r, h3 g" p* N - Button1.color("#0000FF"); //设置app按键是浅蓝色: c4 Q! e( v \1 e8 Q
- Button1.text("开启中");" }* D) Y& g3 U7 _6 `
- BlinkerAliGenie.powerState("on");. e1 J& a) i/ c& ]' t8 y
- BlinkerAliGenie.print();
+ j. U2 j6 {; X( W% S8 O0 @ - }
4 r' F' I- X- v& V1 i. F+ | - else if (state == BLINKER_CMD_OFF)
( R9 v' W! ]1 y3 C( U' J3 X' i5 h - {' ~( f, r4 ^+ ?* D5 ]5 A) ?
-
u8 k/ Q# Y8 @, F' E - digitalWrite(kg, LOW);
8 U- m8 D" z$ v! K - digitalWrite(de, HIGH);, y5 S$ x# E; V+ J
- Button1.print("off");# A' n- p7 k5 h& C' V- f( V
- Button1.color("#00FFFF"); //设置app按键是深蓝色. D5 u( U( W$ V
- Button1.text("关闭中");$ D, g# w# M) A7 v
- BlinkerAliGenie.powerState("off");9 A/ Y- @. C3 G/ U8 j: q1 G
- BlinkerAliGenie.print();
3 [6 P$ @8 E' j* d/ c7 \) i) m( h - }+ n8 R: [9 A6 m+ x/ j5 I: p
- Q0 A1 i. N/ ^9 y7 j: a* c( {
- * t$ q7 g+ ~1 }: O0 `) r/ C
- }
/ r% v: ^. d6 C - //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次
* s; E2 f0 n, ~ - void heartbeat()
* L) I; i, ` \/ J5 m, B. r5 j - {
5 K5 u! E; ?5 Y - BLINKER_LOG("状态同步!"); : m9 `$ G' s/ @. P
- if (digitalRead(kg)==HIGH)
) `. u/ p% Q, B, c. `3 X+ j - {
* q( I5 c j: I8 d. b+ i3 T - Button1.print("on");' P' N. y5 ]6 \4 K3 Z
- Button1.color("#0000FF"); //设置app按键是浅蓝色3 W2 f8 V! Z n1 k! S
- Button1.text("开启中");
( q! h2 }9 M1 ^ - }% G8 s2 f. U. L
- else 7 h# w* [" f. H `( i5 }) O
- {
/ a" ?0 z7 k( b& ], N - Button1.print("off");
4 }+ E. R6 L0 o' d. Y- D# U - Button1.color("#00FFFF"); //设置app按键是深蓝色
" x8 G J- m; w; @5 ? m! E) u0 |/ | - Button1.text("关闭中");+ D# a2 u% a% P" G# Y& Y
- 8 i+ C" l7 l) b" P8 D1 K( y
- }7 t1 v& f: Q* i3 S/ \& ]; ?6 u# ^
- }! P2 ^- |0 i; t# Q( t
- //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4 U8 B* V/ l- ^; S" |& x/ Q) _& [+ N - void setup()
$ t$ H1 ]) x: p2 _ - {; c6 q+ h- g. c8 x
- // 初始化串口+ B T4 J$ I* G# |7 E% W
- Serial.begin(115200);5 c2 H; X( _) l7 p
- delay(10);2 F0 s" d. J- F% j
- BLINKER_DEBUG.stream(Serial);7 M& ` j2 q; |2 x& P8 x5 W8 t
- // 初始化有LED的IO
& e. O$ q8 i; w - pinMode(kg, OUTPUT); & J, @$ G# J# y) y( B. M; B9 Q
- digitalWrite(kg, LOW);//初始化继电器上电状态 + _+ h- o! P5 E# z. {
- pinMode(de, OUTPUT);
# N, ?$ X! V: K- f d( p4 }7 B1 W4 v$ ` - digitalWrite(de, HIGH);9 ^: X; F: e4 o; j
- pinMode(key, INPUT);
}! Q8 e. b- R6 p! q3 g - Serial.println();( K1 f4 n! J. J9 \2 ~
- Serial.print("Connecting to ");
) m7 c$ {# l# X( ]- U4 k - Serial.println(ssid);/ L$ `5 p5 \9 d3 t( `3 c' {' ]
- WiFi.begin(ssid, pswd);- |) M4 x% T/ k- L; a
- while (WiFi.status() != WL_CONNECTED) {4 x4 v( s& ^5 G6 _/ T! ?: e, h
- delay(500);
7 G0 u( G( Z/ Z Q v1 p - Serial.print(".");7 v9 i$ O& M2 p+ m% {) O- n! N
- }' H' W* Q2 d% ~1 s% {2 T
- Serial.println("");
1 K$ w6 ^, w/ j7 p - Serial.println("WiFi connected");* l' J1 m& a1 b# g
- server.begin();
/ ^- M& l6 c4 ~+ S - Serial.println("Server started @ ");8 i! L- ?- t4 ]! G3 Z6 }
- Serial.println(WiFi.localIP());( f& M5 }+ a2 f; V) {
- //打印出IP地址,后期可以制作显示器来外部硬件显示ip
; N) Z5 r4 i I9 |5 X - Serial.println("To control GPIO, open your web browser.");. q1 ~. K& j8 n# z9 B
- Serial.println("To set GPIO 0 high, type:");
- _; N s) r' H- r/ B/ ~4 X - Serial.print(WiFi.localIP());
3 U$ U" d* H6 h: H+ E+ A4 ^ - Serial.println("/gpio/1");
9 Z6 W; E; @2 M& Q - Serial.println("To set GPIO 0 low, type:");/ m- _# m2 x3 v" f* q
- Serial.print(WiFi.localIP());
/ R- f; T3 R/ o( v5 ~4 I - Serial.println("/gpio/0");, z# t/ N4 d( |! M6 s# o8 c" x% h
- Serial.println("To toggle GPIO 0, type:");+ }! D/ v9 `, X; C e2 q. e
- Serial.print(WiFi.localIP());4 f3 w) w( i) ~) W3 I) n
- Serial.println("/gpio/4");& U+ `4 q5 K7 Z7 o/ q9 L
. C- z: a D/ e2 z$ B- // 初始化blinker' Q3 s) V$ Z1 S
- Blinker.begin(auth, ssid, pswd);( ~& h5 }3 E2 V% S0 ]6 O
- BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数+ o0 ~ e- B; p. P) I0 z2 ~8 m
- BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数
& R4 Y; W- s2 X% C6 p - Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。- e g/ p) c S7 e
! J! i f: y' |- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback0 Z/ t' {" D& Y) M7 k+ u
- } d% _4 r8 p& q( A6 C+ l( F
- void dataRead(const String & data)! H( {' X& X3 ]. t
- {
3 G% x7 U: Y: R3 _. ]5 G$ _ - BLINKER_LOG("Blinker readString: ", data);1 M; J5 [% U- R$ S
/ c8 S& O3 u. D9 u3 e- Blinker.vibrate();
) A2 n0 {2 |& O0 ]) W -
2 S( l, Z- q* V' ?# y' ^ - uint32_t BlinkerTime = millis();; e. o5 G6 a" y/ j
- 6 J& w5 l7 W E2 A6 D, K2 h
- Blinker.print("millis", BlinkerTime);
# M2 Q4 y; u( U3 m+ ]/ @* v; W4 | - }$ h, R) N7 v2 S9 R. i
- void loop()# W9 z! N4 \( p8 W+ m
- {; X2 R+ x4 t) b( t; `( e7 l
- Blinker.run();
* [. Z1 v! [" T/ d. X. |/ M# X - if (digitalRead(key)==LOW)0 x8 x$ u* C7 o! U4 B2 N( E
- {
- e2 ` }* ?4 i7 A - Blinker.delay(200);( @$ v2 Y1 @# K# s3 f
- if (digitalRead(key)==LOW)! c9 n" w1 f8 B4 h! M
- {% x" e7 }# }3 q& S
- if (digitalRead(kg)==LOW)
! |/ W2 k( X: n5 z1 t' {6 u$ g3 G+ u: { - {
( m$ x- o& Z j5 @3 B# G S -
( ?3 C7 a- g1 @; t% G' ^ - digitalWrite(kg, HIGH);
+ w' f2 p5 f0 g" I% w1 \ - digitalWrite(de, LOW);
4 A3 X5 A( V J! ~9 [9 i E& P8 P - Button1.print("on");
5 {6 o. c8 k/ V3 |/ l& Y - Button1.color("#0000FF"); //设置app按键是浅蓝色
, N/ V6 K* I- W& U% ~, ?5 J - Button1.text("开启中");* X/ D9 o3 f5 W% u1 {
- }
3 A% G) w8 h: _; q3 s3 e - else if (digitalRead(kg)==HIGH)/ r) |: q0 t& ~( ^/ ~
- {
1 p3 ~! W! ]& k% Q" a - digitalWrite(kg, LOW);2 z9 L3 ~1 B6 j7 |# A
- digitalWrite(de, HIGH);/ [2 j' z" c9 s2 w( M
- Button1.print("off");. U- e8 ?3 q, Q& R. T
- Button1.color("#00FFFF"); //设置app按键是深蓝色& w3 R9 v7 q* Y% B2 | q
- Button1.text("关闭中");
* d* b0 v1 R. C+ |$ R' d - }, ]. E2 L) l, r2 l' C. Y6 ^
- }
- c% j c4 m7 k- ?" a' @ - }
% S: f, n! O3 ]( X3 d0 [ - }
复制代码
; F6 ?' b5 ]/ U' e* e/ o
: U8 S& ^! B- {我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html
+ C/ {/ y# Q; z3 A2 |5 r6 P% i% C, ~" w- E! j
把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。
: H: e" Q% Q0 ]1 R$ p+ b
3 ]. H5 I% @! T0 Y- o _4 |% Z9 p- u
|
|