|
本帖最后由 易记 于 2021-8-21 14:05 编辑 4 ?' s7 u7 b8 N; C+ C: [8 F- y
5 i( v+ T) d+ q( d8 `& M% G最近玩ESP8266,想做个天猫控制开关。& `. w$ w! u& V. \
但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。- d. ]+ P% X9 Y0 y! k' i( C# ?
还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。' a+ ?3 Q" @+ n
# I* V$ j4 J+ D9 Q2 R9 {
5 i* C' D. E5 `4 C9 O |
, d2 z5 l: O$ n4 Y2 ~问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。
1 [( Q* a- B( }' i7 a1 ]. v6 H* h, o; B( {+ p6 |2 [
8 S# k- V: t% h
B/ I* Z. k% Z( `5 G
' z" T/ u% n! T6 E3 _# C4 F6 j, L1 X9 |
到手,当然是拆拆拆。7 \, ]5 z! } q' [) }* ]
( E$ t" {/ ^1 C; {' G% w8 I6 s. d$ i4 \ _' ~$ K/ E7 H+ f, B
4 d3 x7 j9 a7 U. c4 ?/ D7 V
联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。
* r/ ]" T4 N& d, Z& f
) E, F+ l6 p, _' H/ ^& b( }+ [
" ^: k9 a4 i4 c/ g
# T1 P( E* S/ F! X" j; L. e7 o2 h
继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。
8 n5 |) T) q1 {+ c
+ ]! A* [9 n) H1 e! v- e( g
+ q- h8 M% @8 K: O# Y' M
) v' a3 D0 x- n L
& d t; _" [: u( M电源芯片
; D6 \$ ~2 l! C
0 {( ^+ o! p3 R! `5 {; V) j7 g
) ~! V% [! C- L1 X- H: g
6 ]# T$ |6 W8 S5 E7 ]有一个按钮,按钮有二个蓝色LED灯
3 O* P1 k6 [( T) }# H
4 a* A2 S4 d- l- B+ W
" p, S' ^1 G- M- d; ~. e( r# _) Z, A( a
8266
_5 {7 S4 R5 H) Q9 X$ K
' F5 x- \0 X( v# C
) H* j" v4 u: m8 Y; o0 J
$ E, D- ^5 x! k& e& o8 e
9 _# w; @1 X" n/ o4 \
7 j# w8 m7 t. g" {/ M( [9 E6 U接下来就是刷机了,版子上面都预留测试点。
, q' o0 ~' z0 W4 Q* b6 E# Z接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。% n; h1 ~2 V% d# @) C
# |; E& c5 H" E9 Y1 F) e) k
注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。
7 I7 a; s- e( T# }$ Q要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 |
- w+ B$ H: e/ i0 \7 ]! P4 o- p: B4 L; z7 h
. O' x5 |' o0 [ e5 m5 y: u( ~4 \, m7 L3 Y$ L
# H7 f$ v# {1 ^4 u" o' y; p5 O& d
. T4 n9 B. M1 L0 j+ X0 I0 @4 H
5号脚位是继电器输出
2 J* w+ N6 E/ Z' O% U1 ^* i5 J 12号脚位是灯输出* R7 ?7 L% J5 P- s) h- R
4号脚位是按键2 ~- A! n8 K6 m
3 a7 a6 {" ^ E- }& x ]6 D
" ], M. |0 h% K1 y
: j; Y. c0 T! d* V2 j
0 z j- d# a0 A% h' C( W- ^- V卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库
4 q; F' q) K, A7 c+ V- g$ F - #define BLINKER_MIOT_LIGHT // 设置小爱灯类库6 z' {7 Q" }( i" \' H1 K, z: r: W
- #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库* w% f. l7 C) o* o, g
- #define BLINKER_PRINT Serial //串口协议库
# i/ b/ P2 s' S) G i2 a) c - #include <Blinker.h> //官方库9 i+ S3 f. p' R" Z8 V g% s
- #include <ESP8266WiFi.h> //官方库" q) s# V8 K; c# |
- WiFiServer server(80); // 服务器端口号
J) a, Q, N% I& M& C; |" i
+ l M( Y3 J. L/ X# i* g4 e0 j- char auth[] = "c4942fb1d5e4"; //设备key. P2 ^/ k% H8 B* ?* ~ B9 a& r
- char ssid[] = "wanboshi"; //路由器wifi ssid0 D6 o5 x4 K+ Z! \+ a# Z5 F
- char pswd[] = "1365662999813586348220"; //路由器wifi 密码
4 K# m4 z3 o" v0 B
; l% k' G" p K+ k- bool oState = false;/ ?% Q! f4 E( O: d0 N" ~
) q' ]+ ]- r. G; Q8 V# U6 ]4 B- int kg=5;//继电器输出# }& Q, X7 N0 V1 S) k- \
- int de=12;//灯输出' W9 r9 U* o, y7 Q0 \
- int key=4 ;//按键9 n) A+ v+ G- x; o$ @
- //*******新建组件对象
6 L/ @9 m2 [% N9 \& w+ v
9 q7 r; { } H) r- BlinkerButton Button1("btn-abc"); //设置app按键的键名5 X1 v5 H+ ]! G+ {
- //*******app上按下按键即会执行该函数app里按键7 F9 A4 t. {% q; `3 l3 `
- void button1_callback(const String & state)
4 ?% _) S: Z6 t9 E - {, [. S! I2 n' J0 ]
- if (digitalRead(kg)==LOW), W" A. }7 P% k8 I
- {9 @8 J% U; ?) ?0 d
- BLINKER_LOG("get button state: ", state);# J+ N' e R' ~- \2 V; ^
- digitalWrite(kg, HIGH);
7 W: p1 @; k9 ]( a/ y, h3 O2 K- |) R - digitalWrite(de, LOW);
4 r j S% n' T3 Y: f+ m- y8 z - Button1.print("on");
& N6 h* [, S: _) A6 Q) G9 W: t - Button1.color("#0000FF"); //设置app按键是浅蓝色8 H* A6 F: [) s& d, D, A& F3 V
- Button1.text("开启中");
8 n) |1 E3 m+ t9 I( S - }
6 r% _( V3 e+ o - else if (digitalRead(kg)==HIGH)
2 M" F& t* M* R; Y - {
c( M6 g* u x+ I2 |* t7 y - BLINKER_LOG("get button state: ", state);. H& A2 u& S! e. ]+ U( J
- digitalWrite(kg, LOW);
/ N6 P- N" E& D2 [6 | - digitalWrite(de, HIGH);
; V+ y5 }% C/ J - Button1.print("off");
3 d" @) y9 S: S1 K1 v5 C; i' h, l - Button1.color("#00FFFF"); //设置app按键是深蓝色
* N! ^2 R$ ^/ M% {" W2 a/ L - Button1.text("关闭中");! Y0 x! B% y# v$ q7 l3 g8 r! u1 i
- }9 P( c7 `" ?2 ^
- }
9 F. ]: F2 x1 @: e% w
8 s* a+ J% a5 I) S* G* T- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# ?; ]: H9 H& y1 A8 U
9 W+ F* S {1 F" Z2 P) a- //*******如果小爱有对设备进行操作就执行下面
6 S2 R: C1 Q9 s* r2 f- b% A F7 _ - void miotPowerState(const String & state)2 s' p: t7 C2 p! M9 w
- {9 j1 q! s) K, C- U. |' L
- BLINKER_LOG("小爱语音操作!"); //串口打印8 `9 J- v+ P/ O! {1 }
- if (state == BLINKER_CMD_ON){
" k0 b, b+ w3 z' \$ F -
5 e5 O2 ^1 q$ m - digitalWrite(kg, HIGH);
% i' m( Z9 T6 k H - digitalWrite(de, LOW);
+ D# i' \$ G& O& B1 a7 | - Button1.print("on");
5 T+ U' G) t" o# d# L - Button1.color("#0000FF"); //设置app按键是浅蓝色
3 f3 \- w' q r+ F' P - Button1.text("开启中");8 `- M+ |! |* y$ i+ S0 K3 x
- BlinkerMIOT.powerState("on");2 `" M( X% H. C' P) z8 V6 q
- BlinkerMIOT.print();
/ n0 Y c t, ]6 g9 A - }0 W8 Q _9 B" i
- else if (state == BLINKER_CMD_OFF)1 \) V8 Q6 J/ F5 t3 H( P3 ^+ C
- {
' \3 _1 m- T" P* r- p, l8 Z -
) K4 Y3 C' q% k+ T. [5 t( h - digitalWrite(kg, LOW);( Q6 ?3 e; i* w1 Z
- digitalWrite(de, HIGH);; l7 L, z+ r+ w0 E# i: r
- Button1.print("off");
# Q% M2 S3 \9 s; Q* g4 I - Button1.color("#00FFFF"); //设置app按键是深蓝色
3 h. P* Z/ e! g% {) Y, @6 e, [- B - Button1.text("关闭中");
- C' G$ N6 @! f7 g - BlinkerMIOT.powerState("off");
2 Y7 e7 \# l* ?0 u5 E - BlinkerMIOT.print();; M9 y# N4 t; Z! U, u1 v
- }
3 o7 R& s% l* Y+ E0 i -
& b" B2 B' j9 U9 V -
8 }7 j9 b% V E! M - }
' L$ U9 Y3 G) g; l5 g$ ?$ E - //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! e; j, B* {8 L' k6 p- w
- //*******如果天猫精灵有对设备进行操作就执行下面3 h& P2 K! s* j; F
- void aligeniePowerState(const String & state)1 s9 L/ j% C3 y5 Y/ T1 m- k
- {: v' C" D ?& q, c- V
- BLINKER_LOG("need set power state: ", state);
0 k4 f7 _' e) n7 j7 r- [! K; | - if (state == BLINKER_CMD_ON)
$ t6 X+ h- p" q3 C3 B - {
( c" F# Q# h2 B A7 a - / O" ~ w. y# w# ^/ l" Z4 P
- digitalWrite(kg, HIGH);
: w6 v& b6 o0 N' q! ~- y - digitalWrite(de, LOW);- u) \! R5 n# Q
- Button1.print("on");
6 r/ \- d, x' I6 O3 P% K, c) z6 p - Button1.color("#0000FF"); //设置app按键是浅蓝色2 @5 [: |( T: F) G' O
- Button1.text("开启中");
/ J) Q* o$ [/ O \ [ - BlinkerAliGenie.powerState("on");
3 I; x. m4 [3 D/ D7 V+ J - BlinkerAliGenie.print();
# P/ f; q) j, W" d7 p" q6 J. `4 \' j - }1 ]: R0 _6 J* d/ f
- else if (state == BLINKER_CMD_OFF)1 a) @; m( a0 U F
- {
5 ~% s g" S" S6 K9 A - h2 a; R/ n2 ]) f- b3 t( V% ?6 ]
- digitalWrite(kg, LOW);! w9 D% \$ T# E0 N# D' j. o
- digitalWrite(de, HIGH);
9 L! C) E6 r$ z+ S - Button1.print("off");0 t/ @5 b7 s+ `% x- n7 N. T* Q
- Button1.color("#00FFFF"); //设置app按键是深蓝色 F0 i* T& o- N0 Q4 h8 j$ x- u2 M. K
- Button1.text("关闭中");
4 o$ g* j" W/ M6 b0 V- O+ R4 B S - BlinkerAliGenie.powerState("off");8 o4 i. w k5 M) e1 d$ a* b
- BlinkerAliGenie.print();
0 S/ T8 U: c5 e$ {; |4 B3 ? - }5 O" t4 F1 F8 E
- ) D) O+ a# z+ s% v% k! w" A
- # o' V) p! ]8 O. X
- }! z Y: r8 n* o8 D6 a! |4 L5 v4 }
- //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次4 I0 g: n' }; r% b/ m# ~
- void heartbeat()
$ K) ^0 M4 P0 Y' ]) R0 k' Z - {
; H) R& y4 q! P' B - BLINKER_LOG("状态同步!"); & x7 w) G# `5 ~/ x; J2 `5 z
- if (digitalRead(kg)==HIGH)
3 n7 d% `! ]( Z9 c2 {' l5 U - { / k5 l- a" ?; H# G" F
- Button1.print("on");# M0 N3 G [( g1 [, b; H
- Button1.color("#0000FF"); //设置app按键是浅蓝色
0 m( o+ P f7 E2 E% {# X1 w - Button1.text("开启中");
; g5 b! T+ g. e* W - }
% H; e3 G9 h& T: g0 w g( T - else 4 _# P' r$ n* g; X3 f8 i c8 t _
- {
. l, C4 w/ V3 c% E - Button1.print("off");' V& ~" y; h/ A! k% }
- Button1.color("#00FFFF"); //设置app按键是深蓝色
9 D1 y7 C6 r, y2 c/ s6 U( z. X - Button1.text("关闭中");+ Y5 e# \/ y6 X o4 H
- _- {1 W1 I5 [7 J5 S
- }% X& \8 e. _+ K9 S, l
- }( J5 ]6 D w/ i, }" M
- //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++& y8 ~1 M6 Z. |/ _( t3 d
- void setup()% {5 Z3 n: V2 v$ _% [% Q
- {
8 ]* f% E5 l' {/ r/ i0 E - // 初始化串口" q/ L- ]! A8 q9 E! ~5 S, Z B& l0 @
- Serial.begin(115200);
7 _( h5 Z5 {! v1 @/ }0 e" [/ q - delay(10);* B) Q1 l) \# t9 u1 ^+ w
- BLINKER_DEBUG.stream(Serial);
) @/ |& M; h* J0 R( R& @ - // 初始化有LED的IO ? m. K: A* Y
- pinMode(kg, OUTPUT); - P- p7 u: W! ~! p6 p
- digitalWrite(kg, LOW);//初始化继电器上电状态
" @7 F, L G: y5 J - pinMode(de, OUTPUT);
6 J6 P0 ~* w. K+ \8 c% V - digitalWrite(de, HIGH);
5 y( u- P! V/ s. w5 h( l - pinMode(key, INPUT); 0 ^" ^8 M& ?+ S2 ?) G% k# z
- Serial.println();: w$ G$ h7 l; N* b
- Serial.print("Connecting to ");$ t; ?- a/ U! T# s) u4 X
- Serial.println(ssid);' R- v0 D1 q0 _! Q* G! |
- WiFi.begin(ssid, pswd);
* Q a3 z% o. O - while (WiFi.status() != WL_CONNECTED) {% I. k! a4 s+ ]3 a
- delay(500);) Q7 Q2 ^$ @2 v% e1 Y3 ]
- Serial.print(".");' W; S4 v# s" e- O
- }7 J: |+ R$ E- I- i* J
- Serial.println("");
( g9 G# e5 R, b9 R - Serial.println("WiFi connected");
`! G1 K; N2 N1 G+ Z - server.begin();
8 ^0 J* d! W. k! J - Serial.println("Server started @ ");
& L5 k+ f5 {" [: O4 w4 F - Serial.println(WiFi.localIP()); m' o- _* o6 u2 @* `5 ]. I
- //打印出IP地址,后期可以制作显示器来外部硬件显示ip
* t( q. F" D. M2 m1 X; s - Serial.println("To control GPIO, open your web browser.");. d' O7 ^% G/ y# O6 x9 K
- Serial.println("To set GPIO 0 high, type:");2 g+ B* P! y2 E4 P
- Serial.print(WiFi.localIP());7 H5 J7 `' ]+ M8 D
- Serial.println("/gpio/1");0 H/ B; Z" w, N# I7 r' a9 w
- Serial.println("To set GPIO 0 low, type:");
% b9 G& F1 B/ I2 K7 |+ Y% `4 ?! } - Serial.print(WiFi.localIP());
7 ~- v$ d3 c6 b9 S - Serial.println("/gpio/0");' v; Z9 n f' P
- Serial.println("To toggle GPIO 0, type:");
" p( _/ j/ ~9 T/ D% S. k - Serial.print(WiFi.localIP());
7 E. P9 a" E/ K/ q- F - Serial.println("/gpio/4");
5 Z% }8 L; s% l$ v% R( C8 v% t+ g1 ]& D - 3 w4 g" F Y; j4 F$ }0 X
- // 初始化blinker1 M: Y; _. @4 d3 T
- Blinker.begin(auth, ssid, pswd);
5 w& H1 r: J6 _' I' C% O2 \ - BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数' q2 i6 U2 |4 K, J
- BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数
% z9 R4 S+ n; ?% F& @ - Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。
- A' B" g/ g2 R# x" ^) ^, b - 4 H, B: v4 d; [8 X8 o4 b
- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback# a7 x3 l: Q+ C, Y8 V* L( U c
- }
, v3 e O, h6 p( E" K - void dataRead(const String & data): F, c- b: b1 a4 w5 I
- {$ U3 M( }' w* a: a' p
- BLINKER_LOG("Blinker readString: ", data);
7 X5 l" U U. R9 u+ |9 v
2 d8 R5 H \) ~( c8 E- Blinker.vibrate();
! `' T/ b K" m' C+ T - # O4 s8 v% F9 P
- uint32_t BlinkerTime = millis();" N3 n5 [# k, [! ]2 L
-
: a2 X& X/ R" W) { - Blinker.print("millis", BlinkerTime);# p; F- |3 V( v# u7 V, m
- }
" @% M8 C5 v4 T: g& H4 b: Z, m - void loop()
6 F: E4 e. c, O( V0 b* y) H - {
- ?, w" G' Z6 p h- P# S - Blinker.run();
) {! L5 \8 O6 f& |; t - if (digitalRead(key)==LOW)
1 w$ g9 t( w+ N$ X1 D4 [ - {3 Z8 W6 ^3 ?5 A& n0 s
- Blinker.delay(200);
5 w: \% ~6 ^' A- t, Z - if (digitalRead(key)==LOW)3 O4 g4 r3 S( F
- {
+ b2 D# e% t& }. E3 P9 S" J: `3 x - if (digitalRead(kg)==LOW), }; ]+ A/ O7 \0 E
- {
) s; u& ]: ?. G7 o: D - 0 D' T5 R4 ?" [# h
- digitalWrite(kg, HIGH);
! d* n; n' F/ O, I J - digitalWrite(de, LOW);& U& O# t$ m0 Y: @& |! n
- Button1.print("on");
' Q( p# H# m6 K - Button1.color("#0000FF"); //设置app按键是浅蓝色
; M% U" S, p* L) K L4 G4 g2 c) f, c - Button1.text("开启中");8 O' n% y1 X/ @& ~+ H
- }% w/ a. d! \0 c! p/ j
- else if (digitalRead(kg)==HIGH)- l4 t a7 v8 l6 m% x' C( a
- {8 b4 ?$ E: j; O! b5 N2 Q% `$ G% `
- digitalWrite(kg, LOW);
' r( r* N) y* M5 A8 K7 V2 L' m - digitalWrite(de, HIGH);
1 N, T3 R% a, ?& a2 Y ]/ N* V - Button1.print("off");+ @" \ u0 ]. E- }
- Button1.color("#00FFFF"); //设置app按键是深蓝色
6 \+ G+ P) a0 p' l) m; t) U - Button1.text("关闭中");* K3 ]/ w& z: S6 J& W
- }
- R! H: S+ o9 u( R1 } - }
( w/ ]% `* ]1 l/ T+ Y - }
) Z# ?: c8 W7 o* C3 b - }
复制代码 ) A O# O2 j+ _* r. N% H
+ q" A5 s7 j7 o" V
我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html9 M8 f5 {8 x( C# R" ~
- ]8 Z- c8 v7 }# T
把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。
. u" Y' p- o9 J5 e- F3 G, f/ _( |% O5 @$ n# X
2 E& U( z- h0 n2 b0 L
|
|