|
|
本帖最后由 易记 于 2021-8-21 14:05 编辑 # i3 s i0 Z0 q4 T% K
R1 @$ a% C3 `
最近玩ESP8266,想做个天猫控制开关。% O5 f3 {1 L' t1 C, g2 _! ~
但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。
# f- g8 F5 u+ e6 S/ v8 R) c4 p还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。
+ q$ w6 a- l9 c) |* S- {
! F& U1 L; N, k. {0 n* U1 w7 t9 y
5 N# a( s& t A) y; s+ ?9 S) x4 ?& ?
问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。! }7 L Z/ C2 {* y4 H: X6 _0 ^* F
b; C6 B) `+ Z' a
: @2 d1 d- X4 r$ c* M9 G- F+ j
' T+ L7 v( }' Z, L
" a( Z6 U# A3 x
4 q, x9 w' H" g* A% O; `. U到手,当然是拆拆拆。
/ a5 q+ d5 z7 e: F. |. O
9 u( K* ?: s5 f2 E! M8 m
- \5 y G; C4 R# g
" I$ [4 K: p! U联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。/ P0 R N" U D e+ L$ I, Q$ p
( P; d$ U4 @3 {
* [! q9 m: u1 y
/ |& l' F/ A4 l- z$ I继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。$ F( G! H. D$ C( h4 o8 k& m
9 c* e( b$ m5 P9 J: K7 G: n& C
) e) @! w' X ^' r1 B1 M5 i9 d0 o
; b- w$ j3 U3 m; r# ~7 Y9 i6 o, o- s/ \& \. \4 F4 y
电源芯片
" J' Y$ T6 i1 \4 s( x) W$ @
' C! F {: Q# N: Q7 }9 h0 @* J4 A5 F# |
|! [9 u$ b' \. I( ~1 S
有一个按钮,按钮有二个蓝色LED灯
# \9 h- S( k* L7 c
8 Y/ F2 O5 x8 c s' F# R7 D# A8 c1 a
( X2 B# k' t# O' s4 x Y8 k
82664 v$ l E. F, x( c* ^0 G" O
$ G: X) F# ~4 g7 t, I9 ]
$ ?0 v. Y% B4 l$ k" x" d( n
^4 A3 Q% a3 l0 h Q
0 y& f$ W" U1 q9 d5 ~% |% g( K7 ]3 O$ N0 g* I4 Q3 x2 ]
接下来就是刷机了,版子上面都预留测试点。9 @% [3 _' c+ C# }. F0 d% |3 s
接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。5 Z7 E! U% A- ~; u
3 g4 q; Z3 ~+ D6 @( F0 J1 @. X" G注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。 v% u+ a2 t7 E9 P8 W
要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 |
) z3 ]6 [8 c" F$ J# N. B7 B5 s. E& q+ X9 `
! N. s& e, _( g! C/ ?
8 ^, ?6 Z' u5 W9 c# N# x6 I: T) ^8 d- @# ^+ v- |
( i( b! b0 ~3 ]+ b1 x3 W 5号脚位是继电器输出9 s( } _4 H' F7 G; \) H8 G
12号脚位是灯输出
4 A; i, P, m# I8 I: j9 w; a 4号脚位是按键% E4 I& H) H- S' K0 `3 h% T
5 V0 K6 \4 r$ ~7 b5 |! @8 z4 e5 G1 }( T
: G1 P& @5 O, d1 F& K( ^# k# p Z& A- ]8 Q
卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库. c) _/ o- \5 Y3 |
- #define BLINKER_MIOT_LIGHT // 设置小爱灯类库
+ D5 k0 n+ a0 G - #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库
* F6 ^2 _0 G% f& U - #define BLINKER_PRINT Serial //串口协议库
8 @+ L q* N# ?0 l1 E F - #include <Blinker.h> //官方库
' b( ^; X! S$ F# Q% j - #include <ESP8266WiFi.h> //官方库( X; e8 y1 r6 q, |0 E
- WiFiServer server(80); // 服务器端口号7 g. A; j( l( k2 M/ z1 A
- , G% e5 @) m' M
- char auth[] = "c4942fb1d5e4"; //设备key
) S2 T# M3 K% U) a9 {# N; ? - char ssid[] = "wanboshi"; //路由器wifi ssid
6 U' R+ ~" D4 p6 \4 N. Y - char pswd[] = "1365662999813586348220"; //路由器wifi 密码& M( V# t, F/ f" p9 l3 l
+ i$ _; _6 X6 m S% J: t) W- bool oState = false;
" g/ p- R: s# g - 6 t3 d! I6 U5 c
- int kg=5;//继电器输出4 V" I& ]& } F; C% r! a
- int de=12;//灯输出
+ B6 Z$ u h% K7 E - int key=4 ;//按键
9 W2 C: T n+ ?; k' _ - //*******新建组件对象
5 Z( x9 B% h% ^9 w4 n - / }; N6 ?! R0 J1 \* v" T' }
- BlinkerButton Button1("btn-abc"); //设置app按键的键名
7 z( H+ f# h# B - //*******app上按下按键即会执行该函数app里按键
. s* ^5 w, o% w* g' ~% D - void button1_callback(const String & state)
: Q5 k& ^& T! E# A6 E6 S, z - {
' A% _1 G! |+ I s - if (digitalRead(kg)==LOW)
9 Y# z" _8 q# r( n - {* H/ _, F2 I* h! k& h6 R, g
- BLINKER_LOG("get button state: ", state);
# g7 s j7 z$ m3 O B - digitalWrite(kg, HIGH);, ?, Q3 t) _' v' U! S( P9 X+ a. G" K6 G
- digitalWrite(de, LOW);# V% z6 b2 P- K( W' i* S# x
- Button1.print("on");
p b1 ~. w& { - Button1.color("#0000FF"); //设置app按键是浅蓝色
- x" C+ y0 u3 g- z) a - Button1.text("开启中");
( |9 ^7 V# y1 Q5 S! I- _ - }
$ x% Q& h. |' o$ F$ F* A' {" I5 m - else if (digitalRead(kg)==HIGH)& O+ \4 }3 @9 R$ c- H( q# y* e
- {; K( h m! x6 J. X" n
- BLINKER_LOG("get button state: ", state);
6 {* W6 \$ v2 C - digitalWrite(kg, LOW);
% H' P( {4 M9 O }7 b0 f+ M: W - digitalWrite(de, HIGH);/ u% Z0 B' Q+ Y0 ~& z
- Button1.print("off");1 L! m: q# \5 q+ e& N! v3 K3 e
- Button1.color("#00FFFF"); //设置app按键是深蓝色! C" E3 r# r5 }
- Button1.text("关闭中");2 W) U9 X% E u U r' A
- }, e8 y' _. O- w4 k& g+ G
- }
2 N' |* T) F( J) F( C+ {, J
" b0 h( x! P) s' I0 N% o0 ?2 r- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! O$ W$ l( H# s
- ) _/ O# ~6 L7 z
- //*******如果小爱有对设备进行操作就执行下面0 ?! ]2 ~; G, |3 Y
- void miotPowerState(const String & state)
, Z/ T4 [' J. C6 H2 K! \7 f - {7 j% W8 y1 a# L
- BLINKER_LOG("小爱语音操作!"); //串口打印% A( E+ m) m. f8 v( k& [3 _* P
- if (state == BLINKER_CMD_ON){$ g8 j. M# W$ [3 i6 C
- 7 F7 d- L; D' @- |: W
- digitalWrite(kg, HIGH);* O# r- i( y: Y' @9 v+ n
- digitalWrite(de, LOW);% |) F/ X! Q- f2 c5 v2 i
- Button1.print("on");/ b6 M/ c7 F2 k( v' E0 r* c' R; d
- Button1.color("#0000FF"); //设置app按键是浅蓝色3 {+ i C8 n9 D! [$ |0 x
- Button1.text("开启中");
! |2 d2 q" `2 f- f5 R1 \ - BlinkerMIOT.powerState("on");6 m, S/ H2 O W8 p+ V
- BlinkerMIOT.print();
" I1 L5 u6 o! P }, j0 c - }
% O1 x8 ?( a$ ?9 b- _( K; z# n1 G - else if (state == BLINKER_CMD_OFF). i0 n" N6 j% A) s
- {
% B' q% y6 k% B9 w; J5 F: f% Z( L - ) Z9 D! Y! _! Y5 j" ^' G- ~& {2 B: I
- digitalWrite(kg, LOW);
1 ]& Z. c" R. [: Q" f$ S. _ - digitalWrite(de, HIGH);
. S4 b, l0 O& D [2 L7 a - Button1.print("off");, _$ R$ ]! U0 r% t, L% J
- Button1.color("#00FFFF"); //设置app按键是深蓝色: h. u# ]. ` ~$ P
- Button1.text("关闭中");
& W& q& y; Z5 T! h V - BlinkerMIOT.powerState("off");- t- p# z( ^2 r% O, W4 o
- BlinkerMIOT.print();
+ [ E* Y N. a5 @, B8 Y5 } - }% R4 w# U! g9 i1 U9 S7 \1 o
-
' w ^! Y! {7 y: {+ D# A -
/ X( J$ K7 p* q4 h8 X8 s1 ]1 p j - }! s) C. W/ J1 g) Z+ P$ V1 [
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++; m. G; Q: _- J6 ?
- //*******如果天猫精灵有对设备进行操作就执行下面
. C0 O' d) o5 [6 u! R4 E5 j. D& H - void aligeniePowerState(const String & state)7 _# q( |' W* K* R" l; f
- {
2 u. \, ~! w4 F+ X% k2 |! D - BLINKER_LOG("need set power state: ", state);
+ n+ `# M6 O# N% } - if (state == BLINKER_CMD_ON)
# ~- d( F3 D/ h1 g# b - {' @: m/ p' b# I$ n
-
: G- l, a" M6 H& ` - digitalWrite(kg, HIGH);
% q3 P* v5 ?4 V, z/ s' K9 W - digitalWrite(de, LOW);2 T7 E2 `0 A! J; [0 _& U6 y' A
- Button1.print("on");$ o' R! K) r5 W1 I' j+ x% ^. n
- Button1.color("#0000FF"); //设置app按键是浅蓝色/ M5 U% X5 ~; ?* H8 e
- Button1.text("开启中");
. Y; V6 O/ q! B& |5 L - BlinkerAliGenie.powerState("on");
2 E4 Z: c# b% k2 p4 S: [9 L - BlinkerAliGenie.print();' _2 c' U7 k' j4 o* i7 j$ x) ^9 y
- }* a8 M8 V8 m5 f& p
- else if (state == BLINKER_CMD_OFF). @* Q8 {$ h0 D1 d* C/ M# F6 N2 N
- {
: f- Q. S' m( V$ f/ ?! O# r -
+ C9 n7 }, v' q; f3 u - digitalWrite(kg, LOW);: T7 D: t2 T$ T+ Z
- digitalWrite(de, HIGH);
8 j* a5 l& l; {' p - Button1.print("off");0 v% k6 P# H7 j6 c8 z' D
- Button1.color("#00FFFF"); //设置app按键是深蓝色
! z! P3 W) }% X0 } - Button1.text("关闭中");+ m3 V0 V/ Z: R) ?4 z7 |
- BlinkerAliGenie.powerState("off");
_# t% D1 w7 ^ - BlinkerAliGenie.print();' S3 a2 \& l1 f/ E' T
- }/ v% I( t1 q7 E% Z) u
-
1 r4 \2 T& A2 H: N: K
+ D3 z5 A& m( G6 H3 @8 H& o1 ~- z- }5 p5 F3 Z5 U; z9 [9 X
- //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次
% K) Q; e1 B$ I - void heartbeat()4 M/ o+ m! K8 R" Y9 [0 B5 ~! h0 h
- {6 T8 n N4 ]) I3 T. P
- BLINKER_LOG("状态同步!"); ! U0 v" x! H g! I) J% a1 A; @! y
- if (digitalRead(kg)==HIGH)
1 {1 a7 F. f7 ^6 e5 O8 } - {
( O; G8 a: B/ V9 N7 ~3 C - Button1.print("on");* C( [# Q' R) v, A* Q
- Button1.color("#0000FF"); //设置app按键是浅蓝色
2 S! q- c w( t6 u% B - Button1.text("开启中");4 N7 x' a3 R, [" D& }8 G* d4 p \2 F
- }
2 c3 ?! j! j* b2 X( K2 t: W; t+ | - else
/ v" k; `3 l, u G2 S n8 D - {. k; t- V1 V: W. y
- Button1.print("off");- s3 L4 _6 D) e' m4 a
- Button1.color("#00FFFF"); //设置app按键是深蓝色
0 ^4 u1 w" f0 @# e* F/ d - Button1.text("关闭中");
9 l6 _2 r4 W- w: N - , R0 j6 F, e. ?2 Q) a
- }
{! v( P) s* T- ~% i0 M9 l9 [ - }, _% f7 p, ?4 y' ?8 b1 |, D* D% u- Q2 C
- //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++4 L( G- l3 v! x0 j
- void setup(). ^- O5 a$ Z5 \# Q: P2 d$ g
- {
1 n9 t; b! j+ h4 ]" V4 N- H/ M - // 初始化串口
- g% V7 W; [; v0 p - Serial.begin(115200);
- I9 } G6 |3 N. z - delay(10);; M8 W0 v; x; K" X5 g
- BLINKER_DEBUG.stream(Serial);. O! R/ {# S S4 J9 c" f& h
- // 初始化有LED的IO* [4 l( _/ T. y6 A5 ], ^
- pinMode(kg, OUTPUT); ' J n) [" \& j. L4 \1 H2 v ^
- digitalWrite(kg, LOW);//初始化继电器上电状态 & J& u! a' ]) h y- o
- pinMode(de, OUTPUT);
$ V% u w* X- j5 @/ {3 V. R - digitalWrite(de, HIGH);
& x/ g; ]; X& q4 m- ]- \' i( k6 Y& [) u - pinMode(key, INPUT);
3 q* {3 ?* B0 Y' D" @ - Serial.println();0 o& z2 V. `3 ?$ ]$ R
- Serial.print("Connecting to ");+ J. b) U3 L: C4 S6 ~3 `8 C" T1 s
- Serial.println(ssid);
3 u+ |" |/ F8 ^ - WiFi.begin(ssid, pswd);
( y, y$ k/ X* ^2 O- u% S8 w - while (WiFi.status() != WL_CONNECTED) {3 e1 Z* h, b- M( f' l5 Y
- delay(500);) O; t$ b: h2 _. t
- Serial.print(".");
0 {) b3 D" q4 @1 e4 d- O - }
) O6 o; T8 j; g" A* t3 }* p: Q - Serial.println("");
+ k$ C: {" G7 c7 D7 D- y* G - Serial.println("WiFi connected");
* J% a6 x3 K2 r% R - server.begin();
7 z; D& ?* G' w' G" f+ m - Serial.println("Server started @ ");
5 _7 U- n" \$ y" i+ G/ t6 X L3 x - Serial.println(WiFi.localIP());( W& I6 t4 U5 E3 U
- //打印出IP地址,后期可以制作显示器来外部硬件显示ip. V5 W7 d: K6 Z" W
- Serial.println("To control GPIO, open your web browser.");7 G+ w! X2 o3 E, V5 |
- Serial.println("To set GPIO 0 high, type:");7 ` V2 y% h. _$ ]& H2 L' D
- Serial.print(WiFi.localIP());$ z, Y9 I/ Y: j' ]7 ]( h3 s8 O
- Serial.println("/gpio/1");
$ d" A4 K C5 K( f* ? - Serial.println("To set GPIO 0 low, type:"); @4 u0 P0 X: w5 `9 h. |, Y
- Serial.print(WiFi.localIP());# j9 [5 c7 ?8 b8 I
- Serial.println("/gpio/0");2 v* v7 j6 Q& o8 {# l% `
- Serial.println("To toggle GPIO 0, type:");: H: r) f% G: {( n
- Serial.print(WiFi.localIP());
+ q$ C4 h* _; \+ V - Serial.println("/gpio/4");9 ~8 G" V2 k {2 c; y
4 B( y* P; |% b2 |" y1 k7 s- // 初始化blinker
4 C5 p/ g1 l4 S1 K - Blinker.begin(auth, ssid, pswd);1 l [9 P& V2 a& q: g8 F: C
- BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数8 J. t( {: z: v5 r
- BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数; ? E( z9 E% r; ?
- Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。
. E; u' n, L" Y8 [. }* T - 2 X; f8 P+ C8 [8 O+ m6 H
- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback; h9 {7 u7 Q. | o; q
- }' p" N9 s; ]. `0 r
- void dataRead(const String & data)& s0 F+ y. X6 b9 b4 d! f2 T
- {/ S+ B* X% T5 S1 e. Q1 E. m Z
- BLINKER_LOG("Blinker readString: ", data);
3 x% g' o5 Y* h; s' V2 V
8 @4 {( d5 d1 U+ h- Blinker.vibrate();1 f$ V7 [/ I. Z7 F' @: G
- 0 @9 S" T2 W+ J/ q. T3 f
- uint32_t BlinkerTime = millis();+ D0 l% T1 U3 [) {$ [" B9 k
-
% y! `4 n( r: K. K7 \ - Blinker.print("millis", BlinkerTime);
+ Y/ U, c" q* I. B" H - }1 z5 z& s) `3 u( @
- void loop()
7 o: E3 i, s( s* P0 ]9 @) v - {
/ |3 g* ~4 s( b: G - Blinker.run();
3 A$ o+ B2 ^$ @3 R - if (digitalRead(key)==LOW)" D; r* f/ q: p
- {2 d$ p6 k0 e* K& ]. O$ L: h/ L- q
- Blinker.delay(200);
' Z4 K2 C! h9 o% _. Z* L9 a* n9 z - if (digitalRead(key)==LOW)' A U) K, f% K9 j7 j5 V* n
- {# R! c' | a5 F4 M) {
- if (digitalRead(kg)==LOW)$ h2 X" V; {; C6 Y% @
- {1 O* [, v8 q: \2 L
-
% x; b+ h! e, Q0 t2 O3 _ - digitalWrite(kg, HIGH);
( ~7 A: u& o6 C; m8 p7 \; L - digitalWrite(de, LOW);
& y5 G* D# {7 o# l* j* O - Button1.print("on");
- M% {4 t2 C( M - Button1.color("#0000FF"); //设置app按键是浅蓝色
' ?0 |4 Q8 O. i - Button1.text("开启中");" B) A6 K. |* B, h+ B
- }
x& R8 ~: h) I9 G4 @( X - else if (digitalRead(kg)==HIGH)
1 V. w6 S% V3 @ - {
8 e& g8 p8 P2 @* v7 Q2 {2 [ - digitalWrite(kg, LOW);+ v5 A7 I' I3 y* n0 v
- digitalWrite(de, HIGH);
+ e: L3 X9 F; H - Button1.print("off");
4 K" q3 v2 h m- G) t - Button1.color("#00FFFF"); //设置app按键是深蓝色
% _. K7 A0 @* @6 z - Button1.text("关闭中");& o% I4 }* R( q$ N, M
- }: P% L( z, `/ m- D* l) s' M% K
- } @' o, E" O& _0 D' r. j
- }
' _: G. W* e% H" o - }
复制代码
/ B3 |3 f5 s2 u" ]% p G
) ~2 k8 [& @" Y0 W我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html8 F0 e" ]& f( _
T* g Z0 n$ q: T把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。
9 l; j2 W5 X+ v# @0 U( c7 |2 S/ f7 d6 L# o. v7 |
* z# o) f* D; ?) w2 t1 T
|
|