|
本帖最后由 易记 于 2021-8-21 14:05 编辑 , ?& l; @2 [7 F! i$ f
4 A! h5 i( d2 S7 A& B# X
最近玩ESP8266,想做个天猫控制开关。
( K0 {; V$ ~% y. b3 t& [但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。2 o# l& i' Q# E$ i. p# X N
还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。
2 J* r9 q4 X& s
+ G k+ U+ [; y, l! l/ O8 }( e! F) f, Q* p$ Q+ Q, M+ y- F$ L
0 h5 K* D, ]. m% g1 m
问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。
1 ^9 e1 C/ j U3 f* }* K; l# v l& b5 F7 y7 `2 z+ G
5 j# w, C) \: G
: W5 M7 l' c5 v6 I: D; k7 f7 a
# r: s# N8 p, _3 G& [$ q' G( E/ `9 M1 Y( u, R5 Q' g0 V
到手,当然是拆拆拆。 ~5 ]* V! ^4 D
# a% d6 q# _" I1 X" K- c$ ?, B% A1 m' y
0 X7 C: X5 M4 F0 q; r. g, k( `联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。4 Z* w' {! s, a/ k0 H
8 q m0 {9 T" l5 W* A+ z/ B) F3 ?! }7 I/ g; ]0 ]
6 {& k* K' k! [* m继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。2 k0 y# t0 K( o1 l m! Y
6 Y3 L1 E8 F+ u3 b$ c" v) |* b
/ ?+ h( e! | R7 d
$ {7 ^6 u/ @1 U3 z/ n" y$ n' F# d' M0 y4 v- \' k
电源芯片
) y5 e y( i9 G$ W* A- a7 o0 b# |' l! D& j) m
" [7 d4 _1 R0 a/ L6 X6 Q+ Q7 r( m1 A1 A! I8 @: \
有一个按钮,按钮有二个蓝色LED灯
# C3 r& x& m; T' Y4 U/ b
) [( K& V E+ r1 }/ X& j! ^
* }, B; ^/ ^" |4 J: P- N2 W) X
" z. U4 d" \! c* w+ q; E8266
1 [( T2 D9 A u* ]1 b+ W* I
1 h" j$ ?4 b8 k# U" n; l5 m3 s* c' a7 {3 w/ m ]8 @* v
" h+ i/ K0 g! ]# y' F' f6 o6 O
+ [- Y% ^) @0 ~% _; p( t+ E m& V4 h4 [1 [& L3 r
接下来就是刷机了,版子上面都预留测试点。
8 A& z( i* \$ d( u, I8 Y$ i7 C5 W接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。0 P7 N6 b* `5 [" v! e. s; h2 `
, z+ B2 x7 Y9 B! u" j4 i. l
注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。
) X1 i3 ^( }" k8 E' |要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 |
6 J/ y5 t0 r( X$ ]
% M8 W* ?7 Z1 C" y# Y3 R# n
( C, T, R1 p& }: _: T* w! ]
7 E; {8 @0 Q# f4 l$ Z+ N2 i6 t8 C% T) R/ R0 X* b; O
7 Q% U R" l) |& r/ T: Q
5号脚位是继电器输出& M# v& r2 ]' x% J+ F$ x
12号脚位是灯输出# y9 T: B1 U' W# L* R# ^0 c
4号脚位是按键
$ V/ N2 p9 E& f" u4 Y0 v- L3 d. a H
, l9 s3 H( l$ S0 u1 i/ z6 s. e0 W8 f: [1 f: E" C( E p9 c
8 c5 c s8 D$ q6 K1 C* [4 e卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库
5 J* X8 G7 S! A6 B' z/ b* f - #define BLINKER_MIOT_LIGHT // 设置小爱灯类库0 w) L# e) l$ q' _
- #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库9 _. F; N& p4 R) l. b2 y- j
- #define BLINKER_PRINT Serial //串口协议库- D; x4 W: K2 I: `7 S+ B
- #include <Blinker.h> //官方库
. K2 z! e: |8 X2 o5 |3 i/ h - #include <ESP8266WiFi.h> //官方库
* w: n" C* L: y) L1 w1 D! h- t - WiFiServer server(80); // 服务器端口号0 J; R5 B' M! j* ~' D& I$ L2 h
- : ]: k2 u3 F U. u& X
- char auth[] = "c4942fb1d5e4"; //设备key
: P6 O# Q9 A' X6 B - char ssid[] = "wanboshi"; //路由器wifi ssid
5 {8 H( e" [& [ s - char pswd[] = "1365662999813586348220"; //路由器wifi 密码
, S5 W" `& N7 J9 h
/ Y9 _$ C; u. T; p& l$ V1 @- bool oState = false;
$ ~* [* k* w- R ?, h6 J
7 ?+ T/ X' \. ?. o; U* Q9 [, y- int kg=5;//继电器输出# [6 U X( I h
- int de=12;//灯输出
' J6 v5 O( I( d - int key=4 ;//按键
4 u7 E8 T! e7 K+ h; A - //*******新建组件对象; h: z4 V0 `$ o9 y/ X
% O1 h3 S- W( I0 R- BlinkerButton Button1("btn-abc"); //设置app按键的键名
! l6 G; p! w | - //*******app上按下按键即会执行该函数app里按键
2 o$ F% `* \% {# \ s- q2 \ - void button1_callback(const String & state)
( C* k& G6 X8 R" v4 p- D( s - {: A' {: {' L, {. d
- if (digitalRead(kg)==LOW)4 j" B0 a# a9 i, Y* A7 t/ \
- {
% k% [6 X; x1 b) Z V& M7 } - BLINKER_LOG("get button state: ", state);
! @2 o. H8 \" y# W8 `2 ] - digitalWrite(kg, HIGH);2 F: w ?" v# d" v5 |
- digitalWrite(de, LOW);/ P, W( k, r J ^' z: b+ a1 J
- Button1.print("on");. H) M2 R: x& a, N7 ^
- Button1.color("#0000FF"); //设置app按键是浅蓝色. ~2 E* a$ I" E) Y6 t4 l9 X
- Button1.text("开启中");* E# h% H5 x- T2 U1 D- m5 t( [
- }
5 |) S, l5 I& F4 O - else if (digitalRead(kg)==HIGH)
3 N2 x/ m* H$ b0 P6 B - {- S9 r0 i, [ \1 t1 ]6 _
- BLINKER_LOG("get button state: ", state);
9 y$ v/ {; r' _ - digitalWrite(kg, LOW);7 N# b" t, Z6 t* ^
- digitalWrite(de, HIGH);1 C3 M+ `- w# l( m* [
- Button1.print("off");
6 e" t O- q3 ~: ]" A9 n - Button1.color("#00FFFF"); //设置app按键是深蓝色
8 X! D& p5 w9 ?" q7 d. A/ k - Button1.text("关闭中");
4 i- G9 v) x. V - }
8 U- ]3 h9 i7 y d7 k9 m - }7 ]( {& L G7 s2 f5 V# A+ u
- 2 T& ? n/ A C1 h2 T$ q- ]
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
a2 e% T* v4 ` - * d% r8 {5 U; c% g1 ~5 q
- //*******如果小爱有对设备进行操作就执行下面: y" ^9 h8 l0 C, f( M
- void miotPowerState(const String & state)- `4 B/ X+ f' i" M7 `
- {
& Z& L1 v. U6 u9 _3 a9 D - BLINKER_LOG("小爱语音操作!"); //串口打印
% d" R" X- G5 t" t: h1 G% e - if (state == BLINKER_CMD_ON){
: z$ z5 X3 f8 L' w4 o5 A/ N -
8 N. c) G6 c& K7 m - digitalWrite(kg, HIGH);: q/ f+ A6 R2 T0 x s$ [0 k* j
- digitalWrite(de, LOW);
3 a, x1 F3 B" E0 y3 V) @! a - Button1.print("on");; Z* q: `6 g( i
- Button1.color("#0000FF"); //设置app按键是浅蓝色
X' d$ W% a6 w! I: Z# _ - Button1.text("开启中");9 @% ` T& e( @( s3 r
- BlinkerMIOT.powerState("on");" }, r- u2 m* r/ l/ S
- BlinkerMIOT.print();
) H% x9 C+ f8 a: U7 [7 H. @) } - }
) x: P( w4 h8 K' R. I) @# Y0 V - else if (state == BLINKER_CMD_OFF)
! t1 m( R) O( q - {
0 l7 G/ j! c5 K( U6 `" C1 F: O$ m7 C! X -
6 B# q1 W) _% ?7 `0 V2 l* u - digitalWrite(kg, LOW);# ?7 B' J7 Q1 t
- digitalWrite(de, HIGH);
4 w& b$ C2 Z% [* J+ x( N- x - Button1.print("off");% u+ [' w: j8 M, d9 R8 ?
- Button1.color("#00FFFF"); //设置app按键是深蓝色1 Q o/ d0 p) B1 A; e
- Button1.text("关闭中");
s- t- D, a! ^' y' `, T - BlinkerMIOT.powerState("off");* \4 W/ n' c5 }! ^. F+ V
- BlinkerMIOT.print();1 I3 l) v* ^. t5 T$ y$ m: F
- }
7 C/ B- B+ M* f+ c, B& k - 7 Y4 T" C( S. Y: k) d' K# Y1 c9 S
-
. t7 }/ W# P: O0 \) Z, V - }
8 P- E& a S* Q! ^! u/ v/ ? - //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" e$ {( x4 s. P
- //*******如果天猫精灵有对设备进行操作就执行下面
]! Z+ M" a9 c; r7 X2 k - void aligeniePowerState(const String & state)2 h5 J7 ?! N; [- ?8 Q
- {
+ e* p2 G1 e' Y5 S# s - BLINKER_LOG("need set power state: ", state);
. X, R8 `, J% H8 Q+ J - if (state == BLINKER_CMD_ON)
: M* m9 m' u) F- l8 \% ] - {
2 B$ F5 M& z+ b9 ^7 N7 h4 n0 U' ~3 } -
2 G( g& A, V0 t& P; S - digitalWrite(kg, HIGH);$ q, r7 `- r& I: ]0 _: q6 ^8 T+ `+ ^' p
- digitalWrite(de, LOW);7 [- ]8 @6 e* w" y) n
- Button1.print("on");7 \) `7 I# Y% J0 J4 A5 \
- Button1.color("#0000FF"); //设置app按键是浅蓝色9 _8 n( T- z& J9 a: M
- Button1.text("开启中");
3 ~" v' `/ f: _/ O, e - BlinkerAliGenie.powerState("on");
% }( @1 B! h, j b4 a - BlinkerAliGenie.print();8 D+ t8 g2 n% T% ]9 O w
- }2 c1 T6 k0 o; u% ^+ @ o! s
- else if (state == BLINKER_CMD_OFF)
1 [5 z/ y* B4 d g9 Z; H - {6 v3 a f$ V/ J3 b7 l% R% T
- g; k5 @- I$ @* D% E
- digitalWrite(kg, LOW);
5 b- g# L! ^; g - digitalWrite(de, HIGH);
! ]4 N& O/ x) ~8 R& D; U# v9 [ - Button1.print("off");3 g7 y- t- \& `; r! v0 f* v _: P
- Button1.color("#00FFFF"); //设置app按键是深蓝色
: u4 V% u) P8 u! p9 U/ K9 A" Q - Button1.text("关闭中");1 X& |! _- o. A) V6 L1 j: W; n
- BlinkerAliGenie.powerState("off");
2 s, {/ ~. h) |3 {0 I( B& S# E3 S - BlinkerAliGenie.print();
7 T6 s) b$ o2 v5 m- O - }* ^2 L: C K7 I
-
( x a$ k! {4 n' j
* n9 Y# ]4 X5 m% ]. |& c L. b- }
. W4 g/ }: a0 P+ y - //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次
@ c0 }) ? y3 x; L - void heartbeat(), w# b# q' ~- }4 c8 f) _( ^1 B* e
- {
/ f+ J* Z% B3 s* E$ H$ ^) R - BLINKER_LOG("状态同步!"); 7 U! B5 H r0 c1 E1 d* f3 ?8 Q
- if (digitalRead(kg)==HIGH)
5 n" D, Y; b" X - {
% M5 o6 }7 v4 U! S H - Button1.print("on");
* K) V Y7 ?! M - Button1.color("#0000FF"); //设置app按键是浅蓝色, t }/ L4 O- U$ F
- Button1.text("开启中");
& l( h& U+ J3 W, b - }# r) \) ^" d1 G; {9 z) K
- else 4 |- F6 [ A- i
- {/ V- J6 o7 o* W" H0 A
- Button1.print("off");4 Q8 ?5 |( e' q: j3 R' {
- Button1.color("#00FFFF"); //设置app按键是深蓝色6 r. N# q, S% K O; K. r; B8 z
- Button1.text("关闭中");, C( t, q3 I# O+ O: q4 h3 |
- & \2 G* M6 C4 \2 f' B) P
- }
/ T) a4 V$ ]1 i' Y2 l1 W - }8 \+ r' A8 x, U( p7 F, e2 W
- //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4 P" E! H# |* F, t5 s: C/ E+ z7 ? - void setup()
Z c4 W9 g( f: C- U4 i+ N7 r - {
; z' J" S! _9 I2 U- W+ ~ - // 初始化串口
" [" C; G$ b1 d6 U% `+ @/ s$ Q - Serial.begin(115200);/ O- t$ i. `5 ^$ I! ^" R' g% ^
- delay(10);
) h% W6 p# M0 Y5 [" x, ~# t - BLINKER_DEBUG.stream(Serial);8 u( s! l8 U/ Y' H, B. g( ~
- // 初始化有LED的IO
$ D Q0 F g4 e2 y7 }& f8 F" f5 f - pinMode(kg, OUTPUT);
7 q! ]; b" f5 \ - digitalWrite(kg, LOW);//初始化继电器上电状态 " N1 i3 O8 K" S) z7 d" y) N
- pinMode(de, OUTPUT);/ |, d7 B4 E' O- j, l
- digitalWrite(de, HIGH);
( f5 {' y, ~8 Z5 ~. M; _ N* x5 v - pinMode(key, INPUT);
# H$ y: r+ U5 m9 G9 m8 A - Serial.println();
3 d9 O/ I) O) T1 U/ V - Serial.print("Connecting to ");% z3 J5 e' f/ T0 [% b L9 \
- Serial.println(ssid);
7 M T/ r( a4 c) F1 R, l* A - WiFi.begin(ssid, pswd);
E n8 m. f1 G) H& y - while (WiFi.status() != WL_CONNECTED) {2 w" D7 _6 E: q* o$ q# p
- delay(500);2 Q* Z! y$ v `( b
- Serial.print(".");1 v8 ]7 D2 e. ]
- }
% z) m$ g9 }1 @ ~+ W- x& s8 |9 D - Serial.println("");
+ l8 `9 C! |0 a - Serial.println("WiFi connected");
5 b; R) j8 n# r% w, m: D1 e - server.begin();
( x4 K+ ~8 u5 [ - Serial.println("Server started @ ");, \! B: Y8 }3 Q9 F" U6 a. a9 U( j
- Serial.println(WiFi.localIP());( o9 X* R( `$ O( w
- //打印出IP地址,后期可以制作显示器来外部硬件显示ip
* o3 @4 M: l3 p' v" b - Serial.println("To control GPIO, open your web browser.");
8 i7 t' H4 Y" S$ ~$ L4 K - Serial.println("To set GPIO 0 high, type:");
; v( H7 `: x _6 S3 T; i# k4 ? - Serial.print(WiFi.localIP());
6 ?7 t- `5 y" z& v" G - Serial.println("/gpio/1");
0 l5 {' _4 d" }2 d - Serial.println("To set GPIO 0 low, type:");: E7 U Z$ `0 g# ^9 z. o! k
- Serial.print(WiFi.localIP());: T- Y8 Q3 b1 D$ E O
- Serial.println("/gpio/0");
1 S ~' j. {7 Z, i! L9 w' d# ?, j - Serial.println("To toggle GPIO 0, type:");) Y( n* |0 Y. i @4 v. T, M
- Serial.print(WiFi.localIP());
: m* X# o# Y4 I+ G& ^% q5 c1 r$ y& L - Serial.println("/gpio/4");
) d& n! F9 H0 o# l) D9 c# K. ]
& U6 r. E; G* ]- // 初始化blinker
6 M1 u& `0 x9 x, K: E; I6 B - Blinker.begin(auth, ssid, pswd);& r2 [1 x5 e% Y3 E# v
- BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数
: A4 Y7 }! _3 S- E6 L6 Q - BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数
* d+ V4 X% l' w4 F( Z! t1 J - Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。" h8 W% s5 c4 T1 o) x3 z
. K5 _$ s% r$ a% k' K2 G% w$ A' l/ v- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback
+ O9 _: E* }# y* Y5 N. x8 f - }% j4 {$ Z4 ?9 I; K
- void dataRead(const String & data)7 i$ ?9 j) O8 b: b0 {) o
- {
?/ c, k' Z: D# E4 k - BLINKER_LOG("Blinker readString: ", data);8 O, e) Y% n2 R& w# {- s8 z
- 1 F9 J8 a6 a8 S$ g# ]$ ~1 _0 A, o
- Blinker.vibrate();
; ^. o1 _4 ?; s r - 3 k6 M; W* _$ E$ e2 E# b
- uint32_t BlinkerTime = millis();) t+ ]/ D7 U# D h5 ]7 K
-
. U+ ]. v4 t3 m. L+ ? - Blinker.print("millis", BlinkerTime);
, i0 V3 Y2 @2 t) Y( S0 @1 j, m5 l3 j0 m - }" H3 I5 p5 r* J' y. L2 p: Y
- void loop()
. C9 b/ Z x1 L+ e6 l+ b - {9 N7 l) E" o5 x6 E: x
- Blinker.run();6 @. C4 m' s3 {' m: T( L
- if (digitalRead(key)==LOW)1 ^1 J# L' \- r9 d7 m7 N
- {& Z/ ^, ~0 ~1 o
- Blinker.delay(200);
}( w4 K2 s4 a6 F0 O& L% ~+ ] - if (digitalRead(key)==LOW)) l% V& B& v. }+ I0 R. S
- {
* ~- ^- H4 B% u( A - if (digitalRead(kg)==LOW)5 ], x& w' G" C' r# V; y* ^
- {
~4 d; o0 b; p- \9 o% z - 4 m2 n& a1 T6 z7 i, J
- digitalWrite(kg, HIGH);8 ?& @' K$ {; E P
- digitalWrite(de, LOW);& j4 ^2 a0 r& \
- Button1.print("on");
* Y4 w+ j+ b t% K- l - Button1.color("#0000FF"); //设置app按键是浅蓝色
/ S j; w, ? b' [. l - Button1.text("开启中");
' T% y# C) u Z$ B' u8 q6 x5 d - }8 B, m5 v( C2 {5 d. ]" N
- else if (digitalRead(kg)==HIGH)
( i3 O+ h4 p% {' Q9 X- N - {7 ~+ b7 X: x$ l+ M1 Y- b- p D
- digitalWrite(kg, LOW);
' Q3 I3 |% i# }1 ^0 K8 v - digitalWrite(de, HIGH);+ g9 V! ~+ V- Q7 m' U# n
- Button1.print("off");8 ]! F3 c' G! p+ f9 Q
- Button1.color("#00FFFF"); //设置app按键是深蓝色
8 @1 Y j$ Q: a5 o4 Z" `# ]8 u* M - Button1.text("关闭中");, ^! r% v1 }9 g. ?3 j$ k S, B
- }) X- K6 S* S+ l% A" m8 W# T% |" ^7 r
- }! w' E8 Z# ]5 W* v9 K) a% E
- }
& b# w9 w7 ^9 f& f0 k; r - }
复制代码
! R. E( o4 u; s9 w& o& v8 I$ Z) G0 `) E+ }$ M* F
我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html: ~2 I: e) ?) i+ r6 V9 S* {% E
# c0 U) U6 h, n4 n- J9 Q. F把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。, l9 V2 A- X6 \- J% m0 u3 H$ l" ]! U
: _. y) p( G- A/ n, x9 S$ g: o. f% M/ W9 R' B" F8 b D
|
|