|
|
本帖最后由 易记 于 2021-8-21 14:05 编辑 $ b# r/ r. W) \# A, U+ r
+ ]0 H2 a& y# n1 m' S4 N
最近玩ESP8266,想做个天猫控制开关。2 c, M# I8 i" m' ]) `
但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。* |# F0 Q1 [* M* m ?( U+ Y
还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。
( k: |. u k5 v" X) w% R
- o( S: \7 a. u5 u, \# \9 ~
2 d; `% L; g( k* W2 l" @0 r* p- X
p/ t0 [! {5 O8 q. Z+ f, s问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。
6 Z. t, b. G( d' K+ Q. M- s! D& U, E, G# L* _
* e4 J! k! A$ f1 G- ^, _: Y3 k1 A! P
' P" y7 Y& H2 Q
8 T/ j. M( ~% [9 E9 \# z8 A1 i$ ]7 b
到手,当然是拆拆拆。4 p1 Q8 c+ E% Z7 b1 G* f
) j3 @$ D+ J7 F5 \$ e) \- _- l) ]8 \
) o8 [& p5 o5 Y ]2 |
联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。
+ c7 z; y2 x* {8 q# `" v$ e
7 y, {8 P+ V0 P+ ^. |8 P3 q- ?7 U
+ ~; r8 @" a# U( K0 V# g
9 t; g/ ^- a. R- ]
继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。# R2 F9 N( _0 ^4 A
2 H& r; J1 `: L, y0 m1 k" p8 X1 w3 ?8 e6 [; ^
% C3 J- f/ P' d4 L' z
7 }" l6 V8 V1 u& Z' J$ g# r
电源芯片
! U8 G8 b2 r' j2 o( [1 j& z# o( U2 T* W/ S6 R ?
8 O+ n, B: }3 [) b3 V# P
+ w* o& U: j( b: v有一个按钮,按钮有二个蓝色LED灯& A! ~ T) V+ I; w3 _
6 {6 J L" X. t! h+ U, J4 _1 _- N; T0 B+ j/ j7 _9 E7 v2 k
+ \" I, u0 l$ Y9 r9 v: _
8266+ Z8 S" V) Q6 |) c( a: i* _; ^
7 l6 Y2 ], S" Y) x. ]
, Z! W* d! ]% s4 L! N, |( P! i Q4 j% v8 Z
3 Q3 T% R4 R( w8 c: a: }( V6 g" F9 g
接下来就是刷机了,版子上面都预留测试点。, b9 o( d [8 _. G
接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。% e, B5 `: H$ `
' E% a) F9 l5 J* O0 k$ y注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。( m6 @! u+ G* M- b
要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 | ) g+ N0 @0 X7 }: A% |0 Z0 K
# B# }! w: M- G$ {4 p2 A; P3 W% a. E, W. {* t; |3 E
. H8 ?! K m" g a1 t( f2 f9 A( ^: A2 k' T* G- P+ ?+ n
) m; o; t# ~" B# S* T. T 5号脚位是继电器输出
: @. X% S3 q9 j0 _ 12号脚位是灯输出
' h* y1 k S3 p y6 M7 E: o8 [ 4号脚位是按键# ]" p2 ~# H" \5 D3 z: V
9 {5 ~; \$ F$ [3 k y0 [. ]
0 ^& G0 b2 X% m" e g
) f- n+ c# Q0 L( ^; d/ e# l# Z0 _; E7 w
卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库
" `/ i5 K- J8 @% l. l! t+ ? - #define BLINKER_MIOT_LIGHT // 设置小爱灯类库
4 s# t' ?5 W! u7 T! R) J3 y8 v - #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库
! }- {4 u; Z3 p& K - #define BLINKER_PRINT Serial //串口协议库3 s4 |, i( Y, G6 b0 F: Y& J2 w: K
- #include <Blinker.h> //官方库
, i% W0 k& Q6 B2 G& a* H - #include <ESP8266WiFi.h> //官方库
5 N: C% d, K$ \ - WiFiServer server(80); // 服务器端口号8 c0 N }, l Y% J
2 I5 R2 i6 Q2 [* q6 a3 Z' Y6 [/ p) y( t- char auth[] = "c4942fb1d5e4"; //设备key
2 U% G; V. N5 J; a+ {1 Q - char ssid[] = "wanboshi"; //路由器wifi ssid# A+ L6 S* ?) ]( ~6 o' P
- char pswd[] = "1365662999813586348220"; //路由器wifi 密码
+ _. e6 M8 ]/ _8 W3 Q/ C
p+ H+ E# F5 B; g- bool oState = false;
, k# l) X! o G. J8 |5 X
4 w8 C A' ?+ @- int kg=5;//继电器输出
2 N( F# X" F) U. w - int de=12;//灯输出
& d. X3 C8 Y# ]/ E - int key=4 ;//按键1 P, u& U6 D) b1 B z
- //*******新建组件对象
k, H0 I1 X* r4 r8 O# m - ! F, O9 {& B4 S
- BlinkerButton Button1("btn-abc"); //设置app按键的键名6 W& R5 W3 Y. q5 P. Z
- //*******app上按下按键即会执行该函数app里按键
5 ~" z7 n% f7 K" @9 V - void button1_callback(const String & state)
+ \- N& f8 ~) D5 w, B1 a, r - {
! V+ `+ F6 X2 p6 N: s% _1 ? - if (digitalRead(kg)==LOW)! v+ j# w7 K) Y7 n; H2 f
- {, p& W4 ?* ^2 a p Q
- BLINKER_LOG("get button state: ", state);& B3 |6 [ c6 _- j
- digitalWrite(kg, HIGH);! ^4 h0 d+ p7 a: i
- digitalWrite(de, LOW);3 `& _6 Z+ c1 i
- Button1.print("on");. g& G1 m9 W h
- Button1.color("#0000FF"); //设置app按键是浅蓝色- C0 j T! k9 i9 N
- Button1.text("开启中");, A4 m; p4 C/ {% A% t7 @* K8 J
- }$ n1 `& p" Q7 i5 q$ R7 h7 h7 Y' Z
- else if (digitalRead(kg)==HIGH)& s, _# Y# X0 y6 |/ H- K
- {1 j7 q) r3 B/ w
- BLINKER_LOG("get button state: ", state);4 \ ?$ ?, g4 i
- digitalWrite(kg, LOW);
; w: b. W* X1 _4 ^ - digitalWrite(de, HIGH);$ i& X8 [$ B7 j+ N2 v1 }
- Button1.print("off");
9 d% E8 X6 H- X6 q - Button1.color("#00FFFF"); //设置app按键是深蓝色! J5 `8 K. a4 A0 J Z9 p% c4 v
- Button1.text("关闭中");
O3 I1 G7 F) I' [ - }0 u1 W4 y; V1 F; G+ S$ J
- }
% i, j. {$ G3 n- W6 i$ f0 ^ - " \( ^& Y* Y9 c3 Y( H% N0 @
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++, _! p2 S7 @2 I2 i3 z W
' `- p d# ~$ o5 p( ?* p# }- //*******如果小爱有对设备进行操作就执行下面
0 I( [+ f8 ]$ L8 s8 M/ z - void miotPowerState(const String & state)/ V7 ^% `- j" c$ f' A/ x
- {$ @2 O+ B! z& o8 Y- [1 _1 Q
- BLINKER_LOG("小爱语音操作!"); //串口打印
- r5 F5 r) T1 ^& c. r - if (state == BLINKER_CMD_ON){
! `& |$ }; k$ c$ y2 t' w -
/ x( ^2 a' t; q) ` - digitalWrite(kg, HIGH);
k8 X8 ]" e& ^) w7 s2 v1 k - digitalWrite(de, LOW);" v! ]! t3 v+ x' g, u; @4 q
- Button1.print("on");
7 {2 K4 S2 q# S7 u( @ - Button1.color("#0000FF"); //设置app按键是浅蓝色
. E( O/ o5 B( d& z' D- f5 M - Button1.text("开启中");
6 H! I: G. n! p2 ^- j4 A - BlinkerMIOT.powerState("on");
2 d2 Q- n1 ]2 B" x5 @ - BlinkerMIOT.print();
" y2 v/ o1 B n# b. [& B - }5 p7 ?8 ?3 i% v" l2 o
- else if (state == BLINKER_CMD_OFF)+ ~: t8 X8 f1 s$ ?5 d1 j$ F$ W
- {
$ Z9 @1 x! q; ~$ W& \5 [ - ! L7 F- t; l2 U' @0 \4 d- i9 S
- digitalWrite(kg, LOW);% w4 C: ?; i- t2 M5 [! m) r7 g
- digitalWrite(de, HIGH);! A; V7 d/ `; f& f# C F$ H
- Button1.print("off");
6 G& E- H; W& b! g - Button1.color("#00FFFF"); //设置app按键是深蓝色
: Y# L h! N/ E; ~0 M+ P - Button1.text("关闭中");( I8 W- y+ K! v' P% v( o# s$ k3 H
- BlinkerMIOT.powerState("off");5 o1 J+ ]5 s$ r0 ?1 k: w0 P/ K, l/ `: H
- BlinkerMIOT.print();
q6 p% }! o- |7 C+ @) I5 w0 A - }
4 V8 P6 @. \! ~0 Y! X0 A, B! P9 u -
4 o, v( U2 w! m2 S" p -
% K. M4 e" O9 u3 b( r - }: `- E/ Z1 Y3 V9 F
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
$ f, r: C9 E+ [5 U' W - //*******如果天猫精灵有对设备进行操作就执行下面4 M: w$ d+ }9 S) Y- S+ u& b& r- `
- void aligeniePowerState(const String & state)
/ I8 t+ ]; B1 x( B* v - {
: y& e0 {3 l0 i b i4 |; D - BLINKER_LOG("need set power state: ", state);; { y0 U& f' S! g! A! L
- if (state == BLINKER_CMD_ON)
* K8 |5 y' e2 Z& Y9 P( r2 r - {/ k: c1 D6 `9 o/ R4 Q: @, Z. l }
- : l0 ]! C4 K! M7 }. u6 e; }
- digitalWrite(kg, HIGH);
: c8 s* N! ^; C7 b' E- ]3 _; \ - digitalWrite(de, LOW);
9 W/ m& _; g9 v9 e. } - Button1.print("on");
% Y# a3 v4 j# }4 X: M9 c8 U0 V - Button1.color("#0000FF"); //设置app按键是浅蓝色 Z: C7 v/ u! O1 R4 ]3 u
- Button1.text("开启中");' y" \5 {, F8 ^3 n( r" H: q- F
- BlinkerAliGenie.powerState("on");; c" E. m: O9 ^7 G
- BlinkerAliGenie.print();
' x$ L2 o, y( S2 u2 { - }
) H+ l W& }) k' \% l: q - else if (state == BLINKER_CMD_OFF)
' J% o* V6 c, } x - {
- `# S b0 m p- e -
% o# t" @" L1 k7 s# b5 l+ _ - digitalWrite(kg, LOW);. ? y3 p9 r) h' k) v2 h
- digitalWrite(de, HIGH);6 o. Y3 e8 d1 s
- Button1.print("off");& y% z1 J1 h4 S
- Button1.color("#00FFFF"); //设置app按键是深蓝色
% i9 w6 {! l+ [6 b! A# h1 t - Button1.text("关闭中");7 B- b2 K* E X
- BlinkerAliGenie.powerState("off");
1 L+ |0 S6 H! k" s" P2 h: b - BlinkerAliGenie.print();
, B/ O. J- W% z/ J' p% o - }" S, H* s/ \9 V1 s* u
- 8 ]0 O/ A t% i, m* L; K
- m7 U+ P4 j W9 h# M" p
- }& f% _; \: y" \2 f/ e
- //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次
% a! M3 A- A! h# O - void heartbeat()
. } ~8 D( r) u, A: E( h& \ - {. m% X2 u0 Q- j! a' b6 E
- BLINKER_LOG("状态同步!");
! k3 r, Z1 ~1 j - if (digitalRead(kg)==HIGH)
, x. V% k$ t( j/ f - {
: s7 k) u; B/ @4 s( F9 e - Button1.print("on");6 T$ j# c9 u. ]) [( x, X1 c
- Button1.color("#0000FF"); //设置app按键是浅蓝色
# M* Z M& J, i. T" D( @; { - Button1.text("开启中");; k+ e- K a3 A- a
- }
5 e2 F' {" b* O3 ^6 i% K$ k5 F$ { - else ( b: \7 ]7 j" x. f
- {$ T; T1 T5 S# f: f
- Button1.print("off");
9 K1 H4 E9 s. e - Button1.color("#00FFFF"); //设置app按键是深蓝色
& K2 ^0 n3 k9 |' G! K$ O - Button1.text("关闭中");5 E+ |: j9 Y4 P# K b3 z9 R# I
-
; a3 H* m N! [3 M7 N' f: [ - }- w; e% w; V7 c
- }+ a# _& ?2 J8 ~) y N7 P' y0 ?
- //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
( K1 ~6 M- k4 l0 u2 G& _2 ~ - void setup()" [* b* L8 _$ Y6 a( M
- {% H, r& x# ?# e
- // 初始化串口
/ d* u0 Q2 N) g7 b% e' V3 e - Serial.begin(115200);
+ Z/ U9 w& t0 k - delay(10);
; R T4 e. D1 U' N: V/ E - BLINKER_DEBUG.stream(Serial);
" z% I9 K3 _: W% T# d' I - // 初始化有LED的IO. z4 k( R9 s7 H: l0 ~' c1 |: |4 w/ k
- pinMode(kg, OUTPUT); ) {/ e+ l- w# L$ g5 m" c( J5 a: B- L
- digitalWrite(kg, LOW);//初始化继电器上电状态
3 T8 c. J- e' {* z) l - pinMode(de, OUTPUT);
1 ?" m+ c2 g* k2 F! W: A - digitalWrite(de, HIGH);
- V3 D2 [8 y& a - pinMode(key, INPUT);
+ F* h4 {+ s- y' `$ l8 { - Serial.println();- y. y F3 ?+ O3 Z$ X
- Serial.print("Connecting to ");
' B& ^# H5 r! X$ z5 j/ w! u - Serial.println(ssid);
: V5 R* F( H* W8 ~6 F( A$ O - WiFi.begin(ssid, pswd);4 Z( K; r7 m$ N4 C6 C
- while (WiFi.status() != WL_CONNECTED) {
7 w! N' a$ u9 ^8 Y. ~1 f% R& K5 h - delay(500);9 M3 r% N% y, c+ ~. e( ~* {+ {. p4 e% a
- Serial.print(".");0 `! f, Q& |* u, }& H6 V
- }
7 m" `/ G4 S1 l0 I( S - Serial.println("");7 |0 ^+ z4 c2 T) W! l% L7 y' @$ K
- Serial.println("WiFi connected");
j$ Z1 v, w6 o+ | - server.begin();+ S; S4 B ]) j* l
- Serial.println("Server started @ ");
4 ~7 ^: r6 E y - Serial.println(WiFi.localIP());
$ K4 f5 f/ F7 H; S" l* _- p - //打印出IP地址,后期可以制作显示器来外部硬件显示ip
0 `* p0 |! d5 @4 z# X' p* u2 ~ - Serial.println("To control GPIO, open your web browser.");
; c* A9 `0 e& c - Serial.println("To set GPIO 0 high, type:");6 `( m) O4 Y& T# n$ [! T
- Serial.print(WiFi.localIP());; A; A1 F. R# R- A
- Serial.println("/gpio/1");
& f/ e! r3 V: G( ? - Serial.println("To set GPIO 0 low, type:");
: d5 Y" y- a# X - Serial.print(WiFi.localIP());
: s9 K% ?$ R4 N8 P3 b4 I7 I - Serial.println("/gpio/0");3 \7 k6 o4 W( A1 ]! ?
- Serial.println("To toggle GPIO 0, type:");' v: j. l& K3 s
- Serial.print(WiFi.localIP());* Q% h! Y& ~7 I; ^5 W& T4 D
- Serial.println("/gpio/4");
1 w! u7 c/ p+ i7 M0 S
% J* B) R/ }# D7 j6 r- _- // 初始化blinker
7 D/ ]' |% r* d - Blinker.begin(auth, ssid, pswd);. o' X( N r0 t) @0 [ o
- BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数
! B) ?3 I% a' g1 y2 H - BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数
% q1 X8 l$ R3 O - Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。6 |9 `/ O5 p6 P4 J& ]4 I
- ?$ t4 A& D! E6 U/ ?4 @- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback
8 k2 ?; \1 w5 d( Y% D2 [$ o - }
; B- q6 |0 b" @0 Z! H4 g* n$ u7 L - void dataRead(const String & data)1 |$ \. l1 t$ Z; g- K+ B
- {
+ N G* r& h3 X5 h% H - BLINKER_LOG("Blinker readString: ", data);
' M" g6 s, U$ {2 F/ ?
9 U; ?% e9 E S( K% Y, r! N- Blinker.vibrate();2 P. g% A) @6 [" F
- 1 ~$ }$ w+ |' {1 L0 [' G% B
- uint32_t BlinkerTime = millis();. F2 Q3 q: J3 h- H& a
- ; U+ M; [9 |) q, }6 [
- Blinker.print("millis", BlinkerTime);( l; b3 \% [! N; O1 [7 N$ v
- }
. M9 Q# L* Y: e - void loop()/ i* x9 p/ E3 l( |; b x! s
- {
3 a* |. [; j) p; j/ |$ G3 G - Blinker.run();5 Z/ Z: A/ O; t* `6 m
- if (digitalRead(key)==LOW)- D# K" C" r0 `. Y
- {% m0 O6 V% S6 a: D$ p! ?/ Z
- Blinker.delay(200);6 m8 |. @5 R2 P. Z& Z. J3 t) i
- if (digitalRead(key)==LOW)& M3 D" M/ j/ C+ ^8 J, Y
- {
% W' z) n3 l l" z - if (digitalRead(kg)==LOW)
: B2 ]7 F; E# S( @" A - {; j0 \$ j6 X$ m2 o! O
-
2 O# D+ Q7 E* S- r5 _* R( J - digitalWrite(kg, HIGH);6 W- K w4 J) H8 |. F
- digitalWrite(de, LOW);
. o# Q3 G8 |9 e9 d1 ~2 { - Button1.print("on");
I( G6 t5 Y* d, k' _% T - Button1.color("#0000FF"); //设置app按键是浅蓝色
0 t, ^! e* m# w - Button1.text("开启中");8 x5 D- V" @9 k$ l r& ?$ p. M* j% m
- }/ R+ t7 \5 s1 d1 B, P
- else if (digitalRead(kg)==HIGH)
' c8 N9 ?2 |+ o# k- ^: Y - {
" v. I d* x; E& l% F% A - digitalWrite(kg, LOW);& Q( S6 {! B6 _" H( O) j6 H
- digitalWrite(de, HIGH); e7 R5 ^% g) f9 v8 f
- Button1.print("off");
- r5 ^3 x: G8 I - Button1.color("#00FFFF"); //设置app按键是深蓝色! F8 N& o+ G) N* F- w0 \, H
- Button1.text("关闭中");4 N& a0 |3 _; x9 |4 o: C6 h& K
- }
6 E, @2 r" H& z+ x) R - }( X1 Y, H* M3 S1 Q
- }
0 R4 O! s/ Z1 ~0 F3 N, j - }
复制代码 2 @2 Q' B+ `" P+ }( ~: h. B
" |3 u% V2 k+ Q- R
我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html& N% M. q* c+ D; ^$ ]
1 J; e( p% v" o& p2 ~
把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。
0 K& Q, k8 V0 j$ Q& x+ A& N, O c
7 H, b N' q% w3 J, i$ d7 h
/ d9 @* d& g3 H& j |
|