|
本帖最后由 易记 于 2021-8-21 14:05 编辑
+ q& s3 J# }. |! q, V
2 W$ c) h. d( k最近玩ESP8266,想做个天猫控制开关。
. Q' h4 p: P |# w) _+ S但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。 V9 S& p" C' _; K# }
还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。4 Y& d! ~7 G" a7 T
, r, _7 i' W8 y! C- J2 z# E7 n" Q* I9 W* ]5 N3 K
$ b1 q4 P! g7 O7 V2 ?/ _6 c7 i7 N问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。
6 N# q+ X0 J( l% F! V# n% U* h- H7 P7 d
4 Z& F5 ^! o- |2 Y' \6 n, }
+ `/ B2 l2 k0 w7 m6 \" @% K5 L
4 |: C6 ~' @5 L: [1 u) z, Z
9 E4 _% r, }4 j+ N9 S# E4 B; h' L到手,当然是拆拆拆。) Z* k; H' [9 v6 u
/ d6 s( t F8 \3 O3 T8 b- y" B4 v+ b
) J2 S) Q+ B# v" S! e' G
- C( a1 ~- p% G9 z7 ?# y联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。" D: \" \4 p4 R
4 U! y ?- x, Y9 j) U
7 @2 w- e1 T. j W2 H$ {+ c$ p4 e- u6 Y% }2 x& K. I. X9 W% W( L1 b
继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。
) B- B: |+ ]! n0 \8 G2 @, ~
& S' H7 L I5 p, a+ W
& y. {4 C, [: I# h! \- C
9 c1 a& E$ W- x# h( G$ k0 Y) F, V
) y: O' o3 e9 {电源芯片
$ b+ n' K" l4 c- D) K9 i7 u4 I5 ~4 H( t5 ]6 K9 Z
; A% V2 }) ]' m
3 V% { ]; R& J3 h2 Y
有一个按钮,按钮有二个蓝色LED灯
; h. S7 j1 N7 X" R0 a6 Q
/ R' v W/ V$ N' j3 |) K! C, \
( I% F% w& ? O3 r. G
6 |3 _+ d! \9 X7 ~4 }! A P" t% Z
82660 `# T$ w M4 N$ S
/ \1 p- E7 Z1 q2 z' `
# _% ]! o. i$ h0 v2 [! p
, ^4 [) G) N9 \8 P- R( n3 D( Q
. y3 W2 j0 W8 f+ E0 [
7 U: K0 J) Q% }) K接下来就是刷机了,版子上面都预留测试点。5 }& Y# V t2 ~0 S8 R
接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。
! e5 V( U4 o1 f& B; ^
* v/ E5 M2 n4 T) J) W6 g( {$ ^
注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。
4 j, b; I+ _5 @! u0 T! L2 F要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 | 1 x* |2 N2 J3 u2 p6 l f% }
& A& i, R% Y3 q9 ~( J
5 `! O- _& v' C! |3 y# ], o
) f4 ~ g" y, t3 v- `" m% ~! W( @7 e# s: D9 a
# r+ P6 C5 B2 |! @0 J
5号脚位是继电器输出4 w3 [9 g% V9 s- C* ~0 T
12号脚位是灯输出7 g) V6 M" h9 V: U W+ c
4号脚位是按键
7 }) g _; w2 T5 W; V4 g! E" a. r% a0 a! d7 ]# w/ Q7 w
( J( I3 m2 I8 S7 T
7 Z) O: l: R& ?+ [: q! X
2 @% H# M; T3 H- y卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库- ]7 t, j$ _- X1 x
- #define BLINKER_MIOT_LIGHT // 设置小爱灯类库0 ~1 j! H5 b+ @0 ~2 T. [% f
- #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库$ }' t4 W1 k9 f/ M: O2 p2 o' B
- #define BLINKER_PRINT Serial //串口协议库: }5 {" ]7 a5 S* t V1 Z
- #include <Blinker.h> //官方库) c+ O+ }& G* ^6 k
- #include <ESP8266WiFi.h> //官方库
9 s! d( `9 ^$ { - WiFiServer server(80); // 服务器端口号! x# ]. N+ V8 C' b; O g1 g7 q! q' w
% B( Q' J8 e& X/ R8 _9 t# C- char auth[] = "c4942fb1d5e4"; //设备key$ _) h! ]' R" }0 O+ Z
- char ssid[] = "wanboshi"; //路由器wifi ssid. Y7 B- ]) D1 h* H3 t% z& n T
- char pswd[] = "1365662999813586348220"; //路由器wifi 密码
8 e& R+ }8 q$ l5 P3 W' @
9 A& `0 H( x- ]2 k1 W( v m- bool oState = false;
) a$ H3 d: W* z, o0 x - + D0 w ~+ C$ V5 J/ Q, Q) y) H
- int kg=5;//继电器输出
# l4 K) r: a+ z. r0 z) D" o* h2 C - int de=12;//灯输出* ~; h& y/ {2 J* A7 V3 v
- int key=4 ;//按键
) Q+ m* y% c2 t# f* J9 C1 j* f - //*******新建组件对象
; E" I: v- Z1 ]6 ^# E+ l& W - 4 O9 ^- [; ^( ^& {% o
- BlinkerButton Button1("btn-abc"); //设置app按键的键名
, N$ W- i5 I" r - //*******app上按下按键即会执行该函数app里按键" j- R" b# }: \) X# p3 }* V1 t/ ?
- void button1_callback(const String & state): f/ `% @8 F" s
- {* c& F* r7 `2 g" f7 f# r* k% Q
- if (digitalRead(kg)==LOW)
% B6 |3 D: i2 Y' T - {
" e# e% e" P5 u - BLINKER_LOG("get button state: ", state);8 w( N' j8 J- h1 I
- digitalWrite(kg, HIGH);
$ k( r3 z# f. ^6 I4 q/ b4 n - digitalWrite(de, LOW);: O' k0 ^! E2 B& S+ |, z7 ]. V: L
- Button1.print("on");
# H6 h H D3 @' u - Button1.color("#0000FF"); //设置app按键是浅蓝色- y& z3 ^5 P$ A& B4 x' g
- Button1.text("开启中");
$ }/ U; o4 E: N& O* M* v( v! y - }
1 d1 B5 X% Y! l Z& a - else if (digitalRead(kg)==HIGH)
0 e* R7 J0 E; i# I% \1 X - {" f/ \8 k" t2 e' b1 i
- BLINKER_LOG("get button state: ", state);
& [$ Y7 U' t. e( H3 j+ I - digitalWrite(kg, LOW);( `; C5 C4 a6 Z
- digitalWrite(de, HIGH);: G8 b& O G( R6 H2 m
- Button1.print("off"); d0 p7 M# x' K& k+ e" w' h
- Button1.color("#00FFFF"); //设置app按键是深蓝色1 X6 q! `9 j* G
- Button1.text("关闭中");5 l9 l U1 U3 S, x v @, d
- }
. D8 S) z7 ]! I: I- S; S - }
$ i# p, G6 v2 n: j7 B8 Z" E3 J
8 w% R2 C0 h) w' M* B% Y3 w& }- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
( D1 z1 b& ?# |" k% O - - j' G( c( ~5 `$ o. R
- //*******如果小爱有对设备进行操作就执行下面2 O3 }. P) I) z9 T
- void miotPowerState(const String & state)+ A9 E8 ?' V' y6 ?3 M4 C( c/ A5 Q
- {
. {+ ]' h4 a" t" G2 E* b" t/ d5 m - BLINKER_LOG("小爱语音操作!"); //串口打印* g$ G& v) w7 ~- _& }
- if (state == BLINKER_CMD_ON){0 [# |2 A; ^6 s9 y
- : g+ X9 e* E g6 y% S- j
- digitalWrite(kg, HIGH);, q# i1 m! Q+ X: I9 c7 G0 H
- digitalWrite(de, LOW);
; ~( h+ E2 P$ o, _ - Button1.print("on");
- ^7 T# g) Q9 W0 \6 l: I% h - Button1.color("#0000FF"); //设置app按键是浅蓝色( R G, _6 |% e7 t
- Button1.text("开启中");3 [( F1 A( J4 u5 j2 H' n
- BlinkerMIOT.powerState("on");# X+ R! ?) g! {! Y3 m
- BlinkerMIOT.print();
8 U f2 s$ m |; B) K9 { - }
. G4 r% U$ y0 N7 o - else if (state == BLINKER_CMD_OFF) B. C, `, N5 p: m( C( B
- {8 f P; ?: W+ J8 c) E
- 3 e/ m6 U1 C! ?5 M" a7 o3 d
- digitalWrite(kg, LOW);
/ ?+ {1 e8 s x3 ^1 I0 x" S1 }1 L - digitalWrite(de, HIGH);5 q9 u/ q* Q2 Q$ v9 j- G9 |
- Button1.print("off");
& R! Q8 b0 {+ s: V @! x0 H( w - Button1.color("#00FFFF"); //设置app按键是深蓝色2 h1 O2 d/ q, d5 e C
- Button1.text("关闭中"); c R9 ]3 a# q5 j; ^7 R( p- z
- BlinkerMIOT.powerState("off");
( T0 X; g& s# M- v6 d6 D C3 ~ - BlinkerMIOT.print();5 ?+ [7 Q- X5 ^2 n
- }
# @% X } ?5 {1 t# t% h. b7 z/ e7 N9 r( s -
) r2 X* H* |5 y! ~4 D/ |! V. e# z - ) ]+ K5 I3 w1 ^- ?- F
- }. T# l; h# c6 ~, Z! o
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
( w! w9 \" j$ ~% v9 q - //*******如果天猫精灵有对设备进行操作就执行下面+ R0 A9 y t# F* v M
- void aligeniePowerState(const String & state)
; `) }% q% a" J/ }' l$ C q - {
# T$ M" q9 f+ d% O - BLINKER_LOG("need set power state: ", state);5 \: r) o* [! J* e! D( w9 f6 H% t& |
- if (state == BLINKER_CMD_ON)
3 X* z& e7 G( |& S; Z - {
- k- u+ O. Z' t0 ` -
* w8 W s _" _+ a+ q7 o2 w6 V - digitalWrite(kg, HIGH);1 v9 C+ ~' X6 z4 D3 a- S/ |" ^
- digitalWrite(de, LOW);6 D* s0 {, G8 v; }: \- n
- Button1.print("on");( L# c3 _8 Y! o- C' j, S9 s% c$ l
- Button1.color("#0000FF"); //设置app按键是浅蓝色/ E/ e1 P$ p: E% Z5 G" g$ A. `
- Button1.text("开启中");7 I, i! h( n, H1 Z9 l+ o/ ]
- BlinkerAliGenie.powerState("on");9 X% R. g7 \8 V9 E; s8 A% X ^& y/ Q9 n
- BlinkerAliGenie.print();
8 G* F8 E& n- _7 a - }
4 g5 ?2 Z \" D6 F: h% ^: W - else if (state == BLINKER_CMD_OFF)3 U$ \. F) y$ P& {) M
- {0 j$ N3 P" h# M7 R) R; K# t& H' ?
-
& F. Q" j: B0 f1 F5 H - digitalWrite(kg, LOW);
2 I" R; z& ]8 U' B% }. O% Y - digitalWrite(de, HIGH);
' E( R6 y$ i. S7 @* m) Z5 m - Button1.print("off");
/ x3 l6 y1 D- H4 p2 n - Button1.color("#00FFFF"); //设置app按键是深蓝色
0 W" D7 u" c, _$ J5 ~9 [. t) f o - Button1.text("关闭中");
' Y9 P# ^3 [2 R! u - BlinkerAliGenie.powerState("off");6 u6 _, H7 E5 {9 B! F8 }& d2 K
- BlinkerAliGenie.print(); ?4 O2 B6 R6 s0 k7 j
- }
. j7 E! c4 ~3 k - * z- S7 }! F+ C* ]' a5 H V
; P0 z. K* F# e6 f- }
; R8 n( w& `; ^+ O( [: r - //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次
+ E% v; G$ E( y, _2 H- }) d - void heartbeat()) | }0 Q$ \6 u$ h" g2 J
- {
, R! ?. I0 s. f( P' O - BLINKER_LOG("状态同步!");
! o% J- T& E" x) J7 P& i+ o: W - if (digitalRead(kg)==HIGH)
) w: W& K, B2 M. H8 \4 N0 F& C& d - { # W H, i* {2 b4 Y5 t( c; C
- Button1.print("on");8 D |4 I1 T8 S! |" r
- Button1.color("#0000FF"); //设置app按键是浅蓝色6 O0 A1 @: d$ c. r) X5 ^$ M
- Button1.text("开启中");
; n) H% M' a" C" a% n9 o7 ^+ Y - }4 ?* \+ d" I+ q- f$ b
- else " O' D+ ^" I4 o2 R# j
- {2 {) m p: T) Z) y6 U* R
- Button1.print("off");
! k. h+ e! B* v - Button1.color("#00FFFF"); //设置app按键是深蓝色3 }, H6 z- {+ B$ B( d0 a+ `0 _
- Button1.text("关闭中");
) O8 |. u0 H) N; w$ A - , g+ C4 C9 a4 l; X; X! X0 j A
- }
+ B- |* I8 N9 F9 w* ]7 p4 t - }
6 b. r8 v4 D0 d( j& E - //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++) u4 E | {8 H7 F
- void setup()% t0 r9 T9 R! x* v# k
- {1 k7 r# q S3 S: A
- // 初始化串口
7 V$ o- E7 p6 }6 Y4 d - Serial.begin(115200);
$ G; s {/ d. d6 m% \ - delay(10);
8 y$ ~. @' }8 B - BLINKER_DEBUG.stream(Serial);
8 A( R$ N7 q' ^- a: U2 W9 W0 d - // 初始化有LED的IO. [0 e" ^/ E$ n, `, |/ X7 r& l) ^& B
- pinMode(kg, OUTPUT); $ _# \1 m: n& t& @' c: s
- digitalWrite(kg, LOW);//初始化继电器上电状态 0 \& v* h4 l* _; S
- pinMode(de, OUTPUT);- E4 [* k) }- f0 @$ k3 J. @
- digitalWrite(de, HIGH);/ w; k& {' T0 g! E
- pinMode(key, INPUT);
. m/ w$ F! Q. W9 F - Serial.println();" _+ I. e, L- |* a
- Serial.print("Connecting to ");( G2 H. S+ s, a
- Serial.println(ssid);
; X4 w. k) p' A, a3 `5 i - WiFi.begin(ssid, pswd);
+ \& B" R# b9 X1 @ - while (WiFi.status() != WL_CONNECTED) {
+ n+ p% ~2 {" F8 p% w- M1 r$ H' Q - delay(500);' c( G! w6 t& ^* E/ ]! l) l
- Serial.print(".");
* _+ L) @ O! d; } - }
+ u$ ~5 @# I% i - Serial.println("");
5 ]6 d; A0 ]- Y% h( m; x+ B3 V. m - Serial.println("WiFi connected");, Q6 t/ T) x" j
- server.begin();
: c# E0 A2 S0 ? - Serial.println("Server started @ ");
1 e, J, N3 {! M( A5 k( J - Serial.println(WiFi.localIP());
4 b' K8 G+ \! K0 ~ - //打印出IP地址,后期可以制作显示器来外部硬件显示ip
+ w5 _1 P6 W. S - Serial.println("To control GPIO, open your web browser.");2 W% f0 K" h8 i
- Serial.println("To set GPIO 0 high, type:");% L" X# i9 y( w4 F; p! x( @5 C2 f
- Serial.print(WiFi.localIP());3 B' O! P6 n( C
- Serial.println("/gpio/1");
# t0 Z. }' O! C8 H - Serial.println("To set GPIO 0 low, type:");; X z. j, O# J! _, m, o% g4 |
- Serial.print(WiFi.localIP());9 b/ \! |, _8 C l& x
- Serial.println("/gpio/0");
; g0 d+ P: u( W - Serial.println("To toggle GPIO 0, type:");, w' ~' o7 w. g, O1 d
- Serial.print(WiFi.localIP());3 w, Q( z9 A2 _7 `! q" R/ K
- Serial.println("/gpio/4");
. U9 O8 z2 ]$ s. m
2 N5 l: l `, H* I7 h- // 初始化blinker
# D* {6 J2 d5 E% {0 A% G0 B1 { - Blinker.begin(auth, ssid, pswd);5 J1 B; C+ Q |! k8 E; J
- BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数
M! a# g- Y, P6 B) J2 ^ - BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数
' e3 y0 }0 F. _- D - Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。
7 x$ y5 \2 D$ N8 f8 p
, _% c8 g' ]2 O- k. b% @: T- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback* C5 `9 O. G# t1 _8 r
- }
4 o3 T/ q5 U4 A: k - void dataRead(const String & data)! m6 S }/ a1 A3 Z. B% L/ ]
- {
9 [3 T0 H( G% w2 R - BLINKER_LOG("Blinker readString: ", data);5 f7 k% h0 a1 o' b+ n. d2 s0 y: f
- {% U4 q R4 V5 c/ o
- Blinker.vibrate();
5 o( O7 r5 J/ L3 z% W: W. ?3 m k6 G - - z! \9 f( d$ E, `
- uint32_t BlinkerTime = millis();
2 u9 h+ S3 i$ Z7 e5 L2 f" x& N& G - % h. }- \/ ?1 |2 H# O
- Blinker.print("millis", BlinkerTime);
# x$ d% Y# A; x& s7 t - }0 g1 P$ `! q8 U9 L# w
- void loop(): a _% A$ \ R1 i6 C
- {" f4 M& o! W, \! r- U
- Blinker.run();
; v0 p+ H/ `3 e0 ^; P7 p# t - if (digitalRead(key)==LOW)* o* G) r7 h& _: o8 d0 G
- {
* r2 o( H+ e* _2 a$ s - Blinker.delay(200);
$ L" B/ ]: g ~ - if (digitalRead(key)==LOW), }$ g, K5 j, Y- z- z
- {; b2 r. p. b- u% j' R
- if (digitalRead(kg)==LOW)
0 M% R5 }" W5 i* R. Q: } - {
. c ~! d9 T2 y5 {' z0 s$ Z - 6 ~* Z0 H+ p+ ?5 p& C
- digitalWrite(kg, HIGH);
0 \+ x+ [1 ]( R, ]7 S! S - digitalWrite(de, LOW);, `" |3 ]9 r! o/ n
- Button1.print("on"); h+ S! q: a3 o! H+ n
- Button1.color("#0000FF"); //设置app按键是浅蓝色
3 e- W3 e4 J: U- s$ J - Button1.text("开启中");. l8 ?2 ` l; I
- }
0 Q: u* M# B) V' U( P. e6 F+ U - else if (digitalRead(kg)==HIGH) Q1 J% v. z- ?9 r* q
- {
( e' b1 Y9 f) q2 J( N - digitalWrite(kg, LOW);
7 `0 y; V! ~& y T* V( z- k - digitalWrite(de, HIGH);
2 O0 h, `+ D% B% |. k! O- M- ^ - Button1.print("off"); p+ \" N' s/ z# c
- Button1.color("#00FFFF"); //设置app按键是深蓝色
* B" }4 {% o8 A" S) Q0 l& v t- V$ t - Button1.text("关闭中");
' W" n; X* C( R$ Q - }2 l6 \+ C. n9 Y( S
- }9 s; H" ^4 x p/ k
- }
" @0 Q% F& q: C - }
复制代码 ; R( z/ _6 {$ y6 y$ G9 o
5 c* F4 ^# b. m; D) m
我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html L9 B! w' H7 N% ^! E
: j- f, ^$ ?% P1 a把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。
v! o5 U) D" F
2 \5 F1 X2 U& {" T- b* [
9 G1 t' W/ x1 B/ s8 e |
|