|
|
本帖最后由 易记 于 2021-8-21 14:05 编辑
- @# X9 T2 Y8 r& a+ u: {& d* p4 @7 R. [+ i& |
最近玩ESP8266,想做个天猫控制开关。
+ {" }; H2 ?& a+ d$ A \但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。
! u9 q e* |+ ~# A* ]7 Y3 }! j还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。4 Z" ?' _' i: `& t; Y+ Z# C6 V! A
( E X2 n3 v# _% z" T( Y3 \
0 `# S( \3 f" g# a8 t
- U5 w1 |1 f8 j @; v$ }5 Q; f6 I, k问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。
" H8 I- B8 X3 O3 u
" C: Z) o9 |( a9 q; h3 Q
W0 S9 \0 _# ~1 D7 R* Y( X2 }/ u9 v8 B
8 w0 k1 K- Q* m) f
* k+ g2 a a' i1 j到手,当然是拆拆拆。. }/ q: U) M; ?
9 {5 r4 a4 S' j& l( w
1 }! Z. D( k$ i5 V N1 \6 Q* L% e5 @' L4 r0 U* u1 h
联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。
! f$ S, q" x [3 y
$ ~5 h' Z u( }2 v! a6 }6 w
e! W' }+ m; J5 F Q3 f# E8 N, J+ K' ^" C- c. ?& [
继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。
6 e0 O5 p2 L8 Q8 T2 z
/ C) ^/ W$ N# |0 n% X* r) f w0 N' V/ l9 C# b: v7 H- f
& x9 X' G- Y Q7 }4 I
5 T" w* w8 Z: r2 n2 \2 c9 z# a电源芯片
) }* o6 c Y2 x& y: m# e; |- j. {$ w& x. v
) g) a6 [4 S3 i4 E7 `+ I+ S, d8 c
' Q, K& }) S* o; y/ t: k
有一个按钮,按钮有二个蓝色LED灯5 V1 M7 M! S/ l# W; |& l
4 U' U3 s' a D* C$ j2 v. ~0 Z5 G
: D6 b5 c% x& g) a ^; a% P
0 |* h0 E% ]. {# F5 _5 S8266: D1 W( ]7 U8 k
3 m1 O7 J1 a. ?
* o* ?6 l7 n/ f
7 K f$ ]3 _0 f5 T3 g# u% j% K E3 Z2 ~. A% |/ f
! @0 M: ]4 }0 X( W, H: }7 k接下来就是刷机了,版子上面都预留测试点。% s' |; M' I" Y
接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。& {9 A8 A; a C6 Y: S
6 R* _3 N+ Z9 P8 I注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。
% s l2 \" J: g( S要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 | ; i* P6 }, [6 _; o5 L& D
, m- s) Z- \# a4 w
* }6 G' ?2 V* B- }8 h9 y; F: L( {" e3 j$ S
8 ~/ z% o( J" P4 K! Q
0 _4 F* g- m( d! o0 n 5号脚位是继电器输出
, a; j6 q* u: S: ^ 12号脚位是灯输出
2 r- w; F/ U4 X2 W$ D* q 4号脚位是按键
1 H) T6 t0 l F# I
. a0 d1 [& m. x; d- V5 ` Q# e: H
" G' R/ F% u+ n' B8 m8 z1 r& ~5 V; N V
; @+ B. b- S) T0 ]. h6 G, l卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库
- h! U. S2 F" V - #define BLINKER_MIOT_LIGHT // 设置小爱灯类库
* I. {7 \$ I7 b2 b - #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库6 Z' v0 [( _5 |% ^( B l
- #define BLINKER_PRINT Serial //串口协议库
8 K. R8 G2 o( V - #include <Blinker.h> //官方库: s$ O3 k' S/ Y7 ]& {. I4 }
- #include <ESP8266WiFi.h> //官方库
# d* G O7 ^, P- z# i/ `9 p - WiFiServer server(80); // 服务器端口号
2 N8 ?: i, b, i+ [$ } - # } U1 {3 y! L& F6 w
- char auth[] = "c4942fb1d5e4"; //设备key
2 E4 C/ S( {7 x X - char ssid[] = "wanboshi"; //路由器wifi ssid
; \ d- t, y" D, q5 F3 s7 x- C - char pswd[] = "1365662999813586348220"; //路由器wifi 密码
$ Y1 H. A# \( I' ]# v- i. R; ` - ; ?1 {1 z, c) ~" M" t
- bool oState = false;- u$ s9 J, I; `
) B; B7 M9 t& s9 i5 v1 i5 P- int kg=5;//继电器输出( ^* r% R3 G* a5 ?( e5 R) |
- int de=12;//灯输出
! c' h9 E( o/ `$ ~ P" c - int key=4 ;//按键* Y- }# w3 z4 M7 x
- //*******新建组件对象 Q0 j- h! `- |, }) Y+ c
- : V1 e; k2 }, P6 F0 Q: j! E
- BlinkerButton Button1("btn-abc"); //设置app按键的键名, ?* T1 G5 D O
- //*******app上按下按键即会执行该函数app里按键
- \, B5 S. l3 C: m - void button1_callback(const String & state)
8 q Z# \8 i/ H - {9 i$ C! r' G6 n7 S% ?9 g! }
- if (digitalRead(kg)==LOW)
- F' P# Q3 t% J% A8 x& s# ] - {
2 ~; U6 P2 n# f8 ]- r - BLINKER_LOG("get button state: ", state);& e, O! C! e& ^- r! P
- digitalWrite(kg, HIGH);
: _9 V7 r( p4 N# x2 \) y9 I - digitalWrite(de, LOW);# |; l% X" ?/ h3 D' X' s- Z
- Button1.print("on");$ P/ `/ h5 X9 g- @
- Button1.color("#0000FF"); //设置app按键是浅蓝色
- N# a7 k2 \: P - Button1.text("开启中");8 b+ ^) }" f% [9 Z l2 C
- }2 e- b( W: b1 _+ ^0 q: w
- else if (digitalRead(kg)==HIGH)
" i( ^! b: w) n3 c- P4 i - {
4 w$ m Y* H2 o$ j - BLINKER_LOG("get button state: ", state);
: F) u$ v1 w% Q# U3 a4 T) g - digitalWrite(kg, LOW);
0 _; Q# z E& t, P' i* s - digitalWrite(de, HIGH);
! V" M: Q% |; V$ M3 N - Button1.print("off");
2 i* z& x7 D) L% w9 Z - Button1.color("#00FFFF"); //设置app按键是深蓝色# f! r2 g h5 Z# r& h$ P; [
- Button1.text("关闭中");
3 G3 i' f- K9 a% q - }; F8 S' o' G* l) O0 X7 V
- }
- W5 V$ R& A+ T* ?- t9 ~ - # o% d4 {8 y( l
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
* M" m2 O6 V% B$ @& i; X$ S2 b
) E2 k8 W3 k1 S! \# G9 i6 s ^6 C- //*******如果小爱有对设备进行操作就执行下面$ n$ b4 Y+ J, O' @
- void miotPowerState(const String & state)
7 K ^' X" Q/ i7 b z% |+ O - {/ w$ L* q8 n. g
- BLINKER_LOG("小爱语音操作!"); //串口打印
; W& D1 W/ |) t# B, T2 Z - if (state == BLINKER_CMD_ON){
! j% R0 ~, v+ [ s; O0 S! {6 @ - ; ~. T4 ]/ V) X O7 W9 J |
- digitalWrite(kg, HIGH);- u8 \1 A) s2 |% ?5 m
- digitalWrite(de, LOW);' r0 |4 O1 w- c: _- Z, i* L+ Z0 }
- Button1.print("on");8 b; q* a$ s) y x' I
- Button1.color("#0000FF"); //设置app按键是浅蓝色* d$ g$ @+ L1 ?* K9 \& ]" s
- Button1.text("开启中");
- |1 w6 @0 H- L9 H7 {1 k/ s - BlinkerMIOT.powerState("on");
7 j# \2 T( W& v - BlinkerMIOT.print();& f0 s- o5 m0 O8 H: A
- }
7 p$ r, g% @1 r - else if (state == BLINKER_CMD_OFF). I$ f7 l# R. V8 N
- {7 |! x6 f* N" P$ q0 m0 [5 z
-
! Z- W; Q7 G3 }: ] - digitalWrite(kg, LOW);0 m# s3 y- A& F- w& s: g
- digitalWrite(de, HIGH);0 D1 y( q5 e* D0 }$ W7 h% W' V
- Button1.print("off");
: B" |$ }# P/ O" Q% R+ j - Button1.color("#00FFFF"); //设置app按键是深蓝色: W% G! W6 M( }( V0 ?
- Button1.text("关闭中");& \* E( D1 y3 x- U" @
- BlinkerMIOT.powerState("off");' X! w& O. @" }2 f- y
- BlinkerMIOT.print();
; R+ e& P5 T+ o$ \ - }
: ^- z& I1 Y( _" t - Y% Y' f5 w* j7 Z
-
' f# f, J, [7 D1 z - }
& e- A( u% h8 ^" d9 V. v1 L8 [ - //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++5 I! E+ ]( i( H1 C3 U- r! u% V
- //*******如果天猫精灵有对设备进行操作就执行下面 J+ B! F' _6 J& M$ Q- d
- void aligeniePowerState(const String & state)8 l$ v1 U! y) _0 I4 ?. S G
- {& G; }, J- g- g
- BLINKER_LOG("need set power state: ", state);( W8 i; z5 D9 n" ~- O- Z3 N
- if (state == BLINKER_CMD_ON)
# O1 a% K) y( _9 [7 _ - {
( J3 o1 v+ {' ~* J# j - " T1 d; m1 w* U
- digitalWrite(kg, HIGH);
2 H5 b2 o4 r8 z: J: l5 b4 ^1 a - digitalWrite(de, LOW);4 ]' u/ {3 \4 ` g; @! W
- Button1.print("on");
8 ^3 N! `% L$ @* L2 X1 l - Button1.color("#0000FF"); //设置app按键是浅蓝色
5 \1 s% k7 T; ]2 z, K. J2 F - Button1.text("开启中");( _4 }/ X1 B2 N; ?
- BlinkerAliGenie.powerState("on");( ~- P" |% U( p
- BlinkerAliGenie.print();' f! W+ `: `6 G
- }
1 G4 ?9 {* I8 R: O0 L* |7 Z9 c$ @4 N - else if (state == BLINKER_CMD_OFF)1 k0 d9 r" w8 f7 X1 p# `- }5 `
- {2 H W* [% h" s/ K1 X* y: D8 M5 u
- 5 ~; `: ]1 W K0 \& [
- digitalWrite(kg, LOW);
8 c# X- N8 ?' H7 ^$ u - digitalWrite(de, HIGH);
# B- \2 q5 \0 E- Q - Button1.print("off");3 Y4 \4 C; I3 D. b/ Q7 Z8 u
- Button1.color("#00FFFF"); //设置app按键是深蓝色2 F) o, A c8 n# k. a$ b
- Button1.text("关闭中");, y2 U8 ` R" ?- F F+ _
- BlinkerAliGenie.powerState("off");6 G. f6 T/ b" F0 W5 Z! J7 ^/ L# U
- BlinkerAliGenie.print();; K2 G/ K) b1 P0 V6 a1 D
- }
I( |' N! ~+ e, H+ o - ( G' Q: c) t" u, T3 z: n5 h5 P
- ; O3 T W; A5 S* W- P, k- I
- }3 B! n: p) r1 t8 d% p
- //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次% O! d; w" | ^, Q w
- void heartbeat()
" [0 ^# i- p" U4 Q v; q6 P - {1 \! @* z0 g) a8 g5 ~/ M) a) M
- BLINKER_LOG("状态同步!");
" ], k& _7 H7 j' _0 j - if (digitalRead(kg)==HIGH) G# U9 I; `$ T# K! ~ O" V" D
- { - Q$ ^, N8 y2 u' N$ M; J' U
- Button1.print("on");
7 O5 \+ R4 I9 M$ w - Button1.color("#0000FF"); //设置app按键是浅蓝色
8 q" E6 } L+ [% \ r - Button1.text("开启中");
; }9 i/ r# L0 O* B, [+ E! v# ] - }! [2 f* A; Z) l& z3 _
- else
6 F) Q* e" G3 d) u% @ - {
% k. o! K* \* S: k8 ^ - Button1.print("off");
0 u2 `/ w/ u" r/ R0 ?* B( E - Button1.color("#00FFFF"); //设置app按键是深蓝色
; }5 ~4 W) y! ?' Q3 w1 v1 u" G3 U - Button1.text("关闭中");! V. E% D$ g; _' g
-
- \" |: R. r7 Z' o8 U - }
: s% g& |) N* m8 }6 U7 N - }
' l3 s) q/ ` q' p2 B - //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
% \& S& U1 K7 P1 `/ } - void setup()2 i2 P. ]) f/ Y% b$ l
- {
7 F8 c% @8 L0 l" R3 o5 O3 ^ - // 初始化串口
1 Q, j: d/ k6 T; y# ~5 t& G - Serial.begin(115200);
: S/ u; l9 `" ~2 |0 t' P ?0 E - delay(10);
( R+ h( i: ^( R T$ w" {: {8 e - BLINKER_DEBUG.stream(Serial);
; I$ s l; M$ n6 r( x - // 初始化有LED的IO
1 [# Z( s# E" u& u7 R A" D - pinMode(kg, OUTPUT);
& z/ y; m9 h. k7 C" |' | - digitalWrite(kg, LOW);//初始化继电器上电状态 ( r' i6 k, m7 R/ W6 q% e7 Y9 S
- pinMode(de, OUTPUT);9 z2 t' T: f% i+ c: x! r# B& A
- digitalWrite(de, HIGH);) A* a/ m" \* R% `; [) C& X
- pinMode(key, INPUT);
# Q' y. v/ }# K - Serial.println();% h% W: @0 ]) U: g* e. u
- Serial.print("Connecting to ");
a! N( I: E3 r9 J9 A - Serial.println(ssid);
9 `7 t/ k7 A2 R5 m! @- i' N( h( E - WiFi.begin(ssid, pswd);8 `: C- W" ]% \4 Y C" ]
- while (WiFi.status() != WL_CONNECTED) {; h5 Y8 B+ w F# s: S1 v$ u) Q5 m8 O
- delay(500);
* A! g8 o! ^/ {2 A - Serial.print(".");6 }. b$ [& \+ S. e: t
- }; h1 B% s$ |3 G4 [$ W4 b
- Serial.println("");
' L0 k6 |6 X+ H! b0 U - Serial.println("WiFi connected");6 w' A) |; |# W! o& U) {$ A4 D% F( \
- server.begin();
; x' |, f: q2 M g$ L+ q K - Serial.println("Server started @ ");9 q: z9 C8 B+ Y+ y; p
- Serial.println(WiFi.localIP());+ D- r0 S0 C) M2 _- a
- //打印出IP地址,后期可以制作显示器来外部硬件显示ip
$ s: C- {' q2 l0 _+ A. p - Serial.println("To control GPIO, open your web browser.");
: x4 O6 E ]) u. M/ y7 X( Q$ K - Serial.println("To set GPIO 0 high, type:");
& [( {6 K3 H$ T3 [+ s. G - Serial.print(WiFi.localIP());% |& F% }7 U R9 h6 K2 e
- Serial.println("/gpio/1");
8 o0 A" }! o/ ?/ y - Serial.println("To set GPIO 0 low, type:");% x$ F3 |& ]* n+ y% J
- Serial.print(WiFi.localIP());
8 z2 H: X7 n, q# D - Serial.println("/gpio/0");
$ g4 B9 j# i' y4 a - Serial.println("To toggle GPIO 0, type:");4 {7 Z& e5 v3 I$ ^/ s. O
- Serial.print(WiFi.localIP());( d' e# l6 w8 |- u9 ]1 D" m j
- Serial.println("/gpio/4");
6 r7 F- [" z8 o* x - 5 e0 E+ |/ R7 w2 G" r5 ~* J
- // 初始化blinker
5 u9 Q1 P9 F0 _! i2 g - Blinker.begin(auth, ssid, pswd);
' y. |; d s$ U4 ]8 R" [8 U: n# \ - BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数
1 N. A4 N, T4 d; v" J0 N - BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数( b) X+ c# M4 n( n9 Y/ g+ @1 x6 L1 R
- Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。
8 y* h9 C$ c9 N/ K$ U% O% v& O& ~3 W - . Q# D3 v8 J: i3 u5 ? M
- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback
$ O# _, S5 z& ]4 ^" F% X" C5 B - }
' ~6 P" H4 p; p- y) Q* f9 E - void dataRead(const String & data)+ H6 G6 U8 m, v! I+ z: i
- {
+ _# _$ Y/ v5 ^+ P9 s - BLINKER_LOG("Blinker readString: ", data);; n D: C: ^- @: r" p6 d
6 G9 p/ r5 V* G- Blinker.vibrate();
2 F/ Q6 n, ?; Y( f! D1 n3 k8 U2 I u. ?- s - , t/ J9 g) |/ B S
- uint32_t BlinkerTime = millis();
" Y }. n8 F- P/ N" [& X9 n - 9 f4 P. _* V" R" ^- d% u2 r4 I
- Blinker.print("millis", BlinkerTime);# y( W. M! u+ C! r( P
- }
, R4 |; ], r: j6 h; t - void loop()
% J4 C! J: r" F - {
% Q5 n7 D4 X/ R' J" _$ ~ - Blinker.run();
3 u5 |1 h! Z$ d; P: F: m9 { - if (digitalRead(key)==LOW)
: [4 T; n) u! W# n6 o" ^ - {
1 H! t! ^, ^$ ~2 R* c: @ - Blinker.delay(200);
8 o+ x R6 v j! w( P) x7 C - if (digitalRead(key)==LOW)
- ?7 q1 g- v" z- h, ]/ ? - {
1 z- J |( m M - if (digitalRead(kg)==LOW)
5 }& D8 {8 j5 i3 V% K2 n Q - {
6 f% @" C6 y4 N - " B) M" D# X x0 Z/ e/ U, z2 x
- digitalWrite(kg, HIGH);
- g, N1 }5 r, W4 E: I - digitalWrite(de, LOW);
! Y" o4 f- \: D4 Q6 E6 Q - Button1.print("on");
( O- X! Y! w% b) ^- p - Button1.color("#0000FF"); //设置app按键是浅蓝色
& A' C* b8 T% w) u' H% v' P - Button1.text("开启中");
0 U5 M7 v# `7 O6 x - }7 R9 F( J V" B! Q9 ^6 y
- else if (digitalRead(kg)==HIGH)
5 W4 i- q/ S, k e- f: y - {
" Q; c! @! S6 S* Z, q9 P8 U - digitalWrite(kg, LOW);
$ Q. @+ y, C9 K# Y5 F1 d- E# l - digitalWrite(de, HIGH);0 a9 e' m. t5 X: Y2 I3 b1 W/ a9 |
- Button1.print("off");
0 u% n/ n0 t5 ]; w; x, T+ {# w - Button1.color("#00FFFF"); //设置app按键是深蓝色
4 d. [ d1 W0 i `) l - Button1.text("关闭中");
& i- M! x$ {7 l3 j/ x$ E/ H - }
+ z" {5 P2 e0 ?" W3 U% E4 I. y - }$ e4 M; P( A' z% l9 z
- }
$ r$ f+ y* y3 R r8 ~ - }
复制代码 ! I! t& C# I' M* h) }( T
" [2 z' D9 D1 P4 q; A1 w+ \我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html
- n' Q: t& A5 }& N+ q# s2 U4 @
. k0 w. o& a: L# n& t把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。- H) q: R( `2 G! E
/ P2 K0 A1 \7 I; c7 P' Y- Y' O* [2 [9 N) n
|
|