|
本帖最后由 易记 于 2021-8-21 14:05 编辑 # q; \0 ]) p# B% t
5 i3 C; G/ A( s9 u最近玩ESP8266,想做个天猫控制开关。
! r( k- o5 w! h' r8 j( d* S5 H但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。
3 ?3 f6 w! v" ~0 P+ M j5 L4 o2 Z还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。7 l+ u) _+ ?( e; c3 l: H, @! V2 B
7 @, N- t) m9 }/ w8 F6 E+ d
5 c! B" H. E' g, _+ o, A
' h4 `6 w9 c& m$ p2 _问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。
8 P2 g3 c, R# b0 c. Q0 [- `! k' L# t/ ~: O, _$ l9 O3 N
& y) L2 C0 h+ e9 E# x9 W6 e F) K/ I2 D( i( A" a- [" c8 t g
: |1 \' l) g7 r. a; H5 j
4 k: L T* V' ~& ?8 K& _$ D
到手,当然是拆拆拆。
: J3 ?' _/ _* n
1 b+ q$ N5 b1 {& r L! w+ A
; [+ ?% `: S1 ?5 A9 t
9 x# Q! k, C. U
联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。
- p1 N) `9 |, S
- W" R) D y6 X" ~$ v( |" s/ u% K
* C2 w7 d% M W0 O# C$ r5 k9 S
{4 A4 c4 L6 m3 G继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。- G1 l: x& [# k& @) N8 F/ N
$ I' H$ M* `. d3 |* J( x4 b* ~# s; Q6 t
7 `/ F" o7 m1 r7 ~
7 T- \1 f$ P8 D电源芯片
/ r' P% x8 `8 ^/ |+ |) ?( H7 B/ C+ {" Z
% H4 L( r7 t7 e: w: C" A
* `8 O; B& h, j' K6 S, `5 ^有一个按钮,按钮有二个蓝色LED灯
3 X0 b0 T4 o% e; W
0 N y' g7 C" i7 \) F* {: M5 m8 r, e2 q- F9 u" X
! Y6 L7 c- e3 \$ u8266
# p Q9 d; n; f& U0 a
+ k* I) c" [. D( t$ C+ L# _6 x. l: z, \9 ^. d7 O! a9 O6 L
1 _! I% d6 F6 y1 `5 u
1 V$ U* i! n- _" Z7 l4 Y3 h
1 C7 f% J) |+ B E; n接下来就是刷机了,版子上面都预留测试点。
' |, \- |% o% q' b# ~+ W6 {5 M接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。1 l' R$ a4 z! x5 Y$ k$ Y
0 w3 C- ~' Z6 v) g注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。- X: t+ ]& c( _5 n L
要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 |
: h( d* `+ @, I: e
" y6 r1 }& P, G$ z( F& G" i
+ P- t$ f% |* O* f0 g1 s) B
. z( U0 k: V# W8 r: d1 F- ^7 e3 _' t. [% w
5 J: G* T. S# Y9 A2 z/ O 5号脚位是继电器输出& b+ B3 r8 F/ j7 ~
12号脚位是灯输出4 M; k8 m+ u7 \$ ?* q ?
4号脚位是按键5 T5 |0 G8 T( P
: e3 ^. S7 z! k5 m2 j: ?
# M% W4 {0 T+ Z* g9 n0 j) c
/ _- `! O$ {& i/ ?& w3 w3 _: `( p: ]7 W4 C" L* S3 J
卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库
4 R6 e4 d3 F, Z+ w - #define BLINKER_MIOT_LIGHT // 设置小爱灯类库
7 b% s Q$ ~/ M( V: q) B - #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库" c( E* Y6 B) `2 [6 d6 W
- #define BLINKER_PRINT Serial //串口协议库3 J& F r; o4 E7 H
- #include <Blinker.h> //官方库
9 N; U W! K; D5 m - #include <ESP8266WiFi.h> //官方库
' f- x, h+ L/ X, O - WiFiServer server(80); // 服务器端口号5 J" ~6 h: ~* z" h
- ' w. b) e% r" q) R* v# `
- char auth[] = "c4942fb1d5e4"; //设备key
T/ Z+ g' {( U* m. s - char ssid[] = "wanboshi"; //路由器wifi ssid
* D4 y: V8 w" V& r+ k2 t - char pswd[] = "1365662999813586348220"; //路由器wifi 密码' _$ @$ ?$ O: Z4 P5 D4 n
( L6 h, s( T- T- K0 _- bool oState = false;. o$ U$ O; b6 x# T3 n. e8 b1 \
& }) Q4 O# P* l$ m- int kg=5;//继电器输出
. |4 T! ` e; ]- k" s - int de=12;//灯输出* C4 M: D* r' Q: x6 I& m
- int key=4 ;//按键
* i. D7 R& r0 e. D - //*******新建组件对象
" ?- R) X( w c* w" b* ?; Y
c1 d5 l" ]* ~. e- BlinkerButton Button1("btn-abc"); //设置app按键的键名
+ |% v4 ^9 e* u6 q" s8 V: V! R) A - //*******app上按下按键即会执行该函数app里按键
/ ^/ \3 O: {0 O/ p& Q! z+ K - void button1_callback(const String & state)
_# }9 t& G& U1 d8 A: Y3 [ - { D+ S3 h% f& M/ O
- if (digitalRead(kg)==LOW)1 N$ F! X. l8 t) N3 g4 i+ x
- {! `0 c' P" d2 Y! ?) K* w) f1 X
- BLINKER_LOG("get button state: ", state);
$ c$ X% y" W& v0 i - digitalWrite(kg, HIGH);
# M) l: a4 r x- ^2 | - digitalWrite(de, LOW);
( c) \4 s9 L6 Q2 |4 C. p - Button1.print("on");
$ V4 H, O1 g8 y, X8 M9 } - Button1.color("#0000FF"); //设置app按键是浅蓝色
2 A# D, x6 N; _: \: A - Button1.text("开启中");% |, Q3 f( A6 ?& z8 k% b
- }
% M' ^$ N% U3 H' [# t - else if (digitalRead(kg)==HIGH)
4 T, A- K% W, o* G6 E- R - {- l3 y: N1 K& w4 v# a+ K& Z. c
- BLINKER_LOG("get button state: ", state);. q p; v& P6 g! Z* ?4 {
- digitalWrite(kg, LOW);
% O3 \9 |) y5 J, G - digitalWrite(de, HIGH);
0 J$ t) ]6 R. k! L1 P* `0 ~ - Button1.print("off");
+ C0 m1 V: w7 c* x, W - Button1.color("#00FFFF"); //设置app按键是深蓝色) A* J+ S* Y, H2 `8 I* J
- Button1.text("关闭中");9 q" ]0 C& X. h! e) U1 G
- }& F6 ~3 h, S6 q, |
- }
+ D; _5 @/ F6 ]8 u" a4 V' _ - ( z+ k& v2 y7 G9 K
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
z2 Y4 K' z# `# s% h9 Z6 E
, k# S0 a& d! c' c- //*******如果小爱有对设备进行操作就执行下面& ]) F( v" W3 r/ Z8 A. _) s- J* M
- void miotPowerState(const String & state)8 K' X8 y2 Q/ p5 y; G: w- m+ D6 d
- {, e' a# I) @% O+ v, }8 h4 _
- BLINKER_LOG("小爱语音操作!"); //串口打印
( g0 n$ Q. ]6 n+ ` - if (state == BLINKER_CMD_ON){' R( \' O! J) f% L' b6 ^' c# K& q
- 1 f* \- e, j: Q6 U; p
- digitalWrite(kg, HIGH);
+ t( q: h0 x8 R. Q' p - digitalWrite(de, LOW);
7 q6 i8 W7 L1 T" L, Z( I S9 @$ ] - Button1.print("on");
$ X3 H+ B5 m- i: ` - Button1.color("#0000FF"); //设置app按键是浅蓝色* c3 c, a- S9 _" F0 w9 I1 w
- Button1.text("开启中");
! u' f4 O' W. R2 m) z8 L - BlinkerMIOT.powerState("on");
6 `8 S# m; T/ R9 U7 g - BlinkerMIOT.print();+ x% Y) _0 N: k) P( `5 O: P6 o: k
- }( Y3 O* J9 q8 u/ w
- else if (state == BLINKER_CMD_OFF)2 H2 d9 [, v1 a9 W# U8 u4 g
- {
N# M( F( }. x: e" `. A' H - + @& k% w2 h1 _& G2 Q1 S6 d/ K8 ]0 h9 Y, K
- digitalWrite(kg, LOW);* z: ]; Y& ]; F2 [- K& I8 C/ {
- digitalWrite(de, HIGH);
1 C9 [" d2 F! S - Button1.print("off");2 H2 d/ B5 R4 `
- Button1.color("#00FFFF"); //设置app按键是深蓝色
" T# N6 m5 L4 i8 N' P5 @3 ~ - Button1.text("关闭中");
+ u9 F% g" _" Y) o - BlinkerMIOT.powerState("off");
' B7 L+ [9 A. K9 y9 g: N5 I! g - BlinkerMIOT.print();( s1 [( \8 y2 L0 }. o
- }! d+ d8 U7 n/ _/ J
- ' h; W: r7 z0 D" f" |
-
3 h. K1 O2 b8 l2 |$ i - }
9 d% D6 b6 @5 n0 @! [& Q" ? - //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++$ z9 _( \- I" e% Z
- //*******如果天猫精灵有对设备进行操作就执行下面: A D3 E' U- X, i$ m0 D' k+ u0 \ j
- void aligeniePowerState(const String & state)' X# J1 m+ s2 C1 A: c6 i9 {4 J( v
- {
9 e( C& v) a0 V: S* t - BLINKER_LOG("need set power state: ", state);0 V6 d( ]. U8 D2 |! V
- if (state == BLINKER_CMD_ON)3 ` j. I; N! o5 e- h, v7 R6 H8 `3 ~
- {
/ P1 [+ @4 M& g y6 T% g - # {3 H/ M5 r! D& ]( P4 v
- digitalWrite(kg, HIGH);1 J& z6 ?% Q) t4 O8 R- D4 K
- digitalWrite(de, LOW); c" G" s) S" s( Y( |2 t; n
- Button1.print("on");1 F) O/ @: u6 F8 w$ x
- Button1.color("#0000FF"); //设置app按键是浅蓝色
7 J. ^# w$ l, L1 K Q" w5 ] - Button1.text("开启中");
5 e4 _+ s9 A7 k* f" o1 i - BlinkerAliGenie.powerState("on");: [! g; W# G q: y _7 r2 J
- BlinkerAliGenie.print();
. q% v5 R& G" m6 ]& t, @9 B - }$ y5 p" Z/ Q' W1 y
- else if (state == BLINKER_CMD_OFF)
; O- }, e7 E) H3 p; L - {
( W" W2 W$ e; m6 Q - . v9 ^+ n+ e# l/ |' ?; h7 C! {
- digitalWrite(kg, LOW);
N( H- w, j4 r6 ^( w4 k7 F! _ - digitalWrite(de, HIGH);$ [# M7 J4 c7 j% J" g4 g
- Button1.print("off");
1 S! N+ Q# g! X" ^% a2 V8 \5 ? - Button1.color("#00FFFF"); //设置app按键是深蓝色3 C! Q8 E7 l) p# J9 J, \6 @
- Button1.text("关闭中");* f! F' [+ m! C- d g7 F
- BlinkerAliGenie.powerState("off");
. X o% f4 @- {" X1 ^. V/ _6 j) \ - BlinkerAliGenie.print();8 K1 F) Y) w) W% S0 A3 M! Z
- }! B5 u7 h6 C4 B7 i
-
1 j# D6 L9 M6 a7 M Q
; y8 Q' Y9 \ H* d$ U/ b- }
* V( X7 @ y' W - //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次5 M. {9 `( K% I/ r( g( v
- void heartbeat(): b2 |- m z" t/ R4 E
- {
# q% {9 s4 b: r. \9 A - BLINKER_LOG("状态同步!");
2 X2 N' w7 A7 O; d5 i - if (digitalRead(kg)==HIGH) % c3 {4 O0 R- f' y
- {
& T# L3 m$ f$ H1 J% W - Button1.print("on");* |! `% F! k( X
- Button1.color("#0000FF"); //设置app按键是浅蓝色
: N& T4 [/ b' n/ ] - Button1.text("开启中");
+ P2 h, ~; Y g4 E7 w X - }
[1 `$ M3 ~& r8 W# u9 o3 K" ]7 k - else
9 U) d2 T; C" h7 W - {
8 a2 I* U1 A4 j - Button1.print("off");( J" M& e. T* C3 \) ^/ J
- Button1.color("#00FFFF"); //设置app按键是深蓝色' ?* U! a3 M$ @& d" l
- Button1.text("关闭中");: N& a: L* n3 r$ f4 _
-
! \: p# N9 \1 r: [ - }
, B% l- N8 v( \& }8 P# C - }
6 @9 R2 _) m( J% H; x6 J+ N - //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++3 [9 l4 Q1 P1 a% i( d
- void setup()
* j2 a. d! |# m0 b - {" _9 U5 z; ?0 o, S! u
- // 初始化串口2 L$ Y2 l3 K+ ~( _2 E/ B7 [
- Serial.begin(115200);
* W6 K" S, Y! }' v9 L! _( I - delay(10);
) O$ E3 G4 p& T6 l/ S4 x3 b, A% @ - BLINKER_DEBUG.stream(Serial);
8 ^" c, W% Z; Z# T, r - // 初始化有LED的IO; G. X, l9 M8 Y* Z1 T$ Q* X" m
- pinMode(kg, OUTPUT); 7 D [- G8 h3 p: `
- digitalWrite(kg, LOW);//初始化继电器上电状态 * @" a- x& W/ d2 r
- pinMode(de, OUTPUT);- U5 Z! o u7 Z, ~: l- q
- digitalWrite(de, HIGH);- O J4 d- z% ]: s4 P" u6 X, ~
- pinMode(key, INPUT); % l+ M N- n. i. `
- Serial.println();
- g9 Q& i. X7 Q& a0 Y( b3 B - Serial.print("Connecting to ");: N9 z8 z1 ]3 u' o. d, _
- Serial.println(ssid);& \6 l6 ^, s/ ]5 F
- WiFi.begin(ssid, pswd);( a" w" W8 _: ?- W L7 b
- while (WiFi.status() != WL_CONNECTED) {
" {2 D6 z6 b! d) g' L6 d - delay(500);
) T. v. ?5 w5 D1 ?/ Q9 H% M P - Serial.print("."); h$ Y" ~. Z; y2 G
- }' Z9 `8 R8 K' C) P' d6 b
- Serial.println("");
4 i2 `- N3 Z" f/ ~9 `3 q - Serial.println("WiFi connected");
% |- u) O R) V' J4 `3 { - server.begin();5 X' o5 \1 M R
- Serial.println("Server started @ ");
8 o {4 _( k j( m6 _* j - Serial.println(WiFi.localIP());
' ]" A* f7 F- ?: `' m; y; j k - //打印出IP地址,后期可以制作显示器来外部硬件显示ip
* ^: C6 D M& d4 C" u; G1 z - Serial.println("To control GPIO, open your web browser.");
* @; [0 @! g- g - Serial.println("To set GPIO 0 high, type:");3 q* I$ l! y6 F. B) ?/ t5 Q8 ^
- Serial.print(WiFi.localIP());
- h3 E9 `4 }* a3 b - Serial.println("/gpio/1");# f1 {9 c4 B5 g, X- W4 I
- Serial.println("To set GPIO 0 low, type:");* Y6 f: g0 R' i( ~- {/ u0 i
- Serial.print(WiFi.localIP());
6 w, Y- z; O% W! c' K4 J3 H9 m - Serial.println("/gpio/0");
4 V: T+ e" |6 a - Serial.println("To toggle GPIO 0, type:");
9 ?% v7 {( S3 B+ ]: Z9 x5 ` - Serial.print(WiFi.localIP());
3 T. r/ A; J, X# i0 E# r - Serial.println("/gpio/4");" i9 ?0 P; o, ^
- $ P7 H3 |' c k; o; a! q4 N! k9 n B
- // 初始化blinker
8 u/ _% F0 p/ {1 s" u - Blinker.begin(auth, ssid, pswd);
! v. n' l7 r& n+ b, i% l9 M - BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数
' }' k0 M. p8 f* m - BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数$ U% j3 }7 }4 ]
- Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。
! f5 t' W& ~) p' v6 [4 t
& z9 _5 G3 L- C) N" e4 W( S4 [- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback. I c) A x% H3 e5 ^; A
- }% j( o# e2 J- }% [) a
- void dataRead(const String & data)
$ b% e( f% T( [6 S - {
, `( D9 S. o! Z5 B - BLINKER_LOG("Blinker readString: ", data);
k% m6 F% l2 J( Y - ' G& x4 U8 d6 O( ]3 z; e& P, q
- Blinker.vibrate();
/ d, k. o7 n l/ a* t - 7 C" ?, Y% l( i
- uint32_t BlinkerTime = millis();
( r: _9 }. d& y0 J( g. V/ m -
+ R1 g: \( c6 q* `# t - Blinker.print("millis", BlinkerTime);: g+ }+ Y. H; X
- }1 @* i: K; J; K" A6 d+ a E- T }9 J
- void loop()
5 G7 F- b- H& B! O k - {' u* K( q/ K2 q. Z) j8 X; Z
- Blinker.run();2 [, F) ^" u: G3 B' F; B
- if (digitalRead(key)==LOW)
! F+ l3 x1 [" W6 _- q9 F/ C - {
& O% F1 d% ^3 S; i5 { - Blinker.delay(200);
3 H. n! r& m( A* s3 S" K - if (digitalRead(key)==LOW)
5 G; X1 ?) }3 B+ j8 r U - {
0 V1 ^/ h7 N# A! w4 |1 e - if (digitalRead(kg)==LOW)& ?3 v+ Z% n I! ]
- {: d. ^8 p$ h& h
- 0 O* k9 D5 \6 C$ }% X6 w1 G
- digitalWrite(kg, HIGH);' }0 U4 d' g/ O" f
- digitalWrite(de, LOW);* B# c, C0 o: B
- Button1.print("on");: D( M2 ~- s" x7 n4 ?+ B1 G- t
- Button1.color("#0000FF"); //设置app按键是浅蓝色
* I- M4 F$ G5 i2 b( d/ ]9 Q - Button1.text("开启中");
8 [( K j' W7 F2 a0 [0 @ - }1 x5 G7 K0 l: _, A
- else if (digitalRead(kg)==HIGH)
, F9 e% g- `* E u - {% ]1 m* K4 c9 A: v
- digitalWrite(kg, LOW);$ d% ~; x. h6 B& t2 O9 h( G
- digitalWrite(de, HIGH);
: Z' {8 q+ }+ f, d+ N4 V% X1 T - Button1.print("off");
- f8 k6 S- A' c6 b0 X; j3 x( R - Button1.color("#00FFFF"); //设置app按键是深蓝色
: g& ~+ n- w0 k2 r* | - Button1.text("关闭中");
& n+ I+ ^( X" ^( s - }
' v( S/ N+ y4 N9 P# h! e$ U - }" E" g6 k, D ^& @( _
- }
$ o; Y& T0 ?! y% M! b' d3 _ - }
复制代码 7 E1 N6 n% _: Y* b/ X# K
; q. ]; g( Y6 \, q
我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html
+ O, g+ I" U% ~6 D# v( ~9 E3 n9 O) m$ J4 ~" z2 ^ [3 q; A
把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。
% T9 V% K* K: Q- }
3 L2 N% f: N, d. w
8 f4 ]+ p* Z* R |
|