|
|
本帖最后由 易记 于 2021-8-21 14:05 编辑
1 f: B$ l- B- X" w3 \* n( K0 r9 X2 U; {6 j/ q
最近玩ESP8266,想做个天猫控制开关。2 T2 {8 F: r/ Q8 F' H/ F
但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。# J2 C- U4 B% R6 d4 o; @
还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。
- ]0 f. S7 h0 {) \8 b) c* S
5 {: H; [3 }3 s# g6 H0 @: o
4 Z' s" u2 A7 f: E7 N Z9 v% v* o$ v& {, _& U- r& \9 X6 h
问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。
. W, K3 f6 E1 E3 g9 X- V: e8 }0 b/ A; d) \2 S
- W3 p+ g$ L# L8 P
3 N0 M8 U& o: M6 F
, e. l8 ?6 n2 `
/ Z, v: M2 P% `; r+ }
到手,当然是拆拆拆。. `) L- h# T- O k$ C$ @
( v/ Y6 `% ^0 h+ A& M& M# i# V) X: S8 s/ F* M- @6 k
9 P/ V! p) N8 z5 j联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。
) I1 q/ _! ?: n1 ~; x7 ?1 w3 U
' P, X; B& m8 [3 r5 ^1 E7 P) W
& R) l: }. K8 V9 s9 `. l6 W) G7 K, r$ n8 a6 z+ }
继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。6 K9 I) @6 L' U, k$ S! b4 _2 _2 o
% j/ ?" [9 l- F3 ]. T- Z$ W
7 Z8 m; N' B* P# q
1 r" M% _7 X; Y' P. m' ]' l P
( G; s$ f1 [1 M/ P0 H电源芯片
# y8 Y# @' N/ I6 L- |" V$ {. o2 I- f R
' g: q" V9 i2 B; Y
) \6 J5 E, v2 Y2 P: I% c9 M9 m' u [有一个按钮,按钮有二个蓝色LED灯 Y+ M- p+ m$ q0 c
' |! q9 I" P' S, l% [. G! C
* o/ @' d4 o6 N: u5 T7 H) s
& v$ R' }; E" H: K8266
9 p% g) c4 t2 ^1 w" x3 K+ [
1 U% e. `+ m& v$ p: W. N3 j" ^: f5 h
6 _/ l6 Z* I+ {2 Q9 K l, K& i0 ]7 T* o V3 c6 S+ f4 @1 H
+ X$ d% C4 ?& `! U接下来就是刷机了,版子上面都预留测试点。9 D! r8 {' k+ f2 f) |: L
接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。& _4 K: p' e& h
& G4 H: }" C$ z8 D! f* z注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。
4 I+ D( b* t$ a要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 |
% ?( d6 F Z0 x4 E9 h3 x" h7 W) P* J- s: u Y4 y: Z# ~
' |+ D. x7 l2 y4 u# v
7 k" D0 @* I+ @$ h6 f
3 D" Z, G$ Z! w E# U+ {& A0 E
% ~- K; y- f/ r- D7 u7 X
5号脚位是继电器输出
; j c* p7 W9 y5 H+ S( Q 12号脚位是灯输出
' |3 ?& k7 d; r; D+ X% P2 q 4号脚位是按键
: L8 m, v0 w: |0 O3 G! p; i0 M# T5 I8 @' X
1 t; L+ B/ w7 e) r6 r4 D" `# F
5 c( C+ ~9 s' G% M
卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库- X4 D% h1 }" I& Z9 M8 r
- #define BLINKER_MIOT_LIGHT // 设置小爱灯类库
+ n* Z# _6 w2 D- P. j1 E - #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库6 \ ?; S8 L4 C# e h; E
- #define BLINKER_PRINT Serial //串口协议库
1 z$ h, r2 `" D2 N/ Y4 _ ~: F - #include <Blinker.h> //官方库. @3 Y$ |7 `1 O5 M
- #include <ESP8266WiFi.h> //官方库
. P. Z" d" H. k. q; | - WiFiServer server(80); // 服务器端口号
4 ?2 M+ P9 w3 [8 b0 F& ]- A, y0 t
% {/ Z0 y/ b8 K; t& L2 e( j! k. y; S- char auth[] = "c4942fb1d5e4"; //设备key4 P1 \' d0 n [3 |
- char ssid[] = "wanboshi"; //路由器wifi ssid5 X. |3 o- J. r: B4 F* f0 o+ O
- char pswd[] = "1365662999813586348220"; //路由器wifi 密码
! F6 R h, V" L% h
) u& r- f* r* Q! k* L- bool oState = false; O! G6 k- r2 ]6 _/ c1 l* D, a
- # d4 x! T& }! ~
- int kg=5;//继电器输出
; l! M/ ?# B7 R" q: u5 C - int de=12;//灯输出
# m! `8 D9 h8 C3 u# V. h7 F- |: J - int key=4 ;//按键
; X( U; P' H/ U9 W' B6 A4 ? - //*******新建组件对象$ }, ]* \$ j7 H$ R/ t+ _
- : |) s! N! S9 a$ j3 a; M
- BlinkerButton Button1("btn-abc"); //设置app按键的键名
/ u1 N0 Q' c0 |& D1 V+ s/ B& s5 ^ - //*******app上按下按键即会执行该函数app里按键8 a% q# y# V* F% Q
- void button1_callback(const String & state)( `/ b$ x6 U7 Q4 _+ k
- {4 O" t. x" p; r) k% x1 o' r5 K
- if (digitalRead(kg)==LOW)
2 E6 r7 |0 u! M/ t - {
4 C: M9 G) K8 H7 ~5 } - BLINKER_LOG("get button state: ", state);7 N0 F5 E/ p2 ]8 |$ s0 v C
- digitalWrite(kg, HIGH);
5 v# k& a* B# B P, Z( N - digitalWrite(de, LOW);6 l1 A K" R4 c; g; F4 _' l0 k
- Button1.print("on");7 o% z. ~$ t. k8 k) Y
- Button1.color("#0000FF"); //设置app按键是浅蓝色
! C0 u/ g: o: m& F0 ?- M - Button1.text("开启中");3 ~$ W6 ^1 |* Y+ ^- c
- }5 r! C3 V3 _* ]3 ?& u
- else if (digitalRead(kg)==HIGH)
) I0 n8 u% b4 Q4 a: t0 T - {# g. l% A' l( X- R: M- X* k9 N
- BLINKER_LOG("get button state: ", state);" \1 ^$ f O: M3 ~
- digitalWrite(kg, LOW);) [3 O3 `+ C; K: u0 _0 B
- digitalWrite(de, HIGH);) A0 J, q4 X; @2 T7 V7 v5 _8 B% P
- Button1.print("off");
; C- |# Q: s8 ]& q4 H - Button1.color("#00FFFF"); //设置app按键是深蓝色; L2 c# l% Y m$ P
- Button1.text("关闭中");* B! O5 y6 K, i4 H6 ]; U
- }
5 y% F- K# s1 O( m3 | - }
4 E2 q* \) ^/ _- K8 k- U( V
# R0 R, @! R) g; y O: s) {- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
}8 ^5 K6 {$ s+ m2 q7 P
& }1 g6 \5 c, b0 t5 p6 [, Z- //*******如果小爱有对设备进行操作就执行下面8 d/ V, l/ s+ }( ~; m5 h$ B
- void miotPowerState(const String & state). A: \: G9 |2 l: T& d' F/ @
- {
3 d& j/ } z# y' |& Q/ ^ - BLINKER_LOG("小爱语音操作!"); //串口打印/ j+ m4 D6 w; t. \: l0 ]3 i
- if (state == BLINKER_CMD_ON){
8 U. m" E$ b# m3 U. Q7 T -
, b2 \, |) E$ U) g7 K - digitalWrite(kg, HIGH);& M: E- b/ C* Y
- digitalWrite(de, LOW);3 T2 B! q! c- Y M2 N7 d
- Button1.print("on");5 x+ a% ?- f( r' @" d" X K
- Button1.color("#0000FF"); //设置app按键是浅蓝色
' O( |9 m% z% @9 c - Button1.text("开启中");
) l! C8 Y! ~/ w$ `. p: |# g - BlinkerMIOT.powerState("on");
" W$ r( W4 S% `# F - BlinkerMIOT.print();
0 ]2 p2 r0 I% `9 ]& L' i' ] - }& k2 f( @: p& a& H$ x2 c% E
- else if (state == BLINKER_CMD_OFF)+ g- D Q: H- B' S- U
- {0 h* q! l1 B# G0 [* z3 L
- 2 M+ h' o. B6 B: l7 |
- digitalWrite(kg, LOW);$ V# @- C- p! B# G) X% ~
- digitalWrite(de, HIGH);5 U9 N. m, x/ K* P0 l/ ~! U4 i
- Button1.print("off");
- D! K* p8 |3 R8 X - Button1.color("#00FFFF"); //设置app按键是深蓝色
1 F# b& b4 y: B+ D2 u - Button1.text("关闭中");5 S3 m- ]1 V/ [
- BlinkerMIOT.powerState("off");
" G" B1 k1 T/ i; y( R( @( _ - BlinkerMIOT.print();
8 U/ t4 v2 B- h0 u$ \) z5 m - }/ a& T! F* t! d( S5 G) F& o
- & Y8 b% s$ r% j8 K9 [
- 9 w, j. }( E0 a' ~. p7 b
- }
5 p! w$ f0 d/ B( q( \% ? - //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
0 m; C4 t$ P% d$ o - //*******如果天猫精灵有对设备进行操作就执行下面
% H o% R/ q: g; O - void aligeniePowerState(const String & state)9 [' A( e/ U( A8 y' J7 ?+ x8 v
- {
, K& E8 p' |* y& w A, x* r3 b - BLINKER_LOG("need set power state: ", state);
2 E/ p3 Y. l, ?7 _0 ]2 o. W - if (state == BLINKER_CMD_ON)
; e; S6 [- u) _" p4 c4 b" a - {9 M8 |8 y6 j5 ?, `
- & f$ {) B1 `2 ~& G
- digitalWrite(kg, HIGH);
9 C4 t3 y( Q! \+ x" l$ w' u8 d - digitalWrite(de, LOW);8 _7 s: Q" t1 R4 E
- Button1.print("on");% Y& v/ Z# ?! {& I" x" x- V% A5 N
- Button1.color("#0000FF"); //设置app按键是浅蓝色
6 o& C& o% Y# Q) ] A9 C3 ` - Button1.text("开启中");! m0 i5 S2 i! Q8 J: H
- BlinkerAliGenie.powerState("on");
|" }5 i& |: Z+ t' U - BlinkerAliGenie.print();
: v$ u$ p( w/ Z9 g - }0 h8 r* Y, m% o3 G0 C+ A
- else if (state == BLINKER_CMD_OFF)
* E3 D" d3 j$ Z8 A - {1 u5 {2 {7 l `! c+ ], r
- , ^+ a* }. b: }
- digitalWrite(kg, LOW);! Y d1 ]/ [; W+ v
- digitalWrite(de, HIGH);+ H( ]3 m3 W1 w3 h% s; V$ p
- Button1.print("off");# _$ S% O1 l) N9 K( h8 g% R
- Button1.color("#00FFFF"); //设置app按键是深蓝色$ C3 l# P' e) @$ q& o
- Button1.text("关闭中");
8 _( X8 R* Z! b) |9 L: v' o - BlinkerAliGenie.powerState("off");
) J0 f$ F9 R+ z/ b - BlinkerAliGenie.print();; r* E$ I$ M: c9 g/ L- c+ [0 |- v% k
- }
1 y. r5 f) Z) b4 X: H3 q - 4 @7 x6 y r0 }$ Z
$ Z! ?3 H- X3 _' L- }
; d$ O# M: y$ Y! ]2 K5 K1 R( M: i0 q - //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次
0 j- n$ Q- H( n z, K& { - void heartbeat()0 c& b( b( }1 @0 e6 h: ~
- {: n! l$ `% A7 _2 F5 t4 U) Z( t6 A
- BLINKER_LOG("状态同步!");
9 C9 r! Z' b9 f3 ~ - if (digitalRead(kg)==HIGH) ; O; R: U% w" w
- {
$ Q0 Y9 p7 b* v6 p9 N" N. N+ I - Button1.print("on");
; c w# v- c& i7 q7 f; z: E - Button1.color("#0000FF"); //设置app按键是浅蓝色0 S: d+ x* U, o3 h5 x! X% R u/ n
- Button1.text("开启中");! I" ^. a( z8 {
- }- S! k9 v+ n0 g6 _
- else
( n4 S0 R7 G6 p7 k3 ? - {
+ \# s9 w) y- E, R# @/ Z% h - Button1.print("off");& \' T" k/ U0 v# G
- Button1.color("#00FFFF"); //设置app按键是深蓝色
1 E' y2 ]( S/ T8 c+ o - Button1.text("关闭中");1 x* m5 r9 J0 x* ?, l8 J" W
- % ?; @; }. F- D. `6 N, Q) L: F* Y
- }7 n; X5 d8 E5 `) }4 }
- }
0 \- q: V/ b2 y! R; A - //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++6 q: L y) ]3 ?3 f
- void setup()# m$ I( c, F+ ^* Z9 Q- e, u
- {+ |0 F6 N; J" T r1 t8 J
- // 初始化串口
1 h, T+ ^/ o, v/ l" C- ^ - Serial.begin(115200);3 w" N" m7 c) z/ G& R+ y* k6 n
- delay(10);
; b, I* |6 P9 [) u& T - BLINKER_DEBUG.stream(Serial);
4 g* O: {; F4 s" b# e# _7 { - // 初始化有LED的IO& [ P% u0 ^% \" X
- pinMode(kg, OUTPUT); $ j* f7 z$ y5 E+ B1 |. a
- digitalWrite(kg, LOW);//初始化继电器上电状态
1 H" d! Z! W3 I5 w - pinMode(de, OUTPUT);
: X/ a; }5 a5 p4 w! g: T - digitalWrite(de, HIGH); [& @9 e# ]" K6 U+ c" _; x
- pinMode(key, INPUT); , r y( U: f6 y
- Serial.println();
' k# E0 }4 c. @- P% ?$ M, ?' D - Serial.print("Connecting to ");
c. H! W _9 m4 N+ _& k6 s - Serial.println(ssid);" {/ Z- ?1 ]/ J' d
- WiFi.begin(ssid, pswd);
2 k: B: ~9 j0 w9 V7 d' X - while (WiFi.status() != WL_CONNECTED) {
+ h4 Y6 K3 @. B* K# j- X# U7 x6 h - delay(500);
9 i! } r) ?1 B/ X$ b$ _ q, W& w" r - Serial.print(".");9 z( k4 C- A( l2 E/ U$ q6 e
- }
* Y1 M! n" }- Q* H" b - Serial.println("");) L% ?4 Z ]( [% i4 U6 `
- Serial.println("WiFi connected");
4 g4 j7 }1 i% Z; r) ]3 Z5 k9 D - server.begin();7 y1 l! q( Y1 e% l; C9 b1 j
- Serial.println("Server started @ ");
4 c$ L- h2 a0 L( v - Serial.println(WiFi.localIP());
! @+ Y) T, V5 {3 F - //打印出IP地址,后期可以制作显示器来外部硬件显示ip
- N1 T0 M! ?4 a# f: P! u( Z - Serial.println("To control GPIO, open your web browser.");
" o1 d+ z* n6 f. T: J$ z; r' p - Serial.println("To set GPIO 0 high, type:");2 p/ t0 v) ^6 ~, }% Q# U# y) D
- Serial.print(WiFi.localIP());
4 P' ~; v# E' l" R* R - Serial.println("/gpio/1");
2 a5 ^/ s' L, o" s4 w+ j - Serial.println("To set GPIO 0 low, type:");
) e: v/ g! l$ t$ q - Serial.print(WiFi.localIP());5 T4 Z8 V: I, K/ w" H3 q
- Serial.println("/gpio/0");8 Q) Q8 Z7 x; j
- Serial.println("To toggle GPIO 0, type:");, k2 v, i, g4 A) z2 w
- Serial.print(WiFi.localIP());- }. y* U% Y9 k% D2 U
- Serial.println("/gpio/4");: [% c% [- ^, ~& O# h' p3 u
' S2 a; H9 D) F6 m2 O+ {! ^- // 初始化blinker
* _( l8 T9 ?- C8 N - Blinker.begin(auth, ssid, pswd);
4 e/ G% s$ q6 N3 y - BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数) n- o. T: A8 F6 ]1 z" Q3 f Z
- BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数, a5 y* G8 ?# S) f6 J4 [+ v* V7 Q
- Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。3 B0 p& }1 t) _
0 P8 l. J5 o3 c+ W! o% v1 C- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback: H, w$ J7 t( |5 l! w: L! U' A
- }6 v. I) O& @* N6 B# c
- void dataRead(const String & data)+ _( U- ~9 e$ Y# Y! ]# s
- {
- Y- q+ L7 y* t6 c5 Y - BLINKER_LOG("Blinker readString: ", data);0 V2 b! U2 a5 I5 o" e2 i$ A" D! N
4 W5 P$ E0 C5 S- Blinker.vibrate();+ _, T: q% w3 p& S
- 6 g+ r3 H2 u; Y! l8 R0 Z
- uint32_t BlinkerTime = millis();
" R- I: j* T; h0 q; `- H+ R - % H6 d, _7 j' P9 l
- Blinker.print("millis", BlinkerTime);
! J# J# B9 P6 Q! Y) ^ - }8 c2 L; h# k% e% `9 x8 M
- void loop()
, b* k; E. r1 O+ y" N2 V - {# S! U, ^: c; p; F& a
- Blinker.run();2 g9 H' l+ G% u7 V# k) u" k8 t; I: Y
- if (digitalRead(key)==LOW)3 x' A! ^, T1 h) D- E! Y
- {
7 L% ]" \/ g% n - Blinker.delay(200);) { f T) l6 o: C& d8 R' a( T, I' e
- if (digitalRead(key)==LOW)
1 M# O8 `3 G; @& g1 j5 K y. z, q - {$ Z) D0 i, ?. w8 b/ j) A) w$ ?
- if (digitalRead(kg)==LOW)
5 X w( b$ g0 f. W - {
/ Z/ H7 N* A4 O! X - 0 u. r& P: e) ]. @- b
- digitalWrite(kg, HIGH);" A; a. C7 N+ K
- digitalWrite(de, LOW);
$ ~7 D1 P7 I6 i( k$ y ~ - Button1.print("on");) `+ @, w- z/ N: l" f7 b
- Button1.color("#0000FF"); //设置app按键是浅蓝色, L0 g* x( F" H: [$ r
- Button1.text("开启中");
% i$ {5 [* X0 a$ X - }) t% u- e7 }- e; F Q# N. ?0 b
- else if (digitalRead(kg)==HIGH)0 a7 C( j% K2 j8 n5 a! g, [3 h
- {5 J2 \: ^# N% u# T2 ^! Z
- digitalWrite(kg, LOW);
& Z l5 s3 X2 G3 Z! V0 p) `. ~$ t - digitalWrite(de, HIGH);
- O+ h* R6 L c. X' m* r - Button1.print("off");
: X/ r# n0 ^% x2 n+ f - Button1.color("#00FFFF"); //设置app按键是深蓝色" g/ ?' x, o. ~% o9 i2 U/ Z. R6 j/ k/ |
- Button1.text("关闭中");
+ Q; ]* U) l7 Z8 r1 u - }
1 ?3 J( ~5 ], }/ ^ - }
. a1 S' H) x8 D! O* O1 C - }8 i; w- c U4 y7 v& R
- }
复制代码 9 d& m! y1 _1 A+ m+ P+ e
- a. x& J4 J. L, h% p+ @ }
我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html& V9 ~% l' w& _, O1 A+ E
3 R/ k. C) m9 Z( J; J7 G7 _- T; [
把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。
. x; [2 r( C6 S4 f7 X: L! C
/ N( C8 z' c, ?$ Q3 F
! {3 @$ v- g' g& b6 ^6 [, L |
|