|
|
本帖最后由 易记 于 2021-8-21 14:05 编辑 ( X- `& V- ^" C; M2 H
" ^) Y4 B9 P$ J: Y+ X/ z
最近玩ESP8266,想做个天猫控制开关。
+ J: T2 h1 e0 A% C$ @但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。
+ e, r+ [4 V/ l# l' z0 l7 S还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。
0 I/ k1 Q l8 M' O
* h6 C8 w; R$ c% } z" I. o$ L) ^! S! Z4 J
3 O$ d, X# u) |. x- Y9 n3 I7 }* M
问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。! L2 D* A& Y# v
. q1 f0 ]: s0 ~
1 i7 g/ u3 O% j% {; }5 G% p8 r3 Q8 r o$ o- R& {
, }* e9 R" x9 t
( a* X+ y, c$ E% A f9 ]! k' B. @* z到手,当然是拆拆拆。' i2 d" f: m1 d0 T' @' g4 r( N
5 i' g' Q% p) }/ w+ |+ O9 o( \$ U: s& A" e' H
& o; w- M6 x; [" K$ H
联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。6 R3 Z6 q% A/ O% o7 k7 y
4 W7 ^0 f% u8 l T: ?2 C
' @" P$ x8 j- F5 K! f
& M! M( W" X+ v继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。8 v* P+ I E) J6 p7 v
, o( r; @+ u% G9 B* G; g
) D6 R. E" h9 T s9 q' M: w* Q4 f
3 p+ \( [! w2 `4 ?1 z* s# B0 L" v2 [ k# m: Q9 L
电源芯片 r* }# K% `4 x O, l9 g& Y
' Z6 Q4 C u5 ^% K. T! i7 ^8 V
/ y5 A7 P: Z: \! g, y, l$ Y, F4 U2 \0 O, ~+ v1 S7 A7 p1 m
有一个按钮,按钮有二个蓝色LED灯
9 z& F# K0 A7 E; N# f
+ Y' ^/ b+ j; D- i3 [2 \
; z" n3 K4 Z+ ^# t+ I* h# N+ E% `; K7 \7 z1 U J
82669 K; X5 X" }$ b+ E3 Q
0 m5 P q; y8 ]& {# ?
6 C( ?, N9 V( f! {
* M$ s9 g( x; m2 M2 E* a
) G+ m% T" s' m5 F( N% x; t' O7 w* v
接下来就是刷机了,版子上面都预留测试点。% m- l) V' V! K: r0 L2 Z( V3 o% n
接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。
/ T; p4 r8 o# h% H/ Q
" F P1 q( ]' U# N% E5 p9 z0 @注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。
& `8 o# d1 {) F9 d# S- M+ R要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 |
/ n. i* X+ k& F# ^4 e8 t, d% k! {% z" K/ O
# S, k; S5 k0 Z: b4 A# f. w
4 e2 @, y; f+ w) P9 k- W
. U4 P2 y7 n" K. j/ K$ Q0 F- W% _" E8 d2 c ]* F7 `1 m
5号脚位是继电器输出: J, G P1 v, d4 F! P: E9 _
12号脚位是灯输出
# r+ h+ N( h9 S3 }8 U+ _% \' o 4号脚位是按键
4 t" y3 ?7 }$ Q1 v4 B
8 V$ q6 m K: J6 N/ d7 i* ]/ g0 e3 q4 q- x x+ r( T) S
) E" K1 I, C) v: o
/ N5 ?5 m5 v2 {- T
卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库- s/ e% i7 w" y9 n/ u8 r2 o% {
- #define BLINKER_MIOT_LIGHT // 设置小爱灯类库
! c' e8 p$ e: T u0 c8 o! k - #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库
, I" S, B i- y! f/ M; s - #define BLINKER_PRINT Serial //串口协议库
) I( }4 j. D' |+ w# n - #include <Blinker.h> //官方库
. r& x# \/ k* t" Z7 ~ - #include <ESP8266WiFi.h> //官方库7 c9 G* |: B8 w J$ T
- WiFiServer server(80); // 服务器端口号
+ x5 s" `5 l# C* G
0 Z6 p- ?+ ^2 Y4 }0 j/ _7 r+ w- char auth[] = "c4942fb1d5e4"; //设备key0 I( i; S1 ]/ O# h
- char ssid[] = "wanboshi"; //路由器wifi ssid n! G2 ?6 ~7 [& R- M* ?2 p2 R
- char pswd[] = "1365662999813586348220"; //路由器wifi 密码
3 r# Y* K, R' R( F
! k# _6 X% c* u- bool oState = false;
8 k7 K' p3 @! J" v6 j6 F( O - 4 {6 J9 K. u6 G% o3 p% @3 d% P2 X
- int kg=5;//继电器输出
# _' |( n1 R* `# g- f - int de=12;//灯输出8 m; p# c w4 W8 C3 q5 x
- int key=4 ;//按键
9 d; B5 k _* L" c5 K* V- o: B/ G - //*******新建组件对象
5 e$ F) V% U; h+ X* P: t7 x
5 j1 p8 f) p: \ I5 [- BlinkerButton Button1("btn-abc"); //设置app按键的键名% v9 c9 ^6 O2 f+ n \1 B
- //*******app上按下按键即会执行该函数app里按键
8 ?3 ?& r7 q( Y! y9 c9 O j4 `$ } - void button1_callback(const String & state)
1 h9 Y0 f) |! H- z1 P P. d - {
; m8 w c, w$ X3 w1 r Q - if (digitalRead(kg)==LOW)3 y* h, K! `* s+ L( [8 R
- {
8 V: `1 P* u* n7 c5 R - BLINKER_LOG("get button state: ", state);
+ J9 @0 n( _. J M, ? - digitalWrite(kg, HIGH);$ t5 {. \! k' }+ z* W
- digitalWrite(de, LOW);/ P: f3 A+ w: D( m4 Y/ t6 m
- Button1.print("on");
1 q- }+ x2 {4 A/ p! f2 ]% @ r - Button1.color("#0000FF"); //设置app按键是浅蓝色
1 G. n) g9 y* A. ]: l. R# ~2 { - Button1.text("开启中");
# H* o3 W' K0 u, ^& J - }
6 {5 @: r- u, @1 e - else if (digitalRead(kg)==HIGH)
; \$ D9 k2 d9 i& y' g* Z" `! O - {
' N8 k- C- G6 B7 y I - BLINKER_LOG("get button state: ", state);8 k7 W/ N) T9 i8 Z. Z. F; z- V
- digitalWrite(kg, LOW);/ [! F7 @; F: P8 H: j& g
- digitalWrite(de, HIGH);
i6 V1 S# H* y% u: ^ { - Button1.print("off");- W% l) O3 U# [6 G0 k) O' p
- Button1.color("#00FFFF"); //设置app按键是深蓝色: T$ |+ F5 Z9 _% b9 D
- Button1.text("关闭中");
/ X/ H' D$ T, I# @9 Z - }' c( d$ ? W% l
- }: y8 |' Q. A! O) ~0 q8 w$ J
- . r. Y% C9 g/ }
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Q( \1 @3 {+ Q+ ]& P - ; H" M- g0 O. }) v5 t, _
- //*******如果小爱有对设备进行操作就执行下面
% }. ^+ {2 `8 } - void miotPowerState(const String & state)- r9 ~4 G1 c. _" |+ o% r9 P1 E
- {
7 l4 p6 X( v p& Q2 P5 H - BLINKER_LOG("小爱语音操作!"); //串口打印
! i4 m+ v) `# O- R0 z n1 z4 _$ F - if (state == BLINKER_CMD_ON){
" e$ m) V' Z- x+ H3 T -
6 v9 u. {& }' i, c - digitalWrite(kg, HIGH);2 ]8 m. h& [( R, M q6 L
- digitalWrite(de, LOW);8 r+ V0 [* f, B* e0 M, J$ a1 q
- Button1.print("on");
& f7 x9 a6 d* a# R/ \# s" z - Button1.color("#0000FF"); //设置app按键是浅蓝色% U: V: ]: I" S
- Button1.text("开启中");
1 Y" ]7 v, u/ e( i3 S- h3 y - BlinkerMIOT.powerState("on");
4 U" U( y: b, X2 F - BlinkerMIOT.print();' v* z, A2 D @, b
- }
% v8 W% M2 i/ n- l) a* K - else if (state == BLINKER_CMD_OFF)! |0 F5 d8 b# q6 ]9 X
- {, }: p1 x" Q# v- I
- 9 M: G0 F% ?& L2 s% j
- digitalWrite(kg, LOW);. _/ B, u& L& @# h" I4 P$ R/ l0 a! s
- digitalWrite(de, HIGH);
( I$ g3 q# X& o% P- l6 h, e - Button1.print("off");! H$ K) J: x$ v
- Button1.color("#00FFFF"); //设置app按键是深蓝色% P! a1 Q& H/ S1 }! Z- s
- Button1.text("关闭中");, U6 p) q E# ^% m2 k
- BlinkerMIOT.powerState("off");& ]) W1 I. ~# L. m
- BlinkerMIOT.print();
; [+ g a7 ^- h1 E" p5 t; G - }
8 h! F/ Z9 Y2 M1 b/ j - 4 \8 v" H7 j& t* A! k
-
: N7 }6 O! ?& [1 F* h/ |& ` - }
8 w' T7 Q9 h9 N6 L# i8 }6 R - //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- H+ p- x! O) j5 Y( r( E - //*******如果天猫精灵有对设备进行操作就执行下面 r9 e7 |- j6 A c1 ?: n
- void aligeniePowerState(const String & state)
M* B6 _8 d5 j- @ - {
) H. s) R M+ g* H$ [ - BLINKER_LOG("need set power state: ", state);4 s( [+ E+ w i j, H0 M& h
- if (state == BLINKER_CMD_ON)+ C8 H. ]& W" G( c( x( f( p
- {9 C# Q0 a7 S* g v' K/ h p
- 7 L; V! l! w" d4 b
- digitalWrite(kg, HIGH);
# J' `% p4 y0 y2 A- n- y - digitalWrite(de, LOW);" z7 b+ c. g$ b6 d h% S# r
- Button1.print("on");
# \7 K2 E2 X+ C; I( [ - Button1.color("#0000FF"); //设置app按键是浅蓝色
3 j5 L0 G+ k3 \. l8 L - Button1.text("开启中");# D/ \9 }. H# n/ A) g/ `, D8 U6 X
- BlinkerAliGenie.powerState("on");0 E1 c8 [* G+ m1 W7 k; |
- BlinkerAliGenie.print();
: j1 T+ w. g, Z% j - }
, f) h, c2 X- v* Y - else if (state == BLINKER_CMD_OFF)
$ a: x5 ?8 y+ H6 \: W3 z - {
1 _) d8 ]- R5 H1 o" h7 R - 5 j! @, g% ?* d; e
- digitalWrite(kg, LOW);
+ y. A0 C L9 y8 ?: B$ t - digitalWrite(de, HIGH);/ G' x, p. [; S0 C
- Button1.print("off");
! p3 p5 D$ c4 g2 F( _3 ~2 s - Button1.color("#00FFFF"); //设置app按键是深蓝色8 P- B$ T! R& \2 T% x% J
- Button1.text("关闭中");
6 V S9 L/ t# e& } - BlinkerAliGenie.powerState("off");9 O$ n6 o) j% Z8 J1 [/ C, s
- BlinkerAliGenie.print();
% d: x* g% M6 l) z - }
9 o+ { `; q# f% S* R& E& G - u/ f6 |) k9 v; [% W5 e w6 o
- * W2 f& b9 x7 q. j
- }8 x8 U |' M1 g* c% t; Z$ J
- //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次
0 _7 `* [" R! q1 k3 B+ r - void heartbeat()& N7 X# f$ A" z3 g% A$ \& \
- {
/ B m+ C: ~* X" O+ U- I - BLINKER_LOG("状态同步!");
$ _* f5 x% _; K+ P1 q; v2 a - if (digitalRead(kg)==HIGH)
D9 Y7 e$ D5 X4 a9 x9 g - {
% T, M2 ]0 s, c5 F6 N - Button1.print("on");
1 z- k+ A3 y8 \ - Button1.color("#0000FF"); //设置app按键是浅蓝色
8 X, V1 p+ m' J0 D - Button1.text("开启中");9 P. q( Y- _/ d9 @8 |) `! @. A1 S
- }3 B% X. W4 J1 k& r
- else # e4 E) C8 V" G
- {
; v9 r( j% L% Y/ h4 |. j* g - Button1.print("off");) e, a s. e7 k8 J( B& S2 O
- Button1.color("#00FFFF"); //设置app按键是深蓝色
# Q& w5 K) V ?) F+ r' b/ p: c - Button1.text("关闭中");
6 N9 o1 W; o. T6 i5 w; p- I -
_* i9 m S7 M2 z% {( G - }6 `# s& h" z- Y" d }% o
- }
$ g8 d) p0 R. ~# w ?( U* d% b - //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++1 a4 y D( s9 [. I _& d5 F4 y
- void setup()
: o, w7 l J3 [* ?: ]: J+ i - {4 C: k% e7 `9 F* `4 @
- // 初始化串口
: p0 K! s6 Y$ | - Serial.begin(115200);9 ~* l' V( s- D
- delay(10);
# I' S" ]" N2 r& F - BLINKER_DEBUG.stream(Serial); r# q* H7 c; u) y: o' L* w
- // 初始化有LED的IO6 i. A8 H8 z/ `. ]
- pinMode(kg, OUTPUT); ' ~ W0 F- L3 W0 d4 T
- digitalWrite(kg, LOW);//初始化继电器上电状态 0 M- e/ w, e1 d6 O/ ]) X& |" {
- pinMode(de, OUTPUT);
& ?" a( y& O: P( P0 y1 ~8 n - digitalWrite(de, HIGH);
3 U$ K0 ?, ?7 v% Z5 |1 v - pinMode(key, INPUT); ) {8 A/ D% h9 I3 s+ z1 q
- Serial.println();6 n8 i; R4 Y' k+ ]
- Serial.print("Connecting to ");
' S) ?' ?" @, t" a8 Q2 ?5 d - Serial.println(ssid);
3 c2 j) D0 B- u2 T - WiFi.begin(ssid, pswd);' ^) k, X1 Z2 C7 {6 s' N/ h% }: `
- while (WiFi.status() != WL_CONNECTED) {
. L3 v% J8 ]+ e) f8 I4 q - delay(500);5 _6 U3 G! N6 n) _2 l" f
- Serial.print(".");& u' N* ^6 i$ r3 y" u3 k( }/ g
- }
- b X! A6 T4 s" E% L+ v/ ` - Serial.println("");6 c8 A- G, m$ T" y5 F
- Serial.println("WiFi connected");
9 f6 M9 _6 H1 M- `/ M- p/ D - server.begin();% @5 f) W4 c, G3 j" m
- Serial.println("Server started @ ");
J. X; ]4 `7 C) X3 u1 v4 D - Serial.println(WiFi.localIP());
/ l2 c, o! ~( C0 W( } - //打印出IP地址,后期可以制作显示器来外部硬件显示ip' N: F; @8 I$ k3 d( X- W) P
- Serial.println("To control GPIO, open your web browser.");
9 v% N$ M0 T1 z, U1 Y - Serial.println("To set GPIO 0 high, type:");
; ]* L9 q% s$ s0 s; b - Serial.print(WiFi.localIP());
4 U( g3 Z* J* S; L9 Z. W - Serial.println("/gpio/1");1 B4 e9 p) a1 X; O2 c
- Serial.println("To set GPIO 0 low, type:");! {# F# i1 U6 j k
- Serial.print(WiFi.localIP());
6 c! g. e9 G3 H4 Q - Serial.println("/gpio/0");2 M; c2 x, c9 a! E% d: h
- Serial.println("To toggle GPIO 0, type:");
. ]3 x+ m; v( P: H6 s8 t: K - Serial.print(WiFi.localIP());
. r1 H5 z1 a: U$ a, G, Y - Serial.println("/gpio/4");
) y) w* B0 H1 O5 O - ( t( s: l! _+ w2 u- d( v$ B- O
- // 初始化blinker
& Q; j5 N# |5 L - Blinker.begin(auth, ssid, pswd);* m& a7 i8 j4 M h# ]
- BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数
3 E9 s# ]4 I4 s3 H2 C/ P - BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数
& e. j, V3 u8 @; |& h" ]5 W% X - Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。" `; d$ w H! q5 A
. B# @2 W4 K+ [" |- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback
4 ], \; \6 j1 _: |# P - }
/ Y d& l, {7 F4 s; s4 l& S& s3 _/ B4 s - void dataRead(const String & data); ~, p' L' \& [$ N$ M' ?% z
- {
' O% ?1 T4 t: f* M2 x: ?7 ?2 O - BLINKER_LOG("Blinker readString: ", data);
1 [8 D3 d) |5 u' W0 z1 d3 T - ' f' ^# g& M7 N
- Blinker.vibrate();
. p( W5 d4 P. w7 k: Y n# A -
+ N' w; t' G a7 A+ k - uint32_t BlinkerTime = millis();$ h7 _' Z! T: o! z+ l# K
-
! r9 R. Z+ t4 ?- D! t0 Q+ @ - Blinker.print("millis", BlinkerTime);
# S0 p3 n0 `8 ]5 i9 s( ` - }' c* a2 C w! N; c, f! R4 F3 {1 _
- void loop()% v6 M9 W- B6 V3 A7 L
- {! t7 d( {) N' Q. L5 p
- Blinker.run();
# n9 \" n8 e1 |& B& o - if (digitalRead(key)==LOW)" ~9 c% O r2 p; |6 n
- {, l( w* m$ I" G* o( s7 o
- Blinker.delay(200);
. V8 C: U% }) l5 d& J( Z: \ - if (digitalRead(key)==LOW)
+ A. w, B8 o8 I! e - {9 C) I- G+ ~* u5 T9 z' n
- if (digitalRead(kg)==LOW)# h+ b% C) B8 q
- {8 Q- z8 s- v) g2 k
- 4 n! e' n' t" `
- digitalWrite(kg, HIGH);
8 d/ n# e9 \$ ~( R0 r- n - digitalWrite(de, LOW); n* z9 {$ z3 u1 K, @5 N% t
- Button1.print("on");
% M1 @0 |* `. W' V - Button1.color("#0000FF"); //设置app按键是浅蓝色
# }! q2 Y* I) f2 H# w, J - Button1.text("开启中");# z3 R+ g# g' x
- }
' d6 W! ]' k/ l- _ - else if (digitalRead(kg)==HIGH)/ P4 b8 A& ?( F# @& Q+ F2 @9 C& I/ ~
- {' {) E5 R, a$ j- l6 r$ r5 v0 P
- digitalWrite(kg, LOW);
5 Y4 J: M( z9 t! f+ x- g# s0 x+ Y z - digitalWrite(de, HIGH);( }9 A' x! n1 @7 N/ ~8 J4 P
- Button1.print("off");
7 k' q. Q' k1 c$ L; {, @- }$ w - Button1.color("#00FFFF"); //设置app按键是深蓝色
/ p! P1 F2 h' b: U7 {3 m$ J3 n - Button1.text("关闭中");* ^$ o: G9 U) b# A' W6 l% M& _! l; p
- }1 F. {, ^4 Z5 K$ d& I2 @
- }
% G7 A M: S0 k; W# b - }
0 C: d u2 `! u( z6 h - }
复制代码
% t& z0 F$ U, V* t, G
/ `& V. Y/ _2 n我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html, b% O# m; T% F3 e! \% N) R
, R4 W7 ]6 w- ?# ?把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。
: s) |7 [; d6 J* ]: U$ j' \! U
9 K7 r8 e! h7 Q% d; n: @
8 i# t* [: T3 T `- t, t% a |
|