|
|
本帖最后由 易记 于 2021-8-21 14:05 编辑
! M* P! G J/ F+ I4 |2 r: U6 w" _$ |" O- ?0 T+ b0 n1 G
最近玩ESP8266,想做个天猫控制开关。
1 }% Z" M* i+ N" C: k$ ~( _* D但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。
2 T0 y& i3 ^. H- {% ?" W还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。
7 G3 U5 @& q' f& C3 W
. N0 ]- D+ y+ Z8 h
1 U X1 ]! a8 B; j" l M m
8 _) b2 E7 j; U# ?: G! Q$ ]问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。1 L0 g M8 r2 ^/ v7 v, K
+ a- ~0 b( {& x" H+ e
" Z- }8 }6 c4 r! x; n/ K. u, `
6 c9 O* {) S0 O0 V
/ I. ~% Z& C- \, ]
( T1 c5 x' I) r+ P' X9 d9 \到手,当然是拆拆拆。
* q! S7 f! V5 {& S6 D8 R; B* @9 u
- q7 x+ N: g! m) c9 t
' T p3 v% T7 y: C) t* N; o2 V; B) E2 ~: z+ y. m
联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。
8 J2 z9 i7 m! K+ L# M
1 f5 K$ [) @& U2 M# I" a7 u
" Q; j3 y6 F# _( z
3 h# ~4 Z7 g% V5 _
继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。: H! t/ U F6 E
1 L; k( n' ]5 n1 ]) |5 W' E2 L( z
" y% Y$ x' F( w T& D( {
8 g0 U! L6 r6 i/ {6 ~5 x- Z
5 E4 }& V( w6 C2 M
电源芯片' v. P( I0 O6 p% Q
5 X7 q) K' ~8 q* S& ~
z7 b6 w; ~7 ]+ {& @, u
# A& S1 Z% h J5 e有一个按钮,按钮有二个蓝色LED灯
$ B" J$ C* }0 l2 w
7 C) M c- E: c: z3 }! g8 o
7 [! ]: e N* z. J; }& T
% z7 Z7 D8 h; f* [3 ]; P+ Z8266* Z: F0 y' C; j; x+ E
8 ]# I; C3 w) T& \# C0 ~' x
3 C7 }: P# {! [7 v. }
9 Q; ]) u5 k5 B/ Q; e5 w) u5 E) |* ?/ O7 l
; B( q. q- \3 `接下来就是刷机了,版子上面都预留测试点。) M- S4 i6 u' u5 J
接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。1 D- l) i& Q) b* z5 v
& \; m% n+ Z9 _/ y7 X; F k注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。- I' s7 f6 Z! g6 P8 u& n; ^
要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 | & C" K1 `, Q P) a2 [4 U/ A
: U4 q3 ~( r3 o3 J; T0 L+ s* Z7 v, O6 y4 u- ]1 A
* h( T8 m$ {# Y+ I ]; B
/ d' h2 B% b! a: |
; b; k1 c2 B3 l7 e 5号脚位是继电器输出
( t$ z: n" C( \" o' `' L 12号脚位是灯输出
# V7 I4 v- |& F. } 4号脚位是按键
6 o: I; k8 u2 Y' [ L/ B" ?, b* s$ ?5 {/ ~: J% Z
- e. G+ l; Y- K: S8 Y9 P3 T V4 A: b. h
' t* L7 X: s) |/ Y卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库7 w1 e9 f* V; \8 y1 H5 g
- #define BLINKER_MIOT_LIGHT // 设置小爱灯类库. e3 v3 ?& f' Q4 H% ^* h
- #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库0 a, H6 J, U# G
- #define BLINKER_PRINT Serial //串口协议库
% }" c) m( {# D. q% H3 w - #include <Blinker.h> //官方库
6 Y1 |8 j, ~% N' v2 k5 ]1 @ - #include <ESP8266WiFi.h> //官方库
- B; j4 D+ `/ F" G" S4 y- L( R - WiFiServer server(80); // 服务器端口号5 ]: H" B/ n* D7 m6 W
0 c1 q A+ R$ K- char auth[] = "c4942fb1d5e4"; //设备key
5 Q: b* u+ B5 I) K% S [+ E+ P - char ssid[] = "wanboshi"; //路由器wifi ssid% I' l5 f: D: g3 Q" q4 A$ Y
- char pswd[] = "1365662999813586348220"; //路由器wifi 密码
6 A* s$ x* r$ u0 Q - ( w- g& [+ `* j( ~) ~
- bool oState = false;# f z6 Y9 g) m3 \1 W/ L
4 s) Y* _( m$ R0 A. n& O- int kg=5;//继电器输出1 `$ ]8 M, q/ q
- int de=12;//灯输出) z x7 r$ p& i
- int key=4 ;//按键
1 B# i# L, \2 F ?6 k/ z - //*******新建组件对象7 e+ {' L( A7 j4 S
- * k8 X k/ `- b2 u; j' H
- BlinkerButton Button1("btn-abc"); //设置app按键的键名8 ?/ a0 t& K9 c# k3 z& b
- //*******app上按下按键即会执行该函数app里按键
+ e2 e4 v( C6 K0 R5 e# V - void button1_callback(const String & state). D. F0 @, R' ^* k. g
- {2 r# \3 C9 j+ s
- if (digitalRead(kg)==LOW)
% K2 g# j1 O1 E& A: Q& k - {- @! O6 S& C0 ]5 F9 X7 d7 P1 A
- BLINKER_LOG("get button state: ", state);
1 e- }" ^1 v( t0 X - digitalWrite(kg, HIGH);
0 I1 e+ d0 m9 P k - digitalWrite(de, LOW);
7 E+ t! N0 L% p9 ?2 ~2 P9 o - Button1.print("on");! C3 A7 y$ P( {# q/ _
- Button1.color("#0000FF"); //设置app按键是浅蓝色" l3 ~, _; H* @2 n
- Button1.text("开启中");2 W& I/ ?* y) \( E" v2 ?
- }1 F! \4 P) l. v4 J- f* W* I
- else if (digitalRead(kg)==HIGH)* J7 f9 ?0 Q2 e& m( R/ N
- {* r1 A8 i* s) C* d9 M& u3 r! |
- BLINKER_LOG("get button state: ", state);
. @& i0 \6 H( u( p' b6 A; o - digitalWrite(kg, LOW);; b8 y3 B, M8 X6 Q
- digitalWrite(de, HIGH);
: N8 m. v% Q3 k4 g - Button1.print("off");/ t9 Q) U6 S+ Y. k
- Button1.color("#00FFFF"); //设置app按键是深蓝色
4 ~+ i0 i7 |/ ^9 M: N0 b/ `( g - Button1.text("关闭中");
& a9 |8 M" M4 P5 I4 v - }' p5 h7 P0 A9 g, z [
- }/ r' ~, T( w& L" P! z
- 0 C/ i* k g2 j2 r6 A5 h& ]
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
! @8 Z! b. ]- J9 K
; c6 g" f; J9 t" e/ q4 ]- //*******如果小爱有对设备进行操作就执行下面& J: t# B7 ^9 u6 i
- void miotPowerState(const String & state)
& n" V7 c- X0 d8 d, Y - {5 @ Q( v* l X. R
- BLINKER_LOG("小爱语音操作!"); //串口打印" u+ |2 N1 g8 v$ \& e" E
- if (state == BLINKER_CMD_ON){& |' Z( ^' S. X; a9 k( e
- 7 m) r0 { I9 {1 M' D' I
- digitalWrite(kg, HIGH);: m2 \" O/ S8 t; A
- digitalWrite(de, LOW);
9 q m2 ~' U1 `6 {2 \3 T - Button1.print("on");
( `5 _/ w1 O& c2 A% R4 P - Button1.color("#0000FF"); //设置app按键是浅蓝色0 a0 d; b4 X. c+ J
- Button1.text("开启中");
$ R" `& A* P5 E- r9 J - BlinkerMIOT.powerState("on");
! A* ~3 s% Z% q" e - BlinkerMIOT.print();) {* u" m& N% t
- }) |* V3 b# k' b8 i
- else if (state == BLINKER_CMD_OFF)
( d% c3 z# m; v g8 }' L0 d+ ~ - {6 ]2 f, J8 z9 M/ ]9 X
-
& ~1 K, Y! E( ~1 I - digitalWrite(kg, LOW);' V) }+ g9 f, m
- digitalWrite(de, HIGH);
, L! M, ^% \4 N0 }2 k9 k. H x$ d1 { - Button1.print("off");$ P' N+ B1 S, i N3 K" j) A
- Button1.color("#00FFFF"); //设置app按键是深蓝色
/ L- ^* S8 h, V" {; D/ f9 ` - Button1.text("关闭中");
+ m1 ]* \3 \: Q3 d) w$ r! l: K - BlinkerMIOT.powerState("off");# X+ K* m T! ]5 K
- BlinkerMIOT.print();5 e& S6 ]8 l; G; j) ?, g+ N
- }
2 |) v3 v, z N; F3 X( R! _ -
" a2 r! P( t6 u0 N, k - - I# C: \0 R- C% k
- }
; R" ?: d9 Z- D& U; V - //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
0 Y2 k3 y: x9 |2 B# J - //*******如果天猫精灵有对设备进行操作就执行下面3 r1 C; k! J3 s
- void aligeniePowerState(const String & state)
; I! q$ f7 I/ e; G( l. c - {+ e3 \- j- @" K W# [" q, a5 O1 J# J
- BLINKER_LOG("need set power state: ", state);4 c, S' T: T4 D
- if (state == BLINKER_CMD_ON)
+ Z3 O: L6 Z8 R$ k! V% r/ X - {7 _' y: d6 O1 I( C$ [$ k
- 6 v& X: ?& i+ x6 o! a2 H0 V6 t
- digitalWrite(kg, HIGH);
6 m! I& E; H' Q3 ?$ \# ~ - digitalWrite(de, LOW);
) G$ P7 H0 u$ t: F9 \ - Button1.print("on");
, E+ R" s1 H, E4 M1 C# | I - Button1.color("#0000FF"); //设置app按键是浅蓝色
# f9 @: m' y2 T - Button1.text("开启中");
7 Z4 F. n# V, \2 O - BlinkerAliGenie.powerState("on");
$ I/ Z5 L: X# `: G& r- ]1 i3 t4 ` - BlinkerAliGenie.print();) ]( L. j# [; s
- }3 |8 \" `" w, w8 Z# q6 B
- else if (state == BLINKER_CMD_OFF) X4 {% P; p3 x5 e! o2 A( O3 h
- {
) `! G( p6 j9 @; q -
) z5 J( `! {7 { - digitalWrite(kg, LOW);
' m9 q4 _2 S4 Z; A0 H( s r - digitalWrite(de, HIGH);% G) }. v. W! F/ O* r- C( D& _
- Button1.print("off");7 p! @2 J( _. ?! l k
- Button1.color("#00FFFF"); //设置app按键是深蓝色
! _+ Y0 Y: x# S4 A" ? - Button1.text("关闭中");
/ h5 h: B7 K j& {9 D6 d: @ - BlinkerAliGenie.powerState("off");
% G/ ?5 T5 O* W! o0 T3 b- L- F* l - BlinkerAliGenie.print();
/ x& t0 m$ o& y; M - }
/ T9 a( c- k+ }0 J- G: _ -
3 c, i7 X- i$ |# K - & H2 C: G5 X5 N$ `$ Q$ D
- }) X# L) |8 \- ~/ t0 @. t8 M# R
- //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次 j# Y' d6 z& [
- void heartbeat(); Q6 y2 ]1 ^8 G, [$ ]$ i
- {
! R" T& U0 n0 a) x3 r& W+ N) h. V - BLINKER_LOG("状态同步!"); 9 W: ]% R5 V/ t( N8 q
- if (digitalRead(kg)==HIGH) ( ~+ `6 V5 _% w" G, Y8 c) r
- { 1 l- g/ Z! K5 ^" M
- Button1.print("on");* k3 y9 w: S, `, o" l1 O$ t- N. K
- Button1.color("#0000FF"); //设置app按键是浅蓝色2 J' Y6 @! S8 o. k3 Z
- Button1.text("开启中");9 U+ a* M( c1 F- H
- }
+ ^0 M( |2 t1 e - else * U3 D3 n$ K0 @+ u
- {
: }4 O1 Z& r4 s, W' G - Button1.print("off");# _, F) ^+ ? \, L5 j
- Button1.color("#00FFFF"); //设置app按键是深蓝色
! o% t, { F) p* q/ I - Button1.text("关闭中");
7 j, M. o! G& f' b4 j8 E -
( u5 \0 z# E9 A4 ?- S p- ~. D - }. G: L& ~+ n7 R( B2 W
- }
+ p- x* f+ f6 U: ^3 ` - //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4 O1 t; ^! @6 A$ _8 w6 B2 P, r! b - void setup()! z; O& t8 ^9 Z# q Z
- {# O0 h, K G6 Z* W X
- // 初始化串口
, J! A) c( q4 k5 g, `4 A - Serial.begin(115200);
+ m* S8 {' B* y( O9 m( k# l: }- Q - delay(10);
, O5 a! R4 V" c: B3 x - BLINKER_DEBUG.stream(Serial);( ~8 S( x+ S% l7 M* R
- // 初始化有LED的IO
* I3 D& o) M! X: @- ?$ r - pinMode(kg, OUTPUT);
0 z+ d$ P& Q4 ?7 Q - digitalWrite(kg, LOW);//初始化继电器上电状态
5 D9 h7 ^$ N- H, z - pinMode(de, OUTPUT);' g& U$ U' l% h" _4 L- f% {
- digitalWrite(de, HIGH);
3 j) a& E4 a: I9 E - pinMode(key, INPUT); 0 W7 O2 q. ]2 H' Y6 x
- Serial.println();
; O2 V) v( i1 S" t5 c. k - Serial.print("Connecting to ");+ m) ], I; a3 D$ [$ V
- Serial.println(ssid);" u$ @' J: k: c; x' J* {
- WiFi.begin(ssid, pswd);
- L% m' _- P% ?7 ?0 O9 e - while (WiFi.status() != WL_CONNECTED) {! _7 ?6 ^2 M. [
- delay(500);, d, e) N+ q8 j" G. a
- Serial.print(".");* p8 K; G& s" f9 U; v2 q
- }
) @! B& `& y( ]+ m$ [ - Serial.println("");) ^! V4 k2 ], L) f& j
- Serial.println("WiFi connected");
+ @9 n+ R. C+ k/ }1 k - server.begin();
4 m; Z$ y8 c7 c9 f, I' {! X2 ] - Serial.println("Server started @ ");' V2 S& l2 E: k6 o4 k
- Serial.println(WiFi.localIP());, |/ F* Z) Z- ?
- //打印出IP地址,后期可以制作显示器来外部硬件显示ip7 M% \) `! O4 v. L% o9 `* V
- Serial.println("To control GPIO, open your web browser.");
( V- W; T/ ]. }" f4 [) [. O: h) C - Serial.println("To set GPIO 0 high, type:");. M/ E R; U9 I8 z3 i
- Serial.print(WiFi.localIP());( @- T5 N, j+ s' ?
- Serial.println("/gpio/1");( \+ w: U5 e6 i0 _
- Serial.println("To set GPIO 0 low, type:");
j R6 [. A( i G - Serial.print(WiFi.localIP());
& P4 k8 R p" Y. ], L' g$ [% Q - Serial.println("/gpio/0");
$ x( M5 v3 H% w5 A, g0 U5 n - Serial.println("To toggle GPIO 0, type:");
9 o& x8 m1 \5 t - Serial.print(WiFi.localIP());2 F) {7 c( m4 Y- f
- Serial.println("/gpio/4");" W7 S5 @" S: W) y7 ~" B" A
# g# P( { |# O8 @- // 初始化blinker
# w2 Y4 S- ]( I/ l( b) b - Blinker.begin(auth, ssid, pswd);
8 W; }7 I& c) E8 a# e% [' ~0 R2 u - BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数+ q2 L( X, x2 n( w; j3 p( s# P$ x; q
- BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数- ~4 G4 x* m4 X$ J) Q. a7 U
- Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。
; J' x3 K% r* I. y. i - . I6 ?8 q% t" |
- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback8 ]$ O. ]) {! b$ f; G7 P6 o5 x
- }
$ q; u9 g1 N3 t: B - void dataRead(const String & data), X+ j+ U% T0 W* ]- R& X
- {
2 `5 ]3 }: O; {# l% K& N - BLINKER_LOG("Blinker readString: ", data);# U9 T8 u; R; h1 ~8 g8 p
- " ]% ?7 d' ^4 Z4 U
- Blinker.vibrate();% f- W5 Y6 i* e4 ], D3 ~8 P0 ]
-
6 s, u/ Z! M9 p/ w* _9 B - uint32_t BlinkerTime = millis();0 W/ N. Y5 l1 C: J' \$ n
- ; _( {8 a* }( C
- Blinker.print("millis", BlinkerTime);
5 P0 I$ G; k" p7 p$ i - }% k& \% T. \9 e! M8 w& O
- void loop()
# `2 ]! ]6 Q* {$ C - {+ n _; D' B: W0 N# @" J8 i- q* D
- Blinker.run();( ?( f# C' v' P$ E/ x/ W2 Z
- if (digitalRead(key)==LOW)! t% L% W/ j3 Q8 H1 r
- {
( p/ ]/ d/ A5 ^; R5 Q8 `0 z - Blinker.delay(200);
- a# x: U% _: s1 |) B - if (digitalRead(key)==LOW)
) g& W. _) R# u* g/ q1 J! T' I7 x& Q - {
! Y8 [. ]6 i* D: i: z6 @+ J - if (digitalRead(kg)==LOW)2 s* ]- t9 W0 ` ]1 B
- {
9 |, S G/ r, E: G - ) h# @1 n; H# H0 U0 b. p
- digitalWrite(kg, HIGH);8 h& S! |$ [% b! @( g4 O$ f0 p0 h
- digitalWrite(de, LOW);$ H2 `* h8 U- y6 v4 b3 l
- Button1.print("on");
|* f9 Y4 I9 l2 A1 @# m# n" C - Button1.color("#0000FF"); //设置app按键是浅蓝色, v# n: d: h* N- ~
- Button1.text("开启中");
& z, g9 C$ k; d, y* J+ u7 @3 G - }
9 ` L' [ Q3 E( E) w/ V - else if (digitalRead(kg)==HIGH)9 d! Q' L( i: }4 {
- {
" j" P( H3 `+ G% B! p - digitalWrite(kg, LOW);5 q8 M, R2 Y* }* ~
- digitalWrite(de, HIGH);
3 M: w' Y" n- x6 m S# Q4 c6 E - Button1.print("off");6 ?! _ J$ g' y8 W o
- Button1.color("#00FFFF"); //设置app按键是深蓝色! u% S a- D2 v1 [" k( f- v E
- Button1.text("关闭中");
, `7 ?4 i& `! \$ E- o# a7 Y) L - }
X( x/ o$ N1 M9 |- i7 G - }
# ~3 k5 X4 r3 D; e& g - }
5 Y* z, j& `9 p( j4 w5 y$ w - }
复制代码 # y( ^# P- S! ]9 d3 W+ P: |& W6 [
% X' O* c; d Y8 a$ O我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html
3 K, G6 ~% h/ @; i3 H$ p
9 e% E _# ^6 _: v* `, Q U5 T* T3 L. i把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。
7 w+ k; T% s6 c* N/ ~" d6 S
6 R) A& ]% l5 | ]& N- }. B# c8 x
|
|