|
|
本帖最后由 易记 于 2021-8-21 14:05 编辑
% \! {0 q$ N2 d+ `' F
7 S$ \% S7 @$ A9 ^3 L- I最近玩ESP8266,想做个天猫控制开关。
1 S. ~& s, j3 ^3 Y9 A但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。
# |0 ~& q+ X t1 ~/ i9 U# u还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。
9 C' X. w3 N' q7 {8 i
2 u( c t. D d) j! N6 z7 P, p) q! G" ~( m; u. x
* r$ m1 T1 m% E9 d问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。
{- o0 z6 ^, {0 Z4 E- q9 C- x
, S$ T5 O7 M2 \* f/ g0 T
) l6 b% }- R# v3 V( G* U5 m9 V$ T9 m& ? J# t- ~
2 x1 P1 G; w7 \+ m p% L' n
9 t# \9 s; i H% X2 U到手,当然是拆拆拆。
- @: b; @# f/ r/ ]3 Q m; E, B( u
o; a! H _2 A7 z- t6 q2 e' j/ U2 m$ O
. C/ ~: U B* a4 F
联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。2 t3 u' N( i4 ?0 G, N4 T
; d$ D' @) M( n; \
; ^* E# Z9 M2 l8 z6 L. m
* f% Y0 f: `1 t; u继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。! I3 s1 m2 V8 r
! Y h1 Z. Y N# H3 P7 U8 o
/ M% ~. k/ c& [& B0 q7 V
+ V1 q+ t. _( q! u b) X" [* s K
- q) p; p7 R+ y# K n3 A电源芯片
: O* `' c4 x4 B& Y( r
, }; b3 n# D; ~3 Z5 c% F0 i$ B: B4 x
3 @- H% {! ^" T- V有一个按钮,按钮有二个蓝色LED灯
* g8 J$ ?% P7 }5 l
m* \/ H$ ]. X. t' I+ m- P c/ w, p* V6 r' m. U
: i2 f8 i' D5 i0 H" }+ y ?/ w& ~8266$ ]( F. p! i1 ]& z \
4 e0 s: l* Y# P/ V4 L! d" z6 p+ I2 p9 T$ j
! L# l7 l2 F9 P) e5 S
5 m" U! H3 j( D F6 @
1 ?' K, }/ }7 A/ O接下来就是刷机了,版子上面都预留测试点。
# K$ \0 G7 v+ o9 g接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。
4 F9 n* r5 J0 ~" S5 y
8 l7 _' @- P9 n& F) ]" s0 m2 O5 l
注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。, U8 m* ]! |6 K9 D# K
要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 | / x0 M2 F: R. W' |1 V" ^
( b0 A, n6 \% k" F8 p ?
% G% S. D; o! n5 s8 U0 A# {7 W" B3 b% w
5 H5 r/ ^1 `! k5 }( L) ?
) i- t, y- t: R; r2 o
5号脚位是继电器输出8 I" ?: `0 X) h! |* ]0 W
12号脚位是灯输出* U! ~2 o/ J' c, z3 @) u" z5 ~& [
4号脚位是按键
4 a. x( c* A# }2 x6 P+ ?8 V: z3 ~7 m k
0 b0 t8 U5 U0 S [1 | P! E
4 X8 d. T; v& }; [: p8 ^) c
1 r& p4 C8 ]" Q% k! \" K卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库
7 o/ b Y2 L8 g/ q( S+ n# k Y6 t f - #define BLINKER_MIOT_LIGHT // 设置小爱灯类库2 T& B/ ?1 @1 Z
- #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库
9 _& h. ~% z' W4 a. g - #define BLINKER_PRINT Serial //串口协议库
1 L: Z& H& [+ b- m$ b' n0 O - #include <Blinker.h> //官方库
% G, E" L U t3 b. ?0 s/ l - #include <ESP8266WiFi.h> //官方库9 G+ ~5 k; {& k, W' i! z4 `
- WiFiServer server(80); // 服务器端口号
. I' o3 f- t9 |6 c - + i, s G% c: W- ]/ y( u
- char auth[] = "c4942fb1d5e4"; //设备key
, ~$ h6 h! |' V n# {. A - char ssid[] = "wanboshi"; //路由器wifi ssid8 r: s2 |, \7 R. b! Z/ U, i
- char pswd[] = "1365662999813586348220"; //路由器wifi 密码
$ _" u G. p h5 X) W$ Z" p
( A& |, N @' G# z- bool oState = false;6 G2 ` o& [3 T8 H ^9 f! ?& D
- % d1 B! A. G0 H: z' u
- int kg=5;//继电器输出
$ D% _0 ]+ f6 m* P- p - int de=12;//灯输出0 O$ h; l! _# V5 A$ G0 M
- int key=4 ;//按键1 Q! O; s; n- T3 `& f
- //*******新建组件对象
2 j: C) z# E2 r( Q7 t - / W4 u0 f7 c* t$ h# J) [1 _) J
- BlinkerButton Button1("btn-abc"); //设置app按键的键名
5 _ ~3 T; L: g' n+ m - //*******app上按下按键即会执行该函数app里按键
6 a7 O. j3 m( d: y0 k& T) l - void button1_callback(const String & state)
( c& D5 k) ], c& d - {) V1 s& i% n+ Y z" k
- if (digitalRead(kg)==LOW)& D, h e3 g3 B N. s
- {
6 B) W* U4 {7 ~1 j - BLINKER_LOG("get button state: ", state);/ k) g8 h5 B5 q, ~( ?1 s9 `5 U
- digitalWrite(kg, HIGH);
; l7 q. f: v& F" u! R7 R - digitalWrite(de, LOW);2 s/ ^5 o! l7 L
- Button1.print("on");
5 |! V8 V7 ~& p) v - Button1.color("#0000FF"); //设置app按键是浅蓝色( `- j/ O. p' {! h0 r/ B
- Button1.text("开启中");8 U" z9 `) Y3 K# D
- }
/ U& E2 D: D& i$ n" M. h; b - else if (digitalRead(kg)==HIGH)
0 O7 n6 J/ s; ` - {2 O" x( k7 G" c' A
- BLINKER_LOG("get button state: ", state);# g& ~, m& ^! B# g2 e
- digitalWrite(kg, LOW);
& q9 X! F5 H* I0 _& A) J - digitalWrite(de, HIGH);
; q: P+ ?3 q: _4 C - Button1.print("off");
3 ^* N2 F# u( v" Y; t; Y - Button1.color("#00FFFF"); //设置app按键是深蓝色
; x5 T9 H$ u( U9 u$ W0 K - Button1.text("关闭中");7 p3 G# ^2 I, I9 e: u0 O7 J
- }8 t8 H! T; q$ O7 n9 _
- }
$ C& t# k U I! `/ T# |
6 W2 Y9 s( I. z0 D- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 m7 W+ w0 |4 A" l; g# H
$ ^) X: L" p( k2 f: H _- //*******如果小爱有对设备进行操作就执行下面
; G$ Y; x6 z# ~) L V6 } - void miotPowerState(const String & state)
9 L7 G, X& [8 A3 _( H2 @1 H7 ? - {, @4 R' l, w1 i5 e0 i/ {+ @
- BLINKER_LOG("小爱语音操作!"); //串口打印; |, [) P( C9 o+ i* f% |7 v% k3 Q
- if (state == BLINKER_CMD_ON){6 m: \9 {- P% W: D
- ; O7 [ \( O' {
- digitalWrite(kg, HIGH);
1 Q% }7 }. u) t0 x% d1 L - digitalWrite(de, LOW);
* Q/ a, n' q+ A% j - Button1.print("on");
1 \: b P$ j8 J; w9 v - Button1.color("#0000FF"); //设置app按键是浅蓝色
( [ f# [' m) N& i6 V; W7 j - Button1.text("开启中");1 c0 T! g. n$ G) _5 y+ x
- BlinkerMIOT.powerState("on");
5 b/ J# B) ]" s* X - BlinkerMIOT.print();. ~- p, l: ]3 g; R4 |& d9 C
- }
% _ e9 ^7 O/ o7 Q J- [! D) R, l - else if (state == BLINKER_CMD_OFF)% ]- \9 c* V5 m, N$ L7 X$ L
- {% k ?' w9 n, K. X* d
-
. c* w9 W* b( l _2 B0 ~" m' o - digitalWrite(kg, LOW);
$ _" s* P) N/ M9 @ - digitalWrite(de, HIGH);5 A" E4 ~& n& K$ B' g+ O9 d
- Button1.print("off");
m+ d. o1 X9 W" ?7 R0 T - Button1.color("#00FFFF"); //设置app按键是深蓝色( ~+ v; E- N3 ?7 h* a" A; G# j
- Button1.text("关闭中");
- E: I! b9 C* p/ g - BlinkerMIOT.powerState("off");
7 P+ }/ j# U+ N. A6 @- R - BlinkerMIOT.print();
& O6 v1 Z& Y" Z7 U7 t - }
2 L/ L( k- w3 }( Y$ z) j( o - ) G2 C/ Z& W2 x
- 0 `! n/ A9 i% Q, j# x
- }) s6 @1 Y) S5 r
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
! B) v8 ?/ l5 G+ D - //*******如果天猫精灵有对设备进行操作就执行下面1 A4 w1 V; R8 O
- void aligeniePowerState(const String & state)1 `! j) q' v! z- G( q
- {
6 y5 k1 G/ A i& } - BLINKER_LOG("need set power state: ", state);
/ g. e/ G* u4 ?9 U% _, o# m% U, V - if (state == BLINKER_CMD_ON)
% Z* a" Z7 c# ? - {
% B4 R7 A W1 g/ q, `+ k - " W4 W3 O* G: ?" Z5 G7 ^
- digitalWrite(kg, HIGH);% U$ t" H0 A3 S' K$ i" a
- digitalWrite(de, LOW);
: u5 v* G p' a: u2 T, q - Button1.print("on");
+ S2 p$ K% t0 d) `) r6 x( P5 ] - Button1.color("#0000FF"); //设置app按键是浅蓝色& Z& @. d8 N5 J5 Q
- Button1.text("开启中");
$ U" y0 h2 J2 `1 h6 p1 N" a - BlinkerAliGenie.powerState("on");
/ s9 N- ?( E5 {% e2 C( r - BlinkerAliGenie.print();! c3 f$ t9 p- ]! k/ s
- }) s% P+ W+ {8 ~; x8 {6 S5 U
- else if (state == BLINKER_CMD_OFF)- e! p* k$ \: K" v, g8 r
- { y, [6 f5 E9 a0 E8 b" D) R2 A
-
. v0 `+ L( J$ ?8 s1 s( B/ ^ - digitalWrite(kg, LOW);
+ \# v% e% m2 | [4 w" o+ Y4 C - digitalWrite(de, HIGH);
) X {, k. u ?( N - Button1.print("off");
7 k9 X3 Y, `5 \- m - Button1.color("#00FFFF"); //设置app按键是深蓝色
! D7 G! Q* O _9 Z% V - Button1.text("关闭中");) d3 T3 X V6 l) A% m
- BlinkerAliGenie.powerState("off");5 }* Q6 L( ]! E: [$ m! L2 H8 N
- BlinkerAliGenie.print();5 `5 ?- v' f2 P4 ~
- }. c0 w/ D8 s$ N& R( O
- 9 ~, ?2 C, K4 x! D8 \. N9 e
- 8 s) L1 ]$ C7 l. ]7 b
- }* H9 f7 ^2 j7 L1 i5 j: \. t/ L
- //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次
8 u( p# c8 j |7 t8 p* ?2 G4 c" ] - void heartbeat()$ c$ q1 \. V4 x A8 k# A
- {3 a5 z5 O) w6 w2 i
- BLINKER_LOG("状态同步!");
0 z' A& V- \5 E! e1 y [. V1 T7 O - if (digitalRead(kg)==HIGH)
, W- Y) S9 `8 o; Q6 J - { 1 |/ C! y$ K9 v2 V e
- Button1.print("on");) [; ]$ P7 S3 b- b+ c ?9 d0 i
- Button1.color("#0000FF"); //设置app按键是浅蓝色
$ A. ?5 r- `! m! ]- l' Y* ] - Button1.text("开启中");1 E3 x8 [0 q. G
- }
" R1 T a; X% Q4 f* i - else
5 c6 v) n- K4 V% c2 _' p7 R$ n, t" a( T - {8 c+ I# t) F4 a% D
- Button1.print("off");* I( ~5 ~7 x* H4 @, W
- Button1.color("#00FFFF"); //设置app按键是深蓝色
" Z: V* H3 l+ E Q5 m [ - Button1.text("关闭中");6 x; C- q5 J! k% U* E, p4 z
- / f6 `" S4 b4 F! ~9 W% ~! e7 i
- }
) @# e+ ~1 V: p- l - }
& Y0 s( i4 U+ X9 | - //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! N% [: v) n* o, {7 r5 t0 L' |
- void setup()- _3 n9 }0 J+ _* v7 y1 c/ }
- {
* e& l( a7 Z7 ^9 W' W- | - // 初始化串口/ c% A& r8 j# Z
- Serial.begin(115200);& _7 X ^( g7 a9 y5 Y
- delay(10);
! s# n2 C* I1 t1 t; } - BLINKER_DEBUG.stream(Serial);' l3 o7 j y1 o4 @3 r" X0 v
- // 初始化有LED的IO
4 v1 Z) ?( g% F! q( R - pinMode(kg, OUTPUT); ( q4 g" W) y; [ A
- digitalWrite(kg, LOW);//初始化继电器上电状态 ( H6 S/ F) y; \0 ?( N2 a
- pinMode(de, OUTPUT);
0 Y/ H+ L3 w2 q - digitalWrite(de, HIGH);
# d1 p! [1 l' R+ O( H - pinMode(key, INPUT); 4 P3 V: c% h w3 `0 j5 T. x# D
- Serial.println();
4 d, l; V6 {' Z: @2 a - Serial.print("Connecting to ");1 Z$ S& x/ _ B3 q
- Serial.println(ssid);: e3 {+ N8 R9 L* e
- WiFi.begin(ssid, pswd);
. V) j) f0 _: X2 p4 ?" n7 m - while (WiFi.status() != WL_CONNECTED) {$ q/ {3 R% N U. y# q
- delay(500);
& [7 R; U, g0 { A3 N - Serial.print(".");% i0 B0 ?5 U$ {/ g
- }
9 i- {/ G7 r# V7 [ - Serial.println("");: x, ?0 g6 W D
- Serial.println("WiFi connected");; N3 I& B6 v! G, g: t
- server.begin();: G" q0 d0 I( { ^6 E
- Serial.println("Server started @ ");! |8 o. A" k& D; l! k* Y/ X
- Serial.println(WiFi.localIP());. T% E% ]+ v) z, b! n5 X
- //打印出IP地址,后期可以制作显示器来外部硬件显示ip
& L5 z% W" n( Z: b0 e7 [ - Serial.println("To control GPIO, open your web browser.");
# X! E7 K6 @6 H" x. C7 S5 L - Serial.println("To set GPIO 0 high, type:");
2 B) ~+ L' k( q/ K. k - Serial.print(WiFi.localIP());2 Y/ } V( Y# K" }; @* Q/ G8 U
- Serial.println("/gpio/1");% I1 I7 N& l6 z* ]* Z0 }+ }6 E5 g. L; _
- Serial.println("To set GPIO 0 low, type:");
% `. _, q( S$ Y( b8 j; W: f+ n) U - Serial.print(WiFi.localIP());$ |) `* m, `9 b8 _4 p
- Serial.println("/gpio/0");
0 j" o- X4 C# N: W3 g7 [) m0 H - Serial.println("To toggle GPIO 0, type:");6 S7 q" G* x# T' ?" E+ g
- Serial.print(WiFi.localIP());
: m: a2 n# M& N4 z' F - Serial.println("/gpio/4");
+ T6 H2 g8 v6 a. ?/ R' V( I" \ - 9 L f2 V' `% Y- s1 v
- // 初始化blinker
( Y- W+ j X3 V. E2 t5 t - Blinker.begin(auth, ssid, pswd);
2 f" C0 m+ P% F1 G - BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数
, `: c# E/ J' @8 R- m5 v$ p# k* u - BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数- J6 V9 Q) O" H2 n
- Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。' F, H# k" L& ~/ i8 M" a/ |: Q6 W% E
; C3 ~0 ~- a' K1 d2 x, t" ]- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback2 q5 r- N: V! [: U: }
- }
$ V8 |7 r# ?* h4 ^6 u J! I8 l - void dataRead(const String & data)
9 }$ t4 @1 p1 @; ] - {, }) O- P9 d' t
- BLINKER_LOG("Blinker readString: ", data);
- O5 \2 S9 h8 t" ?' z2 o - # e, H- W% ^% i5 \
- Blinker.vibrate();. g& p: c5 L5 v: ], n) k$ e: D3 k3 A
- # N& d6 P( {$ @5 G
- uint32_t BlinkerTime = millis();
4 k1 s8 M. q- ^, i! e y. t' n -
# A/ E' I# l! ^& x) _ - Blinker.print("millis", BlinkerTime);
, @8 n7 N h. ?4 }2 Y - }- h# `" p! Q1 `3 X* ~7 F' C/ Q0 |
- void loop()
- _7 { Q6 Y. `) Q% G - {
0 }8 ]* H0 O9 r. q - Blinker.run();
: M5 p0 H! ^# y! D. d; S+ Z - if (digitalRead(key)==LOW)9 v# Y* Q3 l! F& a) r# T
- {0 w/ e4 y) g% ]! [8 w( j
- Blinker.delay(200);- F5 R0 s- q# S8 t9 q
- if (digitalRead(key)==LOW)
$ N8 F! F2 y3 P0 w, [ - {
2 @% O& K5 i3 t" h' j4 E" H - if (digitalRead(kg)==LOW)
; Z1 {/ ]# _/ h9 D0 ]- s& q7 O( I' s - {/ P D* ~% `7 {2 Q E9 x9 e) o
-
: J: q* a7 K+ z, n" [ - digitalWrite(kg, HIGH);
8 ?: ^) h/ F; J) S0 M$ v0 o - digitalWrite(de, LOW);
, g Q- m( E2 W* ~; z - Button1.print("on");
/ D. f: |- ~: G+ S7 D8 S! c# Y - Button1.color("#0000FF"); //设置app按键是浅蓝色9 f8 A7 | G! f" L
- Button1.text("开启中");
! k4 g/ Q. ]% }! [# t4 V - }
. }3 q6 X/ Z; D% X# u - else if (digitalRead(kg)==HIGH)( y/ {# V l: e; C1 C
- {
- w( a) Z. Y# D. o6 d- U - digitalWrite(kg, LOW);& s( {$ i% S$ s. _+ x! b
- digitalWrite(de, HIGH);
- j# I- E" \9 O- R- h0 B6 a - Button1.print("off");) [; P' F) ]1 W7 W
- Button1.color("#00FFFF"); //设置app按键是深蓝色
/ O4 s: `* q( x+ ^; ~! ?8 | - Button1.text("关闭中");& p ^1 c: a! I) e4 ]
- }
' ^! j g) | V& c; k" N# e - }
* R3 e2 Y# k; }: x; f, ] p1 p2 C* T - }
9 W9 W7 f1 |1 r8 H G; e1 n - }
复制代码
3 A/ Y: Q E1 j0 q* L% p) G# K6 l! ? J/ E% F, k
我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html5 _8 B" _7 F# b
) j4 r+ d) X' L% O1 Z& j5 J9 A
把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。0 }6 _% [/ s0 D4 m9 P! r L
( N3 p0 [ C' k3 W( ]* E4 b$ P2 D- Z
9 T/ W: J/ E" E' N' V3 ^ |
|