|
本帖最后由 易记 于 2021-8-21 14:05 编辑
! p8 a. k, `7 f1 o
8 L! m- q4 c \0 n- j最近玩ESP8266,想做个天猫控制开关。
b+ Q% S2 a0 k但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。- L% m1 I3 | \- {
还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。
8 O r* i( @* |/ }
8 F+ e6 o3 c( }/ K G5 d+ x7 K6 }- r6 G4 B% v& D0 s# M6 y6 ]
# p8 w5 y* N4 n% e, _9 l; I- u& @
问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。 @, O D' H; F
5 G! L+ f; D$ K, W. `0 `
! ^# d! p j5 m/ g: D- `
2 M" [7 ]& w7 m
# q; b( B' l# Q
( E' ^( I& H v) s到手,当然是拆拆拆。
$ S" Z/ n; F9 w, g
6 O7 q% [' d$ V' g% f. K& Y
: ~" P. O8 g n) W/ ?. P: j7 d( [. V, a, `
联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。' z* D1 o1 S9 _2 x8 I% ?) o9 d
! A% [% ]. c8 O
" k$ Y3 x6 _! v+ V
4 D& \) y+ \! v7 N) i
继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。0 ^( t) |; M8 A2 i8 g9 O& v
w2 t0 a' H' ~6 y0 d/ K0 `
+ J8 e! S! ?+ j0 @
, V/ O& J' ^0 [6 o; _* F- r7 h' n9 f8 {7 s1 }% G
电源芯片
/ S! }& s T7 M! H) T6 d6 Q
1 x l/ A4 Y) K; b9 {1 ~& ^- A ^* S ~# T. V
3 j3 m6 o& u% B6 Y. E有一个按钮,按钮有二个蓝色LED灯
3 Y* j8 D3 T8 R$ U' H5 |# u8 l
3 M9 I: }3 Y- E
& |8 _6 t6 K7 X. d6 H& h, f9 m1 L/ U5 j
2 v+ f/ ?! `! u7 }6 V! \# I, A8266
( H+ ~* t3 T8 D1 y( G
- Z0 D& w/ J3 h3 W, t
7 Z, d1 @7 w- x8 i5 x- a
! ]! [: ~0 {# M% i) j" K V% V& z) n* e0 c
8 F ~; ~) O e& r) z
接下来就是刷机了,版子上面都预留测试点。
" W: b6 a1 q3 W7 h3 S* Z. x& r接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。
* T! S& L; l2 I4 j( u& [" W
P0 z& y2 y' v
注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。
. J' }: n( N& ?" I7 ~1 ?) I要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 |
# E. e6 \; h. d5 M1 \2 g
! t; n% l+ R) U: T
9 |7 H0 F- D+ S3 L9 g! c
; e. p# l% j: x( `9 l) e! J3 b8 z
7 c) e1 W5 n2 H; X+ b. N( W* s7 x8 W 5号脚位是继电器输出
9 S( h0 G. y, a# m, Y) |3 L- W 12号脚位是灯输出: m6 ~( ?1 C8 i6 F9 S+ H' T7 I& y
4号脚位是按键
4 F3 F" P- K8 `* I- U1 @
7 Y* c9 q4 k, P/ s! g
1 ]* F0 {6 d5 }9 }# d8 i J% s9 N4 a/ t _, x
- b9 C; y' z* I
卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库 M3 W& I, w: c: k \% _
- #define BLINKER_MIOT_LIGHT // 设置小爱灯类库
9 A* Y& B6 b' S9 m - #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库$ J4 R" }% y, d% l+ e. C' |7 C1 U( @( |
- #define BLINKER_PRINT Serial //串口协议库+ f; C4 i5 h7 ~$ X, J, m3 X: [
- #include <Blinker.h> //官方库% Y! E, Y% U* D4 |
- #include <ESP8266WiFi.h> //官方库
, }- f6 Q% m% O1 S# K% Z7 J& T - WiFiServer server(80); // 服务器端口号
_* A! }6 `: r6 o
2 ^! S# O5 t# v; P7 e8 |- char auth[] = "c4942fb1d5e4"; //设备key
* \+ X1 M) ?( l- ]- x - char ssid[] = "wanboshi"; //路由器wifi ssid
8 w5 ^7 ], ]+ @# w - char pswd[] = "1365662999813586348220"; //路由器wifi 密码# i0 N* I' Z$ U$ N0 i7 ^8 P, u
- ! R/ k' E7 q7 F8 }# R5 Q$ }
- bool oState = false;8 M* p3 Y0 E) ^' S: Y' |
- . T. ?; }. D0 b' h- N* f; @
- int kg=5;//继电器输出2 i3 w8 I3 {8 ?3 Q6 _" l
- int de=12;//灯输出* W9 a. z2 H7 }
- int key=4 ;//按键
1 r' w5 d7 k& v! k - //*******新建组件对象( ~' `1 R! K i: ^% D* V" k
- - A V- j! W9 t8 d
- BlinkerButton Button1("btn-abc"); //设置app按键的键名
' N+ }( q' t5 V7 A - //*******app上按下按键即会执行该函数app里按键
5 K7 K* ^& L* t3 a6 m - void button1_callback(const String & state). `' y! Z/ D0 w" _
- {
6 `7 p5 b5 ?5 f0 J( f - if (digitalRead(kg)==LOW)3 v; n* q) j1 X- J' Q
- {
) [' L: G) ?+ l$ e: X8 b( w - BLINKER_LOG("get button state: ", state);6 c+ _5 j9 h8 U9 A0 c) g
- digitalWrite(kg, HIGH);- \* l8 Y/ ^. ]- _' _' |& ?
- digitalWrite(de, LOW);
, Z4 W+ x- X# {+ m - Button1.print("on");( q+ p( q/ u, g0 _7 c
- Button1.color("#0000FF"); //设置app按键是浅蓝色
; G: ?0 l- ]% x' K9 @9 I% z - Button1.text("开启中");
' F# N/ W9 S4 `# N, u' `+ @( [ - }! _" v; m8 h9 {4 e+ ? e+ L
- else if (digitalRead(kg)==HIGH)
0 B3 \2 w7 h5 k* C% ^ - {
7 C' d2 z- H( t3 d! Q - BLINKER_LOG("get button state: ", state);, L. J5 p7 R) K" a/ i' z
- digitalWrite(kg, LOW);
' h$ ], M1 J- g& \; A - digitalWrite(de, HIGH);
; W2 Q9 _( Q# z0 j$ ~- } - Button1.print("off");
% ^! Z% G {0 s - Button1.color("#00FFFF"); //设置app按键是深蓝色
5 U2 p$ t; H+ N4 D% J5 l" x - Button1.text("关闭中");
$ K; e$ U+ t7 t: Z. A - }
7 o- B% B/ ^1 I% b - }5 i* y' u! ?8 W: z/ s* I
' g# I+ X8 U- Q% `5 r- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
, V9 v) |8 l9 L$ _
) C( J+ o4 L4 v- //*******如果小爱有对设备进行操作就执行下面) `& n3 C7 [2 [: a, U# n0 Z
- void miotPowerState(const String & state)
' E) b* {( y: q# A - {
5 ] O/ I5 N+ e1 x- |3 V) C - BLINKER_LOG("小爱语音操作!"); //串口打印# l2 j4 t, P, j' D6 f8 N6 X- q
- if (state == BLINKER_CMD_ON){
5 x5 {6 F. }) m! {6 e - - y* b( u9 s6 _+ F
- digitalWrite(kg, HIGH);
. r9 q9 ~7 h) [ - digitalWrite(de, LOW);6 A2 Q& F) Y. y/ o# I$ |+ X$ S) V. W
- Button1.print("on");
. \: V1 x s, F( d - Button1.color("#0000FF"); //设置app按键是浅蓝色 U j7 h! v/ j( b/ T9 }
- Button1.text("开启中");: C2 W. b7 g L9 X" S3 T% z; Y
- BlinkerMIOT.powerState("on");4 R6 _: Q5 o( R) z& j& x
- BlinkerMIOT.print();- s) V' g$ A5 g% B! L( B
- }
B$ V8 v) |* R - else if (state == BLINKER_CMD_OFF)+ c/ ?+ J# q7 x# v
- {
2 l4 t f- f& w/ ^ -
. L2 _) v" h# f - digitalWrite(kg, LOW);) z: k9 K* x+ g/ H1 f# s. Z
- digitalWrite(de, HIGH);+ d8 D4 P) n" @. A; L; T- j
- Button1.print("off");
! D, V2 }7 L" f* j9 l) g C - Button1.color("#00FFFF"); //设置app按键是深蓝色
) g/ O: i7 q% P: w1 y - Button1.text("关闭中");3 I, |( Z4 b) G- d3 m
- BlinkerMIOT.powerState("off");
$ ?: s" d5 f$ J ~ - BlinkerMIOT.print();
- E" r, @* k0 ~5 M" g+ G6 d - }
% s2 ?5 K+ F, |0 {& ^$ x: |2 ~ - : b; y; G. l8 l h: r, b
-
9 k4 c3 G# L" \7 ?( y2 N5 ^ - }
+ Z6 q' g( L) d N* i - //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4 `6 m6 u/ s; c+ f3 s3 y8 @: q - //*******如果天猫精灵有对设备进行操作就执行下面/ R8 E/ u9 M. w
- void aligeniePowerState(const String & state)
$ F! t; ^3 A5 Z! p5 [3 r; E$ I - {) Q4 Z+ w" {8 c" ]( |5 j8 ]
- BLINKER_LOG("need set power state: ", state);& a$ n" l5 P5 d4 s+ E9 Q9 u: l7 z; n
- if (state == BLINKER_CMD_ON)% G. f/ F, k' H; @9 ^6 N
- {
' n9 r1 ~+ s0 Q$ |; d1 M$ X -
3 ]2 k9 i0 _% d7 f6 O( g7 W1 D+ ~6 a! c - digitalWrite(kg, HIGH);
) e4 D1 L1 { W5 z; n - digitalWrite(de, LOW);
# i7 J( t. ^5 }9 p - Button1.print("on");
~: [7 d9 |; t1 Q$ E, E8 {7 o6 z/ n - Button1.color("#0000FF"); //设置app按键是浅蓝色
& O/ p! ?! F8 d9 x' ^0 Q - Button1.text("开启中");8 l3 X1 C A6 a7 @2 T
- BlinkerAliGenie.powerState("on");
* Q I% y. M3 H. u - BlinkerAliGenie.print();
7 L* d! u0 ` W5 g3 ~7 [" P I - }
g8 `! m9 D5 W5 Q! w; Y - else if (state == BLINKER_CMD_OFF)
+ k/ Y# u& J, R* x: F: [ - {3 ~8 A: r8 G! \
-
- l; U/ B4 {- N( C - digitalWrite(kg, LOW);- \, D+ p' ]" h% n! p1 ]6 v
- digitalWrite(de, HIGH);) ~% S. o2 A, Z% r2 f6 T; u
- Button1.print("off");
- T4 _- x9 i" A6 s5 h1 ^. d3 N - Button1.color("#00FFFF"); //设置app按键是深蓝色0 W8 y& ?* A! G# m3 q0 Y
- Button1.text("关闭中");
; }& m2 d2 y& ?! Z' T& Z7 V - BlinkerAliGenie.powerState("off");" U8 P3 f5 v- K; O- z4 B
- BlinkerAliGenie.print();- d( c$ _ e& X. h) T- D% [7 h0 Z% m: ]
- }( y; T" N B9 }7 @
-
3 n7 h5 }! `; i) D& b, }; ]
+ x& _5 _) W% C" q- }, e. D0 q. U2 o# M( J8 s U
- //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次
B, Q" o) V5 F - void heartbeat() s: w' |- ^4 `6 ~7 S' Q8 @) o/ x
- {
+ W0 `/ k, [% K* W% L - BLINKER_LOG("状态同步!"); # P% d7 U5 F2 D: k9 C# h
- if (digitalRead(kg)==HIGH)
0 ]4 C1 C# D, M+ b5 e0 ^ ]/ O - {
9 R1 Y3 r4 K& | - Button1.print("on");
0 h+ @4 e! g ]! X - Button1.color("#0000FF"); //设置app按键是浅蓝色
" v/ ^- h$ _) m# m; }. I% \' P - Button1.text("开启中");! k6 C- y E' {2 S/ _
- }
) e) r: e! M l" s( r6 u - else
- z7 W; d, h1 ?: P# {" F+ t' f& J - {6 A) g4 n8 e7 L( s. X2 X+ C$ V3 }
- Button1.print("off");
+ o5 n# x- _# x, ? - Button1.color("#00FFFF"); //设置app按键是深蓝色
' r; Y/ j R; r* k" T/ D7 [, C: t - Button1.text("关闭中");
4 p/ e( c3 _) k+ b -
/ Y5 @# X' N, S: W - }
0 K. u3 K5 v0 ?7 [3 X! w" J - }
L5 _. B* @' q+ b* S- w) U* _1 N - //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- v& k# m- C/ a( {: p, _+ R7 R( f- R
- void setup()4 O4 U. [3 t( i7 S! n
- {
# v4 |/ |- X! g' F7 ?, F2 [ - // 初始化串口
, w" Q) ^1 X. W7 s9 ] - Serial.begin(115200);
$ `/ @/ e9 o: d0 z6 E+ z: C" y4 X - delay(10);
8 ~* B" ~1 E' u. y- s - BLINKER_DEBUG.stream(Serial);# E) O) Z/ d, R
- // 初始化有LED的IO. S1 _: y6 K! n1 M/ s# f& p
- pinMode(kg, OUTPUT); 2 A W: b' f/ ?! l# F1 o
- digitalWrite(kg, LOW);//初始化继电器上电状态
$ }7 |7 K9 o3 D. q3 l - pinMode(de, OUTPUT);4 X- F- f! V6 `
- digitalWrite(de, HIGH);* C# e N* ~: k# y
- pinMode(key, INPUT);
4 a, j3 \8 L9 F4 u! r4 V* D - Serial.println();
* g% r9 Z1 s$ y - Serial.print("Connecting to ");
' }6 }7 Y0 t' R/ d& h, w - Serial.println(ssid);
; o# \% E8 _" x, _5 w6 F - WiFi.begin(ssid, pswd);
a6 `' U% ?. T% V4 P - while (WiFi.status() != WL_CONNECTED) {$ i1 D. ?% o0 N- E b& e% j. ?
- delay(500);! J* t# f$ }! p
- Serial.print(".");0 u- f1 r( Q) q" ?
- }6 v7 J; [7 D) |: K |! M8 x
- Serial.println("");
; b& ~. T% ~% Z - Serial.println("WiFi connected");8 i) i! V1 f1 _9 Q4 G
- server.begin();, s/ t1 _5 C" F. O8 h
- Serial.println("Server started @ ");* X- }7 @4 K" U: T" Z1 C) e
- Serial.println(WiFi.localIP());6 U* c" P$ s$ O
- //打印出IP地址,后期可以制作显示器来外部硬件显示ip
8 q' H& i+ M# S3 _ - Serial.println("To control GPIO, open your web browser.");- l- S$ V( n2 p% d
- Serial.println("To set GPIO 0 high, type:");
/ n6 d# U3 j9 N - Serial.print(WiFi.localIP());
$ _) F0 t# }9 F8 g - Serial.println("/gpio/1");
9 y$ z5 R5 S4 b& _ - Serial.println("To set GPIO 0 low, type:");
T. U0 R I* A% ~. A; ^ - Serial.print(WiFi.localIP());
8 ?$ f9 Y' d$ v7 s3 r7 s) p+ V( M. ] - Serial.println("/gpio/0");% ?. W8 ^- A2 q' m [9 R3 O" f1 ?" Y
- Serial.println("To toggle GPIO 0, type:");; o% N& v Y& e( K
- Serial.print(WiFi.localIP());
5 K4 `8 Z+ y/ i6 r+ y0 x - Serial.println("/gpio/4");4 @5 _0 B* w0 ^9 M* F8 a
4 n; z. Y% Q" U# U3 l" V- i! U. v- // 初始化blinker' I" a/ N% M2 i. b9 H, K
- Blinker.begin(auth, ssid, pswd);
- A- Z, w3 l4 M; O( F6 W1 _ - BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数
2 i; [3 Y, X8 S - BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数 k! g* W& r0 i* o4 A6 I
- Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。
Z( v. z* h. y5 h/ s( Q - , ~: C! ]+ _* N( Z1 x" @) }8 x1 Q
- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback
6 h. y6 c# K& ?3 q - }
1 I" }# q; b2 O, I - void dataRead(const String & data)
1 I" F: l' V# J- T. M6 h! S5 i0 Y - {
" |* n# b1 k; m - BLINKER_LOG("Blinker readString: ", data);
" W1 E- e. F5 F4 p$ j3 e9 C
8 A& x, y, q& h" u$ P# d3 @- Blinker.vibrate();
p2 ]9 y5 |$ H( V - / `/ T9 X6 X5 K
- uint32_t BlinkerTime = millis();* M3 a3 K+ e( W. o6 ~6 B
-
9 l7 x/ A! y% n* [2 r - Blinker.print("millis", BlinkerTime);
) @+ o' e& J8 T( r( | - }9 L% d' c( q7 j+ N& k/ T
- void loop()
6 x7 F, }, Z% X c& } - {9 A$ g) F8 T2 r+ f0 Z. y* N' a6 K0 L
- Blinker.run();
2 M( G' q9 ~/ w& l5 C - if (digitalRead(key)==LOW)
+ o* ^ r) F2 V, P' Q - {5 z# ~ \6 U( c5 t8 u \0 b
- Blinker.delay(200);
: ?' U( ?! E+ ^8 w8 L$ l0 Z& S2 Z; W0 @ - if (digitalRead(key)==LOW)' H# X- t+ a& t# ?
- {
. O4 R( I+ \' k( P' d# E - if (digitalRead(kg)==LOW)
7 k5 ~* O; ]6 i" R - {
8 A5 L" I( o3 T' i, @! ~2 d - " M/ X' K7 t8 k5 ^7 z% M
- digitalWrite(kg, HIGH);, }5 l+ X7 d! z1 }" T
- digitalWrite(de, LOW);( {& Q: p; x/ ^& @
- Button1.print("on");+ w- W# {1 e5 X$ G
- Button1.color("#0000FF"); //设置app按键是浅蓝色
4 ^. ?, d; m: s5 G - Button1.text("开启中");
: `: c8 w8 X+ h8 d& Y: i3 C# |; \5 ^ - }
# n5 y6 t9 u# X - else if (digitalRead(kg)==HIGH)& ?# z9 `- O+ B! D! |8 J8 u b
- {
5 L3 M: y+ B& r( E - digitalWrite(kg, LOW);8 k) O" ?7 q6 M& d. t8 V
- digitalWrite(de, HIGH);6 C8 V* }/ L( X8 w7 X: U
- Button1.print("off");
+ ?3 \' T+ P# ?# ? - Button1.color("#00FFFF"); //设置app按键是深蓝色* J6 u4 R7 u# L" h# R9 P0 k
- Button1.text("关闭中");
6 M2 ]9 @* C6 c# h l - }; ^$ a: f) D+ |. w1 o% U6 d8 b
- }6 K7 Y6 N! Z3 t5 ^% x5 Y8 ~2 g' c: @
- }6 E2 ^6 @5 ~4 v) g! J
- }
复制代码
9 G4 L+ v2 Y$ A; x7 u# H$ t! r. O. Y4 R3 y9 f; A \
我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html
- k3 Q3 v9 b) n3 w4 W! L4 l0 R! E* T9 r1 C/ ?& k- D# m
把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。
, }! n0 U7 d9 m# _
: H& k) }' n& J$ v/ E2 P
9 x& U- [4 g1 T4 F |
|