|
|
本帖最后由 易记 于 2021-8-21 14:05 编辑
u! M- Q! d. O" W
3 j. Q8 J2 h$ I% e. L7 _/ e最近玩ESP8266,想做个天猫控制开关。
9 A3 ?4 r0 M- ]9 @2 U但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。/ [. C5 |0 H$ u7 D. l& k8 E, @
还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。
% q, \ t8 d) m
?/ @. _, _. Y4 a! b
. f6 e4 S) q6 n( t2 x, p- `
7 V: y( {/ b4 [7 c; D问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。$ O7 o+ @& J7 ` G3 p! }
% p# e2 V: A8 Q* t
3 u! b; b; K5 @4 v$ }
+ z# x! n6 L, |' z) v& d3 X6 y/ k2 j8 w) C9 M
3 U# r* O; n1 c. y! C& q
到手,当然是拆拆拆。6 w8 P" h' H. L
' w+ X2 q, n) C) I$ N9 V- C- a1 E$ H. b- E
, z+ e& K- ]4 I( k
联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。& f1 x( r$ \+ |; {
# Z# _7 V) ?4 ]' a. K% \/ {& O8 ^/ a/ N9 q4 P/ \
: k1 c* _% y! j! Q6 h( u
继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。, h! v1 ]+ D0 g( H2 g: e9 d( d o
* G* }2 ~3 c% b# q9 \* X" v
4 N, b" d' v" z- R6 g
* _6 H$ i; H5 M) V1 a8 V
: H9 q" D- d# c9 |6 v/ E: H! w& @电源芯片8 A6 e) `0 j2 m8 G! _ x9 W
$ {9 u5 x) I* D! t
. t0 T4 _& j, j- t4 l6 l6 o, Z6 l/ Z* O( t
有一个按钮,按钮有二个蓝色LED灯 U Y8 e* U; j8 H
3 T6 _, I8 H0 ^7 v) G8 ?" i# X
' n# @& v5 K3 {0 e/ y+ J& {: j; T& P3 }* c/ i# d
8266, v; ]3 N: s0 u
* N8 l3 L, y9 N* c8 p. t- u5 f% x2 b& C
+ z9 M y# S9 p2 y, L
* E8 w: ~7 ~6 j0 R. i/ M# W
# `; _, l* l/ e1 `& Y接下来就是刷机了,版子上面都预留测试点。
$ ^, U: N* ]. t/ R t! e接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。4 {" [1 e( O, ^1 p
' q) ~1 i( H: `6 @注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。
3 D* w/ R7 | s( c要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 |
/ q8 D. _% `- U9 S ~* J& F9 F
* ?& q- W# T: a7 e; K! @7 ~7 x
% O* ~7 G* W+ b/ m; N! q7 R/ {0 K+ y; N! W c# Q$ O2 \: H& S. r
- x P3 ^# k6 Z( D9 M' d, w
8 X* \# i' p! ~ L
5号脚位是继电器输出
g4 L0 E! O* \& _* i0 c 12号脚位是灯输出
3 C' ?4 `4 h o/ q0 @ 4号脚位是按键# [* `; N% ]1 y# e7 N+ B. d7 y
" z3 R% B- U6 @
2 ` }( X6 K( X P/ s2 J7 a& e& j1 L7 l/ O
" C/ h' y1 ~0 C, @+ m- M' g3 @卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库8 W9 |- \- t" E9 V6 ?0 k
- #define BLINKER_MIOT_LIGHT // 设置小爱灯类库
1 n6 X. j$ ^7 A$ _3 W, q( s5 j - #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库
: S3 V$ X8 ^) @* b& p - #define BLINKER_PRINT Serial //串口协议库( H( y8 V: v5 b, Q" T5 J" ?6 [4 l
- #include <Blinker.h> //官方库
1 a* l* P" t3 K- \& F - #include <ESP8266WiFi.h> //官方库, _9 G9 K8 \: k, T2 t2 m
- WiFiServer server(80); // 服务器端口号
. ~: R: ^+ C+ ^7 _6 y - . d6 t" q5 W9 @5 f( ^
- char auth[] = "c4942fb1d5e4"; //设备key
7 X, a) H2 P- M! c - char ssid[] = "wanboshi"; //路由器wifi ssid* e5 G8 d! W9 c
- char pswd[] = "1365662999813586348220"; //路由器wifi 密码
. {1 |* S* f1 l
& V5 I3 S M" J6 z6 C3 j- bool oState = false;) @# K8 c! A; D$ [% ^
- & i2 @! L5 H& @1 U% |, d2 w
- int kg=5;//继电器输出
! @! x* z4 d7 Y, n% J: Q* r/ k - int de=12;//灯输出
+ F5 }3 Q! [! R) R5 Y" c [" E - int key=4 ;//按键) |! o; [. S6 ~& m
- //*******新建组件对象
. _; t& K$ W* X9 H9 c, [
* }0 K+ x1 i4 q) a; `- BlinkerButton Button1("btn-abc"); //设置app按键的键名4 ?' m5 ]) g" J) k X- k2 Q5 \
- //*******app上按下按键即会执行该函数app里按键
9 `1 U' @( h2 l5 z$ P, }6 t; p8 ~ - void button1_callback(const String & state). P0 D1 t3 x8 u
- {& {! H: w9 y6 @+ L
- if (digitalRead(kg)==LOW)
, i8 L3 b0 E. p1 [: V - {
p$ r4 K$ K( D& |3 { C - BLINKER_LOG("get button state: ", state);
! K! \% P6 B: K/ y3 s( U - digitalWrite(kg, HIGH);
0 c* G" Z" s+ u |, |& Z* Y0 u - digitalWrite(de, LOW);* B6 M4 y$ _/ q9 d* e& s
- Button1.print("on");$ q/ B7 Q& \+ {0 j: s. u5 Z
- Button1.color("#0000FF"); //设置app按键是浅蓝色
1 ^! B1 o' k6 e% H; _ - Button1.text("开启中");
) u( g/ L% [2 P& o$ ~ - }$ u3 s8 t$ @3 j; ]$ o; f, E
- else if (digitalRead(kg)==HIGH)6 U }* d- @, @ e2 o" Q' X
- {1 s+ k, X+ X B' A0 ?
- BLINKER_LOG("get button state: ", state);8 f# F/ s& T# r
- digitalWrite(kg, LOW);* j& W; t+ U1 G- |% @* P( K
- digitalWrite(de, HIGH);
7 Y& ?5 U ]3 C6 S; W+ n - Button1.print("off");
! l4 {$ w5 B! c! F - Button1.color("#00FFFF"); //设置app按键是深蓝色9 X0 L0 M$ l \( D4 Z
- Button1.text("关闭中");. @, u6 w: Z0 A
- }
' b4 D6 ?3 x5 E& |/ R - }* b! K! j& z: d% F$ G
- $ J5 h" o+ ^9 E# M; a
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++9 K9 I! l( n* {; j9 N8 d
- ; {+ P- _6 t/ s2 l, B4 O
- //*******如果小爱有对设备进行操作就执行下面( S O; V8 b8 k `& n
- void miotPowerState(const String & state), Z) T- U3 m- \' f! j. `
- {
l* m( R. j3 p1 B' B - BLINKER_LOG("小爱语音操作!"); //串口打印
" e2 `$ O: \* y! |3 X% F - if (state == BLINKER_CMD_ON){5 D' E. B/ H; o& q
- : T) _( z E! ^0 M& C
- digitalWrite(kg, HIGH);. d, Z# i4 k& o6 w# s$ }9 ?
- digitalWrite(de, LOW);3 r2 w- j4 b% b' i9 _" @3 H+ j
- Button1.print("on");
' Q0 k$ ]5 C& W, x' G7 j5 v - Button1.color("#0000FF"); //设置app按键是浅蓝色+ t& @5 ^6 u5 [+ v2 A: s9 r& ~0 ?
- Button1.text("开启中");
& P- V1 W/ T" m' q - BlinkerMIOT.powerState("on");
& e4 J" ]' T- T8 z& I: H0 X* @ - BlinkerMIOT.print();
, A) D( ~" a& P- }) a7 v - }( S% G& u7 V M9 G. m- O- D
- else if (state == BLINKER_CMD_OFF)
9 p* K3 K( d5 u/ D; P; z - {
+ U. H/ Q z9 I) R Y: E4 J' ~) o - % E* P3 ~0 h% C+ H: f
- digitalWrite(kg, LOW);
: d! i$ R2 n7 d4 h. j; |* o - digitalWrite(de, HIGH);
7 g* n8 R) T4 H2 l8 F& o$ N) m3 ~ J$ c - Button1.print("off");
$ z* Q1 \4 G8 X* {, S - Button1.color("#00FFFF"); //设置app按键是深蓝色 V" {* G. w8 k8 C) V. D3 u6 q
- Button1.text("关闭中");
% ~+ ]# w( K0 V* L+ G; z- }) u - BlinkerMIOT.powerState("off");+ x, D! k/ t/ T" Q7 z. y" c
- BlinkerMIOT.print();
5 W* G( L0 V) U1 J - }* q- w9 d3 l/ ^ K4 y$ G$ C
-
& |+ y6 {( q7 |# A( r - . ^; q: p. v) I8 e
- }
$ ]& B3 k6 v" F* o' K9 N4 S - //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
7 M2 g0 C2 V2 D$ t; l - //*******如果天猫精灵有对设备进行操作就执行下面$ P' L- Z K5 e Y# Q( w
- void aligeniePowerState(const String & state)
% ~- [9 U, N; q - {/ D; F$ g" O( X! |% y2 C7 g
- BLINKER_LOG("need set power state: ", state);! ?) g/ y% H. X1 `5 j6 ?7 u
- if (state == BLINKER_CMD_ON)% j3 F3 c/ }# o$ E7 s) _: e+ G, y
- {0 V6 q% [& Q [( g5 v
-
9 s! A; n7 Q l+ Y) e$ d - digitalWrite(kg, HIGH);3 Y* g8 w0 I* Q- A3 r6 m3 w( z' i
- digitalWrite(de, LOW);% f! x, B" b* O, v8 }
- Button1.print("on");
. n. i W% R2 I& | - Button1.color("#0000FF"); //设置app按键是浅蓝色
8 b* q' j0 \5 r% m3 a% A - Button1.text("开启中");
" U+ f0 v' m1 x7 K9 s - BlinkerAliGenie.powerState("on");
8 y7 S! q* R/ ^8 F6 k - BlinkerAliGenie.print();
9 Q4 C$ w5 v/ m P: ]$ X - }. M Z% [2 E( _" J6 a( ~! r$ `
- else if (state == BLINKER_CMD_OFF); Z% D* }$ a4 J4 {' o Y
- {4 ^$ [; h/ K$ F9 f. {" I
- # @. B, f) B+ x1 W+ m6 {
- digitalWrite(kg, LOW);: ^' I* [& ^& h6 ?& L& [! E( H
- digitalWrite(de, HIGH);3 A! m; ]5 L) w! _$ G$ J* P; O/ u
- Button1.print("off");
; E/ n& U5 Y$ Z ^ - Button1.color("#00FFFF"); //设置app按键是深蓝色4 X$ ?* `8 `3 q' ~
- Button1.text("关闭中");, ]1 _* H9 D4 h h: S: Z/ t
- BlinkerAliGenie.powerState("off");
) H: o' Q8 \5 [4 p - BlinkerAliGenie.print();
7 ]# g ^! }& s0 q; H - }1 [5 \; V8 d. ^3 ?8 w0 K7 X
-
5 s9 B8 I9 {4 c+ D
- M k \% U$ y- }& r3 l- H* |# }! m
- //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次
8 u9 ~8 }) N- T$ I f- h3 h: A3 D - void heartbeat()6 j# i& X* ]+ I6 E# V! h! G
- {
I8 d9 Z# d) @. q) ]& ^ - BLINKER_LOG("状态同步!");
9 K. r3 [ T. u6 d1 \ - if (digitalRead(kg)==HIGH)
. B$ T+ ?$ {1 Q% M! z8 z( P - { + U& h# h5 ^. u+ K
- Button1.print("on");% e1 t3 o5 v+ v! ?+ [: I+ w2 h
- Button1.color("#0000FF"); //设置app按键是浅蓝色, ] b8 i. ]/ L @# z$ J# O
- Button1.text("开启中");
* I5 p! b& b! B - }
3 \7 i( ^1 M1 X2 ?% ^- } - else
2 o/ r& c0 O" N0 H2 z - {
) V9 r+ Z. U; L9 E - Button1.print("off");9 }3 y! n- n, M9 l2 }
- Button1.color("#00FFFF"); //设置app按键是深蓝色% F, _5 ~. M+ X2 i5 |) T2 w( h* F
- Button1.text("关闭中");* X& b. ]/ |7 Q) O! W
- $ J9 L0 a% e. W" x8 m
- }/ b- u( `, E% @
- }
* O: \( `2 b" ], k* B2 V6 f8 k - //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |: o$ f* D% J5 J! o9 X
- void setup()- T4 p/ d q: m9 {8 O& K% v9 Q5 G2 U: \
- {# e; d5 d6 l0 c9 B% x1 x* j0 C
- // 初始化串口7 B0 ^! I4 J! I
- Serial.begin(115200);- }6 s3 X" R- e W( J# t! e& _
- delay(10);# V3 L; i% d' A3 U4 S0 A
- BLINKER_DEBUG.stream(Serial);6 z% Y( x2 ]* o
- // 初始化有LED的IO! F' c8 Q1 r5 e. m5 V
- pinMode(kg, OUTPUT); 9 k% R% ?' G" M# e3 r& q- ?
- digitalWrite(kg, LOW);//初始化继电器上电状态 * C$ v! Q% S$ b
- pinMode(de, OUTPUT);
/ Y( g. m d4 j) k, F7 l) m - digitalWrite(de, HIGH);
4 i; F) d; R5 X M% F - pinMode(key, INPUT);
0 h" I( X) E3 h& t0 j - Serial.println();
2 C# f8 Z5 f+ v) G - Serial.print("Connecting to ");
' O3 }" ^7 c9 b7 A5 |- R, Z - Serial.println(ssid);
7 g+ _+ C3 A& F2 }1 {, g, Z* |7 w - WiFi.begin(ssid, pswd);* O# I @ ?; h- l
- while (WiFi.status() != WL_CONNECTED) {! X: y) M; c0 J/ S& ]
- delay(500);( }- M8 m3 d9 ?. K3 [* @
- Serial.print(".");) u" d; F6 d P1 t2 f+ b! X
- }
$ v# h T, E: \3 W! ~ L/ q - Serial.println("");
5 e: S1 S! w& C& q; @% \ - Serial.println("WiFi connected");
" t% [3 A( F- X8 I% a! @( | - server.begin();
8 B1 G/ X: k7 Y' _9 r+ d' ^ - Serial.println("Server started @ ");. L# o. P3 ^# v
- Serial.println(WiFi.localIP());
. @& s0 y" Q3 Y - //打印出IP地址,后期可以制作显示器来外部硬件显示ip/ L4 N0 l3 J+ y0 h' f& A
- Serial.println("To control GPIO, open your web browser.");
* e- {% E9 s& a) ?0 K/ g - Serial.println("To set GPIO 0 high, type:");4 ]$ f: y5 S) T% K( Z, y6 D- ~
- Serial.print(WiFi.localIP());* q+ H3 g2 L4 o- b0 W, N8 A0 P4 J
- Serial.println("/gpio/1");' [9 e# l2 d5 A5 I# q2 ]
- Serial.println("To set GPIO 0 low, type:");2 \+ L0 S0 {5 b0 d. \
- Serial.print(WiFi.localIP());
" p, o4 x1 b) t7 t* f - Serial.println("/gpio/0");
) p) }6 s' Z) N) Q3 M - Serial.println("To toggle GPIO 0, type:");1 I- N* i6 V! U* q1 |
- Serial.print(WiFi.localIP());
; D8 G& I! S K; R- \ - Serial.println("/gpio/4");
! s; @1 _2 ^$ l1 ?9 w - 4 r' L4 p& j% N/ H$ R
- // 初始化blinker
- B: g" [* |4 P4 G9 i+ W" B - Blinker.begin(auth, ssid, pswd);
' O( t p. ?# A7 {+ [) |" N" H - BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数* D( L& a6 k8 X' Q6 J/ w
- BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数+ w7 g0 J; d$ J5 m; F& X4 p$ [; h
- Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。
2 ?3 a& `. s+ {. q2 a: j - $ x/ M0 |* L: U& N' z4 k1 B, ?
- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback
- z1 U: `7 C" d V5 B - }
" P* X* I- O4 F( _( G! [ - void dataRead(const String & data)
( f4 x3 Y1 z, u0 p7 M1 _ - {
) @6 o( S2 y0 m: f- U - BLINKER_LOG("Blinker readString: ", data);9 [ W0 r2 T! z- c, A5 r* g
5 c1 t) _/ N1 Q D% E% O9 d) d- Blinker.vibrate();5 N# {, I" W) u, D9 R% ]
-
5 Z% p. o# {% r" @) F) i- i2 N - uint32_t BlinkerTime = millis();
/ @+ W# v9 _. ~* g; w$ S2 ]* S -
! h- U" l5 D3 a. _" W( p - Blinker.print("millis", BlinkerTime);0 ^6 Y- R" H% R
- }
6 |( Y+ N, L' b6 [ G - void loop()
: f v2 ]* S( [/ _( n5 ^ - {
1 s1 `# y- _7 k+ ` - Blinker.run();3 I ^/ ~$ Z* ?2 b, \4 F; z! O
- if (digitalRead(key)==LOW)
/ K: V8 {* `, Q; Q9 S - {
- d5 X$ O8 q* S - Blinker.delay(200);
2 p, ]7 g+ ^7 H - if (digitalRead(key)==LOW)
8 I) W0 l) W) S+ e8 u8 _ - {6 J+ E' O& c3 J2 w! A* T0 |
- if (digitalRead(kg)==LOW). L1 O; c- [3 x# v) X" V0 ^5 V8 I
- {
, q |) g8 C: X0 T4 _# { -
) W) g2 M" d# \: D' y - digitalWrite(kg, HIGH);8 p8 V: U! r. h
- digitalWrite(de, LOW);$ }* c$ \0 _2 A* Q, ^
- Button1.print("on");* b4 ?+ b( X& j6 _; W
- Button1.color("#0000FF"); //设置app按键是浅蓝色0 o, H( E b9 F! t
- Button1.text("开启中");; N Y! ~7 ^& ` `0 x% P
- }: C1 l* N+ P0 C [
- else if (digitalRead(kg)==HIGH)
7 \" N- O7 _8 T; s2 a$ Z4 l - {
( p) r+ t2 E. `6 ? - digitalWrite(kg, LOW);( x* @+ v- z& d& i" N9 Z3 N/ k N" j
- digitalWrite(de, HIGH);1 o5 v) h }* }- O, L
- Button1.print("off");9 N4 t4 k8 x' |# X, b6 p
- Button1.color("#00FFFF"); //设置app按键是深蓝色( d8 }7 {& r, J- J
- Button1.text("关闭中");
* j& w6 D7 }2 q- L! g. O - }' Q; [8 S% h- R" U
- }
+ F: S+ T& Z! s, T+ C4 M: O% a* Q - }
4 z/ J. }. |* F$ b' |2 |; t1 l5 X+ @5 A; \ - }
复制代码
& ?$ w' a" w0 R9 Q& m% E5 o& h, g. Y+ O. `8 Y" }4 B
我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html
; L9 B, \: W4 [- s, @; [7 q1 ? E+ K# J! y F
把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。3 x. J5 e5 ]) H2 J9 z
6 R4 E& W+ d! l/ Z5 [
$ E' L6 ~' {# q2 h: n |
|