|
|
本帖最后由 易记 于 2021-8-21 14:05 编辑 7 h+ d4 I. A) w0 @. ^$ b
9 M; ?! p7 S! ^
最近玩ESP8266,想做个天猫控制开关。. i# Q0 a0 ]# R" a' V, ?
但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。* c+ Q: }. _- |! x* f J
还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。
1 n9 }; _/ R. ]$ Q$ S8 m( v' h" m
# i' j) _7 \( X' h2 ~/ g
% T, h' D* }- L( S. C ?8 H
3 Z0 G0 H$ I' p {( {7 z/ b问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。
) T$ g" G! E$ z8 P, q, W6 x3 @. m/ d
: `& e: X R/ G/ l
1 p" y4 L1 Y. w' e+ @
9 s- O6 a9 y1 H+ j3 M7 j) e. `5 b
# c3 A* p8 c+ `: K) g# R到手,当然是拆拆拆。1 `% Q' k& ?& y3 G/ b2 g
4 P8 P/ r/ E6 D9 W& P
, n( |2 V7 Z6 Y; Y) l I/ O) ?
" q5 ?/ f7 t5 X& x$ i" _联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。
+ E, N9 f4 Q0 d- Q) [
7 l8 k( I( c" U; @6 O& ^: w2 I/ y; f
! _7 H2 y8 R0 o& h# |( ]' ]0 @, q, u' s8 A8 f9 }7 n
继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。4 M! X+ s5 m$ ?$ n. C" ^0 K
5 U6 q! K @# s# m! b
; x4 ~) o2 r8 T+ ~ x/ \
7 L# x T1 d: }4 r/ G1 b2 d8 d3 ?
电源芯片( ?% e0 u4 H& {$ Q; s+ Z2 T7 Q& l
7 {" j' c# z: @: R2 }
+ U N8 F7 `& x; F' x; A: a v
$ m& l* g- V3 ^" p1 G4 r3 V
有一个按钮,按钮有二个蓝色LED灯
, r/ D+ y2 F t0 J( R) X
6 a+ S2 [. X4 f& v& U: _5 n5 h# h! A: n5 E" b# H
( _% E; n! b% D$ ]. d/ {9 H+ g
8266
- W+ C2 I; O& O" g) m" y5 w8 @
4 m1 z& |2 M/ {+ e/ a! B6 H8 {' n! e# ]% b V0 g( z
8 }5 w& m8 o: N- [
3 v! b6 y' @/ g, o5 K C
9 Q! t g1 w# B) O% y3 r2 ]7 O接下来就是刷机了,版子上面都预留测试点。
; a* L9 y7 n+ G: o6 r. I接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。
) l; r, {: {' l! ~. {7 X
6 {: g; c( \3 b( L
注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。6 J3 k! l% g V h }) R* U
要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 |
3 X7 s6 a! Y& _7 f8 z1 t0 E# U: y& `% _/ t* ^/ O
4 F# m4 ?$ j( B$ ^
2 v+ u- q* L/ W3 z- e& f
% \5 h& R9 f& Y9 W- d) h8 i0 k
& \' d& D/ o4 x- A
5号脚位是继电器输出# ~3 h. l- Q# K
12号脚位是灯输出
0 L( n/ p5 U @1 d+ ^- w( W 4号脚位是按键+ d' Z# G6 M8 z) L* ?* v
, M- }/ o; c/ x+ n" I0 K, g9 I
w. B0 ?& x( M4 m) A
, m8 O1 ^3 l9 C5 Y8 U/ e
: F( W2 o* w0 H4 |: Y5 Y- E卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库; g: k- [% A. P! u- t
- #define BLINKER_MIOT_LIGHT // 设置小爱灯类库
5 ?% O2 _ M. V) x% `7 ] e% }/ ~ - #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库
0 g7 U% y# f% z% x4 [% d/ a M - #define BLINKER_PRINT Serial //串口协议库
* r8 V4 W: Y5 C% R - #include <Blinker.h> //官方库5 |) e! V+ M) \& q* }
- #include <ESP8266WiFi.h> //官方库0 L7 @- F) J1 e
- WiFiServer server(80); // 服务器端口号4 ?3 A3 U. o$ b9 {, Y$ n6 d
+ Z6 `8 R/ \$ P# R+ V- char auth[] = "c4942fb1d5e4"; //设备key$ j- i# U1 [0 }2 z- b5 y* u
- char ssid[] = "wanboshi"; //路由器wifi ssid
* J- G! m- \$ D9 [. o o% @, R7 o - char pswd[] = "1365662999813586348220"; //路由器wifi 密码
# U& D- {9 F. ?: ?7 M- p" \ - , G8 E3 G! Z0 d# O" ]
- bool oState = false;
( j/ h8 M; }: b6 ]8 `/ X- b - 0 W' J/ }' K( i* e5 k8 M5 K
- int kg=5;//继电器输出
; N. p! n" J; y- {1 e$ X4 B% d( i - int de=12;//灯输出* v; j, u I4 ~0 _6 p
- int key=4 ;//按键
8 X) G, p# J$ v" j( E7 q - //*******新建组件对象& n, h' q& h% `. G2 z
# g. G7 L4 A; g- BlinkerButton Button1("btn-abc"); //设置app按键的键名: @2 {1 ~5 k7 z% x1 i' X* A
- //*******app上按下按键即会执行该函数app里按键
& ~! H. `2 |) H6 U S6 i8 p7 w - void button1_callback(const String & state)0 w0 X& B/ M; K1 f' _
- {
0 C5 O& R9 V. ~3 h1 C - if (digitalRead(kg)==LOW)
! ]# l' ~/ }$ d& h/ C2 U! D4 W4 \ - {
1 K$ B5 v0 ~% M2 V - BLINKER_LOG("get button state: ", state);
* ^5 j! K+ p6 M* U1 N% S9 w - digitalWrite(kg, HIGH);
# q2 M! E5 c$ n5 X6 _; _5 A. b1 W - digitalWrite(de, LOW);
x4 h' X; t; d( G W - Button1.print("on");
6 ?% m# r1 U& J# I. e. p# {7 k - Button1.color("#0000FF"); //设置app按键是浅蓝色! H; `6 q- M# G8 x- K
- Button1.text("开启中");% ?. u7 w5 A4 k
- }
; u% I9 a3 }. e7 b M - else if (digitalRead(kg)==HIGH)& X; J* d1 X2 C2 C+ Y1 e q
- {3 \- J' `8 W L- e
- BLINKER_LOG("get button state: ", state);
2 |7 V- O" V2 d/ G- T8 R8 } - digitalWrite(kg, LOW);& A0 }' y3 W! t/ U
- digitalWrite(de, HIGH);! e8 y4 G5 C6 ?& Y, }
- Button1.print("off");8 A% i% ?3 G, T3 a$ X
- Button1.color("#00FFFF"); //设置app按键是深蓝色$ g/ c+ K8 D) B. P7 L1 f( k
- Button1.text("关闭中");
1 z: a4 n3 a6 v3 m1 R - }+ Z- \$ J9 R! O' p# S- ]1 p- b- q2 n \
- }0 ]* @* V' q2 A+ g3 b
$ c$ X, ^& P+ d6 t$ _- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++4 p+ P8 X0 [. z `8 c
- " }( K& B# @& p# T+ A5 Z n
- //*******如果小爱有对设备进行操作就执行下面
3 A- m5 Z# L+ B; G3 g/ B' ] - void miotPowerState(const String & state)9 ]5 K0 H6 ~) F+ k* J2 b
- {& }6 l2 V' V& q) V& A( J3 c7 t# h7 ^- O) x
- BLINKER_LOG("小爱语音操作!"); //串口打印4 g; S' h5 r) l! {! ?
- if (state == BLINKER_CMD_ON){
2 ?" G. N" E( _2 Y. `- k. Q F) S -
4 n7 t& t1 v f; g: d$ ] - digitalWrite(kg, HIGH);
: b! ]5 e. {2 g - digitalWrite(de, LOW);1 M2 A' h0 @) N: @* T5 i$ s7 n
- Button1.print("on");; D" `2 q6 X P0 [! y& O
- Button1.color("#0000FF"); //设置app按键是浅蓝色) s4 E0 }; G- Q! B# }6 J7 F
- Button1.text("开启中");
( q% p5 O; ~5 R* d% v, v7 I& \1 j - BlinkerMIOT.powerState("on");& B2 c7 H$ ?4 ~7 j* s3 x
- BlinkerMIOT.print(); i$ L/ a; u2 v; |( X2 \
- }
, h$ `; o. S, f - else if (state == BLINKER_CMD_OFF)
5 s$ X3 d( P2 O - {4 s+ ]( h/ T$ @2 m) I
-
, J f4 T% i) }' L1 ~ - digitalWrite(kg, LOW);
( v$ H, { }4 {0 s: x! S f - digitalWrite(de, HIGH);
' ]* D/ B1 p" ?) z+ Y1 e - Button1.print("off");0 x7 B# ^9 G6 A. R" ?4 \
- Button1.color("#00FFFF"); //设置app按键是深蓝色, M2 I" G* p# s7 y. _" k- H" o
- Button1.text("关闭中");
+ d: X; w/ a2 V6 U7 _: F9 J - BlinkerMIOT.powerState("off");1 ^ d2 ]' L' I7 T9 s4 [9 Y
- BlinkerMIOT.print();$ h- T; p% N% o. e6 R
- }% H- S% R; B6 W4 G0 v/ b, _! |
-
. k1 s; X) X) l S1 e% ]: P2 Z - - A" z+ c' F1 \
- }
- f1 @- t# E; U: G& q9 c8 ^ - //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++1 L( l6 J) y! e5 y7 O8 T v7 d
- //*******如果天猫精灵有对设备进行操作就执行下面 J- l Y: H1 W: V0 m+ {8 n
- void aligeniePowerState(const String & state)
a% i- c0 \6 l# Z0 z - {
( W2 W$ }' Z+ [% C% [$ T# R! m - BLINKER_LOG("need set power state: ", state);1 g+ N2 S8 Y7 p& W6 y
- if (state == BLINKER_CMD_ON)
) a. I" Z1 E7 P - {
1 i3 L" B; v; H' {0 W7 J - $ c+ H8 G9 D$ r8 o6 y) g0 [% r* S
- digitalWrite(kg, HIGH);2 {+ ?. M) U9 Y1 O
- digitalWrite(de, LOW);
" ?& ]+ Y4 x# A4 H1 k/ a. g8 J - Button1.print("on");3 |8 U5 v3 I- ?
- Button1.color("#0000FF"); //设置app按键是浅蓝色" v# W3 M/ i0 ?1 O* ?: j
- Button1.text("开启中");
& d5 K" e& }3 ] - BlinkerAliGenie.powerState("on");
6 b6 `& K. a' `% w) } - BlinkerAliGenie.print();4 w* |. Y! [2 k8 e9 Y- q
- }
4 ?% C @! }+ p - else if (state == BLINKER_CMD_OFF)$ a- a5 J @5 H3 A: I F0 v; ?/ B v
- {
& ~5 h6 r3 S/ P( K ?2 I% i5 } - 6 o2 ?3 R) b/ ^7 r( s
- digitalWrite(kg, LOW);: B) K* _2 ^9 f2 [: ?/ J
- digitalWrite(de, HIGH);
4 |7 I% q3 a; J0 q) @. |2 u - Button1.print("off");
! y4 O6 r* L( ~! Q' a3 M0 x - Button1.color("#00FFFF"); //设置app按键是深蓝色 _* M# B7 i! F" b+ p+ B
- Button1.text("关闭中");: E- ^6 ^' g7 n2 o' q( E
- BlinkerAliGenie.powerState("off");2 U ]. W' N' Z; T
- BlinkerAliGenie.print();
' }/ k$ |3 ^/ Z, v8 T2 d - }
! ~& M$ L' H8 W8 }) b - 9 ?# V( ^ A6 j
- & t6 D0 T4 j& a
- }
' M; i h2 q/ P5 t1 ]- h$ v - //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次
; N/ F/ D) X) D; Q1 {6 z- I) m - void heartbeat() ^ Y5 U0 p1 K0 w7 Q8 [
- {
! u- \! ?1 d# @! r5 I2 `7 V - BLINKER_LOG("状态同步!");
2 ~ S% e5 |0 J - if (digitalRead(kg)==HIGH) - Q1 T* c+ x( f( L W, l& X
- {
1 j% |0 L L: @8 B( F - Button1.print("on");' G. x5 [+ y% b) X4 r! z/ m
- Button1.color("#0000FF"); //设置app按键是浅蓝色
6 J$ a: A' @# w - Button1.text("开启中");
, a" }' v* `2 C3 j& x: v6 z: R8 z - }( n9 K1 t2 |! Z) H0 Y. A& h6 k
- else
1 m3 p. C5 l1 d - { r) u. V0 J$ {9 |$ U+ I2 |$ _" R
- Button1.print("off");4 d# O7 t H2 D3 r* ^6 |9 W v- F
- Button1.color("#00FFFF"); //设置app按键是深蓝色
! H$ h( d8 t0 ?9 b - Button1.text("关闭中");
7 Q( y, a0 i7 \! j! L -
4 @! o- \# m$ {/ M' l - }
7 v1 f7 P5 a: N0 p3 G5 J - }
5 N- m1 o; \5 N2 n4 {0 v - //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4 o0 s9 m3 M1 _7 }' G - void setup()0 O1 j' j1 B$ m; q& Z% M
- {
" O/ ]/ E2 g+ A7 }9 C' v - // 初始化串口$ N3 t* Y& |" c) `
- Serial.begin(115200);6 u- F; H5 ~# \; ~
- delay(10);
M8 u4 ]! e B1 Y, _ - BLINKER_DEBUG.stream(Serial);/ }9 c- r/ f! R
- // 初始化有LED的IO& C% E, ]. L2 N; c
- pinMode(kg, OUTPUT);
! I: W- e4 G# p0 ]% S - digitalWrite(kg, LOW);//初始化继电器上电状态
" A3 a D( b7 B - pinMode(de, OUTPUT);# n9 h8 m" `: s* J+ ^
- digitalWrite(de, HIGH);
0 n; c3 s' p6 e" m( t - pinMode(key, INPUT); & e- n0 V' x) F4 K
- Serial.println();1 v- W6 l$ k5 s, j1 \
- Serial.print("Connecting to ");
3 P/ |4 y1 J% ]9 I) ] - Serial.println(ssid);
7 {( J$ a( ^" R2 W - WiFi.begin(ssid, pswd);
1 I4 r+ N) m% ?& y' } - while (WiFi.status() != WL_CONNECTED) {
! [# p& s! J; _. T/ Q - delay(500);) u- J" A- [$ i& l4 y6 R
- Serial.print(".");
( `1 G. z2 W6 g* G - }' U# L& W. }- h; \% s
- Serial.println("");3 _3 ^6 O/ T0 s
- Serial.println("WiFi connected");$ X: T4 F0 C; V- z
- server.begin();# x. `# D7 \0 h# o6 ?
- Serial.println("Server started @ ");
& y( Q& c3 {8 @" V - Serial.println(WiFi.localIP());
( Z5 ?3 h, J+ b- Z - //打印出IP地址,后期可以制作显示器来外部硬件显示ip( @: U, ^6 A6 I, m$ [( q
- Serial.println("To control GPIO, open your web browser.");
4 z! d" f6 f! b8 m) f. j5 _ \ - Serial.println("To set GPIO 0 high, type:"); e( _+ T+ h8 z$ K6 K; m* z
- Serial.print(WiFi.localIP());7 u. ^- ?$ ~/ D: k# a4 I
- Serial.println("/gpio/1"); w; u1 G1 J& W: \0 t
- Serial.println("To set GPIO 0 low, type:");0 n4 W$ C! ~' m7 x
- Serial.print(WiFi.localIP()); |# }8 H, m0 M9 E
- Serial.println("/gpio/0");, n/ a% B" o+ M3 o
- Serial.println("To toggle GPIO 0, type:");( ?, t! i7 A; ~8 P0 n. u& k7 I
- Serial.print(WiFi.localIP());
' n- \; I0 r [ K: [ - Serial.println("/gpio/4");9 ]+ p1 `% w; [' w
- % U, n! E N2 f l* f
- // 初始化blinker
5 t5 V' P$ ?: r( U5 F& ?3 y& [7 o - Blinker.begin(auth, ssid, pswd);2 y5 p# u4 w0 m. Z$ b' p& R
- BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数
2 V) O9 l$ k/ H - BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数
$ c# L1 \$ ]( L4 A* c - Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。
7 ?. l8 ?; Z* y2 ?) I - 8 h' u# t' K( l; n
- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback
; E7 [- P: k% t; N" c4 [ - }: K/ r: ~( [% S0 }2 }
- void dataRead(const String & data)# n1 V8 N3 h( w* ]9 k$ ] _
- {! a, w( V7 Y& t
- BLINKER_LOG("Blinker readString: ", data);! `; y; b+ ~. A" G* M
- % ?6 d' Y# C8 Q; Y
- Blinker.vibrate();1 h1 f! @, }: g! {) V! l
- 5 q1 c- k1 j% H4 K* j& R
- uint32_t BlinkerTime = millis();- z; s7 N" O* o! h9 M+ A
- 2 X' v( O" x1 R
- Blinker.print("millis", BlinkerTime);
/ {: L! p+ O+ r) l - }
8 l8 }) X. m) Y8 K - void loop()
0 M5 G1 w* L! \7 p7 t' ] - {0 m9 t6 m2 o, \! w
- Blinker.run();
2 m" R% g9 b% h* u s! o( P& c - if (digitalRead(key)==LOW)" b k$ M5 ~' S/ a M c5 K
- {. }' X- A8 p U3 n1 X
- Blinker.delay(200);
) c: w7 O' q2 _% K) } - if (digitalRead(key)==LOW)
& q1 u* I: P8 G - {
* n* v% h, e" B, \$ e. C! F* J - if (digitalRead(kg)==LOW)
8 T' j+ C7 U1 q - {. J" |. P2 {' J+ w6 l1 W
- 1 F' C- t5 ^1 Q6 Y! C* f5 M
- digitalWrite(kg, HIGH);: W( e4 o; ?1 a, w, D
- digitalWrite(de, LOW);
6 p/ [9 J/ y. L8 B# O - Button1.print("on");& Y& \! z% }* I% ]
- Button1.color("#0000FF"); //设置app按键是浅蓝色; W% ]. ^* }% c
- Button1.text("开启中");
$ q Z3 E4 ?, w0 \1 v% g0 U j - }
/ p& ]' t5 z k& Z2 V T1 O% n - else if (digitalRead(kg)==HIGH)
% F6 v- m+ I! S+ g$ c - {
5 h. _1 M) s) t4 ?5 L - digitalWrite(kg, LOW);
3 e5 \7 I6 E5 h4 ?/ u0 | - digitalWrite(de, HIGH);! H t' z! k/ c9 h" [
- Button1.print("off");6 g3 h# o( C; ?$ V
- Button1.color("#00FFFF"); //设置app按键是深蓝色1 M3 ^) O! d8 ~+ K7 U' V/ m# E
- Button1.text("关闭中");
# T W$ b, s n2 T7 r- h - }
9 ?6 B7 s; y* D% a8 } - }
( c; T1 B! f. \9 F$ x# s - }
* F" x) P' c* a8 Q# T/ g, k3 k: H - }
复制代码
0 f7 r0 b: A9 z% }7 h0 Q6 M+ d
# L& {# P5 g8 k) V, Y9 M+ L我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html# f& l+ T9 u$ u' \' a5 ?
) A9 o( |# I! h8 P. E
把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。
5 g& N( V0 N! ]( b9 t
, ^3 r1 V- F* y8 Y* o9 j* @, b* g# h. r& a9 N# p8 o
|
|