|
本帖最后由 易记 于 2021-8-21 14:05 编辑 6 F- y) I$ s# h: ~* w" d
4 y7 } d* R! [! Q Z最近玩ESP8266,想做个天猫控制开关。
7 {/ k. Q+ M/ Q0 o& Q9 f* m但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。: K& F9 c, h- K! W% |
还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。- f& z( p0 a- g3 u/ a) f
) w% i) z% B/ j, @1 R
0 F6 {: S" |8 R1 i9 J! P
& E/ ] v6 k1 a; G$ c问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。# C3 {$ q5 m! D5 u& ~
$ i8 P! x6 b% u
) k: P' j$ Q: d& u0 w' ~: C
) `& ]. b) }9 N: ]6 C% ]+ @4 K$ R; @) z- N
. i- [9 ?$ n7 B) B- K @( G! i- b- f到手,当然是拆拆拆。
6 G: f# y# k* _
7 ?. J- k, a0 {5 r! }8 M1 R! v2 F9 Q
% N3 t* ?; z1 i. v' ?
z( @: E' G% d联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。
3 t6 j4 q3 G) [ d
9 A% `7 N, ~. H# \4 Q1 h+ n* w
# {; b% `+ K# ]4 l
( j/ C9 G% a* B' e6 \" G
继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。
1 |$ y1 y: s) s
: u& [& t m) t5 |0 t( ^
/ S% J; z5 V9 E. [7 S5 F
/ c/ X7 P- I6 q' I* `* m, k; \
{" i- E; L3 U" `- X1 s, W电源芯片2 Z/ K3 V- n7 L/ N/ ?
! T" u; m& }. L) S# ?$ ?
5 f, f I8 q0 h0 a
8 \( [0 o9 b9 l有一个按钮,按钮有二个蓝色LED灯/ B- X0 z& q) |4 F+ E6 C% I
( f; B" [1 S1 @! k4 U
' t+ d1 P; q" a+ w g1 M
9 d: d1 D! h! C/ M8266
7 [" C0 e) ?# H: H6 R. ]
7 A; L. _+ X2 J5 I0 H/ S
0 y4 L; R" Y# j$ a4 d% c9 o
X2 a8 t( I2 V8 [; L# ]
. O, [0 C) P$ r0 {; D- K0 K
* e. W+ g( ^& d! F9 L* P接下来就是刷机了,版子上面都预留测试点。9 x3 d+ W' U0 Z# J0 v: U8 G
接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。% f8 e" D, g Q# i; W+ f
. k# n) I u- o. i3 Y9 j注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。
3 B0 M- t9 K5 R+ [" E% _要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 |
# i* Q( T5 |5 b% Y, m/ g: l9 f# ^1 z. B+ s; g
5 {: i/ m, h3 b) p7 u1 o! l4 l5 D, d5 I0 J
8 E$ y# _: l& }5 r d' V/ Z
! u# n. F) H4 w9 o p" u 5号脚位是继电器输出: z3 C( W# p6 h( K% h
12号脚位是灯输出8 N; R/ O0 @5 C5 k; z
4号脚位是按键 K, T7 L4 ?% V2 O
7 A' ~0 v) c8 ?) y* s6 {1 O
" T& t5 [( G8 |# e2 I% t* n. D. U/ }2 @
; u+ a. s4 c$ @, F
卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库+ O+ N/ ^: p$ h
- #define BLINKER_MIOT_LIGHT // 设置小爱灯类库) q! S9 z" O3 J2 J4 n& o
- #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库2 @! q3 f! |3 x% c
- #define BLINKER_PRINT Serial //串口协议库
9 U" P8 y0 _5 U- Y7 ` - #include <Blinker.h> //官方库
1 T. ]2 R* {7 O6 U+ }9 g - #include <ESP8266WiFi.h> //官方库
& T: a. G1 E& V5 F7 N+ S - WiFiServer server(80); // 服务器端口号. x/ ^7 c$ }, q/ H/ `
- R; \: ^/ r, s$ U7 \- char auth[] = "c4942fb1d5e4"; //设备key! x4 N& Y( r U, R$ |
- char ssid[] = "wanboshi"; //路由器wifi ssid
4 v, x: ]$ M7 h4 n/ E- ~: C/ R8 A - char pswd[] = "1365662999813586348220"; //路由器wifi 密码3 u& c2 O3 u* I" O7 R
- : Z2 o9 P$ T0 e. O5 q/ S
- bool oState = false;& e5 O1 `4 H$ ^8 ?" M$ g
- P0 n3 l% `' T' D, \- ^( N
- int kg=5;//继电器输出, z: r4 ^. L$ J. W* t% b
- int de=12;//灯输出
! P6 K) f% U* ^. J# M - int key=4 ;//按键8 J% O' U- q- e6 |: [" _3 p; N. n
- //*******新建组件对象( r$ P) y& {( D2 G4 I
% w# l7 S! y5 Z2 }4 ]; x- BlinkerButton Button1("btn-abc"); //设置app按键的键名
$ i: e& _8 i |6 `; b - //*******app上按下按键即会执行该函数app里按键
/ n1 c2 X% ~1 |6 j4 q5 |, a2 U' o - void button1_callback(const String & state)/ K# G c6 D' V
- {1 J, v2 l0 b* ~5 O M- {8 [6 Y
- if (digitalRead(kg)==LOW)5 x* H( r! T B
- {: L1 u, }: A' `6 X% B6 U
- BLINKER_LOG("get button state: ", state);
* P# [2 x4 s* e/ P - digitalWrite(kg, HIGH);
3 y9 K0 L8 |- g8 w - digitalWrite(de, LOW);# V) C# N# e3 e9 ~+ J
- Button1.print("on");
- b n0 {) j* z+ \3 \3 q# c - Button1.color("#0000FF"); //设置app按键是浅蓝色6 W( G) i2 L& C# I8 Z& y9 {$ L
- Button1.text("开启中");3 w) q3 w6 s4 f0 S$ v, O
- }( y+ a# w& `/ `: b @
- else if (digitalRead(kg)==HIGH)
) }5 c/ s; [; }% m1 C - {6 o- S; {8 j" L' R) @
- BLINKER_LOG("get button state: ", state);1 Y1 C8 Z' z0 @' K6 d u- j
- digitalWrite(kg, LOW);; u: T( u, c" X% G* f! ?+ h
- digitalWrite(de, HIGH);1 G- C# `- d# f: X$ }" z
- Button1.print("off");6 i" U ~8 Y7 ^0 v( w# n
- Button1.color("#00FFFF"); //设置app按键是深蓝色
: T- H. Z; b p: @( p3 _ - Button1.text("关闭中");3 k& m/ y& n) H5 \' Z3 c
- }" o. u+ A4 U/ X8 k
- }
( l6 a) i3 y) V3 o8 y
! ]9 D- D! M$ j" h+ @& _8 X9 d- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" G; N7 e2 G' [( u' [5 v0 K3 ?
- 6 K* @& {1 o K K( y/ \# W
- //*******如果小爱有对设备进行操作就执行下面
- K: G3 }1 f5 n7 C - void miotPowerState(const String & state)+ { c# K& {$ S
- {9 f$ r( T+ C+ V# t, [4 T# |/ J
- BLINKER_LOG("小爱语音操作!"); //串口打印$ }2 |; N4 v" {- c" `
- if (state == BLINKER_CMD_ON){
3 z; M A, ^+ q( I - + K+ c. S/ }. s4 {/ u/ |
- digitalWrite(kg, HIGH);% [+ }, P+ U9 X* X2 q. p
- digitalWrite(de, LOW);' {, ?' o! r; ?9 a2 ~
- Button1.print("on");$ N p7 D1 _! C
- Button1.color("#0000FF"); //设置app按键是浅蓝色
3 O% B6 X# }1 Q t& D2 k( y - Button1.text("开启中");9 o+ N8 H" U0 @& G* j$ x3 w
- BlinkerMIOT.powerState("on");
$ {- L. ^, g" P9 B9 i% N. G - BlinkerMIOT.print();/ r5 Z _1 ^4 L: o5 U4 h
- }
# ]7 _4 ~7 p! C' e7 j* p - else if (state == BLINKER_CMD_OFF)* e" q( J% q6 s, p3 C# ?$ d% s) [0 |3 \0 J
- {6 \0 E7 C& v3 O, v2 h! X
- 4 ~- z5 O% D5 E, a5 H' E
- digitalWrite(kg, LOW);+ m! o* G4 I. u
- digitalWrite(de, HIGH);
2 r! T+ I5 s, e/ L5 I; T - Button1.print("off");
2 g- B& o3 }) R o7 B3 W - Button1.color("#00FFFF"); //设置app按键是深蓝色' v" S6 g# P7 E$ y
- Button1.text("关闭中");
; @3 Y0 Y! K1 K - BlinkerMIOT.powerState("off");1 s3 M" ]8 l/ E# ^ V) C! R( n: S
- BlinkerMIOT.print();4 S! H# s: V5 R C2 {4 c _' W
- }% i1 u7 d0 L, x+ r
- 7 ~4 S4 W/ T4 Y7 N8 T
-
2 B. U' _% A7 z# }/ W: E - }
$ O% h* s* b% Y! P - //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
% a" Z3 D" h! y3 e% E - //*******如果天猫精灵有对设备进行操作就执行下面) k7 P+ L3 ]% f5 i/ s2 t
- void aligeniePowerState(const String & state)- L4 u$ l2 f! s% \. G3 F
- {8 k5 M9 f6 o, s' X+ a0 j/ r% q
- BLINKER_LOG("need set power state: ", state);6 L1 z. }8 |+ T
- if (state == BLINKER_CMD_ON), a& l, h$ _; `" Y
- {( g" g$ p. G, Y S+ o: \
- 4 c: l6 C" R4 A
- digitalWrite(kg, HIGH);
! U; ^# Z, D1 k' X, g9 n - digitalWrite(de, LOW);- w5 }/ v1 ]! j$ ]3 W
- Button1.print("on");4 s4 i* H; V3 S e" M: Q
- Button1.color("#0000FF"); //设置app按键是浅蓝色
! C8 d# g& U; J) U1 Z - Button1.text("开启中");
7 q, M$ G+ w1 Q+ \9 J* n5 [ - BlinkerAliGenie.powerState("on");' i) g1 |( ~5 O1 z1 L( y( m
- BlinkerAliGenie.print();0 | B' J( W5 {1 n9 J
- }
" e- j! _; P2 z& m0 l - else if (state == BLINKER_CMD_OFF)
( D/ `, v+ y; M$ | o- E1 x - { l2 K+ z6 R+ |
-
! j' e( n1 F* I4 N, P - digitalWrite(kg, LOW);
7 z, F7 _+ x4 J4 t0 o9 ] - digitalWrite(de, HIGH);
A) Q8 U9 ?7 k# e. G - Button1.print("off");
# w4 Y2 b# i$ Z+ Q - Button1.color("#00FFFF"); //设置app按键是深蓝色
- p1 \0 X/ ^0 x& g S' O6 X - Button1.text("关闭中");
4 Z7 i: F% O$ H% g- R2 ] - BlinkerAliGenie.powerState("off");
0 b" }# R( ~8 K! O; ?; V - BlinkerAliGenie.print();
/ `& T2 U. ^* d5 f' n2 u& | - }
% K+ Z+ C( ]- ~" w( h -
& J5 k. N& v5 \# V. I/ P8 Q! W
% H; E( R h) O" J0 b- }
& y8 z0 x$ d# u6 ^ [4 m, b; X - //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次
7 I9 n: C8 b6 c: ^ - void heartbeat(), S5 _ z/ J; s% c5 y. i6 z
- {
5 H* k3 n) E7 C/ W |" h& y2 \( G - BLINKER_LOG("状态同步!");
$ [0 X8 ?% ?0 ]$ x0 N. s - if (digitalRead(kg)==HIGH)
# S; g6 R2 w- Z. M1 f. h% Y) M$ s - {
" R4 P! I1 n* I# j$ Q b1 q - Button1.print("on");, \% k' m9 s) C7 V1 a. q& J" i2 Q
- Button1.color("#0000FF"); //设置app按键是浅蓝色# Q0 ~3 O4 A% Q; ]" A
- Button1.text("开启中");7 S' y5 E3 i5 K0 o% }- N
- }: X: p1 N+ [4 V# |% @
- else
/ X! ]( _ U' m2 K* k6 A) R6 h - {' O- ?0 K" T6 I4 j! b( R
- Button1.print("off");
1 P7 f3 Y4 P! V3 L& |9 x - Button1.color("#00FFFF"); //设置app按键是深蓝色# N# f5 |% Z q {. s* F; b. g
- Button1.text("关闭中");/ W+ h; ~+ D7 d. V
- ' X3 V, j" K/ i& W0 \
- } ~( |1 y" Q/ X$ E i W
- }
: |' ?, f; C8 h8 e - //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++9 ?9 l, i7 r2 A5 H# G$ a
- void setup()3 f T( V/ ` j) |) h7 n2 X
- {
/ I0 i7 C, `" P - // 初始化串口* d2 |! J, E# m2 |
- Serial.begin(115200);
, d' U6 S+ U* Y - delay(10);
) d% m# X! n" L. {3 Z Y - BLINKER_DEBUG.stream(Serial);
& s" m6 U+ b# S - // 初始化有LED的IO
+ I3 X L$ q# |! `/ [ - pinMode(kg, OUTPUT); ! |3 w9 s Y& h
- digitalWrite(kg, LOW);//初始化继电器上电状态
% P8 } h# v, c - pinMode(de, OUTPUT);
; m/ m% |; c2 d+ c8 z2 n4 i - digitalWrite(de, HIGH);# P# f) l; C( C/ f
- pinMode(key, INPUT); - J5 Z, N0 G, i( L! l4 m
- Serial.println();
1 d1 `4 s1 Y/ S2 P- Y0 c - Serial.print("Connecting to ");
2 N/ [1 u% R; m/ g) K - Serial.println(ssid);0 _5 s8 j6 \* x+ m7 [9 A/ R# W# {$ s
- WiFi.begin(ssid, pswd);4 m% T) G M+ \+ `4 h8 J; C
- while (WiFi.status() != WL_CONNECTED) {% ]" a* H* A) Y9 J
- delay(500); m W) z5 a2 x, O0 K ]' G* [
- Serial.print(".");$ c- Y( |# {3 b
- }+ R- ?& k) c$ S7 p" `
- Serial.println(""); X( a/ T$ Q2 I
- Serial.println("WiFi connected");, Q5 u( v1 m3 H4 \9 a- I4 f G
- server.begin();" x9 Y7 z4 D5 t+ V5 Q; Q6 v: I
- Serial.println("Server started @ ");- `& c( j. |- j1 L4 w
- Serial.println(WiFi.localIP());! D2 Y4 c: m8 `! f. a8 |! N
- //打印出IP地址,后期可以制作显示器来外部硬件显示ip
% A7 ?" G# f0 o4 u3 y8 m4 h - Serial.println("To control GPIO, open your web browser.");
o3 N0 M. M9 {# t# _ - Serial.println("To set GPIO 0 high, type:");
; C1 y4 w$ E8 E# `9 C+ @, S9 ^: H$ w - Serial.print(WiFi.localIP());# Q( u$ @' S$ M9 C" Q" W2 \' R% D& _* q
- Serial.println("/gpio/1"); u7 s! S& _; G: m" n/ ^
- Serial.println("To set GPIO 0 low, type:");" B# `" Y) a5 M# [, U
- Serial.print(WiFi.localIP());
& G4 R: m" y! G6 ^6 I0 h5 f+ j& Q - Serial.println("/gpio/0");
) d& K" d* O- K6 Q% y( n - Serial.println("To toggle GPIO 0, type:");5 B' N$ `, m4 l' x* Z
- Serial.print(WiFi.localIP());
M' L( c _ Z; P( g - Serial.println("/gpio/4");
3 C1 Q, I+ w/ O
0 l( z+ R6 N) W0 R( D9 C) I- // 初始化blinker
) Z0 { g2 A( V - Blinker.begin(auth, ssid, pswd);
# v. s/ P! j! L* ^3 c K - BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数
1 A$ @& _4 L4 u" L) M - BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数7 u' K. }) Z& |2 q
- Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。
( r1 B6 N9 d$ j9 i( x4 r0 D - + k7 e0 m7 w, u( x
- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback6 u; L3 t: k+ ~' Y, R0 n( O
- }; T4 D. e$ W2 @
- void dataRead(const String & data)$ J: T7 ?% ~1 h
- {
$ n" U( G! H& S1 P. J - BLINKER_LOG("Blinker readString: ", data);
% k% ]: _1 Z# J6 O4 l2 R/ o - % I, u/ C4 d2 Y0 s1 m
- Blinker.vibrate();
: d) J1 V5 i1 Y. x - , a* @0 [% I+ L; H" `( A) k
- uint32_t BlinkerTime = millis();5 V# ]& V: C, d2 f" v
-
( @6 P+ z) R/ U- O - Blinker.print("millis", BlinkerTime);
7 @5 Q2 r1 N0 y - }
7 p0 x1 t- ^/ e+ ~ S+ Y q - void loop()! C& W( }. J5 V4 Z' i3 M4 U
- {( y! v) u' ?1 e# m: p- _
- Blinker.run();2 K0 O; r6 V g2 z0 y
- if (digitalRead(key)==LOW)
1 h5 R) G/ V1 J1 ^% K2 b7 { - {
: Z2 p- w+ [0 W- T; j' n - Blinker.delay(200);4 j7 R5 D% {4 K( L: c* d, {
- if (digitalRead(key)==LOW)( }/ X4 i8 q4 N) O: G5 o+ O
- {2 I6 b! j3 M* r' b4 ?; N
- if (digitalRead(kg)==LOW)
0 l) A: a( i) j/ ?# F8 ~% i- I - {- f+ y( H n5 ]# }$ P5 R9 C, r
-
* L2 X2 v/ K& O: _' ]0 c - digitalWrite(kg, HIGH);* k3 }" n V3 @: `% v' f
- digitalWrite(de, LOW);
# ? x& Q- q6 V2 @) Q - Button1.print("on");- e' ~4 G- y0 t7 k, y8 D, x. j
- Button1.color("#0000FF"); //设置app按键是浅蓝色1 \0 e {* j$ s0 ~# @5 x8 q
- Button1.text("开启中");( Q7 \4 Z; Y) r' l: A5 A
- }% @/ e* J b, R T; V0 s
- else if (digitalRead(kg)==HIGH)
4 y/ ^+ P0 g7 J1 T5 q - {0 {# e9 p, E* L0 i4 U& @
- digitalWrite(kg, LOW);
: Y( `& r4 y+ o% y - digitalWrite(de, HIGH); ]) o6 ?" d6 U; |
- Button1.print("off");6 `7 Z/ E& b ~
- Button1.color("#00FFFF"); //设置app按键是深蓝色& `) e* T3 m& }" |3 G) S
- Button1.text("关闭中");
: n, r& r" N( k' G9 V' ^4 s" d- p" D - }
, R4 a7 T4 Z! J. k& ^ k( z - }
0 Z' ?1 c% Y4 }& e! m8 | d - }
n$ g, v) R/ e0 F6 c - }
复制代码
$ m3 k' o O( ^! @1 Z9 c9 w. }
* C% W2 x1 d0 @3 T' Q! u我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html
) ?# K9 X) t: ^
6 t" Y- l1 o$ J8 v; Y2 B+ \把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。- g6 b. {0 u' ?0 L, c5 {
) A, {5 d. \3 y& M( b; F
6 W, B9 |% Z# V# s2 l% m |
|