|
|
本帖最后由 易记 于 2021-8-21 14:05 编辑 3 m! ]3 T5 Z1 M# x# w
4 s; Q$ [7 o( [' u3 t/ `最近玩ESP8266,想做个天猫控制开关。
0 W, @: Z. y- B I# R* [" w但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。/ _9 M3 ]% E* r- p' i t
还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。: W1 e+ g" g' _, v) E3 h% O# K
) O! |* U& y+ i+ g% T1 _9 e
7 V: N% J! I4 G6 s' }, H+ v) [% m" {$ _5 B; C7 ?5 @
问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。
b+ x4 l* i& I4 S
+ y' I" f0 _' m( u5 W( [
3 \" n3 `: H ]# G3 Y
# G" c2 \+ u% Z6 q' V* k
- S* v! u% n7 b: p" \* ~2 y2 Q7 e. _8 L* v
到手,当然是拆拆拆。 z$ v/ X4 L U) N
! g% M" Z' @ v! a7 q
* _" S2 B, |0 G( I/ l" ~/ z. ?. E$ N$ d$ B! a) b! y
联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。
, B/ w/ x6 I" G) t8 K9 G
j6 j/ ]: k' w- |, T" ?
; H: A6 T. P; p( B8 J
% c T" y; j( ?: V3 Q+ z$ u9 S继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。4 [( g3 w) ^5 Q. Q2 J
+ T" K1 |! y) s. b1 F+ ?. u/ \
' v" I' I6 I) U4 U# N' [% I
: o- x# d: T2 S( q
+ L5 j( R1 B3 T8 w+ ~, r
电源芯片
k* h2 `; H1 @8 S$ L9 h5 K- v
m- Q- I; F" J
# i, M" S9 n3 U1 t9 R6 ~$ F4 N
: e1 Y& ^; f% U; \6 J; \, T3 l$ U有一个按钮,按钮有二个蓝色LED灯
% O5 C$ r8 m1 i& J8 E+ K4 e
* }& B4 \1 m1 B
4 G! O8 D. |% l: ^/ y! J. Q" R8 x5 ?( r! @4 o/ d
8266/ s o/ a& `9 T
( G' D6 ^) g3 Z
# @# u, B8 x) ]# d. w9 K( \/ Q0 D7 `7 y+ P
2 z# j& M1 U+ ], A s* L' Z
' z( o- z8 ?: D& A+ S接下来就是刷机了,版子上面都预留测试点。' r% t: K& s$ I c: O, x9 \
接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。
! \+ x# ^# d* o/ t0 b' V
1 F) ?7 Q' p3 A8 H+ G9 ~3 |
注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。
$ T- X! H7 G/ x2 q. }要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 |
2 |6 e8 z0 v( y1 t; n$ I; r/ \) P. x; n
) X6 u% a( X ~8 H6 T7 y Z4 t6 V" M4 `& n( G$ R, A
. Z5 h# G& b+ e. r6 Q
/ _$ {" W% M% Q0 n- d 5号脚位是继电器输出0 @3 a2 }* C R9 J, d6 `
12号脚位是灯输出
- z9 r& W. V% }) r! `: X 4号脚位是按键
+ A4 l$ E" Q$ A4 s i5 l
6 l. l9 i U( H1 x
! {8 [+ X# o3 Y9 I5 { P$ r8 K4 w1 ^
) {$ x7 w$ v% e$ V0 r9 Q5 U卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库. O3 i/ `; Q1 Y, S
- #define BLINKER_MIOT_LIGHT // 设置小爱灯类库
) y8 X& Z7 q' [& Y6 ]3 U - #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库
" |7 u% k2 Q; k8 p/ [4 N# w8 I7 t - #define BLINKER_PRINT Serial //串口协议库0 T+ a) c6 J# @" _2 x1 S- p1 ~7 S i
- #include <Blinker.h> //官方库
, J% }6 P; o( i+ t - #include <ESP8266WiFi.h> //官方库
; ]+ g% r9 u7 i/ ~' p( G, P! _ \ - WiFiServer server(80); // 服务器端口号# ~1 `! M2 I9 R3 C7 J
- ' k( m1 J6 q) w7 @8 u# n
- char auth[] = "c4942fb1d5e4"; //设备key5 t d* b8 _9 b7 i6 S3 u2 \8 h, K
- char ssid[] = "wanboshi"; //路由器wifi ssid, s1 h$ ?0 M0 q* Y/ V# ~' G
- char pswd[] = "1365662999813586348220"; //路由器wifi 密码
0 l0 O9 x4 E I& s D
. w* B7 c+ J4 ]8 `7 c: G- bool oState = false;
6 x! P; A m9 j; _
+ Q9 l7 ?$ U" F0 W( ^( m3 L- int kg=5;//继电器输出
) E, R$ ~3 c& C0 I) p: ], t - int de=12;//灯输出6 D! O' H0 v$ G! \& N) `: O$ j
- int key=4 ;//按键9 M' F1 T! O. I2 N" ]0 N$ v
- //*******新建组件对象 U R: |* b' I0 O
- - q# V7 u" z9 K. J, b* A; v
- BlinkerButton Button1("btn-abc"); //设置app按键的键名9 J: K- X9 G# l
- //*******app上按下按键即会执行该函数app里按键
9 c1 j7 t, h0 h+ Q% j - void button1_callback(const String & state), g; P$ r/ y! Z: d1 H3 Z1 G# w# K
- {
: L7 L# Y) ~- C - if (digitalRead(kg)==LOW)5 P$ j7 c. ?/ S& \1 U8 k, n+ B. h
- {
) f, C) c: I1 \9 T; [! h - BLINKER_LOG("get button state: ", state);
' O+ e( s1 J" C$ V; R& t* o( M- w& I - digitalWrite(kg, HIGH);1 R. Q7 @) l3 [( z1 X# o' B
- digitalWrite(de, LOW);
# _2 n/ ^: ^. {; S - Button1.print("on");
+ N9 O: Z, o0 ^3 m/ {3 O( ?6 p - Button1.color("#0000FF"); //设置app按键是浅蓝色4 t k! e! }) S
- Button1.text("开启中");
, x& E7 A% \0 d; d# |% G& T - }
, d8 c5 }: f# P) q - else if (digitalRead(kg)==HIGH)
: _# a- o" q" D, A - {" [, s9 B. j( Z* ^* Y
- BLINKER_LOG("get button state: ", state);! k* t9 l7 j7 F
- digitalWrite(kg, LOW);, Z8 g9 ]6 y. q3 U8 Q- N* G
- digitalWrite(de, HIGH);5 W* |2 D3 g2 o% U6 Z; S% N
- Button1.print("off");& s1 z& D' r i) |
- Button1.color("#00FFFF"); //设置app按键是深蓝色 O6 ~( |% N7 U6 K
- Button1.text("关闭中");
# A! Y7 D3 S4 O0 T# K7 u - }0 J+ @( ^! Z2 ]' W0 F
- } B4 T) s. [$ Q' N$ U. u+ e
- / {+ i# a, E9 Q5 I% k3 b6 h) D
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
) a- {* Y' c: I% { A, N' Y - * N$ W, A8 f0 `3 p
- //*******如果小爱有对设备进行操作就执行下面4 T9 b) I/ |( V) {* f$ @
- void miotPowerState(const String & state)! I6 U, p! o" A% b5 z: ?
- {
4 g$ N7 U# x. B+ F9 c - BLINKER_LOG("小爱语音操作!"); //串口打印
, V. \" F# b: V! l% w - if (state == BLINKER_CMD_ON){7 K" K2 ~) c4 {2 v5 e; s' g
- : ]- [$ x" S6 R3 P' r' Y
- digitalWrite(kg, HIGH);
( Z% Q0 G! L( a" v* J& j: Z. { - digitalWrite(de, LOW);
* I) R, M% v/ G) |" y - Button1.print("on");! d; l8 p1 v V& [+ `; E1 j
- Button1.color("#0000FF"); //设置app按键是浅蓝色+ K( o/ q8 A& a' u
- Button1.text("开启中");
0 ^3 m$ K- [) Y# P% v - BlinkerMIOT.powerState("on");
6 Z5 a! l1 |4 r( h% f - BlinkerMIOT.print();, |: D2 }! x/ Z
- }
/ d3 z, z; I; c" Z3 \ - else if (state == BLINKER_CMD_OFF)
7 N7 y; P2 D, K' P6 k4 Y' m - {
$ T) K4 B8 M& \# M3 f -
4 c1 @; ^& ?( n( X( V' l - digitalWrite(kg, LOW);9 L! f5 Z4 y8 v5 X
- digitalWrite(de, HIGH);$ E9 _+ h+ E" }0 T
- Button1.print("off");0 Y1 }$ N* h" l
- Button1.color("#00FFFF"); //设置app按键是深蓝色! k6 g8 X2 L" Z4 O `
- Button1.text("关闭中");" L. V9 u% _8 _( q+ F- \
- BlinkerMIOT.powerState("off");
4 {7 P8 Q2 K) ^- {4 H# G9 D* L% h - BlinkerMIOT.print();
" _6 r+ s7 K7 G - }
6 x: j# f& s) V" f& v- _* b* Y1 e1 m -
1 @8 E( C/ T- W/ X T. ~ -
, _! U7 f$ x9 O8 g - }* o( H9 Y6 {! m
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++' w6 k D7 Y+ e7 Y, W7 u. X6 ^
- //*******如果天猫精灵有对设备进行操作就执行下面* u: c% x: h" P
- void aligeniePowerState(const String & state)
# N( H: H! N+ J8 J- C - {/ n/ Q k2 @. a" K, m a1 V# R
- BLINKER_LOG("need set power state: ", state);
( i7 v+ x% m# }% W% }" Z - if (state == BLINKER_CMD_ON)
# `$ H; B [0 O8 U - {: S& V7 o/ d, {, q; ?' j
- 4 p. ~, s- z5 s4 f
- digitalWrite(kg, HIGH);
% B% [7 M$ O/ K: n6 h - digitalWrite(de, LOW);4 _1 R$ y; V9 X$ |# U( Y0 B
- Button1.print("on");$ P2 m h( Y& F( d9 J' S' f
- Button1.color("#0000FF"); //设置app按键是浅蓝色
* L' f$ p/ ~) X. k - Button1.text("开启中");8 c4 g$ t$ ~3 G; Q" _. P
- BlinkerAliGenie.powerState("on");- a |& @) Y* L* R
- BlinkerAliGenie.print();: k) u& b1 J5 b; q
- }
1 N: P+ {) [$ T; u1 r& ]# K$ ? - else if (state == BLINKER_CMD_OFF)% b. y% W; o; b& z( z
- {
; g& i5 t- P3 E+ R8 O6 ^- ? - $ A' d) i( |; C
- digitalWrite(kg, LOW);
" ?5 E5 M+ o- t- x7 ? - digitalWrite(de, HIGH);
; u1 V; N, U' D% j2 z' w! ^ - Button1.print("off");* s P# K* h. y8 E l0 y6 o
- Button1.color("#00FFFF"); //设置app按键是深蓝色8 P; n, q9 k3 k3 r5 `/ ]; H. q
- Button1.text("关闭中");3 G6 Z+ s4 b( Y1 n, C$ p# n( [4 A
- BlinkerAliGenie.powerState("off");2 L$ ?* A& i, Z5 K. @' g t+ ^- P' ^
- BlinkerAliGenie.print();
% \$ i: @6 Y3 r& ]4 w3 U - }# E( m) g8 N- F* s4 ]( e0 k
- ! l2 c0 l/ o) M5 I( W
- * C9 e3 b$ m0 w4 ~
- }, l% V. u5 T( Z6 x6 _7 f
- //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次9 j* U: p( b$ E1 u
- void heartbeat()
7 r5 y( P% [' u2 x9 T - {% ~0 p2 D' c) W/ Y( ?
- BLINKER_LOG("状态同步!");
4 X" W' V+ B% U - if (digitalRead(kg)==HIGH)
/ U1 Y, f7 ]( L/ {- x v; [, c - { 9 ~& `5 b$ o3 `0 j
- Button1.print("on");9 E% H- c/ g, Z/ b* \1 ~
- Button1.color("#0000FF"); //设置app按键是浅蓝色: ~, M+ K( V2 ]2 q# V# D5 _2 M0 {
- Button1.text("开启中");0 Q/ i: h3 w$ w; T7 k
- }
( Q- Q7 q! e+ r6 h. s& Y& F0 S - else
2 m* P1 J7 U3 m# n( L" W1 @- E - {
: c/ D4 S6 H8 w g$ ]' c - Button1.print("off");
, j, A6 c( R+ G, V, G6 s - Button1.color("#00FFFF"); //设置app按键是深蓝色* N- ^$ K% W* Z; c; i
- Button1.text("关闭中");
0 p" b$ D4 t6 z, k! [ -
7 V3 k& U% l N; g+ ]& r0 I9 X - }
' F Y$ l" K; F" ^ - }5 V" _5 t6 x" H0 g7 M
- //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++: V0 p( Q; ?) s, B' H4 N* m2 \: ` ~( N
- void setup()
! I5 X. J5 ~ \6 i, c7 N - {! S. `( ?/ ?3 w$ E- W; s5 l e
- // 初始化串口* U; d4 n0 w% Q" _
- Serial.begin(115200);
6 b: g: R# V# ?5 ?/ @; ]/ K: i. y) \ - delay(10);
. F/ [$ |! M' \3 g( f# F* S* e - BLINKER_DEBUG.stream(Serial);7 s0 p( E; ]$ Q+ P- [; h: X
- // 初始化有LED的IO
0 S: H/ U# i& l3 l - pinMode(kg, OUTPUT);
3 U, j! i2 Z$ ^+ m" W U7 B - digitalWrite(kg, LOW);//初始化继电器上电状态
2 J2 T" h" v' _+ Z H - pinMode(de, OUTPUT);4 Q, G5 D+ l! d
- digitalWrite(de, HIGH);8 p h0 A) p* q6 V
- pinMode(key, INPUT); $ u" | j, e$ g0 C
- Serial.println();
" o; D" v$ f3 I2 x0 B - Serial.print("Connecting to ");" y* R$ R2 e+ _) g
- Serial.println(ssid);
9 g- @1 M. q' _- |) c2 k# [6 A8 d; | - WiFi.begin(ssid, pswd);) g9 p$ Z" k/ M# O
- while (WiFi.status() != WL_CONNECTED) {% C; b6 D3 ^6 J2 f; I" P- w
- delay(500);
1 o; a; q; ~" d: H6 Y, w* h3 ~ - Serial.print(".");
0 x: r2 C& [+ R - }
' o% ^# w7 y5 c - Serial.println("");
4 k& |+ p& I/ |( D x# h1 Z4 e- Q - Serial.println("WiFi connected");
' X! b5 Q8 q3 k& B - server.begin();% J- ~4 `) \- N/ K
- Serial.println("Server started @ ");
. J8 |# f( O5 [ - Serial.println(WiFi.localIP());" c+ }# X* r1 Z1 ?( e* o y+ @
- //打印出IP地址,后期可以制作显示器来外部硬件显示ip
' g7 K" O$ |/ a/ {" ], D - Serial.println("To control GPIO, open your web browser.");! b! N: D! \& d
- Serial.println("To set GPIO 0 high, type:");" S& b2 w9 \+ f+ A
- Serial.print(WiFi.localIP());& ^. _, F' D7 E2 r: ?
- Serial.println("/gpio/1");: _( p* d- \- Y0 _6 r) t% d
- Serial.println("To set GPIO 0 low, type:");) j8 P' U( [3 u6 B8 G9 O! z/ S
- Serial.print(WiFi.localIP());, f: `1 G! j, T* e: K8 J
- Serial.println("/gpio/0");5 W7 Z1 z3 a2 @& D- D
- Serial.println("To toggle GPIO 0, type:");& ^' o3 }* p2 m
- Serial.print(WiFi.localIP());; K1 r( l2 W4 Y$ O q; V$ \( B( o
- Serial.println("/gpio/4");: E8 y0 y3 E' q
' D1 `# r( U; I9 v1 z' V- // 初始化blinker: M$ {7 M- F5 C; R" |5 ^
- Blinker.begin(auth, ssid, pswd);. n, J- H& k# }* W' E% I2 P# L
- BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数
2 [: f: G7 G% i5 |) z& Y% h - BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数
6 r, G* O/ W3 h - Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。3 T6 \/ X) D# W0 C) O! W
- ; u2 I3 r. X9 z* P! [. L( s' h
- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback
/ S8 q) _: t* r7 p; K - }
3 {2 o7 Y2 h7 E% ?0 g - void dataRead(const String & data)' u+ b: W8 v" S0 W3 Q: h3 L
- {' u1 a3 J1 R3 h- Z N! H6 R) x
- BLINKER_LOG("Blinker readString: ", data);3 T# m! [$ _# s2 ]- N
5 {0 Q$ w a( M9 k& t, L- Blinker.vibrate();
% p1 `) k8 _% F. X* | -
$ W# O$ L! Y1 [% E3 f& r- C' L - uint32_t BlinkerTime = millis();' T7 d3 m& W$ L2 e) y% }
-
0 [& X' ?$ @$ Y$ @3 O G5 Q - Blinker.print("millis", BlinkerTime);" x7 v9 H( I( N2 P# h3 g, Q
- }' g- @! X' n! {7 `' ?/ U' M2 }
- void loop()
3 c+ @+ y/ X# j3 b0 y& n3 O - {
7 \1 t1 H. b9 l& R8 f - Blinker.run();2 z. Y" S R9 [) I, L `3 v4 y* [2 X
- if (digitalRead(key)==LOW)
, V; h% I; w7 K' K" [. r% D+ t3 [ - {
1 c9 h2 E% t2 k c+ i7 I" H& i - Blinker.delay(200);9 f9 m: Z# y# E" L! w W/ V' g
- if (digitalRead(key)==LOW)
: O7 W- P3 t+ _* p& c* Q: p - {
9 Y( s. W$ E+ X* ~6 g+ x+ x" j# @ - if (digitalRead(kg)==LOW)% m0 K, P3 `2 N5 E& [2 M
- {
# {4 i# Q, X: B! ^, @ - 2 U: Z3 k" J, |3 q3 _9 |; N" d
- digitalWrite(kg, HIGH);3 L1 J3 \1 {& r
- digitalWrite(de, LOW);$ }+ a) W" h3 M1 q+ U! v& {/ i
- Button1.print("on");
- J3 V( u+ ~1 B0 A/ i - Button1.color("#0000FF"); //设置app按键是浅蓝色
& p5 w! Q( r- ] - Button1.text("开启中");- `4 K6 R2 z: D: S/ [/ t
- }
7 x+ m7 N- O, \4 J t - else if (digitalRead(kg)==HIGH)3 A; m* a" t. r. W W
- {
?' J/ ~: s3 S' u- r - digitalWrite(kg, LOW);
- O l/ ~" E2 N5 g - digitalWrite(de, HIGH);
# v4 l! n) M$ F4 P8 T3 S! a: L - Button1.print("off");$ S; H3 I% ^: b; r; _1 w5 p
- Button1.color("#00FFFF"); //设置app按键是深蓝色. ~, V8 H% y9 W3 f/ C8 T
- Button1.text("关闭中");2 ]* P1 E' h5 |( U9 H# E
- }+ \9 ^6 z( a* m* t! c2 K, q
- }9 [/ H, u- z9 ~
- }
5 M4 u7 X4 E, F; y7 d9 v. H - }
复制代码
8 w1 J) J, B* w& R( ]7 B. T, s C2 M' ^) m. @- p3 m! d
我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html4 q0 \5 `9 O% T- R& V
8 C w( ? g) \
把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。* P) n' S4 n7 Q! K; w( d! y
8 o7 G' k& K& L
0 H9 \( v! r6 j3 Z8 C, G( f
|
|