|
|
本帖最后由 易记 于 2021-8-21 14:05 编辑
* w1 P" N `+ S5 J! k) l( l9 [
$ n6 O' V. m' C8 {最近玩ESP8266,想做个天猫控制开关。
1 X3 k5 {( |0 Z$ E6 Z. o但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。
; A8 V! ^: J9 g1 a0 T6 l还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。
! v5 u2 Z5 d; g0 F* j
* ?7 G4 v6 [$ \* R/ F6 M
) Y" o. B" n5 W1 R- x7 m
& B/ c% A/ `& i e+ `问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。; }$ L/ ^5 r3 M) Q
' h, N+ `: U" n% N' x6 H
" c8 S- w8 J0 r5 Z
' |& J7 j/ c% U. m- s
0 E, ]; w; q; s# D6 M; J* ~
5 x' ` S" {3 T0 {" C到手,当然是拆拆拆。" m' @* r" O8 e$ @$ }" Z
: Z4 w4 W T2 c2 D) y& |
( o! p2 M9 r: c. s5 n- G. `
( t) p2 \0 \ j) G联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。/ t: m* x! o5 d/ A. V7 T
& _4 m& J4 g) ~" R- w
+ `: ?8 Z5 k* s2 B4 G m5 p' Y
" }) h3 D6 T* ^7 S' @继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。
, y4 d* B% I* }, n( [. y3 \5 g. a
$ Z% Z5 z5 z2 S" {5 C0 @3 _& o: S
0 L) n* h9 W- L
, u5 u. h) |" U6 ~2 E2 Q5 Q
& a5 h# n( d2 c9 u9 [, J2 z+ p电源芯片$ H/ a$ M3 ^ X0 [" T& ?. K: b
/ B% j( w" J% o% q0 J$ R0 v0 S+ M# F' r
. i+ j9 l( x0 s+ T* @7 @( a有一个按钮,按钮有二个蓝色LED灯
( G9 a. D! [; U3 a
( w# B$ k; J+ {2 D8 k+ S
; d W6 y+ w! t: b. e$ l1 I6 o- s1 O% h9 ^( l3 U: B! _% v5 w
8266; O6 F3 ]" `9 w! o2 W; E$ ?& l
B" T* r. G0 Z% N8 j* x7 H
8 h) v; G5 u8 M" Z
8 o; Q% @8 \+ q4 ]
7 `3 U8 V* D T* q
/ t) i. ^* e- p4 {# ~; i( ~5 d接下来就是刷机了,版子上面都预留测试点。% m- w( w1 B$ ` g& G, E
接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。6 x! }" U! i5 S G, _! l
$ \9 S" E: S! n1 e注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。
) {7 W$ b: T' O' \5 }要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 | 6 s( r# K+ p; @, l8 K. R
6 i$ f, g @8 [3 e, @
* B9 I- z" |/ j& y5 W' V3 X/ {$ B5 I2 N
1 ]' D" t( j9 S* E- Y) B- A! F
" m+ @5 b# ~2 }3 r, G6 u
5 t& s7 H& D5 a0 O) R5 | 5号脚位是继电器输出5 S# ~# U& T5 X( x: ^1 a7 ? h
12号脚位是灯输出( Y. N7 @* M) a: ^9 i
4号脚位是按键& x8 D+ u5 e7 U! N% `; A) z' S+ Y
# i# ~1 X ^# U! c* G
# X, H5 _$ L. o
+ r0 E0 P. R4 E: J% d- B* ^
9 r; e5 f: m8 c6 a# ^卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库
8 e, D. H K# T! [- F1 x# I- B - #define BLINKER_MIOT_LIGHT // 设置小爱灯类库
) N" l! i a+ b - #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库
3 H" O4 y3 N$ q9 g - #define BLINKER_PRINT Serial //串口协议库. G: K6 Z/ g7 A( l2 }! @* O+ ]
- #include <Blinker.h> //官方库
, N x+ ]' |1 d" y9 p, Z( z - #include <ESP8266WiFi.h> //官方库8 d" W$ {4 p" M: ]
- WiFiServer server(80); // 服务器端口号& i4 }& J& K& e: C9 Q
! U) C3 |7 B) V5 |9 i" `$ V Q- char auth[] = "c4942fb1d5e4"; //设备key
# o2 H5 k4 x: {4 I# H: D" ^6 L - char ssid[] = "wanboshi"; //路由器wifi ssid
! K* l7 e ^' V - char pswd[] = "1365662999813586348220"; //路由器wifi 密码
% c. V. ]6 R& ~) g) w - 8 v4 a" u& H6 F: S' b! @
- bool oState = false;) z& _6 D, f9 g* _- }
# D( k2 c) k( O @5 D) W9 G- int kg=5;//继电器输出& z+ @, \9 A: }' q; R) Y6 o5 n
- int de=12;//灯输出
; [. s. u \% m( T) h - int key=4 ;//按键
5 w# k [* L2 X2 n3 E+ m* g6 T - //*******新建组件对象9 C& G4 C" ?# x5 S' `5 W* s. ^
- Z+ M4 V3 E& I/ u7 E. W; I- BlinkerButton Button1("btn-abc"); //设置app按键的键名
. {% l4 y# O1 w - //*******app上按下按键即会执行该函数app里按键
0 ~& w* W g% M T4 s6 j2 @6 A9 n - void button1_callback(const String & state)1 i- W b$ d; c, u5 O
- {# }/ `3 z; L3 N5 B, Z% F. g
- if (digitalRead(kg)==LOW)2 `; Q( \. E( s H, T
- {+ ` h' w; L) E8 _) ~* i$ i! Y1 g
- BLINKER_LOG("get button state: ", state);
L+ Y$ { O! O2 T9 e0 {; g+ v - digitalWrite(kg, HIGH);) e: r6 [4 k9 M2 A# R
- digitalWrite(de, LOW);. O6 R Z9 S( F3 m7 L" X! G
- Button1.print("on");
; V! _" Z P+ q; d4 c; i! q1 K$ K - Button1.color("#0000FF"); //设置app按键是浅蓝色! n8 C5 \% {5 X
- Button1.text("开启中");) M# D3 I1 T9 F, n
- }$ ?+ v' z: _" W9 c$ x; S+ U
- else if (digitalRead(kg)==HIGH) x a; I2 W2 P/ x
- {
; d0 M& Z; k8 ^0 Y# Z - BLINKER_LOG("get button state: ", state);
0 b. `% w) ]* Q, ~. C& L# f - digitalWrite(kg, LOW);0 W' }$ |+ |) M7 P" `
- digitalWrite(de, HIGH);
5 |8 q! _+ d7 R& J - Button1.print("off");
0 I5 [ v G, }8 I7 g/ e - Button1.color("#00FFFF"); //设置app按键是深蓝色! B4 V& x5 [3 n1 [7 p+ _& _
- Button1.text("关闭中");2 y1 p: m: g# \
- } Z% d* a( S6 b2 W$ P% ]# R& X2 J6 D
- }
! {/ R+ X: o/ c- M3 F5 x
0 B* B+ U; i2 ^0 c- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++0 `5 `9 E) V8 r& N" h% ^$ E
6 E h8 q# A! J- //*******如果小爱有对设备进行操作就执行下面& n1 B" G+ D. q2 H! y+ P; _; S
- void miotPowerState(const String & state)
+ _! p8 N* A2 J6 \8 [ - {
+ q6 p8 {# }, J - BLINKER_LOG("小爱语音操作!"); //串口打印
4 z" U% w; x3 ^2 X) U6 o6 ^& \ - if (state == BLINKER_CMD_ON){
/ C) x8 e$ o& M. f/ y7 w* I - % R- f8 ]$ ]* r o
- digitalWrite(kg, HIGH);- m7 I0 M2 B1 Z' Z' y
- digitalWrite(de, LOW);
- K5 d9 t8 X U; t ? - Button1.print("on");
. g3 N0 }/ E5 j( G/ Z: h C - Button1.color("#0000FF"); //设置app按键是浅蓝色
) p2 c4 s6 N- }7 k. V - Button1.text("开启中");* b3 c' a1 _8 S
- BlinkerMIOT.powerState("on");5 ?* y6 S7 V3 x J1 ?: z+ b% R# w
- BlinkerMIOT.print();5 Q! R, R) w+ ~. l
- }. y* C" K5 P. x8 J. g
- else if (state == BLINKER_CMD_OFF)
5 Z+ d4 I8 _$ O( s( @5 D - {
+ L6 L3 o" x$ R* w - ( I5 x4 q- Y u' X
- digitalWrite(kg, LOW);
6 W0 M, O; L: _" s0 }# S - digitalWrite(de, HIGH);
' R, n' o4 u- h/ `& e/ Y6 b - Button1.print("off");/ H1 ]1 W2 f7 K/ j: g7 r
- Button1.color("#00FFFF"); //设置app按键是深蓝色6 c- X4 i" b8 T6 n
- Button1.text("关闭中");9 h9 u) ^* h9 O
- BlinkerMIOT.powerState("off");
6 V5 _8 c2 X0 W+ C3 C6 Y, D - BlinkerMIOT.print();! D& i) v; y0 [. B8 c
- }
& a: D9 h8 z; X" I! \ - 3 E! H. [) w2 \# F
- # f- [5 L# L6 x5 Y" E. U' F0 T. p! y
- }
) C# K! n4 ~7 j w1 G) ` - //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4 @, R' N7 o& u! p& P$ E3 F3 M3 J - //*******如果天猫精灵有对设备进行操作就执行下面1 O$ D ^# H5 t6 w, C# N
- void aligeniePowerState(const String & state)/ B5 Q- H. R: I& t; T$ Z7 \. D
- {8 K+ i# V1 L; k0 {' L9 D! {
- BLINKER_LOG("need set power state: ", state);
* M! W% ]5 {4 e2 }# E2 u9 I/ H y - if (state == BLINKER_CMD_ON)+ A8 V( |" Y& o/ k$ H8 T# `
- {
6 h" D6 K4 P- y -
$ d9 T3 \# R8 g - digitalWrite(kg, HIGH);
! m0 }& ^0 \) J5 N& ~) \* q! D - digitalWrite(de, LOW);
x( Y# x: Q6 h' m$ G, W; r2 j - Button1.print("on");* X; g; u& @6 y8 c' y) g& i
- Button1.color("#0000FF"); //设置app按键是浅蓝色
1 R4 K, O& ^6 |0 Z( X# I - Button1.text("开启中");( `5 Y- G* k! T! Z4 r$ V* _
- BlinkerAliGenie.powerState("on");) G2 g1 |/ n- a& V) f% n4 V
- BlinkerAliGenie.print();
1 D/ o6 e) T8 z7 t" [ I( u' D; L7 x - }/ n t9 h5 ]2 I: H! i2 }' t
- else if (state == BLINKER_CMD_OFF)2 i% j. H( m! }1 Y1 \1 a
- {
$ U+ | ?: y; f k: {/ ~ - $ e1 h% A+ F+ r: c5 S! ]+ L, s
- digitalWrite(kg, LOW);2 h# [: }, J5 ^) ~
- digitalWrite(de, HIGH);
/ E e1 K2 Y5 B. B# Q( S - Button1.print("off");
) q7 ^' a, a! P. {! k/ x4 f% o - Button1.color("#00FFFF"); //设置app按键是深蓝色
0 V3 Q( }) F; b/ j* Y0 P - Button1.text("关闭中");1 R7 C# B; A0 _0 w9 q/ d8 J
- BlinkerAliGenie.powerState("off");; j1 Z) H8 A% g* N; e( [
- BlinkerAliGenie.print();
5 k Z& j' \0 G8 H, R - }% u) A* }7 M. h @- z
-
6 F0 j7 e/ @9 C {- A8 K5 q5 b
K, ?& _4 K" j- }! t: z7 G% k* v) ?
- //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次
1 B- E0 F0 I9 u0 q - void heartbeat()/ F6 i" S5 v3 c) f# A
- {
+ Z) ]) R. \7 |: j: V0 G$ }7 d1 K - BLINKER_LOG("状态同步!"); * x) A+ H& e1 B% G, x- ]: } _2 a+ l
- if (digitalRead(kg)==HIGH)
D0 O7 J4 S4 x( P6 @4 F - { , F v+ l' a" t/ `
- Button1.print("on");# D) ^/ j# l8 j9 t( G5 a
- Button1.color("#0000FF"); //设置app按键是浅蓝色
- z3 p$ P0 p6 w- x( K4 o2 t - Button1.text("开启中");
$ K; j: M( s. m) I - }
5 C9 k8 K/ i1 g$ }& M - else . j; d' Q2 k$ N
- {0 p. o z1 W4 i6 Q4 f2 j7 _
- Button1.print("off");& f4 `" G3 {8 M, r1 p7 X
- Button1.color("#00FFFF"); //设置app按键是深蓝色; ]. ~/ f I8 P
- Button1.text("关闭中");, H' U+ q6 k( k: v
-
' S6 V" k: m0 h+ ^6 K - }2 L0 F/ r; w9 ?& \9 s, k5 B
- }6 E3 j! H; c* H- j' r1 P/ w
- //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
! F% z# G4 j5 r4 R - void setup()
$ y; ]( ^+ B. t5 t5 ?+ Z- @- ?) E) R - {. B. D" v" x# c+ n9 E2 i
- // 初始化串口
# ]. F# t, ~/ d6 ~/ t4 H - Serial.begin(115200);' v% \! ^! ~: w7 ?
- delay(10);+ M/ P5 p0 X6 Z& _$ n
- BLINKER_DEBUG.stream(Serial);
6 A2 V# ~! p/ L& K - // 初始化有LED的IO# i: ^5 i* E0 F+ z+ h9 ?. C/ E
- pinMode(kg, OUTPUT); ' u" G& K9 E0 Q
- digitalWrite(kg, LOW);//初始化继电器上电状态
, z' L2 w# N2 f1 W1 c% {) ? - pinMode(de, OUTPUT);
& p% A" a) T' V8 _" ` - digitalWrite(de, HIGH);0 t5 z( c, h2 a6 S
- pinMode(key, INPUT); 7 N/ L) B/ T9 l0 K9 M4 e
- Serial.println();8 g \/ k2 J/ q* T8 ^
- Serial.print("Connecting to ");0 Q. i5 V! m s# [6 N7 l+ q
- Serial.println(ssid);
5 i v- k4 d+ }" c+ u5 s - WiFi.begin(ssid, pswd);
. |) c- [* ~5 K; Z0 \ - while (WiFi.status() != WL_CONNECTED) { [" ]1 `8 h% Q- I+ Y& A
- delay(500); Z, Y+ J& R" q6 q8 C
- Serial.print(".");: {4 r' Z% f6 p: L& c
- }
+ j/ a9 V, n" z( L* g3 Q) h - Serial.println("");9 W1 A4 w6 b: E6 o, a6 S6 @
- Serial.println("WiFi connected");
1 F! w+ |+ U9 C$ g9 u - server.begin();) k* X2 l1 Z. R7 F% t+ A- Q x& d
- Serial.println("Server started @ ");
, q) Y) e3 z/ } - Serial.println(WiFi.localIP());/ r) t1 O" e: p7 l9 P" P' e
- //打印出IP地址,后期可以制作显示器来外部硬件显示ip
& R& N, K6 k& b3 X4 b, w- G# d% } - Serial.println("To control GPIO, open your web browser.");
! U* S7 s4 c: j) { - Serial.println("To set GPIO 0 high, type:");
% X+ [& g0 ]8 A7 |2 w3 q: O `5 V - Serial.print(WiFi.localIP());
7 ]5 J, H1 ^3 Y5 U% P - Serial.println("/gpio/1");/ Q) S8 L8 s) B! o
- Serial.println("To set GPIO 0 low, type:");. V3 [' G+ Q! ` ~" b
- Serial.print(WiFi.localIP());
" _- B( }& |- K. C& \% S2 {# y! ~ - Serial.println("/gpio/0");* h. f; d3 @; V" k( H% [1 M B
- Serial.println("To toggle GPIO 0, type:");
) F- U/ {7 W# x; s. k- K, _$ C - Serial.print(WiFi.localIP());
3 P4 q2 c0 Z/ [+ L) A m: h - Serial.println("/gpio/4");2 E& M7 J5 x. s
6 O7 D" } \6 V8 |7 y- // 初始化blinker$ T# x1 w, K0 c7 d; A$ E/ d
- Blinker.begin(auth, ssid, pswd);9 V6 u9 T8 A( p" H
- BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数5 t# C% W, O( B# u9 E
- BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数5 ]" L+ d) T/ F8 h' f! x3 P
- Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。
$ V3 G: E- y5 O
. K4 \8 M3 L5 s% j- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback" B) I2 M# M- I. E; c h0 o
- }1 \' d1 J3 r1 H0 w, Q7 M+ x
- void dataRead(const String & data)) x8 y* Q: u7 e
- {
& p4 p( ?$ ~, J7 H2 _ r - BLINKER_LOG("Blinker readString: ", data);. ]# |3 A% B0 j
7 F+ G- H( w- v Q9 ~# |/ n& v- Blinker.vibrate();
# {8 n t- d) ?- t) {4 _ -
, i! D I* M/ C - uint32_t BlinkerTime = millis();8 O' c% N7 e# k
-
/ `$ n/ T2 N8 F# v, N - Blinker.print("millis", BlinkerTime);+ N& n& `$ K7 y% _; l) H0 B
- }
* j5 W2 C2 K: d! r2 F* x - void loop()
. ]; q& e" B6 `- F- s) S - {
! M% O! w8 J) N- _5 i: n - Blinker.run();
# B4 P( b0 f8 q* H - if (digitalRead(key)==LOW)
. {/ j$ C4 p" h# m8 \ - {
$ l# d% r# c x/ n/ m, `' ?4 f - Blinker.delay(200);
& D9 F3 i% T/ n/ c - if (digitalRead(key)==LOW)
1 ?4 n ?% \5 l: L, n: H, W5 } - {5 ~1 ^: H9 U8 ^8 n1 L/ I! J1 p
- if (digitalRead(kg)==LOW)
+ X# \! _4 `9 f4 f$ ]* y+ ` - {& G! ^5 S, Y+ O( b8 v/ m1 |9 [
-
3 [' j! k9 @/ Z. A6 g* r - digitalWrite(kg, HIGH);
! y/ C6 B5 I8 Y3 Y0 B - digitalWrite(de, LOW);% v$ t8 r( V4 U9 }( k
- Button1.print("on");
+ A3 q, E9 ]5 F0 m$ H( a - Button1.color("#0000FF"); //设置app按键是浅蓝色$ o) }' z/ i2 `* E0 ^
- Button1.text("开启中");
! L e, [5 B6 p' b - }% y& }6 ]- j7 J8 s" G/ f
- else if (digitalRead(kg)==HIGH)
5 c# I5 r- e# ]: X+ x# p& {: L% n - {
- b$ l! j& @7 l) l( Z, @0 u - digitalWrite(kg, LOW);( V& i- T) \% u, O! y
- digitalWrite(de, HIGH);" _' y( }5 }- t# l9 C
- Button1.print("off");6 ]* V7 G$ g4 ~, @; R' `
- Button1.color("#00FFFF"); //设置app按键是深蓝色
@- ?( D0 y6 L* B5 B8 J+ f% Q - Button1.text("关闭中");
/ z' ~6 B6 t3 ?) z" I( y - }
1 M" c' n: b o4 M. Q - }5 r9 F8 M7 ?+ o r! ]
- }
], |# z2 j' N - }
复制代码 " O, H4 ^3 ]+ v" l$ L6 H+ `4 X
* d1 o5 d! o3 _! @2 u# C) w& N
我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html
' i6 Q& n' w. a, S/ }% F" r/ A! m7 @, |* U
把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。8 l& Y) a$ g% o- j g; g
i. X: t5 {+ M( f
+ g! L/ H" G* w# p
|
|