|
|
本帖最后由 易记 于 2021-8-21 14:05 编辑 - ?% J2 V1 w8 q( ? m1 g
6 `1 }. Y$ T. y- P最近玩ESP8266,想做个天猫控制开关。
' e+ {* g2 v8 U n2 N; |但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。6 o. m% c ^) h3 e+ v% I
还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。2 V% V1 D) F* z- l, c
3 }) x6 C/ {2 m( u( I
# J- l2 l2 H7 z) v1 [6 V) n6 e9 w- Z8 h
' }5 d, I# C5 t( q+ @问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。
: t, |1 \9 |9 w, x: \) p: E5 |7 h
) | M. Y X4 r" i5 U
% Y- t, J c$ @2 u( \8 m% B1 e1 E& C$ E; x4 c3 X" y; A- O
/ p# L$ A& B+ P. r6 N' Y0 G5 A' I, L# g* Q: y; c+ Q; G* @4 d
到手,当然是拆拆拆。
2 e1 J/ ]. t1 ?/ y+ |2 V3 C
9 ?7 q3 I. w. J# ~
+ Z' e- {! c2 ~+ h( j. @+ s0 r, K- _$ }
联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。6 e8 A; Z: |: e \
7 O& k# K$ ~& k ^: K
5 W3 I7 z* I5 E O/ l- J. D" B& |/ k% j5 L3 m' d3 ` H5 ]
继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。
2 l2 F9 ]' i( L; X/ E
, X' ^) @& t3 b, k6 M _
9 H0 y+ ~" [, @. A
+ J, J( R& y% Q( \6 P0 Z* O# o7 u7 S, N, p. `
电源芯片# f8 H+ J2 @$ w! v1 u) X: U" U- ^
6 |' j) H0 f7 |( a$ [& }) Q( b6 V5 v. P' H) {
- B( g/ Q' ^2 {$ U" `' O- K
有一个按钮,按钮有二个蓝色LED灯( w4 j3 ^# t! k& H' ?
: `6 i2 i/ ~8 j N/ b0 ^% R
2 ~: h) O7 `( y: ~* i6 z7 [, G& z- r2 P
8266
( n: S" G/ J& n: |' I" k
7 T9 T3 A% n- k% @' u, D
& Q# V5 L" P$ s8 u/ H9 m# w0 b n; g0 E0 l6 [) f; ?
* C% R- i/ H8 b- i7 I
# w# u! l9 Q- |( P1 `7 e2 B, J$ [
接下来就是刷机了,版子上面都预留测试点。
2 e9 @8 ~- q5 b7 ?接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。
; C$ a" `, ^8 }, k# D' a; N
$ v) ^, w) L8 o; \
注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。* ~3 _: {2 ]7 c) D" B# N" [
要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 | ! Z, d; O/ V, G
+ i4 X! @% J+ I
! i1 H7 B4 S8 J8 D
" }* _" ~# T. L
# L" @0 k1 c7 o* u) C6 v
0 e5 s) }4 G2 G 5号脚位是继电器输出
/ m5 S# ~1 X, e0 l0 D6 O, N0 o2 L3 s 12号脚位是灯输出% R, ]( s/ E9 o- U2 S e
4号脚位是按键
9 {2 @9 [ Y, _3 B R
& I9 R% Y' y& [" P& I2 e( u
6 {7 ]& Y6 S; K3 N, l/ a5 \0 \# c- o0 g+ s7 a1 K
( Y M; {' q! X4 M. C. H& R卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库# ?; a+ X! v) {( y/ t# u7 e/ u
- #define BLINKER_MIOT_LIGHT // 设置小爱灯类库; ?6 }) T- F, I5 c. g3 ?( M
- #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库& W$ j/ X5 d; D+ t' x/ a
- #define BLINKER_PRINT Serial //串口协议库
6 G/ ^9 q# F2 z( _1 o- i - #include <Blinker.h> //官方库
8 ^ t/ i* s7 U' i( T. o8 ~4 T5 c - #include <ESP8266WiFi.h> //官方库; k5 ^" x P: f/ O: Q' q
- WiFiServer server(80); // 服务器端口号
( ^, `" c3 H) t! o9 j5 S
3 \# b( u5 |( a9 \" D- char auth[] = "c4942fb1d5e4"; //设备key
7 H/ [7 K- e+ U$ A* L- a) ~% W- Z - char ssid[] = "wanboshi"; //路由器wifi ssid" N ?# W& S0 @7 a9 j6 P
- char pswd[] = "1365662999813586348220"; //路由器wifi 密码
9 Q/ S, a9 P$ b( P2 b3 w( @
' I/ T' ^7 k) j3 N, x4 d+ y. i7 r- bool oState = false;
, @" I3 x' [! H, z; h9 \
' R7 A& p6 ^7 r- }- int kg=5;//继电器输出
" f; Z/ e" e5 l5 \$ o+ |' ^3 J d - int de=12;//灯输出1 w/ ]. b) ]4 h' X/ M& l; @
- int key=4 ;//按键
/ b8 h5 |* J% K9 l - //*******新建组件对象; t2 P: I& A& `
- 6 _( i' _3 N, X8 V9 J
- BlinkerButton Button1("btn-abc"); //设置app按键的键名" Q! {& K+ Y0 T$ T
- //*******app上按下按键即会执行该函数app里按键
$ X( W, \' h0 g" ?/ N/ l8 w - void button1_callback(const String & state)
1 i5 D& W' h8 o2 ` - {
: g& S! [2 Z. | - if (digitalRead(kg)==LOW)
$ @. w- |( J2 w. B4 t - {5 K, L4 g# U2 Z) [6 d7 C1 g
- BLINKER_LOG("get button state: ", state);
3 G5 m, D% X7 J7 v$ a - digitalWrite(kg, HIGH);! [6 G. r7 g- f
- digitalWrite(de, LOW);
( U/ s* m% ^2 F+ B - Button1.print("on"); p5 N7 e; ?6 F6 U6 v
- Button1.color("#0000FF"); //设置app按键是浅蓝色6 Z# f$ W/ a# d8 a7 M% V5 a- B
- Button1.text("开启中");
* `( ]* U2 u7 K% b8 }! o" g6 H - }
% C" y$ a; Q3 R6 e1 R' q4 V9 J - else if (digitalRead(kg)==HIGH)* |# f6 p/ K) E9 G) N
- {
% p }- F4 H' S! L, I - BLINKER_LOG("get button state: ", state);
( P& n. b7 i1 k: } - digitalWrite(kg, LOW);
& ]" J3 v& B8 C" M1 u0 b - digitalWrite(de, HIGH);+ o* ? `4 E; {: S! y% j& e; f
- Button1.print("off");
# C2 z6 e) O) o5 ~# n" s1 G3 Y4 v - Button1.color("#00FFFF"); //设置app按键是深蓝色% a4 {, c. T7 e5 D- | n
- Button1.text("关闭中");! Z( n Z" q. x) C
- }
2 n" U7 `: v- @5 {' q - }
% @: c7 x. I7 U& c - 2 y" s* V3 O& X$ c
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
9 ^* M/ |( ]$ h0 E% Y# l/ K
+ A" F+ g z1 @4 ~ x8 r6 Z- //*******如果小爱有对设备进行操作就执行下面1 p. H6 F0 b( L% r( D
- void miotPowerState(const String & state)( v1 d2 j" P+ c" s- V
- {
$ J6 q# Q: L, P; P9 f9 \ - BLINKER_LOG("小爱语音操作!"); //串口打印
; j) O7 n* Y/ d* P( F - if (state == BLINKER_CMD_ON){2 Y: Q9 J( G4 x
- 7 e0 U% \4 X9 G; u O
- digitalWrite(kg, HIGH);0 k2 _- L% h3 j( V
- digitalWrite(de, LOW);
@; H/ W# L5 q - Button1.print("on");
8 Q# ~6 q9 t9 M$ ?1 @4 } - Button1.color("#0000FF"); //设置app按键是浅蓝色
, u, G5 L$ g% P' t+ g - Button1.text("开启中");7 y- N* G* V8 j3 i) D
- BlinkerMIOT.powerState("on");
3 ~6 I$ ?0 v- m6 L! ? - BlinkerMIOT.print();& N8 r! l& h$ {6 |: ]
- }
. Y ^5 e3 I5 l) B0 ` - else if (state == BLINKER_CMD_OFF). B; z5 `# K; B9 |) i
- {& ~! `: s4 M# O* ^
- / J; p' a# J h% Y. d6 |# \
- digitalWrite(kg, LOW);
, v+ k" S6 b2 \+ e& H4 z" a1 L, y - digitalWrite(de, HIGH);6 `* [5 R* ^5 C9 ~0 J( ]1 n1 j" K
- Button1.print("off");
% }4 A/ |) }6 o( R* z+ m! S; h4 N* V - Button1.color("#00FFFF"); //设置app按键是深蓝色0 W% a- M* o- ^9 j3 V. c
- Button1.text("关闭中");
( m) @ z4 o. A8 G% {% L - BlinkerMIOT.powerState("off");
3 V9 L4 D; x+ o3 E8 G5 g - BlinkerMIOT.print();" Q3 }% ?! t! J5 o' i
- }+ K. x" J, i- J( w: t$ G/ W6 ?5 R5 a
-
2 H' |5 L) }9 S - 4 Y. f: `+ ^ s
- }
" ^/ w. E9 l5 ^7 n. R; Y" K - //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ |" E5 N( u) O. m/ g - //*******如果天猫精灵有对设备进行操作就执行下面 L [$ J3 t3 a- R, d0 ~# B
- void aligeniePowerState(const String & state). Z- a! u$ l) h! Y/ v9 a0 p9 w
- {
; ?0 |: o* m) y0 P( z9 R - BLINKER_LOG("need set power state: ", state);+ ?/ I9 V9 c' m& r( ?9 w! e
- if (state == BLINKER_CMD_ON)
% y) T4 e6 |" I' j+ ^ - {
1 _/ L3 N# \$ n4 X8 c1 f -
" h4 c$ h+ H: i C, K+ }( k* Q - digitalWrite(kg, HIGH);5 z1 M* u @7 R: c2 X
- digitalWrite(de, LOW);
1 p s8 w7 k. d5 M% B7 i; G - Button1.print("on");' F* R+ w3 D' v; P2 h% g- X
- Button1.color("#0000FF"); //设置app按键是浅蓝色. I% y9 E0 L8 k6 b; {" `# Y
- Button1.text("开启中");; F$ L+ K, V4 a3 R* P
- BlinkerAliGenie.powerState("on");
# [& B f) A- H8 E' K# P - BlinkerAliGenie.print();- y$ e0 \# [; q/ R( q5 ]
- }4 G8 {; r4 H% i |; V2 ?# p9 C
- else if (state == BLINKER_CMD_OFF)! n9 u6 }" O. v5 z$ f6 }
- {. f/ t. z2 \& g! S! r- p- B3 |; _
- ! [0 R& {- G0 s( L
- digitalWrite(kg, LOW);) o; |3 O( @2 P8 f! g
- digitalWrite(de, HIGH);
9 g8 B7 Y+ k% ~ q2 i; `2 K - Button1.print("off");5 f2 A0 p8 A$ q2 Q" g: e2 F
- Button1.color("#00FFFF"); //设置app按键是深蓝色
& V" u8 Q: o2 Q- P - Button1.text("关闭中");9 d, B& e1 W9 U/ p7 ~- H/ i
- BlinkerAliGenie.powerState("off");
J6 \1 f, f4 v. J4 Z - BlinkerAliGenie.print();
% g3 H' n5 w& L - }9 ?# w5 E0 b: P' M+ G
- # t% g8 o9 o# I q4 e
- 8 Q8 B* E. G" z$ [8 Q3 B* G
- }
3 `) t' X6 Q6 @" ]* c( J$ p$ u6 l - //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次/ N9 z, a' r: L( m: q
- void heartbeat()6 b* V$ C: e4 \/ ?$ s* I1 J7 C
- {$ F! l& L8 ~* L b9 K) K- {
- BLINKER_LOG("状态同步!"); ( C* s% H" E7 u5 H! M5 Z, b
- if (digitalRead(kg)==HIGH)
" t4 C5 g7 k/ ]1 \7 Z7 R! c. ] - {
" i# {, I+ u+ { q - Button1.print("on");
$ ^" O1 I" d' p# l! H5 m4 | - Button1.color("#0000FF"); //设置app按键是浅蓝色4 [* y7 r$ \1 h0 h
- Button1.text("开启中");. k( ?$ Q# X+ C/ j) Z
- }# h) N2 F- t2 B3 t8 Q6 r& @
- else " P! F4 X- s4 ^6 q3 g6 }) X
- {) a0 v% Z+ f( ?# d# E8 h% ~% W
- Button1.print("off");
- S) s/ z& u3 j: x- [4 u' T - Button1.color("#00FFFF"); //设置app按键是深蓝色
6 K0 ]) @3 {8 N - Button1.text("关闭中");; a9 ]5 r4 g! R% e, E
-
. y+ S) F& o# Y! _. w - }
6 \; W7 h, c( x) t' k) z - }
8 _$ ]9 N$ V- K9 g2 Y' Z - //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
( e k0 T+ U; r% \% h" r; N4 i - void setup()% i( f X0 l' D4 E& b, B
- {
3 H! g% q1 y2 d - // 初始化串口/ P! ?$ }" s1 Y4 V, k5 ]
- Serial.begin(115200);- S8 s# g( A* L8 ^: \" O) v4 m
- delay(10);
( D0 Y, C' a2 L. b) v3 e. H - BLINKER_DEBUG.stream(Serial);
6 s2 h; z' ?; y: |& g1 W/ S* ` - // 初始化有LED的IO
% Y- ]9 W8 q6 ] - pinMode(kg, OUTPUT);
y3 y' P. W5 E - digitalWrite(kg, LOW);//初始化继电器上电状态 # v! i& @- n' J
- pinMode(de, OUTPUT);
. B5 G. e$ _( p0 a" X/ ^# k! E - digitalWrite(de, HIGH);) J/ Q4 \/ g" t0 |; _1 l
- pinMode(key, INPUT);
/ ~6 v, J. ] p9 Z - Serial.println();6 n* O( e7 G! x0 M% T" l( d2 b+ _9 B) M
- Serial.print("Connecting to ");
& y; H+ P X2 }" [0 T, e - Serial.println(ssid);
8 [' ]: M" }' T5 N - WiFi.begin(ssid, pswd);
: B8 _+ t2 o/ ?! }/ A' C. d9 P - while (WiFi.status() != WL_CONNECTED) {
4 L+ N, Z5 u, f+ W4 O5 i - delay(500);
! E. n& s! C4 |2 c, O - Serial.print(".");9 | ^* v( x! z/ I
- }2 ^9 e7 ^0 f) D/ i+ g7 F
- Serial.println("");9 C& D1 @) ^) R- d, o, ~# y+ |8 G
- Serial.println("WiFi connected");. f5 P* B, Y+ S" C0 w( h
- server.begin();
& ]/ R( J* ?. h# Q; K7 x - Serial.println("Server started @ ");1 c1 Z' a2 }- d; c
- Serial.println(WiFi.localIP());
" \+ {' f' z" Y+ A- l: c - //打印出IP地址,后期可以制作显示器来外部硬件显示ip9 ]9 q- J5 B( A0 F
- Serial.println("To control GPIO, open your web browser.");' k5 o6 E" L) b, B" g
- Serial.println("To set GPIO 0 high, type:");5 i4 m+ `" z, D$ C
- Serial.print(WiFi.localIP());/ |" X3 b4 ~ I$ j9 v" p) W
- Serial.println("/gpio/1");) G# t3 d. \; C1 J' C
- Serial.println("To set GPIO 0 low, type:");. _. _0 e3 r" ?9 L- e
- Serial.print(WiFi.localIP());
' L0 Z7 W2 K# C9 g: o% ^6 C - Serial.println("/gpio/0");
G- A4 U, E4 D* G* V - Serial.println("To toggle GPIO 0, type:");
/ F# P% R7 d$ I4 w/ K - Serial.print(WiFi.localIP());& _0 j. f, E1 ~; @2 q$ B8 Q2 p( u0 b
- Serial.println("/gpio/4");
- p# L' g% v1 D* `2 ^" I
, ~; ^4 Q% x5 {4 w) }- // 初始化blinker
0 L' b4 p2 l* g8 r& f2 U, n/ q - Blinker.begin(auth, ssid, pswd);% h8 L5 X% }! d+ x& m" k; T
- BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数0 \" O2 B$ M0 D6 ^
- BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数4 T. Q! Q- D$ Q7 ] p$ d) \
- Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。
: o7 S3 F/ O" s) n6 S+ P! V
5 ]. f4 y$ Z9 [- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback+ c* a; K& j* I2 }& m4 p0 `! r
- }
1 O. e b" W( w" ~3 K" Q$ y, ^ - void dataRead(const String & data)$ z! ?9 V" [* x1 n" i6 J/ S$ z
- {
0 K% u4 G! i) u% a+ A( W - BLINKER_LOG("Blinker readString: ", data);
3 E! U( p, m0 j4 V
& N& r1 W+ U. h0 s* L j2 |6 {- Blinker.vibrate();: |2 ]' w! p" T5 _- R) d
- ! v" R9 |0 I, Y5 d* W, o$ i
- uint32_t BlinkerTime = millis();, V* }9 R9 A* [2 g$ g
- ; C. i" X6 a0 Y W# I
- Blinker.print("millis", BlinkerTime);
! ]' S/ K+ W% d4 B+ ~ - }
% r2 |3 b; j! |1 e: \; ]' w# H* }9 M - void loop()
@8 ?5 t1 ]' W- g1 k1 b - {
' l" |; u$ l3 k1 s6 M4 f1 K9 e - Blinker.run();
3 W; T' m/ {) Y3 z0 J9 ? - if (digitalRead(key)==LOW)
$ ]4 X, }' Y! w2 N - {
0 E6 }3 F- g1 Q ?' k8 z" G5 i - Blinker.delay(200);/ X$ P$ V5 ~$ F9 ?$ Y
- if (digitalRead(key)==LOW)
+ Z" @3 p8 x8 S7 h - {( ~, L. e% `8 K' L6 o
- if (digitalRead(kg)==LOW)2 D3 l) n7 D- u- {. F/ `
- {
6 |( ~5 Q. p2 h# N5 O9 K - 8 x* |$ u4 _6 ~8 I7 A1 k
- digitalWrite(kg, HIGH);5 Q/ ^% {7 t' E5 q' p$ g. _; ^
- digitalWrite(de, LOW);
* s3 P+ @" c( R. i' B. B+ I0 B% d - Button1.print("on");
% V+ O* T- q) L3 h - Button1.color("#0000FF"); //设置app按键是浅蓝色
- N) z6 n6 S8 F: }& s - Button1.text("开启中");
: ~2 }! _! b; k. s \' c+ n- | - }, a; D4 ]' [* e% z& i# l4 M! W* T
- else if (digitalRead(kg)==HIGH)
$ h- \% j5 `% D - {
% j+ v8 ?0 l- ]7 u/ O - digitalWrite(kg, LOW);
- m* V% T4 n5 v: v4 @! S2 Z" k - digitalWrite(de, HIGH); A9 a+ a9 ]9 J9 Y
- Button1.print("off");9 W4 U# _7 b, u3 w/ R
- Button1.color("#00FFFF"); //设置app按键是深蓝色
: L6 C! [1 \9 s2 B( W - Button1.text("关闭中");
. ~" v! {6 X9 `, v* R - }
, w8 N5 ]1 |. k - }
/ e, w6 ?# g' A! @ - }
8 u( c, y, V+ u" G/ o X - }
复制代码 9 z# [, y V$ n& p- m1 I
2 C# |! r' K. l( _4 k1 u
我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html9 K: e3 A# J; ^& t( i# [" D+ V
6 l x0 X4 ` l7 t
把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。
q# t4 {* X! A1 N. _; N3 j
* D5 R5 {. l6 e1 l. Z+ y& ~; d/ d# U4 E7 u# r+ a0 w
|
|