|
本帖最后由 易记 于 2021-8-21 14:05 编辑
9 N, p0 e4 j7 ^- M- x! Y, @- Z$ j8 b& s: B* M3 X
最近玩ESP8266,想做个天猫控制开关。$ e6 C; G8 L% C# t/ m
但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。
( l r2 a$ ~* B0 [0 p& d5 K5 E$ F还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。
$ ]( Z) I% s( a' V, `
: h( c& y* Y8 l4 y9 t' ]
$ g5 J: t; l3 L4 V
# p3 i9 ]3 x/ n ^问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。) {8 e/ `. ~2 H' g) f
$ Z: g+ m+ R0 J$ K; k) z
$ `( N) Y5 I8 z
1 E& a2 C. q2 ~, k& g
' ~. {; P3 p, l* G% }
% C% h2 L- w! }3 c# d( A/ d/ _! t
到手,当然是拆拆拆。* D0 L1 R% q5 i1 m
G5 ~: T, G) \, ~# A
7 }% f3 }8 E6 Y7 m) S
6 C# \* V3 ?, X/ P$ J8 A
联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。
6 Y5 B& n3 W8 O5 ~. \7 q7 n
% g; R5 Z$ G' |; v
% @; y! j' _( h1 X
7 d6 s" k, v5 Q+ w
继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。, u, w: ?* g$ u# ^1 e
3 Y+ p3 s7 c. {
0 o. z% \7 O8 |$ \9 B- d
I" a4 r6 Q5 |9 F
0 p" M$ Q& p/ V电源芯片
1 w5 [& N) p: y+ D$ ^6 C* i) H! U
8 p4 d" ^9 {9 @ I# U" R8 z5 m* W
% a: W# K n/ p0 ^7 P
$ }$ Y; k/ L) L有一个按钮,按钮有二个蓝色LED灯6 O* D9 M5 x v( k
9 [5 M0 _# Z. I9 e) K
" m, c' J$ r1 G# V2 l! o
I# S+ \. o; N! _8266
+ t* M- }" D3 ^7 J% n
9 o. |+ Z* O$ x$ ~
, k( u" _" o W1 j4 B9 b1 Y6 X8 u2 q2 v# c6 F
& J2 `5 g7 K, q2 H2 }# s4 R5 W8 Z# C$ `$ ~$ L; Q1 r" f
接下来就是刷机了,版子上面都预留测试点。
{+ @0 R& _0 m% s接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。
! Z8 d/ U s& r- D$ \8 Z
/ c! R3 z4 M$ X7 T I
注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。/ Z- N" [7 J* O n! Q9 \0 V
要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 | 6 _6 x6 j# s G
. r9 V6 Z2 G I) }, I% U/ `2 }# t8 [& K
, K4 T/ q4 l3 U4 `9 ~/ V, o: Q9 P! [( u' s. f6 A5 U- ]
& s) L* Y- k" `# Z7 a3 |: E
5号脚位是继电器输出2 k2 L9 v, s/ H
12号脚位是灯输出6 o" p1 E: {+ @. u( \
4号脚位是按键& K$ E% Y& v2 {. T- u0 S5 [& |% B
; o% ^" C3 L8 I6 s% L0 E
0 b. Y0 t( v ]3 z4 R+ L% ?
. U, [2 e; ?5 q; @7 r3 H6 l' k. a2 p6 a$ P
卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库
# f+ r4 F) E+ \0 @ - #define BLINKER_MIOT_LIGHT // 设置小爱灯类库# s) B1 s2 R; \; D
- #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库
" }+ ^+ i6 r; Y S - #define BLINKER_PRINT Serial //串口协议库
/ C s# U& ^# h4 G! e - #include <Blinker.h> //官方库
( G7 O% ]* L+ o4 h6 | - #include <ESP8266WiFi.h> //官方库4 @* P0 @. u1 y. _8 e
- WiFiServer server(80); // 服务器端口号8 \! c$ |& Q6 L) U# S( E8 E
- ) y& m1 s. s* o" C7 m+ H/ W6 d$ \
- char auth[] = "c4942fb1d5e4"; //设备key, A9 ~2 J# j( w, H, x$ }" X
- char ssid[] = "wanboshi"; //路由器wifi ssid
$ ^: o: R. z; t - char pswd[] = "1365662999813586348220"; //路由器wifi 密码
: j* K3 e, N$ h0 B% ^ - 8 p8 v6 V( J+ d9 E/ L/ C
- bool oState = false;
# q0 a" Y( P% F - ! ~! N3 h( L+ m* `
- int kg=5;//继电器输出
) P" _: s3 C/ m7 f" F - int de=12;//灯输出
$ w* ^& S- j2 A* R2 c! k - int key=4 ;//按键
% c& D+ ~; S s$ K9 n - //*******新建组件对象; o( O; G2 D5 \0 x& T: [+ J# ]
$ c# r+ m- }) s2 U* s% W- BlinkerButton Button1("btn-abc"); //设置app按键的键名- c/ k# w6 h- {1 ?! d, W
- //*******app上按下按键即会执行该函数app里按键
- g( g* U/ F7 f& C% V: T - void button1_callback(const String & state)
/ d- f, N* C+ [; h" ]0 t- H. n - {: ^' R1 _; a5 {) }+ d; a
- if (digitalRead(kg)==LOW)
6 F& p, H! E0 @ k5 m, R6 }) [ - {
2 I+ p& B; s: m - BLINKER_LOG("get button state: ", state);- }( I; p# V+ {' F3 M
- digitalWrite(kg, HIGH);
1 a& C( G& e$ o - digitalWrite(de, LOW);% Q2 a+ c# t& ]& _" X# E* F: } o( g4 f# z
- Button1.print("on");
) O% ?: F* u% d - Button1.color("#0000FF"); //设置app按键是浅蓝色
; A) K3 [" P# n3 C0 B; e. \9 |6 A - Button1.text("开启中");# Q9 E6 P* d! v' {* d" P Y
- }
0 E2 e$ k* u9 I( m a2 \ - else if (digitalRead(kg)==HIGH), l1 f/ M. d" H1 \- B/ U
- {
' c8 O6 `1 ~) J/ k - BLINKER_LOG("get button state: ", state);, K3 a/ ~( M9 j' N
- digitalWrite(kg, LOW);
8 f4 d8 [/ D+ Z: K9 M7 Z) ]! l - digitalWrite(de, HIGH);/ ? K: b/ V; d) b* D
- Button1.print("off");. a6 Z M/ ^4 \
- Button1.color("#00FFFF"); //设置app按键是深蓝色
: l3 _& @8 v+ b2 ?* o* \; H - Button1.text("关闭中");
9 A) j* @$ B1 C* B1 c4 T# p4 u - }% y$ c, @+ U6 h- n
- }
$ M$ z, F8 y9 o) H% W - . O8 ~/ i* ~ u) E! T
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
0 I+ d+ S( {% T# l/ Z - / C0 o% X+ S% s [: z
- //*******如果小爱有对设备进行操作就执行下面- }% c' i; I; x. X# P) B, k3 S
- void miotPowerState(const String & state)) L- j0 C7 n+ H; L
- {; _6 Z- Q) U# e4 K' @! I
- BLINKER_LOG("小爱语音操作!"); //串口打印
3 j- u* |' d" `6 F+ B1 u - if (state == BLINKER_CMD_ON){
" F( W4 m( s3 b; E -
0 N, A' s% W4 X9 l+ U( Z4 ` - digitalWrite(kg, HIGH);
6 j7 m- w4 N1 ^7 a% N+ } - digitalWrite(de, LOW);
K( K' G0 X9 ~3 R$ }) v - Button1.print("on");
1 N/ A6 `$ i. y - Button1.color("#0000FF"); //设置app按键是浅蓝色7 G$ L& f3 l. t: R. W! N/ r O
- Button1.text("开启中");' W) D% @; t" ^& S. o
- BlinkerMIOT.powerState("on");
& f, S. E* b* n7 V# s! _5 ?; R - BlinkerMIOT.print();* Y! x: {5 Y4 @1 T, ^7 C
- }, \& Y5 S; r' | s! x/ I
- else if (state == BLINKER_CMD_OFF)9 J# Z+ k5 N7 H+ C Q" `+ M9 i
- {8 b! j5 O/ p ]& J" L3 U0 ~
-
; s9 K8 h% s2 Z9 g. l* x$ J - digitalWrite(kg, LOW);
, O! |! V- ~0 _2 _ - digitalWrite(de, HIGH);
0 D. ` x5 M- ^9 G$ l8 p4 s) U - Button1.print("off");- ^9 ?% u! [3 y5 L: k4 W8 @
- Button1.color("#00FFFF"); //设置app按键是深蓝色% n3 O& @- c" B3 a
- Button1.text("关闭中");3 `' [ O$ R5 A1 n
- BlinkerMIOT.powerState("off");
* B, o8 B- V; i, ?6 } - BlinkerMIOT.print();/ L! Q$ P& a2 j0 P
- }$ |7 ?! j! i4 R! A T& |: }
-
7 } c4 D! W: j0 G% p4 I -
1 m( X/ W9 s C* L v" } - }8 U2 x: u+ J9 t" ?
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# ^% M- ]" d# d9 e1 F/ S9 X |+ Z3 W - //*******如果天猫精灵有对设备进行操作就执行下面
; I ^1 w: ]# ], H; T& w9 } - void aligeniePowerState(const String & state)& a7 a' n& k3 r4 F
- {8 R) ^* f: U! J7 d7 r& g3 \* c( ~) o. p
- BLINKER_LOG("need set power state: ", state);
/ l. _* `( M: u1 Z) N - if (state == BLINKER_CMD_ON)
: K0 j' u; k+ x - {8 Q7 c5 s/ \0 {: {0 D" u: x$ ~
- 2 t2 [9 D4 Z- D
- digitalWrite(kg, HIGH);
. }0 C. J6 ?) |9 Y# {; q - digitalWrite(de, LOW);6 A, v$ \7 H v- Q0 \, L$ N. f
- Button1.print("on");
. g4 L4 t _& {# q1 t - Button1.color("#0000FF"); //设置app按键是浅蓝色
o! \1 k/ M' [$ H - Button1.text("开启中");
$ N* B: P6 k& Z7 w, X% X2 P - BlinkerAliGenie.powerState("on");
- m& E; j! P& i3 Q4 E: W, ` - BlinkerAliGenie.print();
! ? P( O, T2 k( T - }3 C r1 u/ f: E
- else if (state == BLINKER_CMD_OFF). j: o& C, ^; z5 h3 z- Z
- {8 V- T" O! U. F/ \" @& o
-
) b! Y% p8 h; n% m! M# o - digitalWrite(kg, LOW);
9 R6 @7 N) n- I5 B9 T - digitalWrite(de, HIGH);" H, ` x; y; u4 f; C5 L
- Button1.print("off");) f" F, V& r0 L7 |
- Button1.color("#00FFFF"); //设置app按键是深蓝色
- l- x! O, D3 k, c - Button1.text("关闭中");0 `! Q7 y6 z# C; E% c9 Z( T C2 N
- BlinkerAliGenie.powerState("off");' r6 X7 D7 E: a
- BlinkerAliGenie.print();
" u+ P( C5 S( a) X1 Q - }
8 u0 p7 X+ x7 |" T7 T' b -
7 V2 U: ?- O8 H% t5 }! C4 R
, ~6 U! V# {4 a: \, D3 B* h- }6 f# r2 V5 a, r
- //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次6 B+ v' W% w. Y* m( A/ {. m
- void heartbeat()
* S/ V: Z% Y1 z2 U( X4 f - {% H& H. m6 h) g; [
- BLINKER_LOG("状态同步!");
4 K6 C+ { H+ u' H$ h6 u( Q - if (digitalRead(kg)==HIGH) / l7 k2 i; V8 F* w& l
- {
5 i$ Q0 k/ e E; ~! C5 _ - Button1.print("on");# Z* k4 V7 x, y/ g! a# m
- Button1.color("#0000FF"); //设置app按键是浅蓝色
) Z7 }5 c4 i& a% z - Button1.text("开启中");
1 x3 k4 }% }' ]9 h0 n - }
V( u! g/ _+ X3 ~" M, ^8 k - else
5 [$ ?- O8 T3 S6 u2 t - {
) z& Y& L: S3 ?" ?6 }5 `4 i. o4 a1 v - Button1.print("off");' |& s3 N8 q8 Z) P% J% ^
- Button1.color("#00FFFF"); //设置app按键是深蓝色
3 E% O+ I( V/ D7 u1 Z - Button1.text("关闭中");
{7 x. }" l- ^; m0 } -
0 @8 _+ x/ u2 ~: {3 p0 E - }, S2 w( X, X; y6 I
- }* n6 `0 L; L4 r& r+ a4 B% A7 E
- //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++* a* Q3 x g1 j
- void setup(); K2 Z- H) `3 ?. |3 ]# f3 {, U
- {
: o: ]5 o: P& I1 P" {' _ - // 初始化串口2 g c0 J! C! s( q- Q0 O8 L
- Serial.begin(115200);2 P/ R3 m" w4 ?
- delay(10);* O" n6 X/ K( m; X U
- BLINKER_DEBUG.stream(Serial);- z$ L/ |- h& R: ?0 w: j
- // 初始化有LED的IO
* p% a3 i+ b. [ - pinMode(kg, OUTPUT);
" k7 q( q( v- s1 f - digitalWrite(kg, LOW);//初始化继电器上电状态 7 ~ R; d% r/ u7 m
- pinMode(de, OUTPUT);; y0 p5 C8 `3 O. P5 Q% m
- digitalWrite(de, HIGH);
# v" q3 ?& O8 ? - pinMode(key, INPUT);
6 G R; R' [# ?, ^% f5 Y+ q - Serial.println();
7 F0 F/ {, Y4 B6 k2 X4 I2 O" j - Serial.print("Connecting to ");
/ y9 s* L) r) \3 C$ l - Serial.println(ssid);+ a0 k, r% Q( ?4 E6 s; }! u
- WiFi.begin(ssid, pswd);
2 U+ }% o1 ^7 ?# I - while (WiFi.status() != WL_CONNECTED) {
* J% e6 d) Y1 Z+ K. l1 ? - delay(500);
4 b/ n% G' `: C; ^+ S& M7 e - Serial.print(".");
, Y4 J7 c/ a' Y4 x5 W5 @ - }
& d) h( Q& g6 x1 f& D1 m# b - Serial.println("");7 h+ \6 |" Z1 `
- Serial.println("WiFi connected");
: d9 f5 g4 T9 K) p! ?# u - server.begin();: T, B& t0 ]9 I0 f- j
- Serial.println("Server started @ ");# E/ [, G; S* g8 A% R; \
- Serial.println(WiFi.localIP());
2 n1 J9 w/ g! x) M7 k2 T, L - //打印出IP地址,后期可以制作显示器来外部硬件显示ip
( {' ?. p2 d. o7 l" e. ~# I0 p - Serial.println("To control GPIO, open your web browser.");8 v4 D0 E. i/ M4 p
- Serial.println("To set GPIO 0 high, type:");* m" X1 X) B3 x) f( i( W
- Serial.print(WiFi.localIP());9 q* ?* ~/ k9 p6 F# D( G
- Serial.println("/gpio/1");
/ n W* X: E, V - Serial.println("To set GPIO 0 low, type:");7 H) ]- ?* h( V; |+ W6 c6 I- u
- Serial.print(WiFi.localIP());
3 J* j! n0 y2 ~+ F/ S - Serial.println("/gpio/0");
C& o8 d; c2 B. w - Serial.println("To toggle GPIO 0, type:");
7 R+ i' w1 H! V# J) | - Serial.print(WiFi.localIP());' Z1 A2 V* [3 k* g' U, n/ i
- Serial.println("/gpio/4");- I' N+ T9 z9 C8 R9 p- h
- D& Y3 Z# B$ l
- // 初始化blinker5 M8 J* o7 `8 d3 x3 \ S
- Blinker.begin(auth, ssid, pswd);
; p1 J+ v! X! F2 A" ~ Q0 ^ - BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数8 E3 j# l% L+ _. F
- BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数0 I! a+ B- [5 E& z5 B$ C
- Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。7 H1 n& s( z1 J+ Y" c' [
- ; L8 w* Z6 b$ S7 I
- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback
9 p" }+ O+ @% m0 F! J) K/ M1 t - }( H6 j5 \4 V) S" e8 c: k" \5 T% e% _
- void dataRead(const String & data)
/ M" W; V7 A. k, ?! }( ~& J7 M6 ^ - {5 R) c# m1 w: ~
- BLINKER_LOG("Blinker readString: ", data);
: d& E, p( O5 t - 6 I' p% w! H: ~4 @! z" z; v
- Blinker.vibrate();
, W; a w b: y# k5 i' J" X; j -
0 z7 K! v* M+ y( l5 h - uint32_t BlinkerTime = millis();4 s: y& x: L5 H' `- W
-
S2 `. k" V. ]$ Y - Blinker.print("millis", BlinkerTime);" U) ^7 g0 \0 x* A
- }( K4 a1 \7 ]8 z) a* u3 d" ~
- void loop()3 k, w& E( i g% X2 [
- {
+ k. M3 J: }# V( {. | - Blinker.run();
# ]! k8 R& Y- X; q3 M( N0 \9 D - if (digitalRead(key)==LOW)* Q% d* g' @& l0 ]
- {/ G. t8 ^0 L3 K4 L$ H0 j! K( t$ n
- Blinker.delay(200);
: [; n8 d/ ?, b( X1 Q - if (digitalRead(key)==LOW)
# M/ m6 g' Q4 O+ p" k( R# s/ M - {6 _" x4 v7 S; ^# E+ d
- if (digitalRead(kg)==LOW)9 W+ x$ v0 q9 c/ C( ?9 a/ @6 q
- {( F# p2 P* \$ [4 B
-
6 K" N L5 v1 T5 Z9 g4 q - digitalWrite(kg, HIGH);
3 \5 v% \/ j4 |# M# |5 p/ e - digitalWrite(de, LOW);
- |0 C2 D7 n9 u* _4 B - Button1.print("on");) V& i9 n% y4 A" w3 @1 U4 l
- Button1.color("#0000FF"); //设置app按键是浅蓝色5 l! |# V6 n7 ~8 Z
- Button1.text("开启中"); [: F$ D2 X6 G
- }
. X/ G$ d. V" J* P+ _' d* N2 _( J - else if (digitalRead(kg)==HIGH)
. P S4 ^# h9 o0 c3 V U - {
1 J# W {. X4 ^5 q0 U - digitalWrite(kg, LOW);6 w; S# w6 p1 r- U
- digitalWrite(de, HIGH);* W' v% n; V: j( ?, ?, n
- Button1.print("off");5 ?: _1 ]1 B7 U8 z, M' j
- Button1.color("#00FFFF"); //设置app按键是深蓝色0 x% o8 J9 l% k h" k
- Button1.text("关闭中");5 Q2 d* h# W) V( n# a7 q- ?
- }
7 q% W: \# m" N1 i' k5 Z - }/ X( K& Q" X* l* C* K* ~
- }
1 W6 Q# f a! q' G Z - }
复制代码
! g2 u5 H, V5 |& Y
7 P% V5 q4 x7 k( {我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html
* e2 m0 O+ |5 M2 o) g+ G& t+ g, q9 n: F# [
把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。 b5 S) \8 J3 H! ~5 w
; F4 Q7 i2 X: t& I3 F! z9 ?8 C
) ^7 i4 r F% f/ y6 v3 L5 a4 d0 |
|
|