|
本帖最后由 易记 于 2021-8-21 14:05 编辑
- v4 H3 K" p' G4 B8 ]& |
, q# _" v. _. @8 m! N. P最近玩ESP8266,想做个天猫控制开关。
/ F# y. a/ n: O/ i0 E- [& T但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。
1 O% ?, M) U5 h" s还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。
1 m6 E" A/ E% G7 `8 w* s5 j
: R0 |7 K; U/ c2 y) {8 T* S8 N: A
1 j* {# ^8 A; m+ A1 `
' P8 c$ a' L" C$ r: o" i
问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。
9 t* O1 e9 i$ z5 s) W1 l) h4 G1 Q+ |- p) v& K( G$ P4 J- w. h
+ U. J$ X' H6 _4 s
7 C" v' V' O: I2 ?; \! t; r S% T% b% R8 i) {0 p
2 z2 v6 E v z4 |% |8 b9 z. a9 r
到手,当然是拆拆拆。% r7 h4 ^% t- f* {- M! @
2 ]+ z1 T# q7 Z @7 |2 v
0 w1 z$ o( `: V) ]
" p6 q! n5 Q1 A联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。6 S) I+ m$ P# e3 b" k3 X
* o$ \" ~+ j: N
6 J7 l. i9 I& y8 i' w
- a# m' }$ S( D8 w) J- X继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。; W+ q0 q) F& Z* _3 c) }2 n
1 ^* Y+ ^+ N& w& V0 w! ], W$ X7 X) E2 ]; D. g8 `
* z( [( i0 u" a, U0 [+ S
3 I8 X9 D8 U! L8 t# i- _
电源芯片, g. O0 R; c j, c; q1 Q" J
' e! e4 s# f! n4 a& b) s
* q( \& H! q. f3 B9 L1 o, Z- w+ v& u7 }: d, }2 q7 e# _1 @2 p: \
有一个按钮,按钮有二个蓝色LED灯
. b+ u3 }' j6 l# s, a) P
% \) _* ~. L9 l% J; }
. i5 `" ^; ~% o1 v; c9 v0 l- G
* |6 y& s+ c/ u" D/ ~ o8266
8 `; {, P' [0 E% ^/ d) ]$ x
2 n3 n2 q0 O+ U$ e6 D0 `: V
; y; |# g7 W3 {* v" Y g
/ x- y2 [/ |+ ~" A
, {: V2 N8 g' s0 A5 e* Q, b* |) X Z- E
接下来就是刷机了,版子上面都预留测试点。
* t/ a8 G# J9 K8 Q3 F) R3 f6 X$ G; R接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。
2 y; }" @3 G0 s' P: E3 ]
6 i! A: L* t3 U' x& w注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。$ {% y- w6 ?( z, q- }
要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 |
8 E# f _2 P6 z- T& Z( o2 h3 D6 `4 j& G" H
: A* T' M1 d9 o- M# _# z- t# i6 n2 ]7 g2 F. |+ }
! ~, G1 s8 K6 b- r( Q ~
- s! h# T9 ]5 f7 h, B 5号脚位是继电器输出
7 G ^; Y5 s: | 12号脚位是灯输出& a# f+ @1 l p) i
4号脚位是按键
1 [7 Z% W2 H) m
( j! O# D3 u4 e- l
. G+ b2 ]: v- w$ O) _7 }" v: T/ _0 w3 b7 L
7 ^: [( M+ P r' B$ `2 l7 u
卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库
7 j s$ V# h" Z - #define BLINKER_MIOT_LIGHT // 设置小爱灯类库
0 ?& @" e' Y+ N) U: C, U- W - #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库
4 Q( |' n+ r, Q$ ~ - #define BLINKER_PRINT Serial //串口协议库
' G- s; _0 h2 B" O8 R; ]) } - #include <Blinker.h> //官方库
' g7 x- {5 _( p* P- G - #include <ESP8266WiFi.h> //官方库- T O/ Z8 _! C2 H& O4 A, Q
- WiFiServer server(80); // 服务器端口号
9 z+ }- j9 v ^; w1 q - . b2 t3 y! i) Z7 }$ v1 ?
- char auth[] = "c4942fb1d5e4"; //设备key9 X* y2 j2 f9 n0 r7 I! Z' }
- char ssid[] = "wanboshi"; //路由器wifi ssid1 g" d. W- ?1 l, s2 A8 p" w
- char pswd[] = "1365662999813586348220"; //路由器wifi 密码
- e& w- f0 z _- X0 z: s" |) \
% d& P1 U+ L% w3 E- ?- bool oState = false;. L+ i4 c9 h& ?
6 B' u/ U7 X3 @: l9 q& h+ Y- int kg=5;//继电器输出; m1 U5 A/ ?/ C9 L! E/ |
- int de=12;//灯输出' X& u6 S$ v! u; ^" F
- int key=4 ;//按键/ V7 n8 a0 k" Q- \
- //*******新建组件对象
) U" y. p" P* T5 J4 d0 [$ G
1 A: z2 O* E7 @$ F7 A2 A7 g- BlinkerButton Button1("btn-abc"); //设置app按键的键名) S5 d. f; o7 r4 g
- //*******app上按下按键即会执行该函数app里按键( r5 P& }1 n6 j$ m8 P
- void button1_callback(const String & state)
* x9 E9 \* i: i& B+ k ? - {
2 ?0 i9 F/ K7 l4 @! _ - if (digitalRead(kg)==LOW)
. T# }& Z2 i6 j* s: `8 m! t; }. Z - {
1 q6 a6 z' h+ E% @- Z - BLINKER_LOG("get button state: ", state);$ T( x$ B0 v c+ B
- digitalWrite(kg, HIGH);
& e6 }7 J- h/ I, J/ _- R0 _# N - digitalWrite(de, LOW);
$ O8 y4 ]! L) B! V9 B - Button1.print("on"); J. i% C' F* I3 d0 Q
- Button1.color("#0000FF"); //设置app按键是浅蓝色: p# p9 K! ~# R% P# P8 c/ `
- Button1.text("开启中");
; C4 K/ r3 @' V( H( F/ Q* l - }
/ @. J i# i4 U9 w6 E - else if (digitalRead(kg)==HIGH)) t& \, t+ r' d" L
- {
1 r% U, I- I4 J4 \0 Q - BLINKER_LOG("get button state: ", state);
4 g5 Z8 x5 H( B3 `2 y( A& v1 W3 S7 [ - digitalWrite(kg, LOW);7 s/ V, j. G6 ]/ V {
- digitalWrite(de, HIGH);3 {) I6 n4 ~& F" k4 _
- Button1.print("off");
; J. c. a5 ^7 X7 ] - Button1.color("#00FFFF"); //设置app按键是深蓝色: J! H& X- s. \
- Button1.text("关闭中");
) v9 m$ V( e' N" O y9 K# O - }
) X# Z1 E! L$ D* | - }; m3 Q+ {9 k9 @% A4 `6 M* B( t9 L
Q0 |7 H/ j- \/ j2 F# Z- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
p( [/ z2 Q4 H' t: b. Z4 b - ' X" R$ l/ m5 k; Q
- //*******如果小爱有对设备进行操作就执行下面
9 G& r k% m2 \- _7 w6 V' q7 ~ - void miotPowerState(const String & state)
& ~ B7 Q! c1 W" t - {
$ Y- l, r/ c! H, d+ Y' x0 o& k( J - BLINKER_LOG("小爱语音操作!"); //串口打印0 }" p+ ~4 [! c
- if (state == BLINKER_CMD_ON){
A% N! Y4 {! Q! g) R+ J -
y) h9 n4 L1 K1 E$ _( }5 W% B - digitalWrite(kg, HIGH);+ ?/ V5 r H% p( j6 @- z
- digitalWrite(de, LOW);
+ B6 o1 u& h2 K% Z, B- y - Button1.print("on");+ o( u1 |1 b6 s3 @' |- M# \1 _" v% u( \$ L
- Button1.color("#0000FF"); //设置app按键是浅蓝色, I* E" z' a1 ^: d
- Button1.text("开启中");' N$ ~6 {, S( o- F) ~! O3 F3 z
- BlinkerMIOT.powerState("on");5 U3 h5 r& @5 L+ c% l3 u& R
- BlinkerMIOT.print();+ o+ W$ s' S. _+ v2 \+ q* A5 ~
- }
* a: _9 @$ I3 Z4 M - else if (state == BLINKER_CMD_OFF): o; h* ^8 O. k- _, c, X% z$ u7 J
- {6 ~7 L" G! ?3 ]
- . T, F( H5 a! U! t5 y, W& j. s4 F
- digitalWrite(kg, LOW);# X1 p0 t) q0 P
- digitalWrite(de, HIGH);
: Q8 k( H" |3 Y7 H: g, [1 G - Button1.print("off");
5 v2 o0 `" A0 S8 r+ @# d - Button1.color("#00FFFF"); //设置app按键是深蓝色
% g: ]2 \! a7 N - Button1.text("关闭中");
& k# Y4 h( j- m t& S- `: E6 L, D0 x - BlinkerMIOT.powerState("off");# O. z6 O2 |7 j/ |1 X' h0 a
- BlinkerMIOT.print();& K/ d; r6 \& N. t* z2 r y2 ?
- }2 [4 E9 k. E) u/ N/ p
- 1 W" u+ g( a$ m8 z2 q9 v7 A
-
' E$ `: m: {1 A. f+ E. e7 x - }
/ y) p! J% A( y7 g) p8 w - //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
7 }+ l5 T2 t# e& R! p1 C - //*******如果天猫精灵有对设备进行操作就执行下面7 @, p0 g; p: y) ^6 C- C) X0 }
- void aligeniePowerState(const String & state)
. i" A; o/ Z# c8 c - {
6 f. V, D( k2 G* ]; P( C' j/ } - BLINKER_LOG("need set power state: ", state);! ^) p, }, N$ E8 B W! e8 y
- if (state == BLINKER_CMD_ON)
0 c4 B: e2 S; v, X8 ], n6 }/ O# Z9 M - {
X ]9 k: p/ w -
8 z8 x9 L% S! ]- Y) Q$ R' e - digitalWrite(kg, HIGH);- W) K% }+ K# d- ]- _6 \4 o% B
- digitalWrite(de, LOW);
; G0 k5 q0 ?8 v1 E5 N - Button1.print("on");7 j3 i' d; Y0 p7 M2 @" V8 C1 o
- Button1.color("#0000FF"); //设置app按键是浅蓝色
7 |& C8 v+ y3 _, w - Button1.text("开启中");
% M3 N( {) m. d& R) H6 z, p$ l* f - BlinkerAliGenie.powerState("on");
& b* D! @+ ]8 T5 V% ? - BlinkerAliGenie.print();
# C3 W U, _: W - }
$ ~! p- B4 W) j3 n4 V. t - else if (state == BLINKER_CMD_OFF)4 V# ~% G0 ]& j2 u( f
- {% E9 b$ g% e0 M( T8 y9 V& C0 K
- " @/ `0 D$ x9 M; L3 z0 Q- L! c
- digitalWrite(kg, LOW);
' e# |1 @4 X. o" A6 Z" {8 q) l - digitalWrite(de, HIGH);
9 C7 H: {0 ^8 G- U - Button1.print("off");( { b W2 a% R$ K$ r. I, V
- Button1.color("#00FFFF"); //设置app按键是深蓝色) Z) \$ h/ f/ q0 g$ L; j& a
- Button1.text("关闭中");
+ _2 o" K8 z2 d" \1 M9 c - BlinkerAliGenie.powerState("off");( g8 W A0 C; C, K
- BlinkerAliGenie.print();8 g; q: O. G# ^+ l" c" @
- }" F. D' _' u4 {+ f2 @9 s/ J' @1 _2 A" z3 _
-
4 y# \+ w; a8 a8 T3 n# f
/ M7 p) T# e$ [9 y- P o& g- }
$ p$ U! o) m* x5 A - //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次
: ~* p% O3 \% x7 M/ C7 N - void heartbeat()
! y5 [( o# }" a9 R7 W) { - {/ U; Y0 Y! l& ]$ U7 N" C3 x5 Z1 o
- BLINKER_LOG("状态同步!"); 9 |' a) n3 s( l6 }3 M" Z; `
- if (digitalRead(kg)==HIGH)
9 v: J0 u: X7 ?" S - { . |0 J4 y( m6 W& K2 k# f
- Button1.print("on");
1 p; l6 ~9 I5 E# B) S4 @% u - Button1.color("#0000FF"); //设置app按键是浅蓝色
. k$ o; g: p5 O- o+ V - Button1.text("开启中");
8 y* Q* A6 z: a8 x - }+ ~2 [) k0 H B4 F4 e7 o" F7 `% p$ C
- else 9 L9 k5 a3 }, ^* E+ T
- {
! O. h& d' ~; e" k$ k# q4 i3 A - Button1.print("off");
+ ^: l4 }3 k$ r) G. n4 r - Button1.color("#00FFFF"); //设置app按键是深蓝色9 _9 y; f6 P6 d X5 @8 C
- Button1.text("关闭中");! ?- Y3 x8 {( {9 F) A4 F6 y; d
- 0 K) L3 {6 c; n' H6 ]
- }
; `3 m$ R! n+ F/ ~1 ~ - }9 b7 E5 A" v4 ^
- //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++9 S w+ e; P; P, Y
- void setup()2 A2 x R. Y! U* k' c2 G# \% b
- {
" C" M+ h8 J8 _: {/ a - // 初始化串口
, ^/ p: J) D& o - Serial.begin(115200);! G3 n$ c* a1 J
- delay(10);/ v8 J: H$ r5 F' a- F( f
- BLINKER_DEBUG.stream(Serial);4 h* h+ Z/ A: [
- // 初始化有LED的IO
! E& {8 h# G& ?2 [8 |0 g - pinMode(kg, OUTPUT); ; h1 ~* p' k* ^3 T, V
- digitalWrite(kg, LOW);//初始化继电器上电状态 ( g0 s5 t* w H7 h2 K. n& y
- pinMode(de, OUTPUT);
3 z( ]) ^& E- ~9 [, \, R w; f - digitalWrite(de, HIGH);) Z, F: L) V% p* J' [) b9 f; M
- pinMode(key, INPUT); ( \- \3 _. ~7 p: z& ]+ p
- Serial.println();
C8 h* {5 h% `+ r. W) \) u - Serial.print("Connecting to ");
3 \ h+ h" F' ~/ F - Serial.println(ssid);- P k( E) j. C! Y
- WiFi.begin(ssid, pswd);
1 d2 y( a3 q7 R z0 I0 ~ - while (WiFi.status() != WL_CONNECTED) {5 P9 V7 Z* G3 I8 ~: H
- delay(500);: N) n4 k/ G N6 M
- Serial.print(".");; H. \. p: C' J4 \. O
- }
, a$ r' x6 A& X8 a! v0 b4 {; X3 C! s - Serial.println("");9 y& q4 K. n7 I( a; w
- Serial.println("WiFi connected");4 h' E0 _6 i" d& N
- server.begin();0 ]) Q; V& M- Z
- Serial.println("Server started @ ");
8 k% o2 {; r: m: ~4 X5 G - Serial.println(WiFi.localIP());
' [* U( Q" G! d% d" o8 b - //打印出IP地址,后期可以制作显示器来外部硬件显示ip3 }+ t/ P# j4 A* ?3 p9 `: W
- Serial.println("To control GPIO, open your web browser.");
3 P, \4 S, Q) e9 u/ f* I2 ` - Serial.println("To set GPIO 0 high, type:");4 @ T: P Z4 r4 {
- Serial.print(WiFi.localIP());
9 |; P" Z0 a7 G! t4 [ - Serial.println("/gpio/1");3 { I# Q' k7 L8 O' y; s3 j- h; \
- Serial.println("To set GPIO 0 low, type:");
; ^6 X r* \# x - Serial.print(WiFi.localIP());0 J( l5 d# x- A
- Serial.println("/gpio/0");; k- ?3 T/ @4 v6 ?) |% p+ t; z% u. r
- Serial.println("To toggle GPIO 0, type:");5 v" _7 A8 Z; O: |) ]
- Serial.print(WiFi.localIP());1 R' |* ?& A& ~3 |
- Serial.println("/gpio/4");
) M7 D: }% y. r$ a' Z" p5 I - ) X. k( E' P E ~( u" D( N! N. F
- // 初始化blinker
) W, G/ O, L6 F) g* b - Blinker.begin(auth, ssid, pswd);
: Q- e! w" `4 _( ]0 l1 x% L5 D }; p - BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数 u! k1 G; W( W1 b# y1 n+ f( P
- BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数
' b! [8 |4 g8 a. n; v$ X - Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。
0 p: N+ _+ v! F4 C5 i
7 J6 z8 n$ d% u6 V$ r# F7 J, [- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback8 g2 _8 `3 }" M- B' J5 l7 [2 X
- }
* T* b' l, ~5 `9 z4 }8 a - void dataRead(const String & data)1 r( J) ~5 Z) K) y
- {3 f8 ?# q; N D% y3 z, N4 e
- BLINKER_LOG("Blinker readString: ", data);$ |4 X' ~, O) q9 p( C
- * `1 t# I5 _; ]# i6 f! p3 O6 }& V
- Blinker.vibrate();9 G3 C% R2 Q, s' V! Z) u+ t2 K
-
4 G+ ?" u/ q' H3 P4 J - uint32_t BlinkerTime = millis();
5 _; B! N# y$ u' o& o8 O7 Z9 G% w - U" z) J p9 i! G+ J) @" t
- Blinker.print("millis", BlinkerTime);0 K& ~; n! }" E: k8 D7 Z( M
- }
+ ?& F' [& Y: @: h4 O, b - void loop()
6 m) T2 U9 Z, l6 f( P6 k - {
! \" r L! z/ [4 S i - Blinker.run();7 {2 u7 B, M/ `! U% N
- if (digitalRead(key)==LOW)2 r; t" g1 q/ G4 y1 Y; o
- {- F3 S; |9 r3 w! y, ] a; x
- Blinker.delay(200);3 R- E8 ^& V* w- ]* F) ~, ?& b& V$ u
- if (digitalRead(key)==LOW)! R5 f" ]0 X! H4 w- k7 L
- {
/ q j4 _ N4 ~/ q, ? - if (digitalRead(kg)==LOW)* N* V) ]1 P' s6 v+ x8 ]$ ?
- {
4 [1 v e+ K9 u - 6 e) h. |) N+ C/ y" M
- digitalWrite(kg, HIGH);
" d% `( q ]) k% Z; N) w! E - digitalWrite(de, LOW);
0 _% k8 h- d) P - Button1.print("on");- E1 u, z5 x7 ~) q) k6 @! v
- Button1.color("#0000FF"); //设置app按键是浅蓝色: b9 O) q' b8 G& g# K
- Button1.text("开启中");" f: |& V( i% d
- }6 E) }4 R9 V5 S# O4 D* o
- else if (digitalRead(kg)==HIGH)
. N4 Z7 a- o, Z# J3 i: ]( i+ o7 X - {* C9 R6 A' m1 [4 A) F) i( e
- digitalWrite(kg, LOW);0 {( s5 j5 u5 q7 P; W8 e
- digitalWrite(de, HIGH); |. \/ a: U, v$ f" b' y
- Button1.print("off");
* z5 S" j- T6 } - Button1.color("#00FFFF"); //设置app按键是深蓝色
2 o* O' [* P, {2 e% I! ~ - Button1.text("关闭中");3 N8 y# X& H( J! a& ]
- }$ E: z) P8 O9 r' ?$ R' A6 t
- }& `' _/ E& ^+ B+ `$ U( u9 i5 Z$ D
- }
+ I3 x; D M# R9 q* x( v# ?0 s - }
复制代码 7 S& l/ n+ h) P9 E
9 ]7 T6 S9 q1 v/ K
我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html
% z3 E9 H. `/ T; f( o
5 q" E, t& |$ }" O$ G# Q把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。* i6 s" H' M8 X2 a) u( \ `
( Q: S1 z! x1 ?0 }8 p$ z
5 v: }$ ?. j0 j7 f8 E" Q. R |
|