|
|
本帖最后由 易记 于 2021-8-21 14:05 编辑 . l2 ?3 i+ f6 e( k, [
, Z' z6 u& _; l+ X5 C最近玩ESP8266,想做个天猫控制开关。4 v) v% E" y- F5 N0 _6 g
但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。9 m7 B; R8 K, u8 q8 U
还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。
; b' N/ t9 t/ C
8 Y1 l- b% X4 |5 t1 {. X! M$ w( R
2 U) L/ ^( h. e7 x$ u% f' ]: _/ X k
问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。" Q6 k. r5 J6 ~% ^# q
. R, ^; B0 k; Y$ @5 @
0 c& ~: o2 t- h! o7 i ^* o* [3 G+ d2 b& Q9 ^% ?0 J1 s
% n. Z- h1 {5 R$ `- U2 w
+ T0 F3 Z8 R U w到手,当然是拆拆拆。
5 P7 R0 j: {( I; M3 y2 J
* K" k" @. {7 z4 K& } s# D& U: C+ k- z$ [* V: @/ c
' b r5 L4 g! g8 u5 s9 X( _4 b+ T
联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。4 ~# k6 Q/ R4 D W0 @) Q
: }: V/ \8 E5 x7 E+ ]; s' ?
; r# E4 e/ Z; y0 c. U" n2 m, s5 X# L4 ]
继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。
0 |* h/ O* Q% e/ |6 `" l' H
( }$ W2 h9 x7 W& ~" ~" {
9 Z. B2 V. ]+ M- j
# u/ B. `% F6 B; d! [3 _" y3 j+ Y+ A0 o
电源芯片3 r& `7 [6 q2 `% T7 P& c
/ P0 h$ X2 T, ]7 z& W1 V
f8 h' m9 \6 E9 k5 }4 p$ Z' e9 T/ _( T: _) r( u
有一个按钮,按钮有二个蓝色LED灯6 n! U! z% C7 |7 T; S7 ] s
# V/ K$ ]4 Q4 ^% }/ ?$ N9 [ L
0 ?1 ]- \! J" D7 t8 N3 ~
% E" k" k- C" @. G6 ~/ }
8266' t# K* [% z! |! H* m) |8 J
! f/ o+ ]- K3 \! j; _0 A' x! `/ z. h; @
, i' a, @) M ~, L1 a/ [6 r& i$ V& w0 v6 @( k) }% a. ~ W, v9 l
( I) ~/ y' {- R6 U2 d# p9 t$ P$ r
接下来就是刷机了,版子上面都预留测试点。
& L3 n, W/ ?: P7 C' d; y接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。
: r; u7 _7 H& k4 n: x/ P
( R7 k5 H' f0 f$ s" e T7 `
注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。$ `' `, A I7 E0 [
要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 | , q* ~2 d X- w; Y( q
+ H, l, w& t* N! m' f8 A3 e [8 f/ p
0 U3 T1 ?/ U: j% Z
+ u! w q0 w) G+ `
0 A: @5 a) P; a
' W* ^- `5 [4 G7 e6 @7 Y/ i8 \- V 5号脚位是继电器输出
+ e- V/ W2 B, |* r, b3 S 12号脚位是灯输出" B, e! ^5 \* t$ q! z& k3 c
4号脚位是按键' P: b8 E1 W. \ t3 [4 t: Y
3 D- S5 y5 J7 ? l
$ w! R9 p( X: b# F2 E& M2 n9 _7 Z& y( x2 V1 \9 S8 c
) n6 ~2 j: M; {, u3 n" I5 s0 }卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库 a' b8 \9 f ]% b" P7 Y/ o
- #define BLINKER_MIOT_LIGHT // 设置小爱灯类库+ V% h2 |( K$ G! d
- #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库
' v1 @' u1 x" f6 V Q( E4 z# ] - #define BLINKER_PRINT Serial //串口协议库( q' }1 W4 {1 |% _6 [( j
- #include <Blinker.h> //官方库1 o, o- k; K2 @" C6 S. }% b7 e
- #include <ESP8266WiFi.h> //官方库
i, O0 B+ b' d7 ~8 q( [ - WiFiServer server(80); // 服务器端口号
" R- ?: j8 _( P; u7 n
0 ]8 {5 S7 L/ p- char auth[] = "c4942fb1d5e4"; //设备key
6 h/ @2 d1 M' k- E/ T8 Y) `; w - char ssid[] = "wanboshi"; //路由器wifi ssid
2 z) H6 D5 `) p; K+ j - char pswd[] = "1365662999813586348220"; //路由器wifi 密码5 ?0 l) X5 `& d: B. y
% ?3 m A8 H; O" S( t4 u- bool oState = false;
' S4 P/ ~+ ?' i, ^6 I* ~
% _7 @) [9 {# F& r7 ^- int kg=5;//继电器输出 ?7 O' T; q- r7 n6 O/ d3 g
- int de=12;//灯输出
3 Q9 i# o" T! [5 _4 E - int key=4 ;//按键6 b# G1 @' X3 [7 x9 ?2 w I- k! J5 w. S
- //*******新建组件对象
0 p6 m' S8 `. K' c* Z0 x& ]7 s6 _ - / z% L5 v+ r/ J7 e, W4 D! B
- BlinkerButton Button1("btn-abc"); //设置app按键的键名
2 G) e! V+ Z- T9 h) n1 r1 n# L% m - //*******app上按下按键即会执行该函数app里按键( U4 X$ S1 l. \
- void button1_callback(const String & state)- t1 C3 b' T+ r5 U, g" b" C
- {1 H5 c8 u n5 d2 W9 ^
- if (digitalRead(kg)==LOW)
0 z5 T" w. D8 D, K: U - {# q9 N: \; T5 s1 h( ^$ `
- BLINKER_LOG("get button state: ", state);8 V+ A k" o- d' l+ C1 v8 w
- digitalWrite(kg, HIGH);% q2 U# J" }7 O u9 |/ V- [
- digitalWrite(de, LOW);
1 V% b5 x* W; P9 P - Button1.print("on");$ y+ t! X6 m; Z; C0 o
- Button1.color("#0000FF"); //设置app按键是浅蓝色
$ |/ I q: f4 o* p4 `9 S; X! k7 ~ - Button1.text("开启中");9 s+ u. H- s" A: a! x' ^
- }
( D$ D$ B3 w+ [. U - else if (digitalRead(kg)==HIGH)
0 s4 E6 x0 U9 i# i7 S& m - {
' h, ]) ]9 C1 }1 G% M - BLINKER_LOG("get button state: ", state);8 r1 L# K$ i: J
- digitalWrite(kg, LOW);
+ v5 F4 t1 {( W( d* g/ H3 t# C - digitalWrite(de, HIGH);8 @9 h; X# l- ]/ t3 ~# I
- Button1.print("off");: P3 g& c) T) m6 |% X
- Button1.color("#00FFFF"); //设置app按键是深蓝色" D9 h! T: |& `; b) U
- Button1.text("关闭中");. a$ D& i) x5 Q0 l) H( u+ g3 l
- }/ O5 n! g H, y6 E/ m
- }
& w) X$ W5 m" d* \' o - $ B! l. l* f: j/ r) J* c1 s
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++2 |. Z/ y0 }6 z4 p8 L3 P: F; |
: S/ i% r) ]* j7 d, r9 ]' ?% U$ j# C- //*******如果小爱有对设备进行操作就执行下面
+ v" ]/ K d1 o5 g8 l2 l - void miotPowerState(const String & state)
! N {1 x) Q# s, y7 I0 v - {
- M h! H) _" h% B0 C' b+ U - BLINKER_LOG("小爱语音操作!"); //串口打印3 n1 Q8 ? D' L
- if (state == BLINKER_CMD_ON){
/ o& ~2 ~8 u0 _; t' [2 y) e -
# [( Q8 k( P; { - digitalWrite(kg, HIGH);* r# g9 p4 V% I/ g7 X- s4 Q
- digitalWrite(de, LOW);
, G: S: i$ V8 K" _# f+ { - Button1.print("on");0 a! s/ k: t3 m' R5 C
- Button1.color("#0000FF"); //设置app按键是浅蓝色
% y0 e* Q4 k9 N- H/ M - Button1.text("开启中");
; s1 Q' U4 Q4 i+ C' P - BlinkerMIOT.powerState("on");
7 G& T Z1 e4 S# V8 y D) X0 l% G - BlinkerMIOT.print();; w+ ], [- r+ \5 i" `3 Q
- }/ d% b2 z' ~5 n1 k/ y% S
- else if (state == BLINKER_CMD_OFF)
; u3 q- A6 `% z& l( X9 W - {4 d7 b7 f; b: Y
- , `# l& g& ^2 {9 |
- digitalWrite(kg, LOW);3 d1 X5 J" {/ V' }% J* ~+ |# Q6 C. S
- digitalWrite(de, HIGH);# m, ^% c% Q0 i- v) P
- Button1.print("off");
( W- H: ~3 ^+ ? - Button1.color("#00FFFF"); //设置app按键是深蓝色" |0 D* L8 l3 S6 |! J
- Button1.text("关闭中");
3 Q8 z8 y# A& J% B( [* j- G4 R - BlinkerMIOT.powerState("off");
7 f8 I: a8 }* V' n2 Y' t D* `9 O - BlinkerMIOT.print();
5 [ k8 |5 Y# F" ?8 z - }. Y$ U2 y2 J; c( v0 i6 p
-
1 \" F4 v+ [- a - ' l/ n4 S% z* N) W. W2 `, V" P8 W
- }
: n! ]6 N+ E( V* b - //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- j, l: O2 B. w* J1 o9 C
- //*******如果天猫精灵有对设备进行操作就执行下面
9 J9 C" k3 y, s - void aligeniePowerState(const String & state)6 L+ Y+ { Y. c* ?% I
- {; {5 r+ ^7 J' C/ h% K
- BLINKER_LOG("need set power state: ", state);
# b. D( t4 Q" S8 A+ u - if (state == BLINKER_CMD_ON)- s# n& A" r; L1 Y0 Q( f9 ?3 w Y
- {
6 L R/ k2 D5 h -
G1 u9 \) \/ L - digitalWrite(kg, HIGH);
$ Z1 X- Y3 ^# H' i8 P# x: [1 f* {, H - digitalWrite(de, LOW);: [8 m5 |' X* U% G3 L
- Button1.print("on");
$ u0 }! f; |, e - Button1.color("#0000FF"); //设置app按键是浅蓝色
( H# C, Z$ t) Y+ U - Button1.text("开启中");% f. o- g+ d, U/ Y( t+ c5 i
- BlinkerAliGenie.powerState("on");
B" Q* x/ |' h3 R# Q, g - BlinkerAliGenie.print();7 a h6 p h/ a
- } n+ y; Z' i' Z; E3 L2 ^
- else if (state == BLINKER_CMD_OFF)
' \4 Q3 _* \$ ^9 ^ - {
3 }/ i5 ~/ U2 h5 D: | - " z5 i: C) W2 @7 g; s6 {& t9 V0 N
- digitalWrite(kg, LOW);
6 P% Y" \ r$ O1 U# Y - digitalWrite(de, HIGH);
, R! {, _# }6 j3 q2 G7 u% [/ F - Button1.print("off");- D, B P7 H6 y. [8 |$ m1 N
- Button1.color("#00FFFF"); //设置app按键是深蓝色
- k- W5 |# ^- t0 ? - Button1.text("关闭中");* o# o+ E% W m/ n
- BlinkerAliGenie.powerState("off");
! f+ X v$ A9 L0 T; y6 G - BlinkerAliGenie.print();% ^' K4 A& \5 l+ U J
- }% ]; R4 `% v P4 ~8 Q: Q
- r( L7 w) s# [6 i; _ c
+ P1 J2 A( o- k+ J8 _/ A8 g- }
! f% U/ r% _$ z - //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次: t1 e7 q; p% j6 _* o3 I0 L
- void heartbeat()
8 s2 X( ?+ w( {+ y% T - {
& q4 `' r6 b) J! ` - BLINKER_LOG("状态同步!"); 5 {/ j. s( u4 b; f9 ]: A8 h9 c
- if (digitalRead(kg)==HIGH)
K" q5 v' ~; P( _- f - { % p6 S" v, |8 T1 H3 o* w3 V
- Button1.print("on");. E1 ~2 L! X* L# J
- Button1.color("#0000FF"); //设置app按键是浅蓝色6 s7 @9 X; S% s" d
- Button1.text("开启中");
' O7 R! A, x+ R) f; @* Y - }! U# A" J/ w5 ]3 y" x/ R6 ~, z
- else - q: [# X o! F! t( x
- {
5 p/ G# G ]+ d! {! a - Button1.print("off");' `- C) e) B- j8 B% G
- Button1.color("#00FFFF"); //设置app按键是深蓝色' j6 g6 x) a7 `8 X6 A" Y
- Button1.text("关闭中");
" D5 j% w' I+ Y B4 d) d) L -
o, T8 K! b; D# {# b - }
3 m$ L# A) e1 x8 `- K - }
3 Y$ ^$ W# u, I) K% B- V% w1 O - //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
" S' N/ |* |! C* {0 W7 I - void setup()
* S$ H7 g% I* U I2 v - {
2 q% S, Y3 U3 p9 x2 U( R9 G, I% u - // 初始化串口: B# G. K' c. V: P5 \- j f3 w
- Serial.begin(115200);9 V* l2 _2 }$ Y& z5 @
- delay(10);
. A1 e9 G' |2 \& o - BLINKER_DEBUG.stream(Serial);8 w G4 x' `* j0 V5 \
- // 初始化有LED的IO
) Z4 C& t4 w5 Z0 x5 L - pinMode(kg, OUTPUT); ! ^, `. p3 b: G
- digitalWrite(kg, LOW);//初始化继电器上电状态 ) [/ l, ~6 H, P* b
- pinMode(de, OUTPUT);
4 a! }+ _3 A" Z$ o: i - digitalWrite(de, HIGH);
/ t7 F0 x5 I" i/ q/ v5 p6 ? - pinMode(key, INPUT);
- z4 B, @8 U: G$ e - Serial.println();
- T q% C- e7 G: K$ L - Serial.print("Connecting to ");
$ m2 @ d% Y* M: d# r; i1 A- }7 Y - Serial.println(ssid);
/ M( U5 R9 x' |+ e4 Y - WiFi.begin(ssid, pswd);
R; ~$ l( K; r' @4 z5 a3 P - while (WiFi.status() != WL_CONNECTED) {
% V, q: U+ J# b U1 V0 [& ]% L ~ - delay(500);/ N; b" O- N: n$ u: n5 c
- Serial.print(".");6 m* W0 r/ V' }7 Z1 r! D! N4 E5 N; y' Y
- }
% Y, j- V* [4 \, u2 ]& K - Serial.println("");; i; E, C' |( |$ D4 c
- Serial.println("WiFi connected");$ l. V+ R1 D8 @( v2 E% ? L7 L
- server.begin();
) ^6 g4 j) H1 Q- I - Serial.println("Server started @ ");
/ Q8 |* A* @6 O1 D" \ m - Serial.println(WiFi.localIP());6 M4 X4 ]6 N7 z% Q$ Q! y- o) P4 p
- //打印出IP地址,后期可以制作显示器来外部硬件显示ip0 m/ ?/ C( w7 g5 M. H# [) A: Z
- Serial.println("To control GPIO, open your web browser.");% z0 m. z' V7 I2 Z1 n- R
- Serial.println("To set GPIO 0 high, type:");
0 G1 }8 V% ]: u( m; M - Serial.print(WiFi.localIP());
+ |6 ~/ f+ V0 C- X. S7 a } - Serial.println("/gpio/1");
$ K- P5 ~% D! l. E3 m! ^ - Serial.println("To set GPIO 0 low, type:");
; a9 N$ b3 O' P5 Z - Serial.print(WiFi.localIP());
$ i0 x# A0 a! _8 e1 N8 Z - Serial.println("/gpio/0");
. V$ X$ h6 j; H* y2 R* E - Serial.println("To toggle GPIO 0, type:");
1 m# t5 n* ^: \( L - Serial.print(WiFi.localIP());4 u0 O6 f' I- W8 J! G) r2 {8 r d
- Serial.println("/gpio/4");
0 f* X) w% i8 }* }" {1 g
! a- N" @9 _+ d7 j4 Z& ?. S- // 初始化blinker! Y% U) U( e& q! ^* ?0 ]: ^% n
- Blinker.begin(auth, ssid, pswd);% f' v8 e3 h5 `7 A3 ?
- BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数& x$ u% S! k- x5 j
- BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数8 r+ C; Q4 v9 F# u' i0 `
- Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。
4 p9 h4 ?# D. s0 V9 c - . y* x: L* _% [6 p$ F
- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback a% X# B8 A. z9 l! ?# l# o
- }! r0 ?: B! _; v* z! n0 T
- void dataRead(const String & data)
! `4 T! u1 C% ~* E - {
G& K2 w9 h( _ - BLINKER_LOG("Blinker readString: ", data);
( j) `6 }; x/ M9 \* X - : Z6 u0 F a1 z2 b
- Blinker.vibrate();
- W9 y% q+ y% |9 d0 a' o9 y. U+ R -
+ J4 G, Q( S, j1 l& p1 h - uint32_t BlinkerTime = millis();
) _7 K' ?7 s [. K6 \7 H" {% a3 B -
6 u4 f* h6 w# p8 H5 O/ y - Blinker.print("millis", BlinkerTime);
' s6 s+ \" S4 p4 \$ u - }
: G- w) T& `+ r- k& R' u - void loop()
0 [0 Z* [5 a6 E! h/ s/ s - {9 f( c/ o" }7 t$ d! J8 I
- Blinker.run();
3 l4 e& H, }1 s3 X - if (digitalRead(key)==LOW)+ e1 r0 `/ n! p! \8 }/ A0 i5 ^
- {# g" Y: H* f5 W) R$ x" E$ J- V! T
- Blinker.delay(200);
* t+ ^. E U0 o5 K" y - if (digitalRead(key)==LOW)/ G7 U! C) ?& V
- {
X7 T* t% N# r2 l. a8 H6 K - if (digitalRead(kg)==LOW)
6 y8 L8 f! t- m$ i5 Z - {
! C7 B( k, S# K9 d7 L2 ]. e -
3 s8 n0 D! v( n - digitalWrite(kg, HIGH);
: N' w/ \1 S% I0 X/ S0 T8 I" d - digitalWrite(de, LOW);3 K' m- y. I6 g; t
- Button1.print("on");. Z$ W6 @+ W% A+ t8 X9 g5 @7 |
- Button1.color("#0000FF"); //设置app按键是浅蓝色/ n; L4 F; ~) d
- Button1.text("开启中");) ^: W# }! F2 I; g
- }
# X g+ ]- q+ O! C* i2 J. G - else if (digitalRead(kg)==HIGH)
P" Q9 }$ l7 y7 v4 x3 \( m - {3 k% |+ @; f! E
- digitalWrite(kg, LOW);
0 h% l9 D3 R* o; q - digitalWrite(de, HIGH);
7 ?# x6 t/ S; {/ q- _ - Button1.print("off");5 y. H/ D! ?- y2 a
- Button1.color("#00FFFF"); //设置app按键是深蓝色
: n7 U$ I4 A, Q$ s3 Q - Button1.text("关闭中");+ h5 \0 i3 T# t: a. g2 Z+ v0 m
- }: F) v) q4 [ U5 L' E) ~: ^6 Y
- }1 [* S$ J9 a6 E9 @4 x0 k
- }
/ f8 A% T/ H! e - }
复制代码 " i) G1 ]1 W, v$ r
2 S. _2 f! u! K) u6 K5 C
我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html/ B- e' h; t5 n/ t
# p5 z. S: m. {1 E8 ]6 g( g N
把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。
( d. C# h7 b& a" ?: W3 a' u: P- b7 T1 S+ O+ q, v! F4 S- k5 p* m; u; r
6 v5 `, O3 T. a# c5 p |
|