|
本帖最后由 易记 于 2021-8-21 14:05 编辑
0 }4 q/ T5 z) p6 M4 ]% f/ [; C( E1 e
最近玩ESP8266,想做个天猫控制开关。% F1 S4 P0 Y; ]1 ]* C7 P' G/ ~
但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。
# _" i* }; k/ h' b还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。9 L2 t( |# e5 a" j+ e7 [
6 q1 ]+ _- F. a7 \* W+ s! j# x. w# G
+ R8 A! ~# _% B$ _, [; e6 N# j4 \2 a% V" Z( Q9 P( \
问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。
3 g- F7 V' T' @( r( b( V/ I; m( z7 f0 x" ]8 @8 N8 }5 H# C m7 s
5 _' W7 N6 q7 E
, ~/ `% w. i. B; I2 x2 B" m6 j- h$ K0 v3 |$ r
( E" j4 {, N0 g% k8 z @# X6 D到手,当然是拆拆拆。: A$ l* I# _4 } H1 ~% S
8 P( h+ P1 \9 k% m. G7 g* v
! _: N" M! h( M" i% n
1 j3 e9 }2 A& k, w+ y4 p& i联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。( C. f1 q# E/ |# Y, d! ~7 {
8 H0 u$ U8 \0 u3 ?& b
" c/ O' U" m" I: U
' O* L. Z% t* ]# ]0 g" z
继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。
' z" r6 g9 b- P, B1 x
/ [: Y& {( ^5 @ d: P; Y ^, W
( l* ?) Y7 T" B* h* B4 l2 x) S
) A5 q: n) C! E6 O3 a( i* L- O
9 ~1 P, R p1 n! r1 V: d电源芯片4 q& E" X8 Z3 i0 \& T
3 X) n/ {) F) u. @( g9 X; U: K9 @! w* Y5 m) }( m; r2 F9 \" Q
5 N- t& `# R# t; ?+ r' T+ f
有一个按钮,按钮有二个蓝色LED灯' ^6 H2 c) a! d
7 ?; x% A! _& B; d7 w
9 t% L0 q6 P& ?9 Z4 J# ~1 D* k& k) z
8266# L. H. v7 V( k0 \& Q7 `
; \0 k# [! g* a
% [( N" N8 l5 x# n! u
/ l' w" }. S) D: z4 ^8 @2 X& m; Z, J# F
" o+ B2 _; h0 @4 k接下来就是刷机了,版子上面都预留测试点。
0 U1 G# ~3 s, {/ f3 D$ l; _3 K接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。
' f# x6 k1 ^: L, X
4 e, o5 {# {6 f; O
注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。1 {# V0 c: e5 `4 k
要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 |
: l" V0 Q/ H$ Y. D
$ q0 f) y, c' u" S" W' W$ Z! c! p/ {# G1 E, |3 E) T
3 L3 E8 `% b: q, T1 ^1 I
* O2 m5 ]8 k* v
6 n3 _! r) E" J2 p+ Q8 f7 c 5号脚位是继电器输出
' c6 p8 o! _$ `0 |# R, }9 L5 p$ F- q 12号脚位是灯输出
3 Y$ C% s9 h2 l" g# M! i8 H 4号脚位是按键
6 l7 ?. }5 c8 O' J3 s8 O
v0 h f& h3 Y& g' [* |0 _3 e
/ V% a5 [7 o6 j
" M7 h) c/ n: T' f2 k
+ R- V0 H+ w! T, @卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库
+ H6 J5 |2 T9 A3 c7 e+ k - #define BLINKER_MIOT_LIGHT // 设置小爱灯类库
' [7 a3 ]; ?4 M0 ^: @3 ?- r6 V - #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库" Q+ s" P3 m4 h+ c# z1 o1 `- `
- #define BLINKER_PRINT Serial //串口协议库
U4 f- {8 k q - #include <Blinker.h> //官方库6 z9 t8 g+ H2 k+ D- p" U3 D, L. ~
- #include <ESP8266WiFi.h> //官方库% R7 g0 b$ S( |8 A
- WiFiServer server(80); // 服务器端口号. h0 N5 J% l2 }1 f
- : l' z) u- S) K! l2 o4 e3 X7 V. l
- char auth[] = "c4942fb1d5e4"; //设备key6 c" b5 n) S" d1 R" n7 q$ e, `
- char ssid[] = "wanboshi"; //路由器wifi ssid. o. W( @6 A, B0 U: h/ [0 G% C! z
- char pswd[] = "1365662999813586348220"; //路由器wifi 密码# y' V3 u( I5 Q% O
- - i2 W7 [4 E7 z4 b+ K
- bool oState = false;- f! N8 P6 Y% i1 n' h: ^* z {# I
- $ h8 O% c+ ~& l% [ P3 Y/ |- v
- int kg=5;//继电器输出
1 j# a( @; J2 D. A: ~: [) \" j - int de=12;//灯输出
9 b- I! e) D3 {) C% ]6 X: G - int key=4 ;//按键5 x" k/ a$ s* Q5 R. M
- //*******新建组件对象1 j2 w0 G4 o: {+ r7 `
- * i9 R% g. e- b) W
- BlinkerButton Button1("btn-abc"); //设置app按键的键名
* E5 X b8 v, V; s: | - //*******app上按下按键即会执行该函数app里按键6 P. n0 g& x. ~7 U! v4 v @: o2 \
- void button1_callback(const String & state)
0 }- X4 S. a' |5 T+ U: k - {# V6 b2 [2 y, _: C4 W
- if (digitalRead(kg)==LOW). Y4 O- f/ U$ f4 m4 q7 k
- {
- a% \! b6 T1 \4 X$ k7 @6 M - BLINKER_LOG("get button state: ", state);. h, G0 n9 k. k" k5 }
- digitalWrite(kg, HIGH);0 a& ]) Q: R% E. h
- digitalWrite(de, LOW);6 t% ~- Z8 {2 R+ t4 J
- Button1.print("on");
: U; E% Q7 r5 l! ]& W0 v - Button1.color("#0000FF"); //设置app按键是浅蓝色+ k( g9 Q7 j6 S L0 e$ q/ {1 @3 o
- Button1.text("开启中");- e3 F: k1 s' }+ P% ]
- }, x& o6 \- C4 K r4 S4 Q1 I
- else if (digitalRead(kg)==HIGH)
/ b/ C# B. }# R5 G; L! o - {
; ?# K' E. i4 z f9 E. |- H0 Z& | - BLINKER_LOG("get button state: ", state);
5 }: H! {/ P' J4 { H! q - digitalWrite(kg, LOW);
]8 R) \; V6 S! o - digitalWrite(de, HIGH);
6 {5 s1 o8 A6 }( R0 H! k - Button1.print("off");: D K) r" ~0 _7 J& L6 H* u
- Button1.color("#00FFFF"); //设置app按键是深蓝色
- u+ Q0 E2 c3 c. @( V* j. W - Button1.text("关闭中"); D, C, n. u4 N- @( f
- }
9 w. C3 a0 s+ M - }+ k$ l% X$ L" [7 _: s E) r* ], N
0 x2 s @: l( I- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
0 t1 f1 _+ k# q1 p, o
, e" Y, p4 C* l7 p* p( r- //*******如果小爱有对设备进行操作就执行下面3 w( O. A5 B4 R9 }* P8 s
- void miotPowerState(const String & state)
$ O+ B7 h0 F1 h2 q: M - {
* a' b) M# i+ @4 n. I - BLINKER_LOG("小爱语音操作!"); //串口打印% ]( D0 o* |# R$ O# { [' |* `
- if (state == BLINKER_CMD_ON){0 B" G8 e1 L, \8 Q
- 0 }% l, n9 }! }1 j" p/ i' g
- digitalWrite(kg, HIGH);
4 k$ u( m% I0 P* @ - digitalWrite(de, LOW);& N' J) r/ x) u' J
- Button1.print("on");4 W3 K8 i) ~: L$ F" t/ F
- Button1.color("#0000FF"); //设置app按键是浅蓝色
) a3 u. t2 ]3 p' \# a" k - Button1.text("开启中");8 j' p( g( j! R3 k
- BlinkerMIOT.powerState("on");; W1 E$ L2 Z& N, C
- BlinkerMIOT.print();
- ~! m1 J. V7 F" W - }; c$ U$ G; ]" `: |9 g
- else if (state == BLINKER_CMD_OFF)# i, _8 Q$ {7 N+ W9 z) E' W ?
- {; q' E+ t5 X# r: y, r W! p
- ' A4 h3 U1 n% @, M" F4 F) t7 x. n0 t
- digitalWrite(kg, LOW);
n$ u+ [+ e2 S; |0 B* S - digitalWrite(de, HIGH);
6 o& s) d7 i ?7 E6 { - Button1.print("off");& P+ F) g# N1 M
- Button1.color("#00FFFF"); //设置app按键是深蓝色
4 t0 a6 d+ c, R+ G6 h - Button1.text("关闭中");; q9 H' q5 W& f5 y' Q
- BlinkerMIOT.powerState("off");: J+ f( [: i7 a) T0 d
- BlinkerMIOT.print();
5 J8 v5 ~. g7 ^2 ?$ M - }; i3 y: B5 e' i
-
# L8 d8 b- d( f6 ? - # [8 x2 }2 p( t: p, [8 e( r
- }4 S( d# ?4 i; t( d
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 `0 Z3 c" x# |, B - //*******如果天猫精灵有对设备进行操作就执行下面
- G5 R+ ~) y n: I! K/ T y - void aligeniePowerState(const String & state)
! O2 c2 r( [/ A* [! @% x& l( }2 m* _ - {
- m+ \* ~: d: p5 `6 z- d" a K& Z - BLINKER_LOG("need set power state: ", state);) W" [: p% d/ C- p: I
- if (state == BLINKER_CMD_ON)5 U- z8 w2 ~ b0 A5 D3 h
- {2 O$ V* k' q: L! X
- ) ~' Z% \' s8 M1 ]- f/ @( F
- digitalWrite(kg, HIGH);
" u4 b k; P6 b6 w - digitalWrite(de, LOW);* w3 u0 L% a$ j
- Button1.print("on");
/ N! z# l. k3 ~7 T( t - Button1.color("#0000FF"); //设置app按键是浅蓝色8 H# A9 C1 J7 b G! |0 {
- Button1.text("开启中");8 \# F. h e$ d5 n" W0 [3 A7 [
- BlinkerAliGenie.powerState("on");
! O; G! h* E1 F l# l2 @ - BlinkerAliGenie.print();2 o. t7 j1 O, H$ P3 |) L; N
- }
; L8 B4 |7 ?- | - else if (state == BLINKER_CMD_OFF)9 n, Z8 E" I5 ]
- {
! R: Q, S% E! c2 \ -
! {3 _. B% h6 e. h8 J* E2 } - digitalWrite(kg, LOW);4 R" m- C5 b$ ~+ F$ P. ]9 F" I
- digitalWrite(de, HIGH);
% t8 w' J7 a$ X. S) [5 _# Z - Button1.print("off");# K- F$ L1 ]/ B [, ^
- Button1.color("#00FFFF"); //设置app按键是深蓝色6 X9 s- g& J. q v! T8 @) q
- Button1.text("关闭中");: n1 r) G6 T6 _% H! Z
- BlinkerAliGenie.powerState("off");
( \9 b5 C4 @$ W5 U/ j2 ]3 C - BlinkerAliGenie.print();
* l7 ^3 h8 v1 r8 y) h; m4 u% v# ?9 d - }
. m1 t8 e( a5 ]/ M! q- t7 E! D; A( p - 5 f3 C; }( K; r: h' R
# }6 d# B, k! [0 G2 y- l p- }8 M9 b3 `7 m$ p6 [
- //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次! h' ]6 B; S1 f
- void heartbeat()
1 D" q) S! j" T; i7 k - {' S% Y+ j3 I! q& }' g8 ]
- BLINKER_LOG("状态同步!");
# y, N. u) A7 o( b - if (digitalRead(kg)==HIGH) 2 k; E- t( p9 O4 O9 [: a* A
- { / L" ]' W- L5 j
- Button1.print("on");& P0 L* @! Y: I: Y- R" p! J
- Button1.color("#0000FF"); //设置app按键是浅蓝色& n2 E% z0 I' l6 Y9 e
- Button1.text("开启中");% P* T4 N9 k( ?) m. y/ D7 }- [/ U
- }* y' {' p% u# C5 F! A' v& g
- else ! ^, M m/ o- m5 c# i
- {
5 v6 `; `: i; K& C - Button1.print("off");- P) I) _8 Z& p1 q2 y$ Y9 J3 X A
- Button1.color("#00FFFF"); //设置app按键是深蓝色
( R6 p4 g l/ ? - Button1.text("关闭中");+ c3 w( m* F' L) n
- 1 x/ I" w- h0 N8 W0 C" B
- }
& L$ y( j) u6 {8 u+ v - }
' G) v& Q b$ r; O" a - //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++9 _# m( ~( B4 U- ~' _; j C
- void setup()% P0 e y1 k1 E6 E" t' r$ v4 w- m
- {
6 J! w. b+ \ T5 m4 c - // 初始化串口2 h7 Z5 v s8 L) M! p' k
- Serial.begin(115200);# r6 C+ l" y N5 L* x2 D+ @; F
- delay(10);1 ?& Y6 N6 s* u# Z0 c
- BLINKER_DEBUG.stream(Serial);, P/ b: E9 E+ r% ~5 t" s
- // 初始化有LED的IO8 n) `" m7 w6 H; u! _! ]
- pinMode(kg, OUTPUT); 4 B+ f2 W! E c2 u0 w- x! X! ^0 B
- digitalWrite(kg, LOW);//初始化继电器上电状态
4 W) Y: c- {+ d6 u! Q - pinMode(de, OUTPUT);
& f4 B$ g; B7 [# v4 g4 w# i4 U2 S - digitalWrite(de, HIGH);
g% H: \- _, s3 N- z - pinMode(key, INPUT);
6 V( ~) ~, W9 m) d# e - Serial.println();
9 x% v! ?, W4 a/ s4 Z I - Serial.print("Connecting to ");
$ {) b. l& y0 Z7 t2 Z3 G - Serial.println(ssid);
: ^ X! l' z" O - WiFi.begin(ssid, pswd);# }0 `, C2 W" ~% V3 q
- while (WiFi.status() != WL_CONNECTED) {: X. _* e, P# t% \
- delay(500);
@( k" c& P ~" W! r8 i0 I - Serial.print(".");4 ?8 [2 F/ s6 v/ W* b: ~' ?
- }
, I5 b. _/ E) e1 ]- E$ n8 }3 j - Serial.println("");
3 |' x% x2 D0 I" S2 L8 m7 U - Serial.println("WiFi connected");8 A5 b7 z1 T2 H* s/ D
- server.begin();4 r" S1 n7 {, J+ Z& }
- Serial.println("Server started @ ");
2 f5 P2 R7 n: C& S2 ?; g1 t - Serial.println(WiFi.localIP());; B. q8 p5 L! ~ q; U$ A* H* ]' W
- //打印出IP地址,后期可以制作显示器来外部硬件显示ip' n& |/ c: g+ ^' I' [
- Serial.println("To control GPIO, open your web browser.");! X7 e& l: L& p: w2 _
- Serial.println("To set GPIO 0 high, type:");
5 v# L+ V8 l! x7 D" R3 i - Serial.print(WiFi.localIP());. S8 F ]" N7 o
- Serial.println("/gpio/1");7 b* [, G$ G! R% J) j
- Serial.println("To set GPIO 0 low, type:");
& Q$ F1 v( h, O, s/ g" @8 o+ B - Serial.print(WiFi.localIP());3 ^4 A3 B+ e! W" i6 G% ]
- Serial.println("/gpio/0");; y0 u) P2 d/ {) C7 u Z
- Serial.println("To toggle GPIO 0, type:");9 j* d6 b, n) c# T% f' r8 @: W
- Serial.print(WiFi.localIP());# z: ?* Z/ L. d: X) \
- Serial.println("/gpio/4");
, }% r+ U3 d$ G - % |8 E9 L# v3 v* m: O H
- // 初始化blinker: b7 A! h! d2 |* x2 d
- Blinker.begin(auth, ssid, pswd);/ u0 h3 _5 s+ u1 ~- N
- BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数
$ V5 f. R5 z5 ~% ^ - BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数0 ]+ f% x" L( g
- Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。; |4 L9 b' L8 f. M5 Z+ \$ L p
5 V3 w$ A: D T Q$ r% b" d- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback
3 @2 _2 o' B$ g8 y/ q - }
+ P) h8 M# Q9 Q0 r1 `! W - void dataRead(const String & data)* q# E( ?8 Y7 v7 g E$ s- y6 T
- {( b2 z1 p! L6 A% {
- BLINKER_LOG("Blinker readString: ", data);
$ }* n1 S# J. M5 I2 S4 x - ) Z% Q) Y) I, [+ Z2 {$ {
- Blinker.vibrate();: k/ A# e: v/ N
- , J4 Z U8 m2 v1 u+ j7 G/ b& b3 s" i' \
- uint32_t BlinkerTime = millis();3 U @2 D- G% b0 N# e, C
-
1 l% D$ Z2 x' g$ L - Blinker.print("millis", BlinkerTime);7 ~1 P7 V8 Y2 O4 K
- }
8 n9 I9 u4 k/ X) |- y) M4 B) ^! T - void loop(); K# X- q* F) \" F2 W5 V$ r% S" b
- { F: ^6 Y( N& I4 t: m+ f- C
- Blinker.run();+ w. s, b9 m& T# z; Y
- if (digitalRead(key)==LOW)
+ W1 g% i- H! ^' _% \ - {0 X8 x1 v0 o+ J7 y' a9 S
- Blinker.delay(200);
8 |7 E. n+ l( R+ C - if (digitalRead(key)==LOW)& m# d+ C* k; K8 \
- {9 M: b- D+ a* g: U* y; e
- if (digitalRead(kg)==LOW)
9 m8 t3 V* K7 r% N4 t - {
- N/ I# s) I% T. A8 l - & _0 w" _; `$ d- R
- digitalWrite(kg, HIGH);
' G: \( N% [2 y* O2 Y - digitalWrite(de, LOW);
) _; X- K6 @- j4 N6 W - Button1.print("on");$ t+ a8 N6 E# k, z" [- K
- Button1.color("#0000FF"); //设置app按键是浅蓝色
" C* K* f5 N# ]6 [+ E - Button1.text("开启中");8 M# ^ { |9 Y% H( V
- }4 c; _# X4 m* _0 s! T: R/ f8 p
- else if (digitalRead(kg)==HIGH)# F5 S0 H8 A: |& U& f: T
- {
9 t7 c! z) O' [. [) D z6 g, F - digitalWrite(kg, LOW);: _' T# \9 _. t& i# w. d4 O
- digitalWrite(de, HIGH);5 X! A1 p- H5 }7 |+ B
- Button1.print("off");
. H5 @+ i U K, Q! q - Button1.color("#00FFFF"); //设置app按键是深蓝色1 \& J" J( C& c! i5 n/ `
- Button1.text("关闭中");
8 E6 j' F8 T. t b# | - }1 p6 s7 Y2 S- O1 F8 v
- }
1 Z9 `1 K+ ^9 N - }
# V) s# ~4 _% w! p% C+ ?, { - }
复制代码 3 v- f/ J3 N6 T
% F+ [6 w0 O* d" S! X我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html
g" n* Q6 D7 P2 I8 s( h' f$ e* H
9 ~: E& v: S7 p3 x8 o把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。 s, r o) K% b9 g6 P
5 a8 y7 F( m9 ]: g( X
: S+ [- C! V5 N% B1 U |
|