|
|
本帖最后由 易记 于 2021-8-21 14:05 编辑 % d/ L5 q" V6 a3 _; Y9 V; X d; i% F
6 \) ^1 t; L7 c# ^, `( b- d
最近玩ESP8266,想做个天猫控制开关。
" J# s8 A" }0 _% R但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。
, j! [0 f: A" ~% j [' }( N W2 u还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。
3 e. l H. c. Y$ l! u
. g$ {. n9 k. ]' R! z+ N) n8 O+ Y; \8 |6 f
# I; J6 f! H) {. u( _
问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。
* ~! x: h: Y: ~: U8 B" R8 x9 F+ w' ]/ o, ?# I; q. c- W
- |2 S6 K( N0 B
1 U2 e; W/ ?/ `& `, e+ E6 j1 l) V
0 @, p# A2 |6 i* ^; F5 W1 k p: r9 w. m' n( M- ^8 r6 P) `1 n
到手,当然是拆拆拆。
1 r9 b% m8 B: y, \3 K! j
2 d# E( u, z1 s8 j2 X- @: m! J$ g: L1 Z) P' n' |/ M
) V8 e% b p, B, {, W5 R$ X5 [+ _
联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。/ g* t# W- f0 ?* @. _, e
- I! E: A0 n9 E5 s# x4 m
/ J, k8 E4 g" d Q
0 l ]5 a, t( V% T继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。- m9 f' N' p$ y3 I
; ^9 m( o4 v/ Z8 L
) u! ^* @$ v3 Q% x0 T. b
4 S4 z, v T0 _$ i4 _5 l0 H( B5 m9 }( L4 ^5 L
电源芯片
+ ]1 N3 S/ d( t- f7 S- R% Y+ n' L! C: c/ D/ a3 y5 U( `% c% Y/ \
6 @' t2 S& s; S* P7 z- z" B" _% @$ n9 R' y2 X/ A' y$ G7 x
有一个按钮,按钮有二个蓝色LED灯
- B+ O5 }' O5 q9 `
9 V- G5 A- I) L: j6 M3 l
3 m4 J) [& N% d0 A
0 ?! D: R0 I4 a0 ~8266
( F3 c. G5 s( m3 I) w3 U5 V! m, \
1 G: S V6 X% O, f! Q
0 p( X$ M8 C) J6 b
% ]( W2 K) w) C3 E4 ]; r7 R1 L- a x! n+ D# B
9 s5 y0 |; S) B5 Y接下来就是刷机了,版子上面都预留测试点。7 u% j' H' m* l& t$ r% {! d( I
接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。/ w9 F l9 j! C) L
7 v4 r, w" S# c! r1 M3 R) p% e注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。' Z6 s' G5 N) Y+ u6 u/ _
要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 | ( H3 b- A8 d' n' ~/ ^
$ j, U% o3 l9 s% \6 v Z
2 l( e. n3 r7 s' A# N0 J/ d
2 x. ~3 u" o) A* G1 e' c1 P8 o; O/ e! | _* N1 W
8 R3 [' |1 S5 f; c- M6 A T; p! A
5号脚位是继电器输出
9 r/ G7 E9 K; M$ s) K F- W* ] 12号脚位是灯输出$ ]) {6 K+ [4 J3 {1 E* f: I$ Y- H! X
4号脚位是按键
3 O( Q/ V! Y$ H# g
4 \) _3 ~! Y5 I' @7 T. N" | M" Z" y3 a# M1 C
+ [. y1 a& e9 N( \% g
0 [+ d3 L6 c6 R: H. u
卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库& n) L3 p: |. z. O* @" j. F
- #define BLINKER_MIOT_LIGHT // 设置小爱灯类库2 K' G" @! O1 Y/ a
- #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库$ k; b; O1 t% B
- #define BLINKER_PRINT Serial //串口协议库, Q C+ [! E* V( ?$ h
- #include <Blinker.h> //官方库; V, _- P7 i Q' p7 m. u# B' \
- #include <ESP8266WiFi.h> //官方库5 Z! x# i: }5 c. J
- WiFiServer server(80); // 服务器端口号
) t6 j" l7 r. R' C
; N0 V0 A( Y1 {5 q' V- char auth[] = "c4942fb1d5e4"; //设备key$ \# b$ w( V4 U$ G! F) }
- char ssid[] = "wanboshi"; //路由器wifi ssid/ Y, Y7 ?* I9 k
- char pswd[] = "1365662999813586348220"; //路由器wifi 密码
$ J( Y# E. o( s p# T( A5 W
2 N+ }, A. } I" N" E8 b- bool oState = false;+ |$ [. P+ [; M- C. t, V4 N
- : h# l( S+ I" j. ^
- int kg=5;//继电器输出
4 ?. E8 r, r* q J! S - int de=12;//灯输出+ [0 c! L% m% t8 U1 I
- int key=4 ;//按键9 P/ A$ _/ \1 U) H% c
- //*******新建组件对象
2 {9 U4 |! V% j* b; Y( b, p
3 r! B: L% P6 w/ }; W: Q- BlinkerButton Button1("btn-abc"); //设置app按键的键名0 Q9 Z$ I, N! z8 z) p7 ~) V
- //*******app上按下按键即会执行该函数app里按键
4 i P1 f, n1 H- n( W2 [ - void button1_callback(const String & state)
8 B4 y ^, ~3 `. Z1 c3 G& V. T. X( b - {
3 F8 H# G$ x3 l/ W4 N: B# I - if (digitalRead(kg)==LOW)' s( l8 ]/ V9 G
- {
* X, f' \3 r# j/ m2 L' i) R+ m - BLINKER_LOG("get button state: ", state);
( [3 Z# y, B1 Z9 o! ~5 V - digitalWrite(kg, HIGH);, ~$ K5 k7 q" W5 Q+ O
- digitalWrite(de, LOW);
. l) H, M( g5 h8 G; y: v% j* f! z - Button1.print("on");
, d1 m R m# t" A8 B* H! x+ U - Button1.color("#0000FF"); //设置app按键是浅蓝色
$ U- X+ |* @' v: [8 W - Button1.text("开启中");
+ l Z! }, o. Q - }5 } T) ^. l1 @7 i" j
- else if (digitalRead(kg)==HIGH)
) d5 I4 i3 X1 n9 D - {
/ \! ^0 ^2 k4 }: R% Y - BLINKER_LOG("get button state: ", state);
) Z. o0 H; D% ^: v" l, ^ - digitalWrite(kg, LOW);2 i8 v8 |8 L, j! ]# V
- digitalWrite(de, HIGH); V$ o+ i4 l+ g" z# m
- Button1.print("off");. I$ L3 }& \! n
- Button1.color("#00FFFF"); //设置app按键是深蓝色# Y: r5 h& w* L( S0 M
- Button1.text("关闭中");% p. L% l, ^& E4 c
- }
% {& u$ E; e! g: ` - }
$ V# n4 x) _% g) G }1 F
2 \9 a) ?6 {* E; T- S; p( h" R4 c- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
( a( b2 z7 |" r - / x3 @4 |/ O4 o
- //*******如果小爱有对设备进行操作就执行下面- [. Y" m9 c9 Q" O9 v6 | F D0 N
- void miotPowerState(const String & state)
* ]+ R3 e' D3 L. f - {
9 d4 p4 @0 D5 Y3 c0 R - BLINKER_LOG("小爱语音操作!"); //串口打印
" o* g' |+ K" M' I- ~; c6 A# l - if (state == BLINKER_CMD_ON){
. M1 i" c' }/ [2 W' |) d0 A) i5 ]! U - ( H" ?2 Q) J( g/ ]3 X& ^+ L, g- W
- digitalWrite(kg, HIGH); ]7 R% i7 A: \- H' X! o6 m/ y
- digitalWrite(de, LOW);8 I- W( d! M) ]$ N
- Button1.print("on");
) Z, Q/ A% e) ^! r4 x$ T - Button1.color("#0000FF"); //设置app按键是浅蓝色
! ]" P" X* l4 s* A; ~$ B - Button1.text("开启中");! _: Y& ^4 l- v/ {* C
- BlinkerMIOT.powerState("on");6 k( ?. P, V; d+ Y8 J+ b
- BlinkerMIOT.print();9 \3 T; D4 ?9 t3 `8 l# D
- }2 C r% ^- m5 M7 h& P' L7 q* o
- else if (state == BLINKER_CMD_OFF)
6 t$ u3 A, ~2 f( X - {9 d- \& N& W8 Y9 Q! [. w
- - `4 ] _% L2 B# N. v! C1 S4 J$ O
- digitalWrite(kg, LOW);0 X: U: ~2 G0 ]
- digitalWrite(de, HIGH);3 C4 Y* X4 C( |; e( y
- Button1.print("off");8 a- M4 Z c# Q/ `/ E7 L# {
- Button1.color("#00FFFF"); //设置app按键是深蓝色; F' F/ j1 q& J0 T6 I
- Button1.text("关闭中");6 ]6 Y" I; W" l9 f" z$ d
- BlinkerMIOT.powerState("off");
, M& W2 U( p# F( [" p' @ - BlinkerMIOT.print();
3 e: B$ D9 R8 ]" R- N - }3 U" _; n' F2 ^( N
-
" a/ t% E" r5 Q, ]: Z: B1 X - 8 K! r) h& y# o7 w) U6 l# {" Q
- }
' @- h0 U4 T$ h# r, J - //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ~" X- D, _& t# B% g - //*******如果天猫精灵有对设备进行操作就执行下面
, T1 V& m- _" S% R; A8 @ - void aligeniePowerState(const String & state)
/ M/ K7 N* S1 H7 s( p/ B% j( M - {5 @5 n, V- h: W% L: v5 Y; h5 l
- BLINKER_LOG("need set power state: ", state);
( o. H: h2 \# c, R1 ` - if (state == BLINKER_CMD_ON)
2 q& l" `0 U$ t0 S) _6 v x - {1 L6 Y$ x4 K5 x8 K9 R
- , p2 p! j- \3 T. E3 Z7 x
- digitalWrite(kg, HIGH);9 i' n5 R! \) J0 H$ ]6 X
- digitalWrite(de, LOW);
$ j9 r* u4 ]/ e5 O - Button1.print("on");( Y! x* P o& s( z, S5 E- o
- Button1.color("#0000FF"); //设置app按键是浅蓝色$ l* I5 O1 a* h/ E
- Button1.text("开启中");
7 U6 h' ~. s- S7 M0 E - BlinkerAliGenie.powerState("on");9 C, x! E- t7 H0 x" ]: [' _$ f
- BlinkerAliGenie.print();
5 L/ a% E9 ?! [! {8 @* t! `) n5 F) B - }7 B3 `1 m4 Q( ~) {, w% [
- else if (state == BLINKER_CMD_OFF), \4 d6 b7 q6 C( ~
- {
1 c6 Y4 w0 ?. ]+ A% \ -
2 i$ N6 V* ?' P5 d - digitalWrite(kg, LOW);5 _: [* ` f- K; x7 J
- digitalWrite(de, HIGH);
0 m3 k/ N+ W6 q/ Y, O8 v5 y - Button1.print("off");) ]& D; v$ I% ?* C4 a8 r: Y
- Button1.color("#00FFFF"); //设置app按键是深蓝色
1 j/ }1 T) f! ]8 A( j - Button1.text("关闭中");" |" @ [3 `3 F3 y+ I7 Z
- BlinkerAliGenie.powerState("off");9 [( V9 l: `3 a# U+ J, v
- BlinkerAliGenie.print();
: v/ x8 R5 B0 |' b8 y! m - }
7 e8 N) [$ t$ H -
2 ~ k/ T% c8 Z
/ S8 o# B: A! [- }" q" }. w+ j: v% ~ Q" U9 \1 g/ u
- //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次
+ T4 R* n$ Z0 t% W - void heartbeat()1 R, y& c' C! ^* F% X
- {5 y! C% x, T. I i0 w: U/ M/ M! p
- BLINKER_LOG("状态同步!");
; g" _6 u: [* z - if (digitalRead(kg)==HIGH)
6 Q$ l9 H8 I0 W - {
) E* u6 [( e' Y+ M, a - Button1.print("on");
5 o0 ]1 D8 C7 F - Button1.color("#0000FF"); //设置app按键是浅蓝色
4 x9 T y/ Z6 b" Y* K. z1 W - Button1.text("开启中");
, E2 y! C7 F9 d( b - }) M5 G. H5 `4 H& d
- else 2 A: h4 G3 [1 q( d
- {
# p# l. |* v* y; ~ - Button1.print("off");
3 A3 W) H: {" e - Button1.color("#00FFFF"); //设置app按键是深蓝色
- x8 r+ O" I1 q - Button1.text("关闭中");/ r8 i+ {8 F4 Z* ?
-
7 c2 z/ J s9 w - }. d; u0 b) S: ?0 y, M9 P) {
- }
# c( J; }. C$ k( | - //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++7 Q5 ]# y, C, P, g8 D- o/ d4 P
- void setup()2 a6 j8 V: Q. ]
- {) j+ J# O0 {* r5 y
- // 初始化串口
A4 ]) e1 t. {' L0 D" q; b - Serial.begin(115200);: F3 j' z0 b1 q6 L6 K V: g
- delay(10);
; V/ o% @$ b& I2 ^ v - BLINKER_DEBUG.stream(Serial);
7 t$ i; L) r5 x$ Z* t' L# i - // 初始化有LED的IO
b W/ L) G' S - pinMode(kg, OUTPUT); : Q5 F; S1 y" l' I1 K
- digitalWrite(kg, LOW);//初始化继电器上电状态
+ p, C2 K& x! U - pinMode(de, OUTPUT);
: ^. r) a6 c4 U$ O l - digitalWrite(de, HIGH);( O4 O) \+ K/ `* K
- pinMode(key, INPUT);
3 s& r$ R/ n k) g% A0 D - Serial.println();3 n( `* L' M2 y+ ?# O* B
- Serial.print("Connecting to ");/ T/ d+ m( v: C" @0 z
- Serial.println(ssid);
4 s2 J9 o7 g: ? - WiFi.begin(ssid, pswd);
3 I- m- T7 I5 D7 W. A2 { - while (WiFi.status() != WL_CONNECTED) {
% }- U& O, t: B7 M5 \ - delay(500);/ ]2 X0 s" U5 ~3 P! d9 m
- Serial.print(".");1 D& K6 x- @6 r$ {* d
- }
: |4 L9 n4 X3 U - Serial.println("");. g# w& {: ?3 E& ~( ?. `
- Serial.println("WiFi connected");
, J5 D' T+ i) M7 n - server.begin();
4 `; Y2 a( a% q, m, `: e( [ w - Serial.println("Server started @ ");& f5 ?6 j/ h4 h) g2 i `, }
- Serial.println(WiFi.localIP());. A# K8 M0 f# S
- //打印出IP地址,后期可以制作显示器来外部硬件显示ip9 Z, X" A3 V0 o( ~
- Serial.println("To control GPIO, open your web browser.");
3 I) G8 M7 q( ~; U, {" z- _# u - Serial.println("To set GPIO 0 high, type:");
9 g. Y; `9 E% p2 i6 }3 a - Serial.print(WiFi.localIP());2 J6 s- G0 u4 P+ w# Y8 f
- Serial.println("/gpio/1");8 z% H+ d1 A5 g) l
- Serial.println("To set GPIO 0 low, type:");
3 w) [+ D! V& @( ^ - Serial.print(WiFi.localIP());
2 H9 D+ [$ H6 z% p/ P* D - Serial.println("/gpio/0");/ A$ t+ S/ f% `# u
- Serial.println("To toggle GPIO 0, type:");
/ [+ [% k$ V6 y: [5 B4 E9 ~ u - Serial.print(WiFi.localIP());% h! f; |9 T: `3 X6 P
- Serial.println("/gpio/4");0 W4 o8 ^6 y/ ], Z
- 6 ]$ r* g( E- ~8 F! ~! R, K
- // 初始化blinker
) A D1 C' h$ q0 f' n. z8 { - Blinker.begin(auth, ssid, pswd);
' l# \/ F8 `# I* i& F- _ - BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数$ I2 t" H5 l8 k" ?/ _5 X
- BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数
( U2 K7 m( R# u. H) X - Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。3 |6 q" R, z4 `1 F& ?
3 ]2 N# f1 Z( ]" e9 c, \2 n- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback
6 U( k5 ]1 ?5 I9 d. ` - }4 n, w. t6 y, m! ]) S
- void dataRead(const String & data)1 T) z2 _: h& @) S0 Q1 l
- {
, [# ]* @ Y! G6 b - BLINKER_LOG("Blinker readString: ", data);2 T- `5 b& i: m/ E4 W
. A* |$ J% V5 P, J9 |$ ~$ [- Blinker.vibrate();! J2 Q+ A' Q# ]# n
- 0 c7 J4 A. |& x( e- i
- uint32_t BlinkerTime = millis();
1 w) _8 M9 q/ ], ~& s0 P, F - 0 Z! z) J2 v7 V- z; Y
- Blinker.print("millis", BlinkerTime);
. `% P# a7 G5 L" }* k - }
& a3 j5 x/ K2 U+ N2 D - void loop()
$ ]6 w$ T! o/ q1 }) F - {9 D* @% ?+ f" [
- Blinker.run();
% D, I% a. X: i5 Q1 y - if (digitalRead(key)==LOW)6 b; @- u1 d/ ~) n3 ?
- {4 m9 `% I) o! {) s# Y. J. b: D
- Blinker.delay(200);
0 [/ p0 h: }9 n l$ z - if (digitalRead(key)==LOW)5 r) I0 j! r5 Y( t2 C+ V1 x
- {' u- v* ], z6 l4 W
- if (digitalRead(kg)==LOW)
3 @' {( }, }2 B; V5 h2 d - {4 s I0 V. }1 c6 m
-
& i- `7 I, k8 Q - digitalWrite(kg, HIGH);- T$ W1 L. F4 w8 z1 D" o0 O' n3 d: O+ m
- digitalWrite(de, LOW);
+ ^: f2 w% x5 s& @ - Button1.print("on");/ d9 j9 w+ V# n
- Button1.color("#0000FF"); //设置app按键是浅蓝色 E) y1 A2 U# f- K `: y" C% ?/ J, f. A
- Button1.text("开启中");* s$ W/ A/ g; Z* B' `
- }/ @( [: Z. M& {
- else if (digitalRead(kg)==HIGH)
3 T* o# b! O9 y4 ^8 i - {
3 h" t: v7 Y# \+ U% F/ b6 g& y - digitalWrite(kg, LOW);
( u# _- }; E' C3 Z# B- N6 O - digitalWrite(de, HIGH);
6 R2 b* J: J! H/ d - Button1.print("off");
1 W7 D; U( y' W- c/ ?- R; @ - Button1.color("#00FFFF"); //设置app按键是深蓝色) E1 g8 y# W' @2 F) Y/ G
- Button1.text("关闭中");
, Z5 H+ F2 Z0 c6 a4 P# j: L5 t - }5 v, Y% I) h! p1 |
- }
, L7 n+ W* \: \: ]- b. H! O) z - }
% c2 _6 x* X) s; m3 z) _ - }
复制代码 - b! u! @; U r+ N+ v
# K8 z0 c/ f( x W* u+ R
我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html
7 K& v* m1 l" ~2 D' x
0 d& U1 g0 A& N! d# W把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。" r; j4 c( r& r) d. o" F
+ Y2 @5 D/ J2 m* y& U: p7 m- }+ L$ N. a# M/ C
|
|