|
本帖最后由 易记 于 2021-8-21 14:05 编辑 $ Q' d; p" P% A$ }' V2 \& G/ g
- [! a2 k' C: E2 E最近玩ESP8266,想做个天猫控制开关。
8 y0 q1 m- y0 `8 \1 U+ \但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。 w) o# [' W) x% u, ?+ v/ U
还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。
' W4 }+ F) k. r8 N
7 D) t$ Q* c' Q8 [
$ a0 s/ [+ B4 W* F' e+ ]& B0 r1 m) Q" E1 g" k* Q1 H3 S( h
问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。9 f6 J: ?) ?$ m. W8 M9 I& k. z
0 F9 ]1 i+ z0 x' q. H$ p |
; i# y) P2 p, ?7 Q( d6 W* A [ N8 d1 k8 ]2 B$ w5 D' _
, _# Y0 z- J4 X3 t7 e. z" I
D" W6 t- s% E/ e1 S2 g到手,当然是拆拆拆。
9 [# d8 ~! x' g4 m3 N _) r
5 d2 z+ V" _. W6 Y4 b( c
o( z8 y" r. Z
9 a+ G6 F, f' Y, k- U+ s联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。
. s/ N2 q, P+ S, Y
5 G( h7 a/ I( H5 \* b
" f. o( m* c* k3 y D- e2 k$ s& i9 H
继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。1 d8 \6 i4 w& T- D8 G: ^
4 ~) B! Z7 Z+ A+ A# C0 r; h# X, u' b# O; ^/ H
4 [9 R7 L. I$ w
. n. E) O% x: b; j
电源芯片3 D# z* l' T& ^( A
6 R" H' ~( h; n% F$ ~/ t
4 v- S% N- j* q5 Z9 n
. R1 b% `# v9 P) D! {有一个按钮,按钮有二个蓝色LED灯
6 d9 t0 Q- n! L
7 o( f0 s$ t2 P* U9 D" x! }5 \: Z1 n
1 x3 [1 l) u7 _82660 A9 l' N2 H1 l
/ r$ A( H2 C0 X
( m) Q/ ~7 f9 l
' j9 t! d% I4 J x) i
- o; P l4 Y. c1 y: s% \
C6 m9 A1 D3 v D! \9 |: O, u+ {
接下来就是刷机了,版子上面都预留测试点。
5 u) o# y4 \7 o K, b) u& F接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。
a0 h7 D9 D$ w8 r: G- J6 j
5 B5 k0 Y" t+ x. c% O注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。
1 ?. C) x4 d( G- Y m0 f3 C) }要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 | ?3 W3 b' C. r9 J
! z0 e- e J0 Y D( r+ ?. T+ z# A9 |/ s% l
7 v1 \* y* W ?2 C6 I" m
' Y! o5 l, \" y3 y2 ?, e
6 C& q6 Q- u6 s 5号脚位是继电器输出
' Z2 a, g7 N" x. |7 [/ { 12号脚位是灯输出
2 ?# L: h4 b, h8 y4 J 4号脚位是按键, `& M8 X/ r4 X0 X
" m5 ?9 q: A5 O. a Q+ l
1 z) F2 ^. j6 s0 q
+ ~2 w2 Z8 B& s: O. ?0 z3 ^: f+ a d6 i% G* ?* [+ S
卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库* F; R: g" I# d% v# w
- #define BLINKER_MIOT_LIGHT // 设置小爱灯类库, ?2 ^2 l" U$ c$ D1 e
- #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库* o: a: p* q+ z) O9 E7 C' S
- #define BLINKER_PRINT Serial //串口协议库
9 p1 a* h2 m+ f/ Y1 N - #include <Blinker.h> //官方库1 O$ \8 Z T$ d1 a4 R* r
- #include <ESP8266WiFi.h> //官方库
2 n, s, j( q4 w - WiFiServer server(80); // 服务器端口号
; {. E$ T" m, ^3 i$ S- f - # d+ @( d; D' |: N4 i, F
- char auth[] = "c4942fb1d5e4"; //设备key. n2 P" T; g' G. j* y& k
- char ssid[] = "wanboshi"; //路由器wifi ssid6 m! J) A$ x+ h* q
- char pswd[] = "1365662999813586348220"; //路由器wifi 密码
1 V7 X q! V: u# r- }& T" z% V
4 V, T3 {$ B' E: ]6 i% m" Y- bool oState = false;( [6 Y9 ^0 e- Q6 s! S
* [) u2 s0 d6 S; q4 E) S- int kg=5;//继电器输出
& i, T4 {1 k; O+ C5 C& l- u - int de=12;//灯输出
( _2 k3 L* Y" g" X: U+ X9 y# c - int key=4 ;//按键- z) G# X8 W+ G$ j: J5 S
- //*******新建组件对象: C" B5 @2 _+ Y( A2 p+ ~4 p
# w; g; N: q; @0 J- BlinkerButton Button1("btn-abc"); //设置app按键的键名, r5 _( c: k: x/ d) }+ w2 ~
- //*******app上按下按键即会执行该函数app里按键7 v1 h# p; \/ Z5 @
- void button1_callback(const String & state)
]8 w6 T" v1 E - {
" L$ Y' E, r: }0 Y" | - if (digitalRead(kg)==LOW)
! Y- t# s: a" W9 w5 k) O! _3 f - {
1 {# _& V( t. j- v4 o8 q( @5 Q - BLINKER_LOG("get button state: ", state);+ t. f) Y; o6 S9 x' P2 |
- digitalWrite(kg, HIGH);& r4 R) @! g& N6 B
- digitalWrite(de, LOW);8 K& D% o9 h: ^
- Button1.print("on");+ o j/ x0 N. A% B# |7 C/ R" G2 T
- Button1.color("#0000FF"); //设置app按键是浅蓝色; O+ V3 ` L/ `5 \
- Button1.text("开启中");
) F$ I) I# b5 @, i1 F+ i7 K - }
. Y: B" i2 L9 t9 c3 R# u$ L - else if (digitalRead(kg)==HIGH)( T! [8 n: B6 h; @' G6 J* x8 ^
- {, M$ x, t- P1 i1 @/ y: H
- BLINKER_LOG("get button state: ", state);
5 z9 r4 j/ i! [3 K - digitalWrite(kg, LOW);
! m0 _# Y! R5 a. O& c - digitalWrite(de, HIGH);' T5 Z. Y1 J( k
- Button1.print("off");
5 _! X: R! b& d6 |" A - Button1.color("#00FFFF"); //设置app按键是深蓝色
8 F/ L6 b" K1 k7 w# a' U - Button1.text("关闭中");6 a( d) P' q3 d6 @1 n* B# d- ^
- }0 |- q$ o# T/ m4 f+ s; T
- }
; L) ^, l: K; Q: ?6 t8 `2 b* f - 5 G4 O! P$ s# U8 i8 @& y
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
& F& V* P0 C' }& v9 _ - # h9 a J* A- x |3 |
- //*******如果小爱有对设备进行操作就执行下面
( p8 S1 p' H6 E$ {- S - void miotPowerState(const String & state)
, I P* ?2 `2 |0 I# Z. ?2 S0 J/ ?8 t - {) I ~. U: s4 ?; U$ O6 b. O9 x. {
- BLINKER_LOG("小爱语音操作!"); //串口打印5 Y& L. u$ |, j w6 U
- if (state == BLINKER_CMD_ON){
( W* U& d T9 \) }+ g -
/ f% G( O( a7 L - digitalWrite(kg, HIGH);3 b1 R, F8 d4 y+ y8 u
- digitalWrite(de, LOW);
! d: G3 Q2 z* K$ W - Button1.print("on");- R, d% k" g3 z* C& |7 L# g
- Button1.color("#0000FF"); //设置app按键是浅蓝色: e( ?4 L# a2 n2 O1 c- X
- Button1.text("开启中");
" V3 i! g2 t. _+ T) b - BlinkerMIOT.powerState("on");9 o4 @2 z9 v8 h! q& }1 N
- BlinkerMIOT.print();) d8 [+ Z, z% h" C: {
- }: N* r5 w) `+ G& @
- else if (state == BLINKER_CMD_OFF)& t2 x$ U, X6 `* K
- {
! @) m D0 Z/ m2 P8 B7 F I0 V$ Z8 | - 3 _0 o* s1 ?) r/ {! x: g
- digitalWrite(kg, LOW);- b' h; z( l; i4 U- `- D8 s. F
- digitalWrite(de, HIGH);5 t2 I& G# ?& H; {0 V2 X
- Button1.print("off");1 c% ?- {& Q% ?2 n
- Button1.color("#00FFFF"); //设置app按键是深蓝色4 V0 a& L+ w( u% d9 n9 c
- Button1.text("关闭中");
" l0 M, x' p, J3 V& o: Y3 q - BlinkerMIOT.powerState("off");' C; h3 G, C+ ]0 F0 ^
- BlinkerMIOT.print();7 q! w' z- ^% t
- }# P% u- @% h+ |
- h! M3 u6 @! P( t/ v
-
F4 x: a4 l6 L - }" u0 k2 u1 \8 u& F7 b
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- i" {4 W1 M4 W7 i; C" [
- //*******如果天猫精灵有对设备进行操作就执行下面" s. s+ Z: T% }( Q2 ^
- void aligeniePowerState(const String & state)# b; Q- V! t) y! k' P: B' c
- {
8 F4 [$ N \8 d7 I2 @) P: f% ] - BLINKER_LOG("need set power state: ", state);+ i0 M+ @& h+ Z
- if (state == BLINKER_CMD_ON)8 U3 ~! H7 p# a$ Y) X' c. z
- {3 e: Z7 l; v; ^' i; f8 o
-
, F. Q. d& m& O. J9 S2 W - digitalWrite(kg, HIGH);# F2 [7 o7 J$ A# l
- digitalWrite(de, LOW);
' q! i3 d$ S* {' u! n" ]8 ^ - Button1.print("on");# P% w5 v! N# i2 y9 _) o0 Z: ?4 p% r
- Button1.color("#0000FF"); //设置app按键是浅蓝色
0 i; N! U) f! F0 l* b - Button1.text("开启中");
* c0 K R) D! M3 |% V+ w1 L - BlinkerAliGenie.powerState("on");* `. ^! i/ Z9 w0 q
- BlinkerAliGenie.print();. e% q$ k5 z R; I- I7 K
- }
7 {# y4 h7 e' k - else if (state == BLINKER_CMD_OFF)
6 L: u6 M# Q+ [ - {
* i" `) Z! @/ f. E. C% O- C - 3 n! P @! o4 R7 G) k( v
- digitalWrite(kg, LOW);
Z; ~7 S# I( h$ Y7 [9 M - digitalWrite(de, HIGH);
) g0 F ^: Z& J$ f& U - Button1.print("off");7 M$ h: a8 F# x
- Button1.color("#00FFFF"); //设置app按键是深蓝色
( G) y I1 [5 T; I/ p/ E9 Q! c. m - Button1.text("关闭中");
0 d9 n8 i, r. h4 Z6 J - BlinkerAliGenie.powerState("off");
- |) Z# h" S- b' A( L - BlinkerAliGenie.print();
; H5 U, }6 M3 ^ f( i - }: [8 \/ T! E: R! A, `9 M# N
-
) E2 q; C% e# k$ S! J6 l - $ A$ x1 r& l" ^( r. t M6 A
- }% }0 g" Q: J% \* [' o3 T" ?
- //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次
+ h* u) q/ }9 Z; {" r - void heartbeat()
6 M0 G0 l/ R" K6 x- Q6 [0 ~: ~/ F* T - {; r" J9 N1 E+ [9 L6 e: H; H0 [
- BLINKER_LOG("状态同步!");
0 s @/ w0 g* m1 e! B! k: y- a4 L - if (digitalRead(kg)==HIGH)
2 }" k" ]- S, w4 p- O8 y5 A: L; z - { 9 J) t9 W7 d% I) V! u
- Button1.print("on");
0 B6 ~7 I7 y0 b/ j. Z1 M& c - Button1.color("#0000FF"); //设置app按键是浅蓝色
1 @+ \3 _; x& Y - Button1.text("开启中");
6 D% W* x; \: ~( T* ~4 V8 p - }
& G5 u% \. I" F5 Z# } - else ; n0 ^) m. Z' Y: s
- {
5 h! R. ~6 E+ J1 T9 E' L - Button1.print("off");1 ?$ u$ L) v& \0 V/ C1 E
- Button1.color("#00FFFF"); //设置app按键是深蓝色8 g9 `, I/ E9 m9 V' \5 r( P
- Button1.text("关闭中");* ^4 _1 ^) u2 f% r2 {3 K, G( J8 m
-
: S6 B9 P* x) H) L4 z. P. }) M - }+ h3 y, Y; D& U1 g- J9 o2 x
- }, d5 A# T. g$ W
- //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
: ]3 _* _8 R6 c9 \, ~9 v" { - void setup()
' z& t) T2 i5 o4 ?0 F+ } - {
( O; j" z9 W; ^" A - // 初始化串口
" T; T8 L4 K9 c6 X6 K: R$ m - Serial.begin(115200);
# h/ Q- m2 S* G) a5 W - delay(10);
6 e. ], n4 j0 F) D. H0 j( ? - BLINKER_DEBUG.stream(Serial);
2 f) X4 K4 [) V1 a4 h+ H - // 初始化有LED的IO% o5 C, v) Y9 s, B3 K" ^, s
- pinMode(kg, OUTPUT);
+ l, Z {, v5 I$ @, M2 b2 X - digitalWrite(kg, LOW);//初始化继电器上电状态 # g: w1 N9 r4 D- v: C$ V; r# p6 h
- pinMode(de, OUTPUT);/ `/ X# m$ @8 r9 @( r
- digitalWrite(de, HIGH);+ z2 w& \; O! U/ Y) w3 j
- pinMode(key, INPUT); , z$ ?, o# J# x! R* O# H2 J
- Serial.println();
; K, p L0 t3 b5 D5 d) v - Serial.print("Connecting to ");8 |# C2 u" p: X4 v* V( [- W
- Serial.println(ssid);! \4 P) r T7 G8 y' D) B" t2 t
- WiFi.begin(ssid, pswd);
: k- B# M5 W; P% F" g' v' N - while (WiFi.status() != WL_CONNECTED) {2 Z" B- B! E0 e( q/ {0 u: ]
- delay(500);) f% j7 o1 [- K7 _2 l1 k
- Serial.print(".");
) z8 S8 G1 x3 o, J! [ - }9 q, T6 ~. ?' A! b6 b" O
- Serial.println("");3 H9 M. @6 x. V4 H4 f* v; H3 {: [
- Serial.println("WiFi connected");
* d3 {0 s% e' A, j - server.begin();
' X& r6 f4 K/ w6 @+ N9 i) m, H8 h2 ^: m - Serial.println("Server started @ ");2 F& [ C' C( R! F0 w; l. C0 i
- Serial.println(WiFi.localIP());
0 p' k5 r* b8 d3 Z - //打印出IP地址,后期可以制作显示器来外部硬件显示ip' c/ I/ e6 s% ~. n' W( D
- Serial.println("To control GPIO, open your web browser.");
( C3 G7 b$ k$ ^5 Z - Serial.println("To set GPIO 0 high, type:");- F9 y/ O: B: ]4 `, ~7 n. Q
- Serial.print(WiFi.localIP());
) J! }7 J- a, Z2 T8 k' R9 r - Serial.println("/gpio/1");" m; ]7 u* R8 a* ~/ [$ o7 l
- Serial.println("To set GPIO 0 low, type:");6 N% n6 G8 s7 }& v4 f
- Serial.print(WiFi.localIP());
3 {+ G' N0 I+ l - Serial.println("/gpio/0");8 ~1 t" j& ~& q) q
- Serial.println("To toggle GPIO 0, type:");& V: s5 T8 b; o0 b$ I9 E) I8 f
- Serial.print(WiFi.localIP()); f/ z3 N i0 d G$ `' j% u& M
- Serial.println("/gpio/4");' B2 B- n1 B% a H3 c/ W2 d
- ; g& e3 H- e$ ~/ N) b
- // 初始化blinker
6 g" V! F6 H% U - Blinker.begin(auth, ssid, pswd);) e+ `7 A2 F' i8 t, u
- BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数- c0 Q; f% l: a6 H, D
- BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数' M; e9 n. n! c: H3 G7 j
- Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。
2 h4 I: f0 n f) v; M - : v% r, X- E0 K ~
- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback @; O- t' F" w' h: U5 v T; K7 i
- }
* J( R9 `$ y: B1 a- b. Q5 M - void dataRead(const String & data)1 {3 F% Z8 r7 i A- ~( i
- {/ S, D! @; X8 s% @+ z
- BLINKER_LOG("Blinker readString: ", data);* z7 L" C8 G0 f
- x$ U+ L* v1 Q! i- [7 {% x% d- Blinker.vibrate();
6 U/ }8 b3 z+ F) |! d4 a -
" Y- {0 t, A6 ^0 A* F6 B2 ]$ {8 b - uint32_t BlinkerTime = millis();
9 ^; J% Q7 H5 S0 A, _ -
9 X- Z. o& J* P/ d4 ?( q7 z% e - Blinker.print("millis", BlinkerTime);0 E% ~& q! Z9 l( q$ Z# T% {6 B4 e M- c, V
- }
! ?: t3 u1 K& A4 j - void loop()4 c' s9 i0 r; a! T" n/ s2 P$ U( q( U
- {
7 G- b2 o p/ ~7 c9 y" A - Blinker.run();, H% f2 u0 ~' K& a4 g( F
- if (digitalRead(key)==LOW)
' o* t+ G9 l' J6 x& q7 A0 ~" q; l1 Y - {
7 O2 K; {2 ~+ {$ \ - Blinker.delay(200);
3 T+ M: g7 D% T" ]' X6 C" [ - if (digitalRead(key)==LOW)0 ~9 d! e$ b& R0 L0 l. h* s4 W: C
- {0 L) }( _# }( F+ F: b" C
- if (digitalRead(kg)==LOW)) P$ I0 |- C0 B1 }
- {
l ?9 F% B K0 v; C3 I* u - - P6 k+ a2 f2 f% ]1 E4 b
- digitalWrite(kg, HIGH);
& j9 t5 j7 t- ~) B9 `+ W - digitalWrite(de, LOW);
3 t: q# X w) X' i4 Z - Button1.print("on");
8 q3 z7 }; r4 b, _+ i - Button1.color("#0000FF"); //设置app按键是浅蓝色
: e+ D# G' n2 \/ x - Button1.text("开启中");6 c8 E: C- _9 ], `, b
- }4 l2 ]. l* q4 _6 Z8 T" ~4 [: F
- else if (digitalRead(kg)==HIGH)
: ^4 s% z+ d# A8 l- d - {
6 m8 ^3 M8 [1 Y1 Y7 n" m - digitalWrite(kg, LOW);1 v$ v) F4 J2 E% H' x7 c* I
- digitalWrite(de, HIGH);$ m5 `! d$ @+ h4 |/ s" ~
- Button1.print("off");$ f. }4 D' D- r' t8 \" w# x; ^0 C. Q
- Button1.color("#00FFFF"); //设置app按键是深蓝色& }* K& C4 Z; ^; F0 V
- Button1.text("关闭中");3 ~* h, \& X* h: m
- }
3 c1 ]3 g1 O+ @, ^& t1 C - }
6 V& y' a9 t9 e1 e/ `# U7 T% K - }
! G2 R& ~6 f- l5 m6 ? - }
复制代码 / K1 k: W3 o0 G" N: J. C1 w \
; x& R& V8 I% U; Y @
我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html
8 ?2 H7 s) O+ v
+ C& Q% `& q" {把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。
, z0 o4 l; A2 g. I+ Y6 ^/ D9 p% c6 U, g# J5 J* N4 b5 n/ M- n+ Q, O9 n
6 `* p q* j' b6 o: s |
|