|
本帖最后由 易记 于 2021-8-21 14:05 编辑 , Y1 W. M( h) |. B( o# P0 u
* `1 b0 X# H, G
最近玩ESP8266,想做个天猫控制开关。
, e9 q0 z9 a% h- W2 K但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。
- Y3 a' V5 o) y- g7 X( X0 S4 p还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。
9 Q, O- h+ x- K8 {$ S
' B& c7 j. K8 P! k% z
# h" Q4 O6 V; H1 ^: D& s4 l
- Y3 D) v) a2 l* n, o( ?问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。) {4 a: h# V( `! Q! R3 |- r1 }
* ?% ?$ c$ v/ |: D. `1 B: a
1 y6 X! N& J! y2 p+ x4 {. N' m( n" N$ `* \
, x- Y* l8 n* q* n$ X0 |! m! G4 p4 N4 c3 T6 f5 N
到手,当然是拆拆拆。
: N1 K; N( l- S. G2 q# Z8 @
2 D9 U- d' f# p/ t6 }: x8 [1 Z& ]& c: K, E4 [0 S
. m3 j+ X( ^0 r& W) D
联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。" n4 F* A/ ^( u, K$ \- p* A+ \
% D6 K( g, r9 p5 @& g) ^! G7 @" @# d9 T! w) g
$ ?4 y9 C' m6 ]3 ^ Y/ |; ]2 c
继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。) C% t2 m* {# A" ?6 `5 g
% W9 ~& |+ z) o" U9 t
1 x" @- `6 z c: B
1 u& k$ a4 e+ L' Y* F4 o
0 {' B6 K8 i X6 ^/ h4 |
电源芯片
+ S8 _4 h6 H) k: O5 d$ z
) ?; ^2 \. N3 A' h/ c& a0 u: J! j$ `, N7 X! Q; @+ y, d2 ?
( O( y. V8 ?, S9 p# P
有一个按钮,按钮有二个蓝色LED灯
7 t, ~& u! @3 a& v* D6 \
$ Z0 w2 J& L# s# x) \
4 G7 R) @8 g; H
% N8 r$ A0 T) g6 a) K, i/ k8266
+ m) C# t) A( s; N1 u. v* o( }
- E0 J- k. X8 G% J- g7 \" O% w
, m& z5 ?1 y2 i! j
, w# t* W9 S: C! Q
4 ]4 R& ?0 ^. {' z7 ? g/ U. Q* F& j1 R9 N" g
接下来就是刷机了,版子上面都预留测试点。
) s. a3 L6 r- O接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。: S" `/ k2 ~% h4 T. S
: H2 Y# M- [) J/ z9 X, l: H, N$ N+ a3 r
注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。
7 F/ z) _2 v& ]8 n$ ~7 a. C要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 |
6 ?4 D* F- R3 N+ R- R" }- {
) w. R1 r# U4 Z& x' [4 A" m( M3 N: \# R! z$ I
+ G! C3 C" a! v& C6 c2 f
: g( e* B# s% w2 @ U- B
% u2 r2 Z- c5 A d3 I 5号脚位是继电器输出: {6 A8 q/ ^% u# F. I9 ]
12号脚位是灯输出, b7 I1 a1 @- |/ q2 D' S
4号脚位是按键) `: W6 \1 A- J3 p8 \
* n& N5 g4 ?, a* X( ~8 q! n, `8 ], L
4 p( C8 N! ?' j3 g
, c, o0 R. v! y! S/ K! w: M [
% b: G z" ?! L* m+ ~2 X
卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库# t3 S1 ]' g1 m/ R0 }/ |5 |: |7 g
- #define BLINKER_MIOT_LIGHT // 设置小爱灯类库" X+ @1 L1 t& V( C
- #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库
) M3 Z; y9 H% {1 g, r - #define BLINKER_PRINT Serial //串口协议库) g) x" C6 U' Q1 f8 T- c6 N
- #include <Blinker.h> //官方库
$ C+ `9 K4 k. C - #include <ESP8266WiFi.h> //官方库' i# Z. |5 z0 F, P2 l
- WiFiServer server(80); // 服务器端口号
, k. H& H: j8 W
( D; I' e# U. {* o4 Y% \- char auth[] = "c4942fb1d5e4"; //设备key
) b: L- i n2 c - char ssid[] = "wanboshi"; //路由器wifi ssid
$ A; i6 ^1 V- I) G& y) _ - char pswd[] = "1365662999813586348220"; //路由器wifi 密码
. z: B' }% V' p
' ]: ~, P5 o: K2 [4 M; V- V- bool oState = false;& c/ U/ Z) _" P" |4 a
- 6 V) g. ]" h0 q4 K+ U" J
- int kg=5;//继电器输出& P/ y3 T; D {. U1 H
- int de=12;//灯输出
9 W/ H2 t$ ^0 }% _ - int key=4 ;//按键; K; q* }" R) E. h) w
- //*******新建组件对象
2 a% Z# V; f6 R" }9 C; V - $ X8 j1 @1 I/ P% O
- BlinkerButton Button1("btn-abc"); //设置app按键的键名
7 J; |' ]; c. P4 I3 s( ~ - //*******app上按下按键即会执行该函数app里按键
- F1 f) ^/ X' F1 R* _7 B* I& Y - void button1_callback(const String & state)
, ^9 s& k. B2 I1 Z1 R; X8 t- q3 @ - {
: \% c% ?+ P$ N5 ^5 s' y6 Z; s - if (digitalRead(kg)==LOW)
9 w; z* F: D, i4 D {' C - {1 Z6 K8 P. _9 O! M
- BLINKER_LOG("get button state: ", state);
+ B( Z% U1 c; `, U - digitalWrite(kg, HIGH);& K* d- \+ ]3 L* O
- digitalWrite(de, LOW);& [- H# R( r7 e. I. m# ^
- Button1.print("on");
0 `5 U, w8 k+ S. o+ ^- `& H9 w' h - Button1.color("#0000FF"); //设置app按键是浅蓝色
/ @. [3 w9 X& [; p' c - Button1.text("开启中");
8 [2 ?" E" Q5 [% Q0 \ - }
D$ [2 p- b F/ [, k& m0 h - else if (digitalRead(kg)==HIGH)2 z9 v8 e! X% v" X$ I- a9 \
- {) O( Z. i# u- a ^
- BLINKER_LOG("get button state: ", state);/ _: o$ g# O& H. j: m7 v( b) _4 m( e
- digitalWrite(kg, LOW);
6 ?" a' [( A1 ?( B - digitalWrite(de, HIGH);
2 B3 t+ Q+ Q7 k6 [ - Button1.print("off");3 z. B0 D5 v! d. t6 }
- Button1.color("#00FFFF"); //设置app按键是深蓝色
# ^9 C, C( e' v4 ]- v% X1 W - Button1.text("关闭中");
& K5 M( }, |: {- k0 M - }; Z0 v) b+ O# q
- }0 P4 ]8 Z Q ]( ]+ \, v
/ j- _, i/ w- S# h5 Z9 z, Q- e- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 j) v0 q* L2 A/ ?# b5 Y% { - % k# u0 _- C, g/ S( q9 D: G; r+ [
- //*******如果小爱有对设备进行操作就执行下面4 T6 n9 V6 [$ [, g9 G
- void miotPowerState(const String & state)
2 o F2 Y: |2 O! K, e - {
: `0 f# G3 v9 O' b7 _5 _$ J - BLINKER_LOG("小爱语音操作!"); //串口打印
0 Y" m% }" z: j& H8 u - if (state == BLINKER_CMD_ON){4 L# k0 v/ |& D% w# T
- 5 u2 d- M, s: o$ l- M, {* _
- digitalWrite(kg, HIGH);
7 V) Z7 H( \3 e& n - digitalWrite(de, LOW);
2 Q$ O$ ^( Y9 T2 D0 u: ~; R - Button1.print("on");/ a0 M3 _8 u$ ?3 \8 g
- Button1.color("#0000FF"); //设置app按键是浅蓝色8 O7 F& K; K/ M3 k
- Button1.text("开启中");" G. E; \- s+ [- W6 I* R4 V
- BlinkerMIOT.powerState("on");3 y |- v2 p; X! z+ C' {* q
- BlinkerMIOT.print();+ K; W9 Z& E' ]' Y0 V
- }8 f9 `4 u( z I* e6 Z
- else if (state == BLINKER_CMD_OFF)
9 y* [! \9 l0 e' J; Q9 | - {, ^% k& w$ d7 I" E
- ( x! F: Y3 O0 r' r
- digitalWrite(kg, LOW);
3 S5 H/ ?; M1 y2 P `/ s) F) W - digitalWrite(de, HIGH);5 Y8 x# U) {5 ^" F
- Button1.print("off");8 I" n" }: Z8 y
- Button1.color("#00FFFF"); //设置app按键是深蓝色$ _3 U$ l. I Y( ]) l/ `
- Button1.text("关闭中");& b) P: L; H2 L" }8 G1 L6 d
- BlinkerMIOT.powerState("off");
7 d. e) h$ N" o3 p5 ]: | - BlinkerMIOT.print();* n; @" w6 w- a. b4 O( m
- }( D' ~3 a% l3 j \' f1 k/ i t( R
-
7 u$ P/ h1 c' M. G2 e: g - 9 f/ K/ f' o a
- }" B: h# W! ]* l. U
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" u. \0 T6 A6 U" R! p
- //*******如果天猫精灵有对设备进行操作就执行下面
; D+ ^/ P U/ a# ]) d8 t - void aligeniePowerState(const String & state)
$ E% f/ u" c8 K4 [& H% C' Y - {0 I8 w( C) ?$ F/ N& D3 v4 c f( {
- BLINKER_LOG("need set power state: ", state);/ N' N2 E; k2 C" [) K' E
- if (state == BLINKER_CMD_ON)! o3 U8 z& O0 G7 q n' g
- { N& A- D- }% Z6 W1 ]! H# J) d! O* A' C
-
! g0 o) c& i$ m5 B7 }$ D( Z( g - digitalWrite(kg, HIGH);
2 F7 q% ?# ?; t, x - digitalWrite(de, LOW);; g( m6 T0 E8 U& K* M% o% F
- Button1.print("on");
h6 z6 i* L5 V p0 s - Button1.color("#0000FF"); //设置app按键是浅蓝色
. B, K# ]/ t9 }# Z - Button1.text("开启中");+ m2 n) Y; t& L4 g
- BlinkerAliGenie.powerState("on");
]0 x, s1 j, d m+ y. n0 o - BlinkerAliGenie.print();
+ l0 J! R6 o: a8 k5 ]2 u - }5 T7 l7 e! d5 W: V9 A
- else if (state == BLINKER_CMD_OFF)8 f' U+ A1 R" ^9 O/ F
- {+ N" w9 `4 Q |% l* e/ K' G B9 \
-
: T( u Y, ?0 l4 B - digitalWrite(kg, LOW);8 ^% M( q: f/ `1 A
- digitalWrite(de, HIGH);
, ?% @7 N; I# n {6 {" f! _ - Button1.print("off");. s' H% I h! S, u( s
- Button1.color("#00FFFF"); //设置app按键是深蓝色1 K- ]0 |; J/ }: `" l+ I( w V, ^' X* V
- Button1.text("关闭中");- ^! U1 ?1 ?! x% l0 [/ W
- BlinkerAliGenie.powerState("off");8 I* t* f& U: ?4 w
- BlinkerAliGenie.print();* e/ |. X0 f' X/ t6 Z9 J
- } y+ |$ D2 Y. Q# c
-
& |) j: D2 M6 U0 D! z1 C) t - & P. S; E" g0 Y4 Q% K% W
- }
) i3 P. E$ w- _8 | - //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次
_% z' M+ q% M! x9 B; e4 t - void heartbeat()
' l" f: i. [+ X1 e# S& \6 Y - {
6 a( ]# _( w+ m& o' K4 K; t - BLINKER_LOG("状态同步!"); 2 S3 Q0 U2 s( Y" E( j- k4 N" {
- if (digitalRead(kg)==HIGH)
$ b: H6 u$ B0 h1 a# _ - {
! O% {0 {" v J/ }& p6 E+ `5 x8 p; l - Button1.print("on");' P M* x: y* {( r G: y9 I
- Button1.color("#0000FF"); //设置app按键是浅蓝色, m- t: p( \1 F9 `" ?
- Button1.text("开启中");( x$ |$ w: \6 J/ M
- }
8 W9 `+ Y# [1 z3 Q+ z - else
8 ?/ q" o" _* K1 n/ I' e - {& w( {/ c! V% j1 K; N
- Button1.print("off");
: k, G" w$ @( u/ J, L1 W, E - Button1.color("#00FFFF"); //设置app按键是深蓝色* r- O- Q7 |$ @7 R0 U$ n
- Button1.text("关闭中");
! w: k5 ^) W" i% Y4 q* I; g -
l8 i4 [9 {1 N' @' F3 D& F% E - }
; [7 j" M" W# U! B) n - }
% u/ t7 {& u# f$ O5 w; n5 S - //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++8 _3 b2 a9 }4 D# t) @8 m' p
- void setup()
8 t4 I- C' s0 B5 G1 i5 y - {% V) y+ A( N) v
- // 初始化串口
/ j* r: U! }: t, B" } f9 }' d - Serial.begin(115200);( P; |" Q) @) u$ Z9 P
- delay(10);
. T' c' r( b, ~2 m. w+ A - BLINKER_DEBUG.stream(Serial);
& P( a4 {1 L3 u' G, h" {( d# _2 A - // 初始化有LED的IO) t# F: g$ p3 f' n1 o8 x2 c
- pinMode(kg, OUTPUT); 6 F: w/ a1 S" B& E( k" M, o, Z
- digitalWrite(kg, LOW);//初始化继电器上电状态
# E {+ B, {- e! E" C6 u" ~8 ^ - pinMode(de, OUTPUT);# E0 j" t Y- Y+ y% n" L* @ j1 |1 `3 u
- digitalWrite(de, HIGH);( A, C9 N' i* d2 Q1 t- i
- pinMode(key, INPUT); + F2 v4 W# b: Z/ Z
- Serial.println();& z& F/ M6 I: F9 U
- Serial.print("Connecting to "); j& F+ W. n. W% f. y6 \2 U& Z
- Serial.println(ssid);
& X9 z6 u; p' R6 n4 |; E9 c, | - WiFi.begin(ssid, pswd);
% p7 |+ o9 x9 g5 N7 F2 T3 h - while (WiFi.status() != WL_CONNECTED) {
8 J4 L/ C6 W7 ~ - delay(500);' U: X/ |, j- Q) X- K% R
- Serial.print(".");1 X \8 `. \1 m6 E9 _9 K4 M
- }2 {6 d1 `4 V8 F" z$ b# L
- Serial.println("");
, }4 M: A+ }( l$ z/ r - Serial.println("WiFi connected");$ F9 a5 |: z, T8 O# ]7 o8 q
- server.begin();! }1 X( w+ _1 |6 N5 a$ r D' S* G& N
- Serial.println("Server started @ ");
! k$ c' G; ~) x: L& @- x5 ` - Serial.println(WiFi.localIP());
& {' F e) x" F k; r! H2 o2 u - //打印出IP地址,后期可以制作显示器来外部硬件显示ip
+ j& x' W3 ]6 n% z; T6 x - Serial.println("To control GPIO, open your web browser.");) S6 n* Z$ P- q0 q
- Serial.println("To set GPIO 0 high, type:");2 O' v% i' Z8 C) t' N
- Serial.print(WiFi.localIP());+ [ f7 b3 C) j8 ?' V# N! N
- Serial.println("/gpio/1"); s) m$ P) y5 w: `- H" C" y$ q
- Serial.println("To set GPIO 0 low, type:");* `& \$ g& ^0 F- N
- Serial.print(WiFi.localIP());6 j# j* d V" z* O
- Serial.println("/gpio/0");
6 r" K5 m H) ]) G, U. t - Serial.println("To toggle GPIO 0, type:");
0 m& {# T1 \ F0 n, j' G2 j - Serial.print(WiFi.localIP());
. ?( f8 {( Z5 c7 O8 k; W2 z - Serial.println("/gpio/4");
+ Y$ ]6 |1 ]( @( |7 a4 N
P5 Z( E2 `1 _ }* l- // 初始化blinker
* s4 I, N3 y+ t& M - Blinker.begin(auth, ssid, pswd);9 ~" W" z2 C! }5 k& [: e4 \' a
- BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数
# W5 B. D; b9 ? } - BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数" i6 V8 L$ Q [/ l+ c! c6 ]
- Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。5 Y% \0 F1 L9 d, n( g3 u. c
- " Q: P' E4 O2 _
- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback) h S% C5 k) [9 @1 H
- }
8 |: I& [$ d* q$ f- o* v - void dataRead(const String & data)4 X! D( B4 c( b+ O+ P
- {2 M+ E& F( ]8 G6 s! @, O: C
- BLINKER_LOG("Blinker readString: ", data);) f* }' A& C* E0 |. Q
$ ]. k2 Q7 B u7 B8 ]- Blinker.vibrate();. b; b1 u) o1 C% J9 s; [" p
-
: e& c H. z, @4 Y - uint32_t BlinkerTime = millis();) v- p& s& G! I8 i# g
- 8 N) N& ?4 m/ ]' a. [* {! ^/ L
- Blinker.print("millis", BlinkerTime);
2 ?5 |) k _8 W - }; ^% m" ~9 i* N: {
- void loop()
5 Q7 [& A9 | E, f5 \' W& ] - {
& @5 D2 e- f4 A8 Q9 w - Blinker.run();5 N; n; O3 K! X1 B' I: X$ N3 d
- if (digitalRead(key)==LOW). t+ C0 Y$ Q W W
- {' g$ q7 o8 M; [5 T. D. T1 c3 j
- Blinker.delay(200);
. ~( W: {& a) w' D; @ - if (digitalRead(key)==LOW)4 s9 b# _9 P% g
- {- ]4 L4 P9 |3 }
- if (digitalRead(kg)==LOW)4 h% D( c; L: _: m. t1 s
- {/ h1 J5 r$ w& I8 _8 J
-
9 n( i% b7 ?7 o, q" \$ U+ o* m - digitalWrite(kg, HIGH);3 W% S R7 J+ g
- digitalWrite(de, LOW);: v0 R# B" @# T6 [8 ~4 C
- Button1.print("on");
$ T, x' {( ]7 N: x. N6 N - Button1.color("#0000FF"); //设置app按键是浅蓝色
+ u: _5 n) b9 Q$ Q - Button1.text("开启中");
# }1 p# X: T; c) H3 r' w - }# `! j6 e- [& x$ P+ p/ l
- else if (digitalRead(kg)==HIGH)/ W) c/ Z$ E: c) u
- {
* ^4 I; u4 f% O) ]7 v- t# |9 I+ R. v - digitalWrite(kg, LOW);1 `# _! {% o+ ?; }3 X" z1 c
- digitalWrite(de, HIGH);. N" {5 Y$ t+ T
- Button1.print("off");
3 u* z# h7 ^* v5 d. K) {( P+ l0 c - Button1.color("#00FFFF"); //设置app按键是深蓝色
5 w% w9 ?; L0 q6 `3 I: H - Button1.text("关闭中");
+ W1 q* C( O% u* P0 a. { - }
+ x" k1 W5 I8 N& z - }. M7 D0 l" v( t; X
- }5 V- Y" i! a- q5 z1 V/ u
- }
复制代码 8 N r% l2 c$ c+ i1 e$ O- d& p
/ u$ {2 b# Z- |+ g V( f V$ ]
我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html/ K7 R4 h9 `6 R, p6 T+ O# n
( ~9 G- O' g4 U: } r把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。
; f% m( A: N/ j9 {( `& V* U$ y! s5 V2 j
' t& g5 K" c3 R6 j
|
|