|
|
本帖最后由 易记 于 2021-8-21 14:05 编辑 ) }; Q4 }/ T8 F# g. L' i
1 {5 \' t. n, Z+ L7 x2 }
最近玩ESP8266,想做个天猫控制开关。
( Q3 z! V( `) `8 E3 S2 t但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。: ?. a# R$ N& v0 @. ?
还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。& c9 d- h7 `$ I2 D2 O8 H0 z
; D+ ^6 W, j8 P2 J
, N! ?9 m# C, d L% G j0 x" M
2 I+ v8 H4 u! O6 L
问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。' |5 \2 n9 l0 s# a
1 r, h+ x; r; g" X0 x
- R! f* s7 Y3 ?
, K) z7 {/ l4 _7 z6 x
, P: t& X( q9 ? ^6 A8 p
p/ U& \7 x; K. N$ J6 t: H到手,当然是拆拆拆。
+ T0 S: H1 `& R+ i1 i) F1 {/ D
! I9 U X& \% o5 ^% r6 j/ h2 F/ i. n+ M2 x
) r: N; x- C1 [/ X8 V9 \
联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。
* k6 w9 _2 i% v- @
6 w" y& `+ p+ W( s/ p6 C# R# R
+ `6 s/ e- V6 P2 H# c; k1 ~7 O
% r8 ?/ N: D3 l3 W( B
继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。; w( i _8 @5 C0 |& n
' G3 u- u5 r1 R2 |& o- ]
9 a a. v+ P+ K' k6 G- Q
" f/ j) C. Q9 ?" M, r# g9 V" X* p' `9 u& Y" k% E5 K) N8 k5 |2 n# I3 @
电源芯片
$ x& }7 B3 Y& S4 _) ^! p- [- n( H# p1 f7 F1 L4 V. L7 \; }
8 h$ m1 u3 e5 y
2 Q- Z+ \' d' t6 e2 o9 U4 F
有一个按钮,按钮有二个蓝色LED灯5 O( A- X& _9 J$ E& X
9 u$ b/ F1 E: R0 } d9 U
- D: o7 h, S0 y$ c! h3 G1 F* A# \: S/ E: V
82669 y% P; ?5 e: o- O. Y
" Z$ Q% N0 Z$ F3 v$ [9 A
: G: z+ I4 d( O
3 g, J9 O! X4 o- g. l/ F$ J+ u8 O7 H5 H% a
5 ~4 M& @ N9 o* f; u2 A" L) d接下来就是刷机了,版子上面都预留测试点。) e7 Q' z( M& G' E
接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。
) }/ M1 Z8 J! K
/ a8 K& H$ _3 ]. P注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。$ Z, c$ o2 @* f7 L9 l( r
要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 |
5 L: u, \/ P- Z, J1 F) r K7 }( G" z# l. K
0 I8 F( ~2 H7 ?3 {. [" p2 X- N: r
7 Q1 {+ |* \ d$ N/ v- j) f) q
; g# P2 o, @- x7 K
. S9 R% |& p* h+ j0 n3 q 5号脚位是继电器输出8 t/ j z. j! T! p
12号脚位是灯输出2 W. s) B3 m w, f5 [) O! d
4号脚位是按键
# D- F/ O3 [9 h, H& ?% m( k- G0 H0 U! T9 A; B
% a! I) B) P: `. I' M( q& T# S
" E5 }* z5 _% K' y3 H9 e) H! g0 v
% ]7 M8 \ o: x! S( T+ C3 s
卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库# F* {9 a- T7 k2 e
- #define BLINKER_MIOT_LIGHT // 设置小爱灯类库3 w8 G2 o/ a( a& x. R- s
- #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库
2 t7 R1 O- v) q5 Q: j6 B5 H - #define BLINKER_PRINT Serial //串口协议库. ~# N& U9 C. Y6 B0 `
- #include <Blinker.h> //官方库6 R* R6 R! P7 [" H( x8 s
- #include <ESP8266WiFi.h> //官方库
5 H6 O# V2 _/ K c. R! B0 ^- b - WiFiServer server(80); // 服务器端口号+ m/ a% z E# y& i2 t6 L+ r! ^
1 E. ?2 E9 V% }2 m) W- char auth[] = "c4942fb1d5e4"; //设备key0 F+ |- j u8 i2 G
- char ssid[] = "wanboshi"; //路由器wifi ssid8 z. I- \, Y/ U: R9 }& s; K: p
- char pswd[] = "1365662999813586348220"; //路由器wifi 密码, F! N+ O! w7 g7 F
- 0 m- M7 N" L9 i' [! y/ q0 F. \) j
- bool oState = false;; m6 v# d% h+ K' _/ E; t+ i& d
* X; H. ~/ a5 k0 W# g, j- int kg=5;//继电器输出' `4 Y; L$ M9 G6 l! d! l
- int de=12;//灯输出
5 ^5 ~& L8 o& x' z# L - int key=4 ;//按键
* g$ J) Y; `; m! \+ W( B e - //*******新建组件对象
* s' c3 J( N) R6 L3 ] - + [* J8 @% E5 g% a! S ]7 R
- BlinkerButton Button1("btn-abc"); //设置app按键的键名- t3 N4 O1 p$ d
- //*******app上按下按键即会执行该函数app里按键/ l& P' [0 L7 Z5 s* J5 M
- void button1_callback(const String & state)
1 b' f3 e9 z+ n - {1 `! S0 t- W7 {- B+ P- V& ^
- if (digitalRead(kg)==LOW)% O" F, U2 e2 w" K7 Q
- {+ t9 S* P, t# I0 \5 H# `" j$ z
- BLINKER_LOG("get button state: ", state);
' f3 A) t: ^$ s3 H4 T) { - digitalWrite(kg, HIGH);
+ G8 T0 ], ]4 F* |: Y - digitalWrite(de, LOW);# a; V# D( R& ^
- Button1.print("on");4 f3 I2 x2 |, L# y: N+ r. X7 h
- Button1.color("#0000FF"); //设置app按键是浅蓝色4 q% J8 v$ B6 f# ?, n
- Button1.text("开启中");$ V9 P" P: _( [. ?7 X
- }
- M6 B: h# S1 [' i4 y& F - else if (digitalRead(kg)==HIGH)
i4 y" i4 F$ L* L( v - {* j3 x8 s' s! l2 n( z
- BLINKER_LOG("get button state: ", state);- J( Q, H& N0 o3 ~
- digitalWrite(kg, LOW);
( K1 o0 L1 ~$ ?! g& o - digitalWrite(de, HIGH);
; K, L$ q9 \ h# F. Y; T3 X! O - Button1.print("off");
3 ?3 o: Z5 s9 Q( W - Button1.color("#00FFFF"); //设置app按键是深蓝色
- J" J; l- F5 H8 r }. H - Button1.text("关闭中");
9 N" `) `3 N; ^1 ?: M" m$ U - }4 Y& n) M. ]) o2 I% j
- }
1 A% d; q8 G( f& v3 ^
% ~2 t* v+ _' Q- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- z0 j; a" u) v% W
2 n% V0 E/ l. S" P& ` i- //*******如果小爱有对设备进行操作就执行下面
! H) g. e5 F! C" I& J& e - void miotPowerState(const String & state)3 s B W% b& H4 Q+ \
- {
" f5 W# {* w0 @& Z - BLINKER_LOG("小爱语音操作!"); //串口打印
* E+ E! _( b0 ~ G - if (state == BLINKER_CMD_ON){/ P' n2 C6 S6 k4 v3 v5 l' u4 e" |% i
-
. K$ B# Q) A9 Q - digitalWrite(kg, HIGH);6 S2 U! j+ Y5 _$ r" r
- digitalWrite(de, LOW);. L/ _, P6 |0 z* W+ g0 o
- Button1.print("on");- ]& ]( m" B. ]" h. c, A6 o* i
- Button1.color("#0000FF"); //设置app按键是浅蓝色
+ j U6 x( ]7 j8 L# i$ K6 G - Button1.text("开启中");8 Y6 L% h- H! g8 e( K
- BlinkerMIOT.powerState("on");
: n" [9 @. } v* G8 x$ u6 n - BlinkerMIOT.print();
3 F# H6 ~" A! {5 T7 k3 N& N0 Q - }
7 Q; N. a/ p6 o ^# A5 o! e - else if (state == BLINKER_CMD_OFF)
% N; |$ j9 v7 K4 R) e& v - {: |. A0 a2 f& p, e9 h2 q
- 5 R f- |) \; n& m) [( C3 \
- digitalWrite(kg, LOW);' U B: q, n k) G
- digitalWrite(de, HIGH);8 h' u. w' Y/ k7 c8 F0 Q; x( w+ y
- Button1.print("off");
' G1 d" e6 A/ ^( y. o5 Y - Button1.color("#00FFFF"); //设置app按键是深蓝色1 C* T2 W# l$ W: {7 F
- Button1.text("关闭中");
- `; K" k% n$ ~5 n/ c - BlinkerMIOT.powerState("off");
% D+ e' ?+ t+ L+ O& u - BlinkerMIOT.print();) F- g5 g- M3 U/ @. E; O( x
- }5 ]. _0 l8 o6 L
- 0 C6 l$ b+ S5 ]/ |9 s9 V0 L
- : Q! O" j. Y v9 H
- }
) P. `/ k6 M1 @1 g2 c - //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! i# @/ S+ {8 R. N) ]
- //*******如果天猫精灵有对设备进行操作就执行下面" ] _& D: H0 L& n
- void aligeniePowerState(const String & state)
8 ^: |8 e8 O% j8 S$ T# E - {8 }% m: i& u8 J1 s8 O0 N3 T7 f
- BLINKER_LOG("need set power state: ", state);
& t4 c$ W' y. Y# x! p* v - if (state == BLINKER_CMD_ON)
0 L3 P9 B6 e: h' A/ ~, T! i0 q# c - {5 s1 u% b. ~# s% ]/ A8 g& k( e" R
-
# n: b! c ~, Z! w4 ~* o - digitalWrite(kg, HIGH);
H; ?' `. W$ w. ^- I - digitalWrite(de, LOW);
2 f( E; I3 v. ~% G m - Button1.print("on");, o; ]( I8 g: O( F0 E/ Q" \- s
- Button1.color("#0000FF"); //设置app按键是浅蓝色
% y( h T$ P9 t" ?7 d - Button1.text("开启中");7 X* |; h5 l ~5 a1 t3 J. g4 E! b3 U
- BlinkerAliGenie.powerState("on");
4 T! H9 D, A" i" p' w - BlinkerAliGenie.print();; I6 q6 S! } t/ k- \6 H4 w
- }
, l0 j6 b" v6 P1 E+ ~; I - else if (state == BLINKER_CMD_OFF)
7 K u+ h6 g# q2 C- W4 w - {# @. l* i. D$ e' h) p7 {
-
, G: B' r, t6 E0 ^! n0 e& \ - digitalWrite(kg, LOW);
8 E4 [6 `& K, ~0 G+ }6 a9 ^ - digitalWrite(de, HIGH);
1 l/ u* E+ Q( _) p. l/ I( k( z - Button1.print("off");
3 C6 J+ J+ u8 v! L" ?$ [% T - Button1.color("#00FFFF"); //设置app按键是深蓝色
- I) Y$ G( |- e2 s( p. ` - Button1.text("关闭中");
1 {. ?7 `( O. m3 V1 y; |# r( R - BlinkerAliGenie.powerState("off");, v8 s3 P! ]: d$ t a
- BlinkerAliGenie.print();6 j( K% F% T1 e7 H! M
- }
# a5 ?+ N: Y$ {% O# ?: I" h - 5 o& g$ E$ H3 a$ O5 h
1 N- @- D# `# h4 }0 ?6 y, r- }
3 b, h* B! h4 R& C - //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次2 D( |( v( E5 g* W7 q% f
- void heartbeat()
: s! N r9 B6 @2 A - {+ H) K8 d7 {1 F$ f1 g
- BLINKER_LOG("状态同步!"); # B# N+ G7 ~' K5 O/ |
- if (digitalRead(kg)==HIGH)
2 P8 }4 R5 P" L2 z, N - {
! E6 a/ V- c$ Q4 c: [ - Button1.print("on");
7 n; J& C4 C4 U - Button1.color("#0000FF"); //设置app按键是浅蓝色
, u7 q1 N" z5 g" P* X) H - Button1.text("开启中");& h" K& V/ d2 }
- }1 g7 H# M6 Q, m$ Y. ?' A! W7 K
- else : H `* t' g5 X1 z4 w* q
- {
0 U. V2 C, I3 j& n; d - Button1.print("off");
) t7 x" }( r* Z4 k$ q - Button1.color("#00FFFF"); //设置app按键是深蓝色6 G3 p* D2 E7 X
- Button1.text("关闭中");
d7 q4 v2 N; a- i+ o6 { - 1 W. B: c2 E5 Q/ g& o4 ~
- }9 o( E& X' H6 e, j, L
- }
) j) g- E( }, D3 _ - //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/ f: Z9 q$ C, L1 C( |
- void setup()2 u( w7 O d* g/ r+ k
- {
2 t4 M# ^8 U+ b2 c7 f0 X& U - // 初始化串口! R* @' {4 ~, w5 q; ]) v' N
- Serial.begin(115200);' E) E$ k& ]; n- `, \6 J% {' K- }
- delay(10); |" z8 V6 S5 c' R a
- BLINKER_DEBUG.stream(Serial); _ P! b6 I3 w- z( E& l
- // 初始化有LED的IO: x I( {$ `; \+ a4 x, ]( M
- pinMode(kg, OUTPUT); 3 k% Q2 }1 y( n, k2 O+ n0 x
- digitalWrite(kg, LOW);//初始化继电器上电状态 & a4 n4 f! s3 I0 J6 y
- pinMode(de, OUTPUT);" @, I7 i- z& q5 T* q, K2 f3 w9 N3 \
- digitalWrite(de, HIGH);6 C8 o Q( g$ E2 |0 X* E/ e
- pinMode(key, INPUT); 7 d, _1 [# O# U: S
- Serial.println();% f* ^' O# j! w8 V8 r& z, e6 O: p
- Serial.print("Connecting to ");3 Q( \% y1 n& H' s
- Serial.println(ssid);
' A! h) _+ P. L q. A( L8 U - WiFi.begin(ssid, pswd);. w1 _ U' P9 _. {8 S L
- while (WiFi.status() != WL_CONNECTED) {
$ T* O u% _5 R+ Q5 r - delay(500);* l: U6 |+ S0 B: L8 E1 X
- Serial.print(".");2 X$ Q- w/ j0 m; D7 Y
- }
8 p8 S0 f, b$ R) V) G* J - Serial.println("");
5 F) z5 X4 Y q% |% Y0 F$ C - Serial.println("WiFi connected");
7 H3 [. e/ X1 g; u - server.begin();! ^2 }, U* ?6 {& Z: y
- Serial.println("Server started @ ");+ F8 _- B- m9 J& f' }, N
- Serial.println(WiFi.localIP());
/ D9 W" e" i4 H - //打印出IP地址,后期可以制作显示器来外部硬件显示ip0 ?$ |2 {: ]( I# {- [0 Q4 i) z/ Z
- Serial.println("To control GPIO, open your web browser.");
$ C. C4 R) S0 t4 Q. q - Serial.println("To set GPIO 0 high, type:");
! B ^' |& p* z1 ~9 l1 C( ` - Serial.print(WiFi.localIP());
0 p6 N3 w9 y1 y( G0 k# r - Serial.println("/gpio/1");
& ?% a) ~0 G4 ~( B: i# K' g; p - Serial.println("To set GPIO 0 low, type:");
7 A0 r- B- T3 [. w8 k; a" z - Serial.print(WiFi.localIP());& a: E+ M5 |' ?& L3 O
- Serial.println("/gpio/0");. F5 \6 U# J0 b/ b5 {
- Serial.println("To toggle GPIO 0, type:");
* \4 k4 X/ o5 N6 ~9 _ - Serial.print(WiFi.localIP());, b Z( {8 h8 o
- Serial.println("/gpio/4");
+ c' I& @* z$ C
; i1 p. Y! V' f. E `- // 初始化blinker' z2 W% t" y% |4 n4 B7 _; Z
- Blinker.begin(auth, ssid, pswd);
% ^, W! ? T4 S9 e+ \" q - BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数9 T! L! x) @1 S+ L' z8 w$ L
- BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数5 `/ \1 c: W* a8 }- W' x; Q
- Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。
2 ?- F' h0 d9 y8 T; ?3 L
5 [1 N* z2 n+ n% y/ N! G; ~- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback
; I. H; j7 W$ }: p/ ?& g - }% B$ v: x! ~- P: M
- void dataRead(const String & data)
8 K6 z! v) Y- B2 C/ E - {" s! _' |* K* J" _
- BLINKER_LOG("Blinker readString: ", data);
' o% v6 q, n! c7 u& B
! x3 n2 e- E, u% k- Blinker.vibrate();- t ~, }9 u3 h# e5 n0 J
-
: c' W* f3 W- S/ B8 [ - uint32_t BlinkerTime = millis();% a" F1 K y6 X& m; X
-
3 B6 Y/ ~/ s3 M" \- u4 ? - Blinker.print("millis", BlinkerTime);3 S4 L$ s" x( I" ]- x+ d% Y9 O$ }
- }) x4 |2 F! s g
- void loop()# I; J/ X' |+ u9 O# m, Y0 u+ r$ T
- {
3 j1 `2 U5 L4 x& } - Blinker.run();* f' _ _& E; q
- if (digitalRead(key)==LOW)9 D1 u: h9 J |0 }5 _
- {
6 j" V4 N% ?: X - Blinker.delay(200);( ~# G! |0 H9 p8 J* w
- if (digitalRead(key)==LOW)
5 Q( }5 n5 I! s - {* W% e( Z& h ~
- if (digitalRead(kg)==LOW) U& K' B9 D) ~) A5 S8 I
- {
7 U) [! r# Y# S! [( G, G4 s8 ?6 e - 0 ]0 [+ h7 p T" `& v
- digitalWrite(kg, HIGH);
+ A. f3 \% y u+ ]6 R9 n - digitalWrite(de, LOW);* ]! a4 s9 _, @
- Button1.print("on");
7 j4 B% J3 |1 A4 L& X. A. e* I# L - Button1.color("#0000FF"); //设置app按键是浅蓝色
" V# o2 `) ^! }1 S. _ f - Button1.text("开启中");
6 K* s0 T. Z2 n: c, B$ x% { - }
0 m+ ]: W- @% Q - else if (digitalRead(kg)==HIGH)
1 b. D' U7 g4 i/ @1 X% x' | - {
% d; x4 e" G1 T: }2 N6 k - digitalWrite(kg, LOW);
6 `7 n3 c5 W9 Y) _% C - digitalWrite(de, HIGH);# U9 S0 o4 s; }+ p6 C
- Button1.print("off");* g! Q% I5 c0 @
- Button1.color("#00FFFF"); //设置app按键是深蓝色& I5 B$ \( r m8 ?
- Button1.text("关闭中");( ~$ _+ G" \# |/ V2 R
- }6 y7 o' ^: u/ J8 e& [
- }
, O9 R! b7 L5 \ g - }' I3 q% k* M: {: X) I+ s, w4 ]
- }
复制代码
6 M) \! T1 S- y, Y' W/ E3 n$ k" ^/ h' O6 B8 ]1 b! R
我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html
0 b' z k; Z7 x+ K' X5 D! X. s/ q9 Y* i
把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。
1 L! s# g: @3 F$ d1 }$ g; I3 Z$ C
+ h' q/ _( d5 m/ P/ U7 d2 c
' o+ j' }7 t1 U/ q' q |
|