|
|
本帖最后由 易记 于 2021-8-21 14:05 编辑
. g. R8 d9 h7 S: l# a4 G/ t8 t4 B
: B* E; L4 X7 f7 ~" y7 W2 P1 R9 O最近玩ESP8266,想做个天猫控制开关。
! s! g. B7 a2 Y, b( k X, u但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。% O) I& C$ x# l
还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。
; Z; q) [7 L. @- |" j
) b" k4 T Q6 l$ _: d6 [. v5 C
: k- {$ ^) K; s5 _5 ]6 S
& b% l3 I6 I2 K# Z7 I
问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。* Y' W: x7 ~2 O, C# X" U
: D+ W5 ]4 E6 l7 J2 a
: ?' |* i# I- V5 _% C9 g* V
2 }1 m" I' Y: ]# S3 ?- v0 i$ H# K; V8 w* j! D0 H
7 T% Y3 A' g8 l) w: e8 a2 C
到手,当然是拆拆拆。+ j' [7 a0 G. A. R/ z9 Q
, |7 s; ?+ t/ ^1 T
" t. f6 s: }: G. J7 X/ E, D
( d, e- B# b [* a) m' D7 S联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。
( g, K: \0 m1 `1 t% _3 m3 Q- M
p& I: i: d8 q: P3 N
7 k* m$ Z3 j0 S: T8 B6 W% j" i+ G! V0 i
继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。1 o0 x/ M% s0 T+ [) T" W, m4 d
) ~! i- k" w% _. K+ ~0 V
2 i$ v6 ^- F0 R& k! P+ b
) _) u, H/ a0 Q' O
* l# S. \ F$ z5 q电源芯片+ v" M, \5 s$ ]- O/ q/ p/ {
' K7 ^ ~/ ?- V+ X- Z. z4 h. p6 z+ g; ~3 N0 M9 ]
+ D: T+ I: w2 v) x
有一个按钮,按钮有二个蓝色LED灯4 K( a" s0 K- ^
% l! ?2 i! j; q2 O' L; O+ T/ g% V' e6 k9 F; n
! m; E1 r% [9 V- V) L8266
4 I1 r! D. ?- u2 r
D6 r- `. C. s; w/ J( w0 B4 j: [# C% `7 o, ~; T" R
$ Y$ d0 `: v2 @6 {0 s1 j4 \9 W
9 G* x$ P: M! n' I
接下来就是刷机了,版子上面都预留测试点。4 j: a& I3 j8 A2 S# ^! i" k
接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。1 `/ c; w0 I% ^4 o b9 ^
. k% i" V8 U) J
注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。
( n: ]6 c& u7 e' H0 o要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 | : W: o3 L4 \/ {5 \) {
3 S, M6 H7 t8 A( t( F, g" s) A- a2 \5 ^3 P* F
# L0 `, J+ V V" n
: h, O2 b3 s6 d$ @
9 {. j- y' X- y$ U. F 5号脚位是继电器输出4 X; F6 q) }# A/ g1 ^6 ~' b
12号脚位是灯输出
+ r% n" \$ w2 w7 J; b 4号脚位是按键
% D8 W: Y: T3 R6 \7 e' h1 J- l2 y4 x# W& k
2 A8 t* n! F5 v' }: m2 G7 S! k
- z4 a: s, T/ B; u% Z( t. U
, \$ X. J/ y M1 B% |0 v
卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库
. p/ S* p3 f5 T$ I7 b' k8 ^ - #define BLINKER_MIOT_LIGHT // 设置小爱灯类库! I: Y, v) J% p/ r4 K) z
- #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库+ v/ S3 f- W0 k8 \3 V
- #define BLINKER_PRINT Serial //串口协议库# o2 C8 a* A8 `$ W
- #include <Blinker.h> //官方库
2 e3 b$ m! y* |+ r - #include <ESP8266WiFi.h> //官方库
1 e( \9 v% w( B; ?, z$ e7 d/ o - WiFiServer server(80); // 服务器端口号
) J2 r/ }5 m+ K6 |8 H- a9 \ - , j, J5 x: A0 f8 v$ G
- char auth[] = "c4942fb1d5e4"; //设备key( ^) m) A8 u$ J! U+ E2 L0 G
- char ssid[] = "wanboshi"; //路由器wifi ssid `2 b& g0 l3 K! l
- char pswd[] = "1365662999813586348220"; //路由器wifi 密码
$ Q/ B& K8 [' o+ _4 D
6 F% A' @: \/ {4 S9 E- bool oState = false;
" ?* C% ?/ r, o' l
. I) b& M3 ?2 B) t: @1 e9 ~- y- int kg=5;//继电器输出3 b* `2 A; d4 m) g5 Q7 y+ Z% x
- int de=12;//灯输出9 s0 W5 a( ~4 X5 H! O
- int key=4 ;//按键1 r. X7 |1 E/ n& a) t: y/ U4 E
- //*******新建组件对象
+ `% D. { N+ T1 B! g7 y$ g3 K0 I - 4 t4 i, {. V+ `* X/ ~7 }
- BlinkerButton Button1("btn-abc"); //设置app按键的键名6 T J) Z2 J) |7 t6 q8 K
- //*******app上按下按键即会执行该函数app里按键, H5 Z& @0 v4 V3 T( |2 B, w
- void button1_callback(const String & state)# v. b3 t2 ~1 C" d" z+ D0 j' y
- {: `9 W% _. M {3 Z; B) A9 H3 N
- if (digitalRead(kg)==LOW)
4 }" H! S1 c+ Q8 G - {- V/ g F& s, r: ]0 `7 |
- BLINKER_LOG("get button state: ", state);
- P2 e" F, U% {/ ?$ U. }3 w, T - digitalWrite(kg, HIGH);
% h/ y5 y6 S$ g$ `3 x& x - digitalWrite(de, LOW);' T- n) J' Z# Y
- Button1.print("on");# _- N$ i! x9 x6 m r: ?4 ~
- Button1.color("#0000FF"); //设置app按键是浅蓝色, z+ {, R& H% d( P2 q( ^. h) x
- Button1.text("开启中");5 F! ] Z' \1 m" Q( P
- }
: R$ w# A, O9 y. R J" B - else if (digitalRead(kg)==HIGH)& `& i9 T% G, h% u
- {
) z: X2 N/ E9 e n( C - BLINKER_LOG("get button state: ", state);
" C* V* }9 }" _/ d1 f! x - digitalWrite(kg, LOW);0 K4 c3 ~" |5 W* u" T" J
- digitalWrite(de, HIGH);
% p' m5 A6 y( H8 f - Button1.print("off");
7 ~! v" d8 u9 ^) v - Button1.color("#00FFFF"); //设置app按键是深蓝色
6 J: ~4 ], r8 R5 ? - Button1.text("关闭中");" m1 x! n% P. a$ [/ d0 m: w) `! O
- }
8 B3 }5 ?6 U# y q - }. [' p5 _+ \6 P% E+ L) C: u& F) K0 T
5 B8 W. i. Y& I* @4 I+ v- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 q' K' v+ ~" e7 Y2 Z
: i# V- o# ~; z# }$ e% b& _- //*******如果小爱有对设备进行操作就执行下面
' ~6 p3 [. a1 U8 _: e' {$ d - void miotPowerState(const String & state)
, V; l+ ] ?8 M! v3 P - {
9 V# T0 l+ B2 Z/ L6 c8 ^ - BLINKER_LOG("小爱语音操作!"); //串口打印
9 P4 i& q. K% w - if (state == BLINKER_CMD_ON){7 [4 d9 {! K! K0 P
- ; M" y* ~& @( b; x
- digitalWrite(kg, HIGH);0 r( p: s- i1 J- C5 Z0 o7 h, b+ w! ?
- digitalWrite(de, LOW);
# t$ Y8 ~; L7 h$ G, } - Button1.print("on");
" t6 ?2 |+ h2 r# |5 x - Button1.color("#0000FF"); //设置app按键是浅蓝色
) m$ b4 ]' l8 H. y" l6 p% \6 c - Button1.text("开启中");
2 ] J& {( k. \ - BlinkerMIOT.powerState("on");
; _% Q4 ~' A! x0 M( b4 O' u1 S) x - BlinkerMIOT.print();2 K$ D8 |5 }7 y2 [
- }
+ u; o5 {% P9 Y& Z0 Y% ~ - else if (state == BLINKER_CMD_OFF)
8 e" Z8 o3 ]! k. X - {
8 y4 Y* S, v7 s' V: R' Z - ( D1 V0 M: _7 _* c$ y" M$ T/ P, `# S
- digitalWrite(kg, LOW);
5 f0 b& R, S6 q$ Q, \ - digitalWrite(de, HIGH);# N0 w. r: X6 e% Y" {+ e
- Button1.print("off");8 O! _: C; B& i) X1 ]" X
- Button1.color("#00FFFF"); //设置app按键是深蓝色
: j+ o3 I/ [1 M/ U# U$ Q# w - Button1.text("关闭中");$ j9 s3 l7 Q' [, |8 B9 s- g: s
- BlinkerMIOT.powerState("off");
& E# |7 F# G1 Q8 D2 N6 n - BlinkerMIOT.print();
& z3 K/ a4 S" c4 h' N: | - }) D c6 k8 U+ n0 P
-
6 z! d$ L( d# O3 i2 i - $ k& J: \. _1 Q- Y- X* c5 ^/ R% W9 N
- }" _/ h! W5 Y% C8 Y$ o; a. f
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; F7 B- i7 S$ n. N6 a/ v3 r" M, @ - //*******如果天猫精灵有对设备进行操作就执行下面
. q7 ]1 K$ O% ~' ?, ? - void aligeniePowerState(const String & state)( ~% X( b" G! v# z
- {3 C0 F$ I5 I4 Y* ~5 S) |$ A
- BLINKER_LOG("need set power state: ", state);4 I% K# a! G4 J) x% v% y
- if (state == BLINKER_CMD_ON)
f$ |2 c; L& w+ ~/ E( y' _+ M - {$ y; d7 d8 h! U/ n e
- $ _" H6 L# ]" \( g, A1 L% o
- digitalWrite(kg, HIGH);0 |" P, b: m! b+ I8 S+ ]" e
- digitalWrite(de, LOW);7 _6 k9 |* I% q4 ` v. p# m
- Button1.print("on");2 ]: C, s6 s6 r4 o& T- @) I7 _
- Button1.color("#0000FF"); //设置app按键是浅蓝色
0 \. i. i& `7 n% v6 ] - Button1.text("开启中");
7 p3 f( }+ ^+ F" U - BlinkerAliGenie.powerState("on");/ S" Q; `( x9 J, G2 S$ y
- BlinkerAliGenie.print();
0 q. m# e0 h# H+ r6 v/ ^ - }
( P& U/ I; W* ?3 e& L# D - else if (state == BLINKER_CMD_OFF)5 X: D( L8 n2 H. f
- {, d* M3 i6 o; d) G
-
' u% u% f$ C. ?- j3 B - digitalWrite(kg, LOW);
9 [3 n$ M: m5 y - digitalWrite(de, HIGH);
) [0 ^0 \ Z5 C5 ~ - Button1.print("off");$ H, ?! S0 K3 { O, I- S
- Button1.color("#00FFFF"); //设置app按键是深蓝色: }/ f# y! b/ o; P; z
- Button1.text("关闭中");
& S9 s! x* w; R$ l, ` s4 { - BlinkerAliGenie.powerState("off");/ Z4 n& N: S2 I- d* D
- BlinkerAliGenie.print();
% s3 B$ n% h' @5 S - }0 N, J5 |. c' y' P! g' B
-
/ U' U8 ~# P$ O2 A2 X4 U3 ~
) C! u z7 _- j i3 n- C- }2 i3 ?% {+ F, L1 J0 {% W% Z
- //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次% ~; [* R# M! v |. s) X% A+ x$ p: T
- void heartbeat()
+ g2 _+ S+ `, C- A8 E# w0 r - {
/ O4 F% t- t# x. y - BLINKER_LOG("状态同步!");
) [) F7 N# }" i+ G - if (digitalRead(kg)==HIGH) $ u# H. \( u. j; J* J
- {
1 w. P7 Z! l, _; J6 H - Button1.print("on");
. ^/ @' o. W& m - Button1.color("#0000FF"); //设置app按键是浅蓝色
2 H6 O& h) U/ O* R: } - Button1.text("开启中");
, A9 D& v4 U8 N8 O n - }
B; t1 x0 F& Z' J7 G - else
2 Z% N* I: R6 @. E w: _3 J - {
6 P1 V1 g' J7 h* r - Button1.print("off");
: H6 q. L& a( I5 v& C; Z( I - Button1.color("#00FFFF"); //设置app按键是深蓝色, M3 i* U' ?- b% ^
- Button1.text("关闭中");
5 j# v% u- X9 }3 {3 m( W# e& B4 Q0 i -
8 S2 k1 d+ r/ E0 z - }
, q1 R! J8 ]* q) a) Q; E1 ?& i - }
/ ~/ ` f) n$ D; N - //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" W8 n) T+ s+ k
- void setup()
6 v+ y: v6 O {$ B* g - {
4 J; i+ O( t: s0 n, C - // 初始化串口
; p; K4 ]% u V9 Z' K4 K, l4 {0 O! U - Serial.begin(115200);
- P& P" [4 w, Y. q1 S3 q - delay(10);7 M! O' B- C7 }2 `! P8 r+ S
- BLINKER_DEBUG.stream(Serial);
* |5 Y! ~# d$ w0 {( P - // 初始化有LED的IO, E' y) C% e9 Q1 t+ J& @
- pinMode(kg, OUTPUT);
- x: q7 P" u9 K" z# K7 r' m - digitalWrite(kg, LOW);//初始化继电器上电状态 : g- O3 d: o) J3 v
- pinMode(de, OUTPUT);9 T3 Z; R w% p2 S. l5 O% a8 G$ t
- digitalWrite(de, HIGH);
! U+ m( o d/ u9 } - pinMode(key, INPUT);
$ I" b8 |0 x0 |/ i# h! r - Serial.println();" j& g- S. @% B# @& g8 ]
- Serial.print("Connecting to ");( ~, K5 X' }, y8 K
- Serial.println(ssid);9 [2 [ T4 h2 H ~; F
- WiFi.begin(ssid, pswd);1 i, c% d( h; F
- while (WiFi.status() != WL_CONNECTED) {
. n: d o0 b2 u- Q7 z5 `+ a - delay(500);
8 g7 \6 k# U6 R4 Q - Serial.print(".");
: g" P. R, y, |' u- [" [! d7 y - }/ K6 N& ^0 u' Q ?( j: Q/ S( K
- Serial.println("");% I- L+ o& Z6 n u
- Serial.println("WiFi connected");' p+ O' [- [7 q8 A/ Q2 D+ ]
- server.begin();
$ \1 P$ N9 {1 K( l' Q# u; Z - Serial.println("Server started @ ");/ B/ u2 Y# C' b( ^ z
- Serial.println(WiFi.localIP());
' G! I7 p# P6 k2 _6 d H - //打印出IP地址,后期可以制作显示器来外部硬件显示ip; ]% j4 n* e& G6 e+ r! t6 C
- Serial.println("To control GPIO, open your web browser.");
4 s4 c g9 R3 _9 N. d) h - Serial.println("To set GPIO 0 high, type:");
j6 \ n" K/ L& X1 N3 e - Serial.print(WiFi.localIP());2 `# y7 J3 J0 F7 W7 w
- Serial.println("/gpio/1");
* X( l# ~$ O* Y3 D) H7 @+ |1 O - Serial.println("To set GPIO 0 low, type:");
9 L5 \) x2 S1 G! X/ H, Y/ j3 d - Serial.print(WiFi.localIP());0 q* b ^" b/ U& b+ _
- Serial.println("/gpio/0");/ r, H3 |: k3 P' y* C9 p& Z1 r
- Serial.println("To toggle GPIO 0, type:");
8 |; {; |% _) q6 v" k - Serial.print(WiFi.localIP());
. r' m6 L7 K6 H( e - Serial.println("/gpio/4");
9 j- k- }6 }: e3 R - 7 X7 G4 R( Z) k4 _+ z
- // 初始化blinker' k6 H, h, W4 \ r% T. Y" P
- Blinker.begin(auth, ssid, pswd);
8 J: C5 a5 x- x4 D# i# i - BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数6 [+ x6 B# X6 R# J
- BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数, Z+ ^3 B& j. z, X
- Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。( N0 S& E# N( N Y( G3 R+ j
8 s/ o. M& p9 I( A$ s- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback
+ W+ [& T& s5 |' G - }5 t6 |# H5 p8 x1 D1 m% D5 G+ A$ {
- void dataRead(const String & data)5 I% E2 X' M: N2 J% n
- {7 O% x! B, i# K3 Q. T# U) Z; U
- BLINKER_LOG("Blinker readString: ", data);
" h/ V- s5 y7 b. t( M - / a$ L6 g A) V# [
- Blinker.vibrate();
$ \' Q" H/ X( Q1 Z8 o - " c* G8 P; H+ c3 B1 E
- uint32_t BlinkerTime = millis();; i8 \; C, l" Z1 k+ J. Y0 a. g: A
- % P. _% A- x- t; l& h
- Blinker.print("millis", BlinkerTime);
4 M0 k; Z) l. `% u. w - }
' i: q9 R6 `: F$ `! f - void loop()* F) f- O. c# C. R, B' \
- {, W% } a3 n6 x6 P" ?& O& l0 Q
- Blinker.run();* i3 v) K( g+ P( @0 ]4 a
- if (digitalRead(key)==LOW)
6 G; k# I2 v1 T9 ? - {
- i. {- {. V9 l - Blinker.delay(200);0 c' _; |5 i- e9 H+ C
- if (digitalRead(key)==LOW)
4 ~3 N- _4 T: r8 E; P - {
2 O+ ?" B, \$ z0 { L* F5 R - if (digitalRead(kg)==LOW)
- a4 q5 ^0 g1 Y# a - {
( W! `% `' l2 u, U -
. o# A0 _0 E4 \3 b# D K" w% ^ - digitalWrite(kg, HIGH);
3 a2 e d3 _! O- ^ - digitalWrite(de, LOW);) h/ i, z4 r- e+ B
- Button1.print("on");/ m# U, @: e2 _
- Button1.color("#0000FF"); //设置app按键是浅蓝色$ G) Y7 F( ^/ e7 h" p. N& A, y3 d. o) Z
- Button1.text("开启中");' [+ z& ^2 j+ w- |8 T
- }
% I0 Y; J( o: D S - else if (digitalRead(kg)==HIGH)7 r7 h' K- j B9 m- e0 D
- {2 T4 o. Y" j/ E0 |9 j
- digitalWrite(kg, LOW);
5 A* r- g% v: x9 q6 V5 k - digitalWrite(de, HIGH);( L* e3 `; Q! R) l N* _
- Button1.print("off");" o7 A5 k+ ~1 X% \0 F- U
- Button1.color("#00FFFF"); //设置app按键是深蓝色- A: p, [, I; o3 i. H
- Button1.text("关闭中");& f9 @% M d6 z9 G" m
- }2 Y+ d* p* |7 Y6 |
- }
4 r$ ]* p$ @% N6 l* k3 H - }9 O4 Y1 g' A$ H! h% u
- }
复制代码
5 b: Q& z$ S- R; l1 T9 t; C$ r T: \( C1 F% z2 X; ^% y( b" i
我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html
' J# p+ r5 d& h1 A- t& `0 R; R) F
7 R5 T: s/ I6 u% W" @把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。
. A6 }( L# T; [, J. n" m/ `, R/ y0 G7 ]" p
0 ]8 [ j8 T: X f1 m) m |
|