|
本帖最后由 易记 于 2021-8-21 14:05 编辑 / I' S1 W' o. b+ q" w, u6 t
& a6 b7 U, z% p
最近玩ESP8266,想做个天猫控制开关。
3 o6 X& `; N* U9 o4 q+ p) ]& Y但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。) l+ s! t2 |+ K9 \4 F
还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。$ \8 J' b9 s4 m# [& q
, l2 y c; C A' J" H
; V- Y) E/ K$ z: y
8 S3 V9 s2 ]4 J0 T$ I
问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。) z/ n/ k3 G8 |9 k
3 H% ~, Z7 O- X! |" |
+ e4 ~8 D1 K+ \7 P- y: ?
$ }) z N) L( ] P$ e- e3 {
- j9 N, O) o7 A# e5 ?
! a% b/ n; n0 d9 t到手,当然是拆拆拆。
: k' V, X; t; m4 h5 ^/ r
- u5 R6 S3 d3 c, t' ^ u
6 r' N6 H% i' a
( H0 S) {# e2 ?联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。
/ ~& i4 w2 ~% n4 ]$ R7 O! y
c4 B9 a8 ?0 v: H/ ~; b% h, X$ n% k* i4 q: A* i6 H7 ]/ p2 {
1 N- w, B/ q; @% m+ O继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。
& B) s9 P/ G8 Y8 U$ Z2 S6 b
3 l3 ]1 ^' w _" m b
/ v( l) Y6 [' q
5 `# l6 }' }% u# N, _' {7 l, o( O: k) y/ Y2 c
电源芯片" H- O# V* X' @3 h! I- ?- {
& s' B( Z( Q" [! _# k) k" v8 `0 I8 R, P! Y2 N3 [0 }
2 x9 X- O% h& B" x% w: M$ o有一个按钮,按钮有二个蓝色LED灯
4 ?. Q0 I8 C9 L5 }' s/ L) m
2 R" {5 V/ p7 C% K- V
9 d+ F8 d3 u- Z7 C# y& z
+ f) O& ~% l% d- ~9 x" D+ G
8266
2 K" A6 F$ ^" D; Y" K
) n% P. E" N3 s9 A4 i
4 _" P" l1 ~, y9 i6 m6 k- i! g, {& @, a8 D; r T. g
3 _: Y' L J6 G2 ~# _7 E( O
; j% `' M/ p1 t' g7 b' ^接下来就是刷机了,版子上面都预留测试点。
# O* s2 p% Z( i8 z& F" a* p; Y接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。% R" Q0 ^- ]- I: U
7 M& Q! q8 s* g# J9 b
注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。
! D- B2 S3 ]+ _/ _2 s9 g要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 | 9 e6 ^' |; O! u
2 O( u; T. _% P
7 `) b7 G% t$ w/ G* l7 k! s$ [; h0 q5 O: V8 r
( J/ G+ F' _* W) j0 A8 S% [* w/ X
7 }6 X! k! E/ H o+ j+ G4 _ 5号脚位是继电器输出! ~2 [ G# Z: C9 V; \$ y8 s' a7 }& F' h
12号脚位是灯输出; N/ c4 e0 k t2 Y" @
4号脚位是按键/ w! z0 F$ x) h' K) ^
7 r4 |% ~4 M# D/ w9 f0 K& o6 e" m; ]& s' ~" i( f& D3 Q" X# w! m
. n( m: P4 z* G% t8 q$ T# f& b* z7 Z3 C, `
卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库
& I% l* s" J- S3 Z - #define BLINKER_MIOT_LIGHT // 设置小爱灯类库
[' y8 S7 I( f4 [ d3 i7 G - #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库
6 u4 r( U) a" B" x# m - #define BLINKER_PRINT Serial //串口协议库5 [7 S; P: r+ H7 M* v% }8 Z
- #include <Blinker.h> //官方库
' L' ~& O* Y( e: z# f3 Y - #include <ESP8266WiFi.h> //官方库
& l) I7 H5 ~7 |, C; Q- `( [ - WiFiServer server(80); // 服务器端口号
# _6 k8 Z. C+ k; P
" V8 c6 A" N. x, w# @+ N- char auth[] = "c4942fb1d5e4"; //设备key, W. e9 e. G1 C
- char ssid[] = "wanboshi"; //路由器wifi ssid
+ I5 b$ N p+ N - char pswd[] = "1365662999813586348220"; //路由器wifi 密码) ]7 o) p9 S0 w5 w
- 8 x- L- ^" B- O
- bool oState = false;
. f0 h! G4 i' t5 w
9 q1 M4 T4 o, r. U' ?- v5 o; J- int kg=5;//继电器输出& t& C- O) e$ ~# p, }
- int de=12;//灯输出& U8 N8 n& d; n, ?" h3 V* p
- int key=4 ;//按键
; e/ L1 ]/ q' Z8 J9 @3 ~( q - //*******新建组件对象: C" B0 K; j* l& u% @
- 1 |" Q b6 k* Q) P4 Y! Z
- BlinkerButton Button1("btn-abc"); //设置app按键的键名" C. q* n* D2 |) \: x7 l* o( K
- //*******app上按下按键即会执行该函数app里按键
! N* t9 s5 f( e1 @$ p( x# p7 M - void button1_callback(const String & state)4 t7 M( T4 |" |
- {% \4 _' P, O3 ?; D9 A7 }. m
- if (digitalRead(kg)==LOW) \# v, R) D% h" I1 b
- {
' V3 A7 _6 ~, E1 m7 z6 B7 V. M - BLINKER_LOG("get button state: ", state);" [( W6 L4 L: Y2 \- R- @3 g
- digitalWrite(kg, HIGH);
+ L' z7 H) g' Q. `" z3 Q5 @ - digitalWrite(de, LOW);
6 k+ D9 v& v2 Z/ |- Q - Button1.print("on");
' M; K" S9 X( h/ d7 ` S - Button1.color("#0000FF"); //设置app按键是浅蓝色( S1 J& T9 V/ ^
- Button1.text("开启中");7 S9 D- q, z) N
- }
; f) T% Y, P, h0 A0 R# J+ }8 S5 [ - else if (digitalRead(kg)==HIGH)
) Z% |7 F# D5 P( N. v Z# r" M - {! n/ F* _# @* A. w, N0 l0 F
- BLINKER_LOG("get button state: ", state);
7 g* Z9 e9 Z6 U+ L, c8 O - digitalWrite(kg, LOW);
) v" c2 L/ z4 H5 S; e) r# Y k4 M+ U - digitalWrite(de, HIGH);
! t8 o& g; A( ^1 l( @% U4 e - Button1.print("off");
, |+ e7 u+ W. D% w3 ]% l2 n. G0 l. i - Button1.color("#00FFFF"); //设置app按键是深蓝色
+ ~4 i) @% K, R# u- d3 i9 p - Button1.text("关闭中");! ~8 B0 B3 z4 G0 w
- }$ T, D- N+ A" g% W, |' J# y
- }- w+ N0 w9 p+ D/ o3 A; F6 ^0 y
% \2 b5 ?/ n7 X- L: t9 W9 T. [- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
9 d) x" w( o' C @( l ]* I - $ A# @7 G; d2 Z4 Z% l& C: ~0 K
- //*******如果小爱有对设备进行操作就执行下面5 X3 ^3 N6 C: V( G
- void miotPowerState(const String & state), ~( J5 O% f) Y6 f+ F$ z
- {4 n3 e5 B6 A4 o; t( K! ]
- BLINKER_LOG("小爱语音操作!"); //串口打印$ c, l3 {. h1 i( e/ o7 F
- if (state == BLINKER_CMD_ON){; e) T) @2 l: Z5 n l6 x
-
7 O+ ^7 m' v2 \& w5 X) k - digitalWrite(kg, HIGH);. B8 U4 `1 h+ P
- digitalWrite(de, LOW);' I% q6 o X8 R- M" Q, r. ?& Q$ m
- Button1.print("on");! ], L# A" u) w, x2 A
- Button1.color("#0000FF"); //设置app按键是浅蓝色2 Z; g# T8 X0 h4 _3 ]' Z4 B
- Button1.text("开启中");8 ~+ E! j* N5 T6 n! r. c
- BlinkerMIOT.powerState("on");) R) V/ z+ a$ V& b6 K6 ^
- BlinkerMIOT.print();; |& d+ g% E, X2 Z' ]
- }, F4 S H6 x9 z8 @4 f
- else if (state == BLINKER_CMD_OFF)0 N( R9 w5 r9 y6 c
- {
) X- e0 x- C" u$ b( F1 Z - L/ F) n( s. V' j+ q
- digitalWrite(kg, LOW);
+ U* U# \2 R& V6 _1 F1 m% n - digitalWrite(de, HIGH);
8 w# `( C5 H) D, L7 s8 W - Button1.print("off");4 m# L7 j7 O( k7 ?+ r! i- b
- Button1.color("#00FFFF"); //设置app按键是深蓝色" T8 d$ w: O# j9 g
- Button1.text("关闭中");
1 o4 Q* a' G3 v0 p - BlinkerMIOT.powerState("off");
0 O/ l) ]+ I5 O6 Y$ }& Z, t - BlinkerMIOT.print();* J3 [( ^- O: t( L6 j1 z
- }: |0 `0 C$ C/ L2 ~, D
-
$ X$ v3 x0 u' S, e8 n f -
$ H! Y$ D7 f1 I% [ - }& n% c7 S3 B- R7 G
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/ D+ Q/ R1 e1 P8 {, Y: D - //*******如果天猫精灵有对设备进行操作就执行下面' B1 B3 g' v. T4 e% M, G+ m* X
- void aligeniePowerState(const String & state)" O5 G) I1 n/ @& F% f8 f
- {
( F# b; S- w, c) R3 ~7 l' O - BLINKER_LOG("need set power state: ", state);: K9 E; c3 ^# b1 e% J
- if (state == BLINKER_CMD_ON)6 C8 Z3 i {) a. I9 Y" \6 U
- {! o8 z* q# r4 g) q/ J
- , Q1 ^: L0 m) G0 h, }) j! K0 Q0 g
- digitalWrite(kg, HIGH);
) C0 O# B) a' T2 \& f/ f - digitalWrite(de, LOW);
, O5 i# W) D! |% Y& v+ \' T/ y - Button1.print("on");
/ l) u$ X4 u* H8 v& X b4 f - Button1.color("#0000FF"); //设置app按键是浅蓝色
8 x( V R2 s9 O$ _$ G- t - Button1.text("开启中");5 Z! D4 h# r& g0 C# q
- BlinkerAliGenie.powerState("on");* ~) ]4 D; F3 k e
- BlinkerAliGenie.print();
8 X# Z( q! f+ F* n' y n - } T" @' s: w) ?) Y1 h
- else if (state == BLINKER_CMD_OFF)- z. w; \" I) Q S8 o) q- {
- {
& x' c% S: V) k+ B0 U. l -
# m; s1 J$ o- P! B - digitalWrite(kg, LOW);8 G- _5 r8 i! [; M2 F
- digitalWrite(de, HIGH);3 f* j2 S' w# @5 r
- Button1.print("off");% X# n6 A2 q- m" k, V$ | f4 Z
- Button1.color("#00FFFF"); //设置app按键是深蓝色
2 [4 K/ I3 _: ^' C' r1 E; L* j1 g - Button1.text("关闭中");% q+ Q; a2 e6 w3 U) S( ~ A
- BlinkerAliGenie.powerState("off");5 Z: L P5 ^: I P- q; O; ]3 O
- BlinkerAliGenie.print();* f( {/ x, J; {! X" i; F* n0 \
- }
( Y3 ~# g& `1 i2 \9 ] - ; W$ S! o! Y3 c2 S% V. I9 O
- , B+ W5 l) h/ h) j" O) H
- }
1 k! M' B% u5 d' I - //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次
- ?6 e2 ?$ ~6 ~( O5 i6 ]" r - void heartbeat()
, R( K! `9 Y4 v4 k. U - {
" v* f5 E" C, f% K$ C - BLINKER_LOG("状态同步!"); 9 _2 M! }* p- ]
- if (digitalRead(kg)==HIGH) , P) N X# n J$ p
- {
8 ]% v% _+ O0 w - Button1.print("on");
6 E) M+ B3 L5 Y) d1 ` - Button1.color("#0000FF"); //设置app按键是浅蓝色
& X6 K4 X5 R$ X% b+ l! | - Button1.text("开启中");
$ v7 |8 V9 v; o& v" H$ m6 }9 g( N L - }
, T6 G% G, z$ ^% l. J/ V. J - else
/ Q' b) ^0 S( J - {
9 I1 P$ X5 |) a% c6 b6 e1 o - Button1.print("off");- ?- L4 S7 v' i. {, y, X* \1 Q: u
- Button1.color("#00FFFF"); //设置app按键是深蓝色
' W; o' E' n" k; e - Button1.text("关闭中");
9 J9 W% w9 n/ j- X, k u, s; H -
1 U+ d8 J W! J4 o - }
8 `8 w2 |- V9 Q: Z - }* S9 V+ `. h4 P0 Y; D! ~
- //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 i! C# s/ g1 U( ^" D; } - void setup()& {+ B/ s- B3 {1 e' Z. ?1 U9 u
- {
' ^, v2 c* {3 U1 w4 A, {1 ^, p - // 初始化串口5 F/ V/ r( Q' i1 j; j
- Serial.begin(115200);/ o! x8 h) ?+ `3 k# x1 c& D1 B
- delay(10);
: o3 k* T. h4 A2 |5 y - BLINKER_DEBUG.stream(Serial);
7 J. x! V+ x& Y& G1 h4 n# l2 C - // 初始化有LED的IO
* C- [4 R# y5 S3 j7 Q0 T - pinMode(kg, OUTPUT);
V' w4 f; Y; i, S$ s8 A) t' L! l3 q - digitalWrite(kg, LOW);//初始化继电器上电状态
; `0 {! [8 y% u7 m8 v - pinMode(de, OUTPUT);
+ q& E" T1 Z8 }. l! e# n - digitalWrite(de, HIGH);" E- Y* P5 n% t; u
- pinMode(key, INPUT);
& i$ g; w1 C5 z# I- z5 z - Serial.println();& q1 R! q& i- J; m3 n* I$ J$ |
- Serial.print("Connecting to ");" N5 F2 B8 p0 A6 E: E
- Serial.println(ssid);9 \+ o5 Q) f. Y( d' {, L/ n: R V
- WiFi.begin(ssid, pswd);
. z' x: v& q0 r2 k) T! ^# b - while (WiFi.status() != WL_CONNECTED) {
4 F- k0 n% [( |1 M; ^% U - delay(500);
; C; [. {3 H( v7 y/ _ - Serial.print(".");
. ~9 e. D( z) ^+ L& A - }
3 ]9 `; {: a* |) M( W - Serial.println("");
. N* N& Q0 H: Y% ~- @' e$ p - Serial.println("WiFi connected");7 Z1 c/ f1 S+ |8 u. W9 c
- server.begin();
# } b& N) c# E$ p: W9 }2 m - Serial.println("Server started @ ");8 M; S0 b+ o! z- Q9 } e
- Serial.println(WiFi.localIP());
' B3 s. E6 Q3 U% D9 O' } - //打印出IP地址,后期可以制作显示器来外部硬件显示ip
2 m7 {4 ] o( q5 y( |9 g - Serial.println("To control GPIO, open your web browser.");
: B" c" p/ i- Z - Serial.println("To set GPIO 0 high, type:");
& p5 t5 W2 `6 L* M4 M) y" y8 O - Serial.print(WiFi.localIP());4 _; G6 |7 ^9 c+ _& F
- Serial.println("/gpio/1");" n; U) W) |" g+ y' Q1 i5 L3 h( T
- Serial.println("To set GPIO 0 low, type:");
4 W6 x5 n5 x* L2 v: A! V - Serial.print(WiFi.localIP());
2 L& C ^2 d/ Y6 p& \+ u- V; h - Serial.println("/gpio/0");& o, h! Q I% f. o
- Serial.println("To toggle GPIO 0, type:");! E7 r4 S- @5 v( L
- Serial.print(WiFi.localIP());+ y Z& y6 ], {9 F2 J h2 y
- Serial.println("/gpio/4");# B# [, v: e7 w) V5 l: v! U
A: ]: m0 X" N* s6 k5 E- // 初始化blinker, }% q, t6 X6 w9 t0 Z, ]5 A
- Blinker.begin(auth, ssid, pswd);+ v, \$ e$ ^; K
- BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数
O* ^4 j7 Q/ M( v( ~# P) B t: s - BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数+ F; q" t: S6 M
- Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。
' R4 p; `/ f: k$ H9 | - : N- S2 }5 M9 @& z$ E7 F2 ]
- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback
% N* [+ a$ r: C' J* |* a - }# d: h$ l8 t1 r
- void dataRead(const String & data)$ V8 y7 ?2 m s0 A, b: m4 `% D
- {! M: [) v5 K/ @3 g; c' C s6 H( u! s
- BLINKER_LOG("Blinker readString: ", data);3 F& _) K$ Z' _, [& o
- 7 }- l5 u% u/ p8 G
- Blinker.vibrate();8 Z; @# g# Y/ y; c( X: n8 Z
-
" X6 t7 a( H8 ]4 k2 R* c1 i0 V - uint32_t BlinkerTime = millis();
: l2 `( S$ I- [1 m& e$ Z+ ~ -
1 J( h, J# n5 \/ \( g - Blinker.print("millis", BlinkerTime);
+ S# V* {" H- C% ~$ E - }
1 p, L/ H+ R5 j% P+ C" x2 \- p - void loop()* c3 c' I# E$ I$ U& s5 g6 q" ]; q
- {
9 q8 K0 F8 B6 E6 U - Blinker.run();2 P* H+ E! n! a D( o; f5 \8 }
- if (digitalRead(key)==LOW)" N3 H& D- ?! n, |+ @- k
- {5 v9 K2 {3 p5 M1 `9 y
- Blinker.delay(200);
/ H2 i- }. {* X. Z/ ?! G) r - if (digitalRead(key)==LOW)1 M/ D, r6 u- N8 Y# x( A" u- B
- {
0 [/ B, _3 Z( j+ ^$ V9 W2 \! V - if (digitalRead(kg)==LOW)
" j( K* N% P( n3 D" q$ O - {0 e3 ~# V- l) e) Y D# [5 w
- 7 P0 c5 x) s2 W* i. d
- digitalWrite(kg, HIGH);$ P# E# n! k) a( Q: \# T8 a
- digitalWrite(de, LOW);3 D8 ?8 M \/ Q5 t+ u
- Button1.print("on");
9 W' y$ s( k. y, P, _ - Button1.color("#0000FF"); //设置app按键是浅蓝色1 X% ]3 a: |% ~6 t# \6 k, K- z. D
- Button1.text("开启中");
1 P$ D) H9 J% A - }
: H0 B% x3 w" ] - else if (digitalRead(kg)==HIGH)# J% |: O0 B! w/ [# f" a$ L
- {
; \6 y( @; I1 v- u. U: ^; U - digitalWrite(kg, LOW);
: Z3 q$ [8 b8 S: a, g9 q! G# d" o - digitalWrite(de, HIGH);
9 \5 d0 R! G( V3 n - Button1.print("off");
. w8 D0 {/ H- O - Button1.color("#00FFFF"); //设置app按键是深蓝色* c/ u/ b2 h* q& L9 G
- Button1.text("关闭中");3 {; c* K9 r" f! ~% f. V
- }
; m! y6 |$ s, Y( z - }
$ p& F# n( ~* R - }' l3 ?' S# C) d& G
- }
复制代码 - r. L d+ k% T1 i6 ]. |3 O4 A
/ c1 ~1 y4 z) U0 ] m' C+ E# E我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html
0 ]1 Q" i7 P; A# I/ o/ F+ U% z; B5 `8 Y$ T% a: m" Y m( C1 q5 j
把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。" e& Z# s8 j( ?! M) b, E3 I
V8 u$ M, _$ ?$ L
6 P c# w) t7 o i: c' ?- P. f |
|