|
本帖最后由 易记 于 2021-8-21 14:05 编辑
- q* E. v- M$ p/ U5 p8 T' f# _/ w5 w" v: l5 L! x# W4 n! B
最近玩ESP8266,想做个天猫控制开关。
# k7 P! n& f4 a" S0 T* _但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。: x, K" ~3 w$ l3 f9 T
还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。6 G2 ~" H* P5 Z: U q8 }% C% {
7 l# X1 |4 x+ r% w! E
3 L, T0 R7 {7 w& }( W* n3 D5 O/ q) A% L+ H
问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。6 T6 i- M L S& ?" f
, K0 [% O6 z1 D2 ?" b3 V
0 p+ x5 `: t1 z! q. N# f, i" z
! K8 q1 n' B) p" u9 U. j# j+ y! |+ p* y4 p& X! L
2 M7 s/ f& q# E9 a; s
到手,当然是拆拆拆。
+ Y# N7 `# D6 M' T
; }& z' j. |3 q, H6 x" B& {7 p3 _+ c
" w0 e7 W9 c& F# D
联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。
% R4 I9 i2 L% _, C1 U% I/ M
, ]9 G9 u$ f; t$ X9 ~* A
9 A: b7 ~/ h2 q, Z- I* t) K( p- X
继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。
# _0 h' I' o2 e
$ A: ^3 _8 d% p# k; W
h [9 m: ~! h2 n2 C5 r
; F1 z, s% h/ x) p1 t) ], K
: z, F* l4 z( [- c6 a
电源芯片8 O3 ?# C+ s# U9 z- j
* x! _0 V, x" g# c" P$ F4 {/ O) Z/ Q9 o' k- }, [3 a- {7 P$ Y# b
- }2 }* v ~7 @) F1 G
有一个按钮,按钮有二个蓝色LED灯
& e/ ]8 g* \& O* d
+ Z# |4 b9 |& j% Y/ w3 w
1 p6 [/ ?/ L1 b9 H) R) L2 Y t8 W+ [4 q! z
8266
; x# V, x! O. N' P {
U/ N' k% ^0 l0 m& J
( D" y8 j- E; d& B- Z x
+ ~7 r% e! q! a3 Z$ z) W
, ?# X" I: v8 m, _
) Y7 @4 d! p/ Q z) ~& v$ w9 l( ?接下来就是刷机了,版子上面都预留测试点。# ~7 w) R: V0 W9 ^1 N2 w
接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。/ X; w0 Y1 U& Q7 [
+ ^- n+ \/ ~$ d9 v. w" ]& }- e( m! R: B注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。
; f5 I; H6 Z9 g \! h1 w& O: Y; C要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 | . ^+ y5 ?- T/ d- C" A
1 t$ o1 g4 B: C; b( M- u6 |5 I& ^) Z; h- M4 D5 L* T
& g! q3 V, i% H$ V# E4 l" t* u; D
% V4 k0 n3 U/ m( G& |8 u( O
5号脚位是继电器输出- j2 o! X& E1 k k4 U# d# e/ E0 Y; H
12号脚位是灯输出9 ~+ N* Y0 ?7 A4 J' b2 G0 D
4号脚位是按键! S+ p/ r( j! b* U* g" M% w Y
7 ^& A, n( {. `1 h' ^" \' {
; `( [5 _4 I2 h b( c0 C" g' x0 e) U$ a0 ~; E/ E7 B
, B A' H0 `( k( n+ x4 Y
卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库
! F( D" g5 @4 Q6 o) j2 ~ x: H: Z: E- } - #define BLINKER_MIOT_LIGHT // 设置小爱灯类库2 X$ E4 U# ?8 X" l: f
- #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库
4 n4 B& o. |$ g# V' ^1 L - #define BLINKER_PRINT Serial //串口协议库
* c7 U9 X# ?* l. S; I4 K - #include <Blinker.h> //官方库
! P4 s! z6 z$ `1 D% t3 J5 a - #include <ESP8266WiFi.h> //官方库
/ N0 B1 c* u5 i7 k - WiFiServer server(80); // 服务器端口号
4 N3 V9 I! e/ ^4 r8 q
& `+ o7 @2 n5 M' N3 P: A- char auth[] = "c4942fb1d5e4"; //设备key
9 s' t3 J! T' { - char ssid[] = "wanboshi"; //路由器wifi ssid: X7 u3 ^8 S* {4 i: ~
- char pswd[] = "1365662999813586348220"; //路由器wifi 密码" i* g @" C: c( W
( J8 o- c/ b7 K+ o- bool oState = false;: u+ B* i- @ u4 E
- 5 m: l8 x3 D# b. T4 A: ?! j
- int kg=5;//继电器输出4 ?7 N( L( n# w9 S
- int de=12;//灯输出$ j! d) h6 ~' V# G' ]
- int key=4 ;//按键* I; U# g# F$ V
- //*******新建组件对象& I4 I1 c( H1 }* E
4 X& v* Z* \2 P9 w+ a) r; Z6 v- r0 O- BlinkerButton Button1("btn-abc"); //设置app按键的键名
" r. I5 @; S7 u; y1 i - //*******app上按下按键即会执行该函数app里按键
+ |9 V. B5 T5 I/ T! q3 Q - void button1_callback(const String & state)# j9 r- p7 [, }- e8 t
- {3 U1 _" _0 b2 E( ~. _2 E
- if (digitalRead(kg)==LOW)+ m, j2 z2 e* t: n+ J
- {6 L- F) s; b+ c* s: C% W
- BLINKER_LOG("get button state: ", state);
( ]( {* k1 C+ e6 f! Y L - digitalWrite(kg, HIGH);. L/ [' \6 c2 T# v4 z! S4 u+ {
- digitalWrite(de, LOW);
" X- {( l y) ?( C - Button1.print("on");( u5 v8 B6 Q3 w' Z' b9 @; O. g( `
- Button1.color("#0000FF"); //设置app按键是浅蓝色8 D9 ^ x! M6 u9 W
- Button1.text("开启中");
: v; h0 S! K; O7 y) J3 j b( @* k - }
" Q: @; w7 m! a( w/ {7 r - else if (digitalRead(kg)==HIGH)& ?* P0 c! u. A& s
- {
: @+ Z+ e* L' h4 _ - BLINKER_LOG("get button state: ", state);! ~$ B+ U' d) ~/ g+ e3 X* W
- digitalWrite(kg, LOW);& B/ m0 Y( C. u, a5 Y s
- digitalWrite(de, HIGH);
. H' T% k5 R: q8 {2 g/ R - Button1.print("off");# ?+ d1 X3 F: J# |4 H/ E
- Button1.color("#00FFFF"); //设置app按键是深蓝色5 W; J# B& I) M
- Button1.text("关闭中");
6 d3 C8 j% `$ s! X+ ~. _% O - }( a( ^ {6 _# ~! y3 W
- }
0 T9 }3 ~& M A# w* c* l
; V: @5 u) c! F: X* R# F3 f/ w- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# h( v m4 j; }4 C* G! r; y
/ E/ {0 g( O* C2 `- //*******如果小爱有对设备进行操作就执行下面8 Q B, j. I1 V6 f, n/ \& [# D
- void miotPowerState(const String & state)
' h9 M8 ^+ E, [- e - {
9 Y: B/ w' d* e9 W# W3 u: A - BLINKER_LOG("小爱语音操作!"); //串口打印
; e. ~6 u' s; W; D. `1 n - if (state == BLINKER_CMD_ON){2 k" _" S% w" Y* x( U
- + P& N0 G7 r2 ^/ r. H
- digitalWrite(kg, HIGH);, C0 g( o8 V7 S- ]& p
- digitalWrite(de, LOW);
5 d0 b, E! [% C' M - Button1.print("on");
7 ?# d8 [, i# e* D - Button1.color("#0000FF"); //设置app按键是浅蓝色
: j- f9 K, f# E4 u/ h' }0 w6 M - Button1.text("开启中");
5 o% H4 @$ T! O8 r" I) ]& z - BlinkerMIOT.powerState("on");% |/ ^4 X$ y( }* N: {2 ], l; I
- BlinkerMIOT.print();
2 X: e P/ Y7 \* U: `/ m" H/ p+ V$ f9 E - }
0 x9 s4 k* R5 z' ~7 ?8 E! { - else if (state == BLINKER_CMD_OFF)
. ?9 J( M. C- V2 i! u' {( ?+ x - {9 b! Z$ ?$ L+ C M- e- e
-
K! C) L v$ D2 H% u$ ~ - digitalWrite(kg, LOW);
0 E8 h$ }, ~( f4 ~ - digitalWrite(de, HIGH);* U. b, J! v+ v# \$ f
- Button1.print("off");( S0 Q* q( P; M1 l5 R
- Button1.color("#00FFFF"); //设置app按键是深蓝色3 t7 C$ r! ~2 h, b- ^3 N
- Button1.text("关闭中");
" h# a) l1 z/ H* w( T& s9 x - BlinkerMIOT.powerState("off");
. _, w% \9 j/ O- o4 \, X - BlinkerMIOT.print();/ Q" B2 t$ [) S- B t. c- l
- }
; |6 A9 S/ z/ l - & B' a+ D6 y; P% P# r0 _
-
8 _ ]/ k# I3 J2 ? m - }8 O; Q6 {" Y3 w$ o* ^( ~2 ?# I
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
( ~- w( S" ^& p( z A - //*******如果天猫精灵有对设备进行操作就执行下面' d. e6 I, K. a1 ]" `
- void aligeniePowerState(const String & state)
- n B# s+ [* ]7 e/ n - {5 c; M/ T' N- E W" o
- BLINKER_LOG("need set power state: ", state);
+ U' Q2 \* V( N9 `0 J7 z - if (state == BLINKER_CMD_ON)# h$ }; M/ \% l
- {+ J0 O2 v/ N/ Q( i* n* g0 v
- # ^ y- D) \1 q5 U o$ {
- digitalWrite(kg, HIGH);
# f) T7 J' v' E4 I2 Q8 z$ S# Q - digitalWrite(de, LOW);
7 t' R- m( [" w - Button1.print("on");/ U# S: Z& L, e2 `+ r' {
- Button1.color("#0000FF"); //设置app按键是浅蓝色
7 t' D+ B. d1 ^* A - Button1.text("开启中"); l& q; W4 r' M0 }$ }
- BlinkerAliGenie.powerState("on");
* Y' X M0 k/ S - BlinkerAliGenie.print();
) ?5 o) h6 T8 U+ q - }% z& y' {1 C; D3 ]# Z' N3 h, K
- else if (state == BLINKER_CMD_OFF)- N- ^7 l# S6 |! C0 C
- {; P- A, [9 I& r/ }5 |
- ; T- o7 T3 L! N1 m z# ]
- digitalWrite(kg, LOW);
# z/ f! F3 U; k$ J( v - digitalWrite(de, HIGH); I9 @1 T1 @) Q9 W1 Y, `
- Button1.print("off");
, Q/ x8 a5 z" k - Button1.color("#00FFFF"); //设置app按键是深蓝色, T4 Z+ m% O# S& Y7 `* x" F1 C
- Button1.text("关闭中");
5 E/ _0 v3 A! C5 H2 g! x) o0 f9 O) [ - BlinkerAliGenie.powerState("off");% P% H& C0 z2 u
- BlinkerAliGenie.print();0 L( e% f; o2 q0 F
- }
4 P8 w6 o; m: ]5 a! l -
" K/ _, U9 V$ |4 ]! e
) H- ?3 t1 w% F1 A5 z- }9 s* Y+ j6 E6 M! \) Y9 p" s
- //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次0 Q* F; s5 d) K2 {3 c7 {
- void heartbeat()1 V. Z. u0 o- s8 ` l" d. ~1 h9 q* y9 _
- {/ Z$ J: v1 o1 f9 U9 f
- BLINKER_LOG("状态同步!");
6 P) }. C% x6 n. C. r; p! s# i9 q - if (digitalRead(kg)==HIGH) ; R4 ~7 i& `( j% f! Q% h. ^
- { , _' M; L/ ^' U0 u
- Button1.print("on");
( [# I+ g! l/ U1 ` - Button1.color("#0000FF"); //设置app按键是浅蓝色+ t( I8 q. a1 O7 d9 }( U* k0 _
- Button1.text("开启中");# f; ~9 r R7 _* ~
- }
4 c3 b [- E5 d4 A) P# q - else
9 Y5 a1 D3 w9 F9 u7 \5 }. Y - {
2 }! k8 r/ T2 j1 P2 z - Button1.print("off");5 Z. ?4 T. T ?. t& v
- Button1.color("#00FFFF"); //设置app按键是深蓝色
. x! q' E$ F1 Z8 A- j - Button1.text("关闭中");! ^5 V; C% D- a; ~% X
- . O1 ^! N3 w" Z% I4 V+ M ~" `: ]
- }8 |( i" {* k, p$ D ^1 g
- }+ r& U. m& |. l$ z( p
- //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++: U" v5 ?) A9 X
- void setup()
5 W- a2 W O# p7 |9 \, K- } - {. s+ [$ X& q! L$ I; j/ M
- // 初始化串口, u1 O' U' G; i5 z. g* {
- Serial.begin(115200);
0 e& n- u7 S+ F4 ^0 | - delay(10);
) p4 L' T. k' [ - BLINKER_DEBUG.stream(Serial);0 t; x9 q+ Z4 I" d/ \- D$ g( [
- // 初始化有LED的IO
5 l/ T3 I8 p: c: Q - pinMode(kg, OUTPUT);
. s' }6 i& Y* |' b s @; X - digitalWrite(kg, LOW);//初始化继电器上电状态 9 m! M) p z0 O$ T$ D8 O" Z; p
- pinMode(de, OUTPUT);2 r* ^9 k; K L* H1 F' l
- digitalWrite(de, HIGH);
) v/ i/ Q# j7 \) g; U8 Y% O - pinMode(key, INPUT);
/ L+ ?& C) _- h5 }8 _4 e! e8 L - Serial.println();9 o. |+ q2 I" f& ^6 b1 o, s3 o4 G
- Serial.print("Connecting to ");
( e" Q6 t1 Y( \4 [4 ^+ M( Q4 [$ n - Serial.println(ssid);
1 X; E* P7 q# k, o1 F6 ?4 D+ L+ @3 F - WiFi.begin(ssid, pswd);
; V+ n+ {! p0 [% X% ~: N# A! y - while (WiFi.status() != WL_CONNECTED) {$ z$ y2 A4 Q5 {
- delay(500);
6 c6 H# ]& o" k7 X2 e, }3 k) Y7 q - Serial.print(".");
- a* I- X3 u! e1 o$ v- n/ W - }. {, L: r+ r9 l! T
- Serial.println("");
; }3 a( ]7 x( E+ W; m - Serial.println("WiFi connected");
, P0 v' A1 L5 x% K( r$ E G - server.begin();
: R* f% x& Y6 M1 b" P - Serial.println("Server started @ ");' v2 m* t. z! G5 s
- Serial.println(WiFi.localIP());
7 J$ y- q! q8 B5 R) [ - //打印出IP地址,后期可以制作显示器来外部硬件显示ip# Q5 g7 j w9 u. H
- Serial.println("To control GPIO, open your web browser.");
; B6 B1 u6 R6 [ - Serial.println("To set GPIO 0 high, type:");
! s) v: J* @3 K7 r - Serial.print(WiFi.localIP());: G5 Z9 F9 Y+ e9 b
- Serial.println("/gpio/1");
$ d y8 w1 C7 Q/ W! f1 Z - Serial.println("To set GPIO 0 low, type:");: h' b* t/ H* G# j4 e) C3 a0 f1 g
- Serial.print(WiFi.localIP()); p( {4 x" c- y/ {: i% L
- Serial.println("/gpio/0");6 |6 y, h' M- M, ~3 j/ v$ d
- Serial.println("To toggle GPIO 0, type:");* K5 y0 M7 u2 r' ]; P2 b
- Serial.print(WiFi.localIP()); r& w' R0 K' _* Y: z
- Serial.println("/gpio/4");
- f- S: ?8 n$ z6 @, h - - M2 F0 B& {6 W4 P( w$ i# S
- // 初始化blinker
+ f1 d) l# K- @, @" O5 } @% [ - Blinker.begin(auth, ssid, pswd);
) ^) L' s4 b3 m3 t - BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数
9 [, w4 ^& @ Z4 @& A' P5 B/ g - BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数2 T& Y2 V0 [4 {* g
- Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。
; D0 o8 A' t# h# x7 Q* ` - / i* U0 G% D7 E$ z: \. F- F
- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback% a V3 d1 F: w" c" h
- }
! \5 i1 @! q( i, X - void dataRead(const String & data)
) {" T2 }5 ]/ a - {0 `# }0 t7 V- c; u: p' d
- BLINKER_LOG("Blinker readString: ", data);
) s! {5 N* n7 Z+ \$ W8 f! m2 e - ' h% K( r$ N" y! y) G) o& N( O
- Blinker.vibrate();
4 X1 _" j" n' E% F0 v8 i -
7 w' k4 p) a) d) o; E - uint32_t BlinkerTime = millis();
. r6 |4 i( U! h N# D8 v -
7 @7 ~2 [9 K6 @2 w7 A* s/ x - Blinker.print("millis", BlinkerTime);
, T) Y; G" u: x& Q$ Y1 K7 R - }
7 K3 L7 \8 \, P! D) S0 k - void loop()
! u% z7 m* j0 N% s& R - {
) h4 [4 r% z7 q - Blinker.run();% G1 \' g- ^6 n9 n% j w
- if (digitalRead(key)==LOW)2 E/ a* y& V& R
- {& D( O q2 _/ d7 w' F+ E) f
- Blinker.delay(200);+ j8 p. p2 d7 W5 C; p! e1 E+ ~
- if (digitalRead(key)==LOW)' U0 g; v, y( R3 a! l n
- {3 V& H: a# s$ o; P' W0 a
- if (digitalRead(kg)==LOW)4 j4 x* Q% c- @# I( P# M0 N
- {
4 A2 d( a: a. V' k5 j& Y - 9 O l( r- r2 R0 t- w, c
- digitalWrite(kg, HIGH);* _8 ?9 e6 S0 p5 N+ `0 J
- digitalWrite(de, LOW);
$ V _$ e- ]% F% a; I2 q - Button1.print("on");6 t+ a1 s! z$ W4 ^$ d
- Button1.color("#0000FF"); //设置app按键是浅蓝色4 C" L# @8 }! [! B4 n* t
- Button1.text("开启中");& w, E: E$ \. {" d
- }( p0 l3 z4 Y5 K
- else if (digitalRead(kg)==HIGH)+ X5 |' y* i8 }: p: @" Q3 i8 S
- {
& s& `9 x h9 o C" ^ @ ~% W - digitalWrite(kg, LOW);
' p5 P1 h% I$ k8 v( t - digitalWrite(de, HIGH);3 B8 ^: r/ f& N: G& x8 }5 [
- Button1.print("off");: i6 O4 V% O: t- Y( E, X- c% P
- Button1.color("#00FFFF"); //设置app按键是深蓝色( Q. Y1 A+ u& ]5 Z" W( S
- Button1.text("关闭中");
& X& B. s# I' Z$ X3 P - }
2 x0 _ `( C" v; N; G - }9 ~9 V0 n7 A- O5 z- s
- }2 d3 _6 q" l, j
- }
复制代码
. s- O/ b+ G9 W k2 ]7 V) A' z' m( ~& C5 k2 S& G
我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html
& S& e5 O- }: h' g! n$ a9 C' }9 E6 v: k1 w3 F- n J8 I7 u
把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。* w3 C% x' Y o* ]1 C
% ^- D5 N: a! A, [" S) Q
: f4 f# d- A6 L" m: E |
|