|
|
发表于 2021-8-21 13:57:54
|
查看: 5667 |
回复: 5
本帖最后由 易记 于 2021-8-21 14:05 编辑 ) W/ `5 M4 W# A8 t+ l7 D
) b) Q8 m" f- @5 }7 y+ i最近玩ESP8266,想做个天猫控制开关。
( w i7 n+ _ i+ o* b! I6 W. i但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。3 N7 B; i, `) |
还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。
8 i1 m. i) v { K' ]4 r9 y/ u z) E, e
2 G/ ]2 m% ]+ r5 B8 t$ x3 }& Q: K" z. [: g
' f7 e3 ]# ?+ Q
问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。
' n; O5 l+ C* c/ W5 K: Q3 P" i2 D- h' n' q' m9 U3 g$ A9 {* Q) T# w
! i& a [5 G/ v9 W
0 J9 S- ?! n. _ U7 \
X. ?0 v* J3 O4 t$ m* q% ^3 R' g! _2 D, }" }+ Y* m+ Y
到手,当然是拆拆拆。9 S8 |4 m( N3 u8 x. t
( T0 l# m4 L! w7 a7 [) C
6 h& W4 k+ B9 ^
& C( y! \0 s1 G5 H$ W( [. O$ w1 |联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。( j& M# @; M3 j. D( T+ N
2 s. w2 D. S$ N: g# I
* A# Y. t' v4 ]/ |3 x& j0 U$ s
/ I- A" t# g2 ^) i$ Z$ E继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。. S: {5 [5 S% M3 B; ?$ K' G
3 _5 C( M0 P7 Q% t
9 j3 ~* _+ z4 L1 Z* I/ Z i
; `+ H1 Z7 W. X0 F) t9 e) X; u0 Y4 v2 g
' I, c @2 {, Q# _3 a3 m
电源芯片
* l# I8 C9 F8 D$ L: h0 O0 K9 s. h; f$ x' t
; A- v3 p9 `: V2 J- L
0 }2 o; D! n0 C2 M! R! ]! u有一个按钮,按钮有二个蓝色LED灯
; W2 N; d6 l' R) q
0 m9 _3 [0 [) ]4 \
. a4 B2 D1 n/ d: k1 u
' s$ E% E* `* ^% x" m' L l1 |( {+ W* r3 E8266
7 y+ X. f2 |; E! h3 X+ j
4 U; X& v9 M) B, J' w$ @* [
; l% A( ~. ~( u2 U% u# r, w; g4 Z6 Q, P& H! v
+ m5 R5 U0 d2 w0 P6 ^/ K
% e; d9 x- \8 X
接下来就是刷机了,版子上面都预留测试点。
8 k7 W$ U# r* m0 j# M- v1 q- T接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。+ m- Q& B g& }0 e
+ _$ `6 l' v9 W+ S2 g4 Z' D$ [* |注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。
8 v0 J9 u N9 n7 p8 A4 s要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 | 9 q/ B9 `% C* J8 w
" E6 v: d, t8 k1 U8 z. G" e
0 G; n6 c! k" Z3 U
( N) G6 {3 J. a" @
. s& a; h) D" `9 c1 G
0 L/ k2 X( F1 Q. G q$ M! Q 5号脚位是继电器输出& X0 z; N. W4 Q; k" O# A
12号脚位是灯输出
4 V0 ~1 j3 l; \ 4号脚位是按键% X/ v+ x- Q% O2 @0 E
' N& s, g1 }* b. N
& E' o. S/ z1 H3 g6 i4 n( f- z' I% T a1 v$ M
7 ?6 c: L& q! V" e r) W6 V* w1 I卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库$ q7 ]; t! \& t
- #define BLINKER_MIOT_LIGHT // 设置小爱灯类库
- }- _) F- z1 R: |+ l9 v - #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库
: w4 E8 L8 D4 { - #define BLINKER_PRINT Serial //串口协议库- d4 U4 N) t4 b. }1 G. G% q/ _
- #include <Blinker.h> //官方库
; }5 ~2 F) W1 M! `) {5 ^ - #include <ESP8266WiFi.h> //官方库
7 C6 X9 M( @! C* O0 g5 k' a - WiFiServer server(80); // 服务器端口号
% u+ Y5 b: |0 B
0 ]* f- Y6 W/ g, g9 O- char auth[] = "c4942fb1d5e4"; //设备key# }5 _# Y1 `1 o2 D
- char ssid[] = "wanboshi"; //路由器wifi ssid
3 R# D/ r2 ~2 K7 B5 E - char pswd[] = "1365662999813586348220"; //路由器wifi 密码
! y) B$ `& V7 y: I n. s: ^/ i- M
: Z r" P; e4 p1 e1 E- bool oState = false;
& U) ]. G- l2 P! `- j5 h
4 @8 V3 R" T' g: c- int kg=5;//继电器输出
3 W8 g! i: @ i+ L9 e. k5 l - int de=12;//灯输出
$ b |4 o* B5 p+ X# h - int key=4 ;//按键) e0 r: l+ g1 ]& ?3 E
- //*******新建组件对象' w% m! |0 d7 }" N) l2 i9 [
1 K% _3 r( n5 A# k- A# E- BlinkerButton Button1("btn-abc"); //设置app按键的键名
! Q6 H1 f' z% {$ j0 {9 l. l - //*******app上按下按键即会执行该函数app里按键
* e1 Z/ G" b& ]2 X4 g' ` - void button1_callback(const String & state)" G/ q' F) G# f% q+ }, `% u
- {* v6 x/ ^; F2 m% v# H6 U
- if (digitalRead(kg)==LOW)
0 W/ F9 e! [ x8 f! y% F" ?, u2 e - {; ^) Y4 o2 z1 Z
- BLINKER_LOG("get button state: ", state);
2 A# o3 b T$ W/ n& O& I - digitalWrite(kg, HIGH);+ S. v" P/ y/ i+ Q8 i
- digitalWrite(de, LOW);
5 C$ K0 z: H1 x) M0 z* Z0 Q - Button1.print("on");+ w" z+ @' I1 Q* f: @) ~3 A
- Button1.color("#0000FF"); //设置app按键是浅蓝色) V% y! \6 T2 k/ Y5 q' `# U3 k3 Z
- Button1.text("开启中");! L6 g5 W& ]" f$ y
- }
9 W/ J3 a$ c/ b - else if (digitalRead(kg)==HIGH)
6 Q/ C4 y% q0 B' K - {" T# m$ e+ h( c9 D8 M
- BLINKER_LOG("get button state: ", state);2 m1 Q) R4 b. J4 n* y) S1 M- l& H& \
- digitalWrite(kg, LOW);- c( J: `% _; l! a
- digitalWrite(de, HIGH);0 c2 B& _( O! X7 n7 M
- Button1.print("off");3 Z( Z. j& p9 Z- h) E# y. n
- Button1.color("#00FFFF"); //设置app按键是深蓝色# D1 e6 H1 ?) @" R& S
- Button1.text("关闭中");3 V2 T0 [) R# F
- }
2 j. l/ c7 f1 o" x! o: u - }/ r4 M; ^: Q5 ^1 Z) [/ p
3 E P1 P/ n* o) A i; x+ G! X- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++8 m' W2 g* \: q0 `! j$ N; v
- & ^; }) E" v" v+ }$ _" T! I' \# _
- //*******如果小爱有对设备进行操作就执行下面
q! a! V$ H# {* b3 g( V5 B - void miotPowerState(const String & state)7 n3 t6 f. |7 d+ Z0 G" U( L' t
- {( H1 J0 g/ S) J/ p5 R' B. M
- BLINKER_LOG("小爱语音操作!"); //串口打印
, h7 w3 O8 x+ m$ a" ? - if (state == BLINKER_CMD_ON){( J0 H- q o2 d k. L
-
7 M8 [6 N1 b0 j2 ]/ ~: G' N; r - digitalWrite(kg, HIGH);) c, J- D" r9 d9 d3 L) |
- digitalWrite(de, LOW);" ?1 m( B2 \) k8 p1 N
- Button1.print("on");+ ?5 E) R* G2 z" e
- Button1.color("#0000FF"); //设置app按键是浅蓝色
% D! n$ ~# {/ b7 h" Z" j - Button1.text("开启中");# W7 B% D o9 x4 W* L0 h# U& P9 }
- BlinkerMIOT.powerState("on");
7 m- R8 u2 p1 k1 T - BlinkerMIOT.print();, q3 o) i: b4 T T, C# y
- }% Y0 O1 F" X' w. z3 j# j
- else if (state == BLINKER_CMD_OFF)1 Z8 w* `9 e2 z$ r
- {& H3 s! Z- w) r2 F3 a
-
9 R, I; y3 F6 `7 F, s. U( u - digitalWrite(kg, LOW);
, N. `; y+ B& r* O. y& i Y - digitalWrite(de, HIGH);
' p1 f/ j, `0 v& n2 D# e - Button1.print("off");
+ H' R* K c1 ~( E0 Z0 \" I - Button1.color("#00FFFF"); //设置app按键是深蓝色2 V3 Y7 L* X, I( b8 y7 y5 D
- Button1.text("关闭中");
# N, w3 a. R9 g/ K - BlinkerMIOT.powerState("off");* V) i* |, Y! Z
- BlinkerMIOT.print();
' m9 L9 }9 b- z9 y4 b4 U: c% C, h - }
1 N) z3 K; K1 P; h3 N( `3 L - : m C: e: x9 H& i, E* L B
- , z/ h3 d* B* O
- }
4 Z- k7 m# d* j; m& o) v - //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
. g# d" p$ c6 a) n/ [3 e( R' ~# T5 D7 R - //*******如果天猫精灵有对设备进行操作就执行下面, \ M/ ^( C9 h. l; v9 _
- void aligeniePowerState(const String & state)
, i+ J1 @0 Z9 |% t8 @3 e - {* V: n1 E; z. o$ k* w& Z
- BLINKER_LOG("need set power state: ", state);% m Q) n. Z9 [5 c3 _" T5 N! W; x
- if (state == BLINKER_CMD_ON). B% ?0 z. `& M
- {
& }! i$ j8 T6 a- T3 ~- f -
9 ?& I4 t0 [4 y. V( E1 h. W7 y. p - digitalWrite(kg, HIGH);5 V; j- b! C" ]
- digitalWrite(de, LOW);" Y. P( {' t1 g
- Button1.print("on");* l4 w3 m7 k; y9 M$ K1 _0 I8 |7 B5 }
- Button1.color("#0000FF"); //设置app按键是浅蓝色
: N. J8 \" O4 u @ - Button1.text("开启中");0 B5 Y! T) V- z" t1 @
- BlinkerAliGenie.powerState("on");
8 f& W! n6 {0 |% E, y2 s - BlinkerAliGenie.print();. Z; B2 x. c' l* I
- }$ g v, f! r" p, I# o; I
- else if (state == BLINKER_CMD_OFF)9 y2 k L- r6 s
- {- H6 T3 b/ _5 P0 z
-
7 W. V$ @) V2 s7 g# c - digitalWrite(kg, LOW);& ^8 V3 D3 x6 R- t% [
- digitalWrite(de, HIGH);2 I; Q, p' o& w5 i- m& C
- Button1.print("off");( M9 Z p! A; U
- Button1.color("#00FFFF"); //设置app按键是深蓝色; b: @- D; Y& \* b8 r5 e5 R
- Button1.text("关闭中");
% z& X- z( [3 @8 U( R# \ - BlinkerAliGenie.powerState("off");
. N' E& S, x8 M/ d - BlinkerAliGenie.print();
# N0 T! s6 [( ^! \5 V - }5 Z/ R* v: i- n3 h- x0 P. o
-
) c5 m0 r% `" [, l* ^9 y
2 y7 I6 s ^* y- }
, d& I0 x' Q* L2 s, s - //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次; q* P/ D* w' e4 T% I8 b: v. X8 C7 L
- void heartbeat()
2 S# F9 @: N L' T( g - {. U: S$ G) R$ N' w% p
- BLINKER_LOG("状态同步!");
4 ?! f, N5 z5 E" _2 J - if (digitalRead(kg)==HIGH)
" A" a, X8 s0 H9 J. U- C4 Q - { 3 \, s5 z' T8 P* q4 p7 s
- Button1.print("on");
( B) `% {, I3 N7 ^. F - Button1.color("#0000FF"); //设置app按键是浅蓝色2 r$ K# u+ Y: ]1 v/ R
- Button1.text("开启中");
$ M# i( q8 e, X' d" i8 `; E - }
3 B& R4 Q# A& ?, k6 ]6 y+ K1 V - else
M. E( a* c* c" Q - {/ {( X: L# @$ d# z0 v8 k
- Button1.print("off");
1 B: P8 N" w7 a - Button1.color("#00FFFF"); //设置app按键是深蓝色
0 _7 h6 w( a; Y. S' c F% o - Button1.text("关闭中");+ B2 [- E8 i4 g& S3 s
-
6 U" Q; T2 a5 s r { - }
' ~; i, T* _% P' l- W, X - }. u( ]; r! y- ]& D. U$ a" z
- //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++$ r6 B. K; K; ?8 j) q+ s( D
- void setup()
) L- U+ r E, J6 j/ [ - {" s4 e% Q4 b/ L3 J% V
- // 初始化串口$ M% q+ E; v# D- n1 u" _: B; l) T
- Serial.begin(115200);
_; L3 \% h* r9 U. b* b1 \ - delay(10);" M0 Y ~; o" |8 y+ n R$ F
- BLINKER_DEBUG.stream(Serial);2 i# f; w! u# A) g! G: _- P
- // 初始化有LED的IO
# R% { Q8 o+ B - pinMode(kg, OUTPUT);
( K$ ^8 S3 f& V- ~& [* _3 b* S, h/ _ - digitalWrite(kg, LOW);//初始化继电器上电状态
: m4 G+ F5 ?+ g' D: Q - pinMode(de, OUTPUT);
# l2 i* H7 ~- G7 F - digitalWrite(de, HIGH);
8 v. |$ X. Z1 v8 X/ i# K7 |$ n, n. W" z - pinMode(key, INPUT);
; e% p; U! U$ z: M: P- W - Serial.println();
& ~+ u y+ t' I9 u - Serial.print("Connecting to ");
. k) U& P( d; I! B T0 B - Serial.println(ssid);
& b' C' u8 } C5 `3 D T - WiFi.begin(ssid, pswd);
% G5 E, ]2 T$ E! B - while (WiFi.status() != WL_CONNECTED) {
5 D G3 H- }3 z% ~! b) p - delay(500);
' Q* [5 G8 P3 S: ^ - Serial.print(".");* t. e7 ~0 | }0 D' t$ e6 }
- }
7 C$ h0 W& Q! N8 L2 g - Serial.println("");
# E7 m3 f( Z5 s8 L/ r - Serial.println("WiFi connected");
) i4 O" E2 M" g6 h - server.begin();% O; B9 t' ?2 Z
- Serial.println("Server started @ ");+ P# B3 f" O* ?( @% Y L
- Serial.println(WiFi.localIP());
3 ~1 [5 T. Y) V3 C& v, ` - //打印出IP地址,后期可以制作显示器来外部硬件显示ip: {/ C& C9 F! L
- Serial.println("To control GPIO, open your web browser.");! @4 x, E# { n7 F3 d/ |
- Serial.println("To set GPIO 0 high, type:");3 o, h6 W+ ?) ?/ j& S
- Serial.print(WiFi.localIP());3 @) h! C. r6 \1 V$ J; Q( U+ s% b# k
- Serial.println("/gpio/1");
) C- Y! x( R* }2 a9 C - Serial.println("To set GPIO 0 low, type:");1 g$ P$ ?% B" j- F
- Serial.print(WiFi.localIP());
' z @9 M4 p3 U3 k - Serial.println("/gpio/0");
" L6 N3 U' }$ @/ g7 E" o) N - Serial.println("To toggle GPIO 0, type:");
7 k6 M* {$ T0 T- j6 C - Serial.print(WiFi.localIP());
; d7 v0 N/ [+ G! b$ V - Serial.println("/gpio/4");# E: j$ G q8 @- P4 l, ?
1 x6 t. `) I/ q( W: y1 t- // 初始化blinker
8 v. ~' l9 Y9 ~9 H - Blinker.begin(auth, ssid, pswd);
, D0 A* \! q$ i) Z i, p- k& H - BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数2 g, U- F; s/ H7 i# @: P0 A
- BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数
* t9 K& M- r. }1 D: { - Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。
1 F! f# V" O) I* i) n* P
3 }- R- m9 N: K9 @- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback
G: Z. H7 J o; a( z7 ^7 I - }7 K& l9 L- B7 |( E7 C
- void dataRead(const String & data)! h2 a4 Y9 Y$ Q3 N- i' Y& m4 G9 D
- {
2 B# E9 y8 [8 m. @% x8 _$ g1 a/ ] - BLINKER_LOG("Blinker readString: ", data);
9 M6 s0 `) U+ v- r - 7 c2 Y, E9 j" O" J! i7 d7 K) i+ O
- Blinker.vibrate();' L' g2 o( z. a, R3 H" v
- , k* {% }5 y% [9 l4 D( s! L
- uint32_t BlinkerTime = millis();8 g/ A2 h2 m# N* q: Y/ ^0 ]1 Y- `0 z
-
( V& C& j2 N" d- @0 ]) X. Y' ~ - Blinker.print("millis", BlinkerTime);
& S! v' K: Q0 t3 h- }8 x - }( Q: l B1 L# C, u# f
- void loop()( T, E9 g, _* J
- {7 W* ]( w5 D( B4 `* @4 e& p A
- Blinker.run();
/ {5 k. ]0 h& k% q) V8 T! L - if (digitalRead(key)==LOW)9 A4 C ?# x. a, k* I4 u) U
- {
* t; O0 Z) j1 l$ J - Blinker.delay(200);
, c& o1 N. k4 S% A0 `- @1 Q - if (digitalRead(key)==LOW)
# z, B- [; z$ o4 j/ {# J8 m - {
. `* |$ O" h- a% s9 e7 D - if (digitalRead(kg)==LOW)
0 _. |8 A X- s6 E! |$ d; p" p' T - {
! l! y; m/ s8 q - . L+ Q6 L [' n; Z/ {( T& M9 x7 P
- digitalWrite(kg, HIGH);4 c+ R) ?. O* N
- digitalWrite(de, LOW);
' c6 i+ G, \ X. c" ~; X - Button1.print("on");+ [6 M) j6 y3 I' _
- Button1.color("#0000FF"); //设置app按键是浅蓝色) i+ o5 ~3 y9 D" M. G C$ J
- Button1.text("开启中");
0 K f- G E( c" z5 L- J - }
# O6 i1 }. S/ e0 a( W - else if (digitalRead(kg)==HIGH)
M8 B. u! V7 C' k - {
) t3 }5 f2 K& t; q - digitalWrite(kg, LOW);* n- w# J3 c! j4 r8 \
- digitalWrite(de, HIGH);
9 g* D' r* L4 {: c' f6 {9 k9 C - Button1.print("off");; e8 \( H" W: ~' X8 z1 ^
- Button1.color("#00FFFF"); //设置app按键是深蓝色
0 y' { [- j! `* a% J% C1 R, {5 v - Button1.text("关闭中");
/ b# Z& I0 s q7 v6 c - }. N1 t: S$ x/ ?9 ^9 A" i
- }, i0 n9 u: n- I, u: p4 d' F5 t8 ~
- }
' @1 y2 o4 n& v0 R! }8 A7 Q" n - }
复制代码
5 [) Z: A: j) K) i0 V' N
! p. W& z/ Z: p* \3 _2 {我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html
- C C3 l1 P* `
: A7 o w2 Z' d- [: u把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。7 u) \+ N" L7 z+ ]' @3 W5 G `
& T3 |6 b" S* j3 ]6 e% s3 c* Z; _9 [9 A- d+ T# b
|
|