|
本帖最后由 易记 于 2021-8-21 14:05 编辑
$ e8 `! y! Q( Z* v' h) {( i0 x M. U7 p. x; \
最近玩ESP8266,想做个天猫控制开关。, G% u* ]0 p8 ?7 b) o: Y
但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。2 q7 h7 J- o V' J8 m. ?/ Q
还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。
& A; V% u8 B4 A3 f3 P6 p [
2 _# B. {7 ]( f
$ ]7 O) ^; \+ x; r! e+ Y
* S; {$ |: D# ]" D; d. \问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。
; I+ f0 d# B+ d# ?( n% `
; l# V2 o" ~0 v }2 N5 q
8 I9 m1 q- I& h8 Q# N6 U* s( F! {
# r' ^: |+ ?8 c
" M; v! D# ?( M, p! `; s& ?: v; Q7 |# h( |
到手,当然是拆拆拆。
1 y1 G3 `/ J& L* _+ X
1 h: M. L/ D, h7 |
. M) s# E2 ?+ \+ y( U
$ `8 ]. ]: E1 ^; I6 R) h, u* }8 ?7 }联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。
4 @5 y' K5 o6 G
2 A: I" d% y( z! j$ C! Z1 l
9 A, _; q) n5 O( Y, }$ j; A7 q p) }. _, e& C. \- i& S% f
继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。
7 `* t% y1 I+ {: r# j
5 @0 g' v# |2 f4 b
! ]9 Q4 D+ `1 |6 L* l9 s- ~* a( {
: b4 u' [$ U, q F) _
6 h% Q- s+ q1 R电源芯片
8 g( y9 W0 B x" e! k" V$ v ?& ?; |$ h7 t9 v
& p" w- C& k. {
( |8 A9 i/ ^- M8 H! @有一个按钮,按钮有二个蓝色LED灯7 o% \5 d9 K# r; b7 N
' x! p7 K e- v
5 z' \! n1 u" t4 Q! E$ ~- y& `3 |. K. |. v* a% O! N& M) K
82663 v) J9 X$ t$ N6 _8 c' i
: q' Z' M) o" w M6 {0 m$ ~' j: b( }% e
9 m+ c( I0 i, A7 Y
) f ]' k) C$ {! b% j
. H) J2 r& K" L3 l% a9 P. w+ c
接下来就是刷机了,版子上面都预留测试点。: V* X4 _6 x$ C( } m" c
接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。
- H! c$ l- u( {' I- a! y
1 _6 D! h- i# D* T注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。; B5 J! [' Z! n0 B0 T
要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 | & r' i) A, H, V- V5 I# ^1 a
5 k$ S0 A# g7 s- u' x# a8 s
4 z7 d; m+ V4 v
1 Y1 X. V( f3 C# c- H
4 b) J5 U) h0 W8 K- n6 g7 |+ D4 V+ d+ i. {) B6 p
5号脚位是继电器输出5 R! {; H m( |6 b: ?) O
12号脚位是灯输出' F3 M7 \* E, G1 K0 z
4号脚位是按键% ~( Z+ j$ R* a
0 K: `8 I0 h0 u7 Y! m" H% U
! z$ Z' Z( b: X4 w1 ~: t {4 n
1 _/ n7 E) {7 q+ Q9 ?; c1 R( [& @ L8 E* M# M) D& {% i
卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库# e* I( {- F. s/ Q# w
- #define BLINKER_MIOT_LIGHT // 设置小爱灯类库, z/ x9 t! V- c( [
- #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库2 `1 w) Z8 ^, c+ I+ z9 I. T+ ]. D
- #define BLINKER_PRINT Serial //串口协议库; Q) Y6 ?0 \% F6 t
- #include <Blinker.h> //官方库+ W$ n, C4 j. g8 D
- #include <ESP8266WiFi.h> //官方库1 Y7 M5 a* |- P8 {) O. O
- WiFiServer server(80); // 服务器端口号
- R+ \" k) ^2 h
/ u: ^. A; j Z' o- char auth[] = "c4942fb1d5e4"; //设备key
+ [ ~/ A/ p) A7 W - char ssid[] = "wanboshi"; //路由器wifi ssid
2 d9 ^8 G9 ]& w$ x$ K# k; b! A9 B# c - char pswd[] = "1365662999813586348220"; //路由器wifi 密码
- x( V1 x1 X. y3 i8 R
0 \: l3 H7 I9 |- bool oState = false;( a& `8 I! L" m$ j) s. D
- 3 a. M2 j( j( M+ t7 {) M- P A/ r' G
- int kg=5;//继电器输出
+ u& G' {* G( O8 X& a - int de=12;//灯输出- N* o& t- x. N* v+ T' z
- int key=4 ;//按键
3 u5 J( n# N" [9 v! N: T: v0 L - //*******新建组件对象2 |! M9 E. h% G: m, z; \% y1 Y
8 T% Q7 d; W, d0 a1 r- BlinkerButton Button1("btn-abc"); //设置app按键的键名; M/ Y* v, c! S: \
- //*******app上按下按键即会执行该函数app里按键( L) {; D; G& a! }1 h n1 o3 F
- void button1_callback(const String & state)
5 n2 O: c* p8 L: n& f7 |/ s' [ - {& ]" ]/ d& K9 y3 s9 [/ ]4 g l8 R
- if (digitalRead(kg)==LOW)
' M2 {3 {+ \/ i - {3 Q' |& Y4 d `
- BLINKER_LOG("get button state: ", state);
* E+ d! h7 X$ y& k# {% S3 ?* r - digitalWrite(kg, HIGH);
$ O! C$ I6 X9 k% e" c) ]/ ? - digitalWrite(de, LOW);
9 q$ C: `- q# X+ D+ E$ w4 ?/ d& U" i# R - Button1.print("on");
% i; }" j% Y& A: L( A - Button1.color("#0000FF"); //设置app按键是浅蓝色% a6 c7 p1 t2 L
- Button1.text("开启中");
7 o; ^/ R0 ^0 ?. I: U - }& W* s0 W" m$ q9 S
- else if (digitalRead(kg)==HIGH)- z6 u+ P8 |4 b# h8 G& u U
- {
; p8 [9 y0 @0 i- o. @9 ? - BLINKER_LOG("get button state: ", state);
1 f( j% K* {! q# k3 O: p - digitalWrite(kg, LOW);
# l% ?4 b& G5 U: X( h - digitalWrite(de, HIGH);- y) p* L: [7 D I
- Button1.print("off");& D4 U, O5 i8 X# ?7 `
- Button1.color("#00FFFF"); //设置app按键是深蓝色
' X2 Y; t# a: d2 L - Button1.text("关闭中");
6 T' n, T. b( C0 i; a- g - }
$ u! T6 v5 n" g" s' ]8 j* l f [+ e - }/ v2 B, e. G' Q! k. }: u
4 e; P( b5 }+ u W$ P- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++6 B& ~+ B5 z6 K
- v7 U5 H7 x$ z4 K/ u! \. i- //*******如果小爱有对设备进行操作就执行下面. X$ [: v# S4 S. _ {% t$ c
- void miotPowerState(const String & state)
: ^/ q h1 D0 `) L - {
/ I* N: f' \- X4 x5 x- d% x7 v5 [8 E - BLINKER_LOG("小爱语音操作!"); //串口打印
7 G1 J& M. ]+ _" o6 i - if (state == BLINKER_CMD_ON){
7 H) ~) Q6 @7 H# C, \ - 1 ~/ E3 O$ D2 W# i" t" I, f
- digitalWrite(kg, HIGH);
, ]$ f7 \0 Z F3 N6 D- t1 i - digitalWrite(de, LOW);' O, g! \" m" T8 U
- Button1.print("on");
+ C6 \. T+ }# E* T) z0 [ - Button1.color("#0000FF"); //设置app按键是浅蓝色
" M! w4 r0 E; q& [: A4 A/ V# G - Button1.text("开启中");
. S% Y6 C% Q- p' G# ~$ | - BlinkerMIOT.powerState("on");
' X8 z# i" {$ M4 ^8 E( ^ - BlinkerMIOT.print();
) y# J v1 n1 W3 ]! k0 ?- i - }! R% q, l6 F2 J- t6 `$ x' D
- else if (state == BLINKER_CMD_OFF)
( P4 i+ \( E5 @9 I - {. ?: Z0 w3 q- E6 M4 @* C
-
0 m7 s$ G& D J2 q - digitalWrite(kg, LOW);
0 T8 L; T3 j% q6 y - digitalWrite(de, HIGH);5 I, M( X5 j, n) l: g
- Button1.print("off");; Q8 L/ d% Q4 j$ T+ c, h6 `8 k
- Button1.color("#00FFFF"); //设置app按键是深蓝色
) H, @1 g+ u: Y - Button1.text("关闭中");5 ~9 T* [! Q* J
- BlinkerMIOT.powerState("off");& x2 x! e! q; J2 x* k
- BlinkerMIOT.print();
7 F* {& i* C4 V, n1 D l8 W - }
" ~1 |$ T7 o" V# G - ! l: H% Y1 o5 v1 m
- 7 d! `, b7 s/ W, j; B. m
- }) d: f* O. s T5 d2 l7 ?7 q
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++$ C5 r* B9 J" r" h: I0 {, _
- //*******如果天猫精灵有对设备进行操作就执行下面
5 K& Q/ U+ [" l/ Y. e - void aligeniePowerState(const String & state)2 s) {* P3 y5 v' N# G
- {. d4 \" s$ ^! K t; b) T4 F8 ]# v
- BLINKER_LOG("need set power state: ", state);
. U7 t, ]8 r/ _5 b7 l- D9 M4 i - if (state == BLINKER_CMD_ON)
6 J" f1 ]* M( a' U) r5 a3 d - {+ q, [' g$ }. z1 X7 O( @# z
- " ~# d( z1 [( H+ J, p1 z
- digitalWrite(kg, HIGH);2 D/ F5 Y3 u4 T) H4 l5 H
- digitalWrite(de, LOW);
( q9 b4 I1 P; o" p( n, {8 K - Button1.print("on");, g( y5 n9 f( Z& C& O# z
- Button1.color("#0000FF"); //设置app按键是浅蓝色5 l' S9 V( f- _- H8 m# ~6 p
- Button1.text("开启中");
& H z1 T" A8 h, W% a# ? - BlinkerAliGenie.powerState("on");
5 x* ]" a2 ?5 G q. S - BlinkerAliGenie.print();/ c" ^- b$ u# |/ A" ~! o3 t3 _3 `
- }3 Y9 r8 f; }4 V
- else if (state == BLINKER_CMD_OFF). d" Q3 |( J( f8 ?
- {9 j; S% x) n7 \& U2 l( F
-
a9 Z5 G6 U% ]2 t7 Z& K - digitalWrite(kg, LOW);$ R0 U% r1 F9 c% E* O
- digitalWrite(de, HIGH);
& J/ k1 S+ u! {8 t' y, k - Button1.print("off");; x0 s! D/ P2 b4 [) D
- Button1.color("#00FFFF"); //设置app按键是深蓝色
8 Z5 F- [" W/ q( Q - Button1.text("关闭中");
! S# G+ \/ O9 d1 y6 ? - BlinkerAliGenie.powerState("off");, I0 @1 \! J2 c3 b
- BlinkerAliGenie.print();
R" i6 x9 W5 d0 K/ \# J - }
: ~, `7 p' ~; ?- i. s& a% G - " ?, M ^4 Q% }! I% J9 e1 y
- ( }- W* P) o H# o" E# [
- }
1 u( Y* u. o! ^8 d - //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次
' k+ x/ b& @- B: e* Z" N+ }( k6 y - void heartbeat(), n8 A: l) t- N8 W5 ]5 J8 G" Z
- {
% e& l& K0 `: S# } - BLINKER_LOG("状态同步!"); + ]; R: n& \4 @5 D h9 A8 ~0 j
- if (digitalRead(kg)==HIGH)
0 r% W' @/ s/ w2 L1 D- Z5 J - { 9 \& L7 O8 O2 e3 b" x/ t+ Y
- Button1.print("on");& c: v9 J" B. K( h& \6 k" Y1 D
- Button1.color("#0000FF"); //设置app按键是浅蓝色, g* D) y- \4 {4 z6 H
- Button1.text("开启中");
7 w+ [/ H/ h& ], k" U - }6 b6 x( P3 D1 `' J* [; |* j; t
- else
! E" B; G1 u5 s( d. F - {
- j$ q: {% G2 y8 D - Button1.print("off");! h+ I6 u" n% H! D
- Button1.color("#00FFFF"); //设置app按键是深蓝色
6 [: J7 `/ S( L7 {+ _+ { - Button1.text("关闭中");
/ [- c1 x; q5 f9 B0 L B6 F - * P3 h" _0 H' d% W
- }
& ?# y, O$ a/ C; p; | - }
- K- W5 b. F3 {) b - //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 u+ j, J; S. T3 y - void setup()
" J, Y: c5 x# b! R4 m0 k+ z3 t7 n) O - {
0 n& C/ {3 m: R' B: m5 \) q - // 初始化串口# x- d, P3 s4 @; v+ G z% U
- Serial.begin(115200);. M9 Y: `3 I& x6 f4 S
- delay(10);, j, [5 G! B+ h |7 h. c& x5 l; s
- BLINKER_DEBUG.stream(Serial);1 W0 _: u1 _; d2 a0 m5 L
- // 初始化有LED的IO
$ B$ Z8 @# ^( x" i* S2 D& a - pinMode(kg, OUTPUT); 8 k0 P: }! `5 N! l
- digitalWrite(kg, LOW);//初始化继电器上电状态
$ z! ]* U* t+ D9 G% d% j - pinMode(de, OUTPUT);7 O) G5 n3 z* E) r, v
- digitalWrite(de, HIGH);
+ u0 |/ P' n. X' T7 ? - pinMode(key, INPUT);
; G& ?6 L- u' R3 E - Serial.println();- N, L; N2 i! ]# w9 j `8 c9 c' n
- Serial.print("Connecting to ");! w$ R0 I+ L& f
- Serial.println(ssid);" v- w$ i( n/ d# P) l1 p
- WiFi.begin(ssid, pswd);: @5 }$ B# J: t! M
- while (WiFi.status() != WL_CONNECTED) {
! e0 \- y9 {; }( W3 N - delay(500);
{) d/ i e6 M) b1 Q! ] - Serial.print(".");
4 J8 m z! k$ g$ S! t5 f0 L8 q - }) y0 z% l7 K! G7 Q' v! Y( t" i
- Serial.println("");; I& O# O8 O6 s8 O
- Serial.println("WiFi connected");. k& E. ~' l% F1 G8 ~" B
- server.begin();* n* Y$ z5 Y( V$ Z. L( p R
- Serial.println("Server started @ ");3 z/ ?6 r* s% K( U: [" S
- Serial.println(WiFi.localIP());7 e) `8 E% o( T+ ]
- //打印出IP地址,后期可以制作显示器来外部硬件显示ip2 D! \, i+ v" c/ C
- Serial.println("To control GPIO, open your web browser.");, }/ |# a5 g! S3 g, S
- Serial.println("To set GPIO 0 high, type:");
5 P& d; b L, d T: B - Serial.print(WiFi.localIP());
% ~) g/ R' ?% H5 L: V) E - Serial.println("/gpio/1");9 V% D2 c) g$ A! V K. I
- Serial.println("To set GPIO 0 low, type:");( b. O* q2 E/ x7 ]4 M, G
- Serial.print(WiFi.localIP());
) T/ \5 A1 M9 U0 `( o$ S4 T E9 F - Serial.println("/gpio/0"); m* t7 q3 h( L1 R$ E: I
- Serial.println("To toggle GPIO 0, type:");
4 v/ ~- e* B5 s6 k5 ?# V# T0 B - Serial.print(WiFi.localIP());# y1 M% A8 C4 d3 X5 N8 |* {2 {( l
- Serial.println("/gpio/4");
0 Q; D4 \* V# X- _- ?) D
. z8 r9 c Q( m) n5 g9 ?- // 初始化blinker
; L+ a. M2 p6 B& D0 @ D - Blinker.begin(auth, ssid, pswd);! O) b+ T n* @+ h; L. p4 v- e
- BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数1 F6 K- c; N" A" D& x
- BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数$ i8 G3 _0 s7 F9 F& e
- Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。
& d! \/ V2 V' Y/ x2 i' d/ R - - q$ @1 ?. \. v' x, ~" u
- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback
2 a; @/ E: {7 {. l8 _; J' d - }. g& i1 x. @- I9 h! F
- void dataRead(const String & data)* y% P7 t. |6 P0 K
- {$ w# g' s) h# f* ?* D, s9 a+ o4 _
- BLINKER_LOG("Blinker readString: ", data);
& T7 C/ f2 r! ~$ F6 @& ]1 L - + B0 p2 f# r" n: c3 l6 Y
- Blinker.vibrate();
/ T( m1 L& n/ [! w1 { - , @, U0 ~( b! G; D& p
- uint32_t BlinkerTime = millis();
* J+ X5 u$ u, F* J0 E! d& D -
% \$ ]9 U# } k/ P6 s' v9 n - Blinker.print("millis", BlinkerTime);- Z9 ^! B$ |# q& m
- }, c# S/ t; m1 w' \# ]
- void loop()
) K i |) v+ f. p2 A: O - {4 X' O9 u5 D ?& W1 u' F" A
- Blinker.run();3 ^% O& y8 N- W& t) V5 C
- if (digitalRead(key)==LOW)
9 ?) [4 q- Y) G. u) s& | - {- l$ b! h+ D# W
- Blinker.delay(200);1 w0 a- ]* v# f9 s, z
- if (digitalRead(key)==LOW)
# ]* ^- }" L! ]" g* `% U+ t' d - {
9 ~' B3 U% u& F - if (digitalRead(kg)==LOW)4 y. V, o$ I! e2 a* s! B: M; B
- {
9 ]+ H: J3 V3 y - ) f( m/ B0 M( `$ ]3 a5 [) X
- digitalWrite(kg, HIGH);$ x) J0 j# ? R' r
- digitalWrite(de, LOW);
; P7 c7 w$ @) b; `0 d - Button1.print("on");
4 H6 _- S, Z2 V5 P. p/ Y9 H - Button1.color("#0000FF"); //设置app按键是浅蓝色
A7 c. |# W' t7 Y4 J I- k - Button1.text("开启中");) _! i% f1 y: F' U
- }
, m. S" t' W7 `3 A - else if (digitalRead(kg)==HIGH): h3 w0 g0 ^$ _& A' x2 m# I
- {: O7 j1 o) u2 R
- digitalWrite(kg, LOW);4 V0 p* _2 R) x8 g) x8 Q) J, l
- digitalWrite(de, HIGH);& J- j, G0 }, ?( r' e
- Button1.print("off");
& v' }# m4 l; M1 I1 R - Button1.color("#00FFFF"); //设置app按键是深蓝色% S6 d6 c; _6 {8 |+ H6 x1 Y' a
- Button1.text("关闭中");
/ F# S; f, q- ?1 L/ ~- {2 t- e) } - }& _/ ^2 y2 Q2 N& K
- }! z* m/ _- {9 C& }" g {
- }
/ }! {( P4 w; r6 T' G6 X g; w - }
复制代码 1 k" m% E7 I o1 t4 s
/ x1 h8 d2 v9 x( b: n: m! M& ?
我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html+ E( H( Y) ?3 Z, N5 ~# v
2 F9 S! b3 n0 s5 X. ~# { Q
把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。
' Q7 z) Z6 F3 ~0 l' U3 f F6 H; \; O( v6 _$ x6 C' ~& V. K
3 ^9 P# u7 d7 B: c
|
|