|
|
本帖最后由 易记 于 2021-8-21 14:05 编辑
' _6 e& N/ O: Z
0 b' [+ `: }3 S$ y最近玩ESP8266,想做个天猫控制开关。- f0 ^& ]- H. v2 `9 p% W
但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。
* }7 ~1 Z* t$ k还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。9 x9 G6 B) q5 o1 E/ y8 i
0 ~4 c( E8 }" q; R$ Q! N) K
* t2 R* r' [6 }* Z- x
6 {% \. R: X4 E2 k" }问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。
w) L! R, j3 @* D6 j& |0 Z6 K$ E! n9 O
8 a$ X# o) V# f% _
! T. @* C1 r& `( l; E% @
: @$ M$ t7 y, z4 Y& @" J# n$ O% X9 A j2 y# r
到手,当然是拆拆拆。6 j4 B7 y6 b4 \6 L
8 r0 J% F- m4 k2 J4 l
! E4 C3 r& |: o# ]+ Q9 L# `/ x! {9 p) B' _& `8 l8 P
联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。
+ v6 |' A5 a" j; B+ O
9 W! Z9 z# w' @; m! x
" G. Y* l4 B2 \
F- g. X9 c O! ?4 v( ]继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。* r# r( |7 o6 g' o
" r D% e$ x% o- [$ Q6 S) V
) m( Z) _& N9 J
e; \5 f* l6 O( K# l+ N
6 v5 ?" P/ b4 P5 e电源芯片
! h+ ?* `$ X) w, ~, W0 U: s$ r1 p, I! B M: w! X4 l/ e; A
. x+ s/ P1 F3 t0 v& R, r" d
7 d: X- o, a7 U$ @# R
有一个按钮,按钮有二个蓝色LED灯* X9 _1 _: }5 H- D2 L& ]4 g9 f
8 y: \4 |7 w( K) G5 _7 I; H3 I3 J' S5 e+ z5 I) p8 H
- S1 r9 o- W, C
8266+ r' _5 e- c) E7 y$ t/ p
- W& D( x5 G+ r2 ]1 |% z( K/ q) n6 Y% d/ n5 d: w2 W* O
) q, R2 l- B$ S" ~* A9 E+ ]; M
- x8 G5 p2 a1 C U9 z
) K: G. c7 {7 R! x" R0 W- D接下来就是刷机了,版子上面都预留测试点。
- R' Y7 H# B; C; Q4 ^接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。0 o; G8 D+ U: S+ {9 N
( l: f2 s: B8 a; v& P2 x. c
注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。6 J) h" s6 d6 n7 a+ x
要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 |
) J7 j4 [/ n& [, D! n \8 X" q0 Y* d) V2 M9 f2 I& V9 y3 j
4 ^! Q8 B" F" M7 D M) v, @4 T, B* K1 W; ^
) [3 T( w1 [( }3 ]
, u! h; v! Z8 L4 o; W7 y 5号脚位是继电器输出
; n* @0 O7 ^% Y 12号脚位是灯输出
8 \# X/ i1 r: Y& b; C, {: w1 L 4号脚位是按键
# d8 s L, K; h) a" S% p; y
' a& V( _4 b7 `$ C+ {8 V" V6 M* I7 s( Z5 j
/ p3 }( |8 L7 O! M' B
! C/ ~; p0 U$ P7 b卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库
: x2 J- W) `! f! w - #define BLINKER_MIOT_LIGHT // 设置小爱灯类库
9 o8 {; R% Z" t) ] f - #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库3 h$ t6 x2 D4 W# ~$ h" K
- #define BLINKER_PRINT Serial //串口协议库
' I* ^7 [2 J+ _' H; x - #include <Blinker.h> //官方库% A9 Y& m" j4 A
- #include <ESP8266WiFi.h> //官方库
/ R5 s' }1 P# l) P - WiFiServer server(80); // 服务器端口号
& T3 C# c! Z9 X) F% W( l) a% E$ z. G - - R3 v6 a) {2 i; [6 N
- char auth[] = "c4942fb1d5e4"; //设备key/ h! x2 n/ X3 A! V7 O [) ]
- char ssid[] = "wanboshi"; //路由器wifi ssid
9 o9 w: L9 |: u) |$ s; u - char pswd[] = "1365662999813586348220"; //路由器wifi 密码
, Z9 Y2 V& w9 U3 b. u; ~5 H
0 S) l, j J8 x7 Z; g9 J' {- bool oState = false;9 g! R+ J; n; a+ m! j
- , [7 S9 B! b- @! w0 Q/ x
- int kg=5;//继电器输出
9 f& l) e% E) i# j1 T - int de=12;//灯输出
: @: K* N0 @9 [ - int key=4 ;//按键+ }3 D# ?, |' B" C! n2 M w# T
- //*******新建组件对象& E/ S( W P, Y* F2 j) O9 C8 C( U
O+ R6 p* `. t) r. C" z2 B- BlinkerButton Button1("btn-abc"); //设置app按键的键名
. O& I* g- P: x$ ]0 x - //*******app上按下按键即会执行该函数app里按键* x. R+ Z d: A7 ?
- void button1_callback(const String & state)
3 v+ `: S0 y5 a D5 e8 N - {
# U& A) X" C9 {, ` - if (digitalRead(kg)==LOW)- \; w2 t5 }! t) q
- {! M5 {3 _* }) @# Q+ S
- BLINKER_LOG("get button state: ", state);/ O; f: j. W9 c) f: k
- digitalWrite(kg, HIGH);
; i; n; J. ^" u - digitalWrite(de, LOW);' j- d. P( \! m4 X m. d5 P' M
- Button1.print("on");
3 U! G4 a/ F( S6 Z( Q% ] - Button1.color("#0000FF"); //设置app按键是浅蓝色+ Z# d& {1 C/ B; M8 n1 w. [. w |
- Button1.text("开启中");
1 d0 x5 M0 H) B! B9 @& ]7 e - }
( A G( x- g+ w - else if (digitalRead(kg)==HIGH). D8 H/ Y8 h% l r2 h
- {8 X' `5 \6 E( B$ A9 w. t4 o
- BLINKER_LOG("get button state: ", state);9 Y! [8 g8 m0 i) Y5 z1 F7 @
- digitalWrite(kg, LOW);
/ T& u W# j" L( w, H - digitalWrite(de, HIGH);: Q! z1 Y' G( v" h/ H: C( J
- Button1.print("off"); Q; F0 ^1 k! K/ [; ]
- Button1.color("#00FFFF"); //设置app按键是深蓝色
4 Q- ^# ], W9 }2 t, m6 Z6 A G- r' Q( a - Button1.text("关闭中");1 r( U! b7 {# w# F# m. K+ T5 y
- }; n" p/ e& f! w: n( ~
- }0 K6 o9 N; A3 H8 c: P
$ @) K( E: ]* n( p) \' O- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
: C; U: }8 O3 `! U5 H* l - 6 T4 c {6 d4 F. c0 p1 j% E
- //*******如果小爱有对设备进行操作就执行下面; B+ K. J; n8 h* u
- void miotPowerState(const String & state)
9 ^ {' C8 W* W' T. M - {
2 @& d7 {- x" T: H - BLINKER_LOG("小爱语音操作!"); //串口打印
% D0 K/ ?( h8 Y' \3 e2 A2 ~( v9 } - if (state == BLINKER_CMD_ON){
1 v0 i: @( v$ A# Q+ w: c - ( Y2 B8 i, L7 F8 n, n
- digitalWrite(kg, HIGH);
$ _, E! e$ E5 t - digitalWrite(de, LOW);
4 ?. b+ \( _, S - Button1.print("on");
4 O0 U1 m3 o s- ]& V4 m! x+ ` - Button1.color("#0000FF"); //设置app按键是浅蓝色
" f& Z; u1 q( Z' @4 K% s$ [ - Button1.text("开启中");
5 z* E, L8 z2 _) t: q% N - BlinkerMIOT.powerState("on");: J+ M- P7 a+ {* J! I3 F# S
- BlinkerMIOT.print();7 e, E. \- ^ Q
- }
3 `& Q5 a# i% b& \5 B - else if (state == BLINKER_CMD_OFF)
8 Q' m/ k5 R! Q/ q5 ]* q/ M - {8 [& g$ X+ B/ K3 o2 l
- 1 C& u0 a: a' D) i
- digitalWrite(kg, LOW);2 { B. B, Z' z7 S0 h3 @
- digitalWrite(de, HIGH);6 ?8 g: y! Q* E) y" q$ `% u4 k
- Button1.print("off");
+ B1 L: J% J9 R9 G G+ a - Button1.color("#00FFFF"); //设置app按键是深蓝色
( m; n0 v8 i3 V9 r4 \5 u - Button1.text("关闭中");$ i. r9 N% ~7 o7 ^- d
- BlinkerMIOT.powerState("off");
5 U) |, A8 `; ~7 O& z5 a+ l - BlinkerMIOT.print();4 B9 G: T# o4 A$ Q
- }
3 j _5 Q# U; R9 B' N( {. b - 5 \1 N+ Z) V3 v; x) u. Z
-
6 ^9 I' l3 R& t - }
- ?2 |3 \4 x. a/ w, E - //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++1 {7 @5 j' t$ b$ z5 p
- //*******如果天猫精灵有对设备进行操作就执行下面
4 |: e# x% _; w$ `9 L6 c' s - void aligeniePowerState(const String & state)
" Q6 r3 x5 d; I/ b/ S - {4 s* }( \' J- W1 Y- L4 T* I6 y
- BLINKER_LOG("need set power state: ", state); p }$ j; N7 l" k
- if (state == BLINKER_CMD_ON)8 W& f6 S% f6 x
- {
$ V/ }3 D) ]! y. F, O* ` E - 3 I4 \) r0 ~5 u1 N$ C- v) ] ^6 t
- digitalWrite(kg, HIGH);. C! L8 X; }6 R8 T, Z! R
- digitalWrite(de, LOW);
9 H. @. o! h9 a U - Button1.print("on");# P4 ]4 Z1 B6 W! w1 o2 V0 Y6 q6 h
- Button1.color("#0000FF"); //设置app按键是浅蓝色; t7 `6 f" ]# K, d
- Button1.text("开启中");
6 B) _. A4 D Y& m0 q - BlinkerAliGenie.powerState("on");! A; `# `; S( s& F" i8 p1 m
- BlinkerAliGenie.print();0 w* D1 o6 m l
- }" s9 b8 E, i3 V- ]& g
- else if (state == BLINKER_CMD_OFF)1 C k/ a9 n$ e8 p3 s
- {
( Z7 I1 N8 }' T3 O; j/ j -
; M1 z8 P7 @. _$ T: t" l - digitalWrite(kg, LOW);4 M/ J1 a' [" J+ e3 T! Q( u( |8 V
- digitalWrite(de, HIGH);- |2 D- R) S4 E1 q
- Button1.print("off");
' v p1 ^! _/ j# f) g) L" G - Button1.color("#00FFFF"); //设置app按键是深蓝色5 Q H+ D+ T3 d& {
- Button1.text("关闭中");
5 J; a8 V' k. T - BlinkerAliGenie.powerState("off");$ v7 k6 R; r- ?
- BlinkerAliGenie.print();# y# }' X( ~, f y6 a
- }2 j$ E0 s, S( a3 v3 Q
- ; I# c' T( ~) \/ j3 A( B+ ^
- # D; N3 @+ |& K" l1 i7 F; b) z3 [
- }, ~( f; U* b: b0 J2 E u1 C* Q
- //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次1 e; F- \4 L2 |
- void heartbeat()
4 B/ p, x! q+ N1 T) P - {
+ q" g |- ]1 E, v# O3 @' t; j; R: z - BLINKER_LOG("状态同步!"); 0 N8 ^" Q( C$ q3 O3 X) J( u5 r1 N6 l
- if (digitalRead(kg)==HIGH)
! O' V* Z- h: ^0 U+ E% j, Y - { . g: o( r0 j. Z, q! z: n# y7 h0 `
- Button1.print("on");
" ~& W- V- O A9 [3 o - Button1.color("#0000FF"); //设置app按键是浅蓝色/ n5 h0 E" e- I% A0 ^3 n# a4 O
- Button1.text("开启中");: J* W% _( c* V1 n" V
- }/ S4 O3 ~1 B8 e8 B. N1 C4 i
- else
% X; p% W& W2 _7 \- B0 x - {
* c: T5 Y7 d! Q! V - Button1.print("off");
! @% Q1 ?) z6 z3 I" k' T0 S8 U8 _ - Button1.color("#00FFFF"); //设置app按键是深蓝色: ^" \, E E! V! e- J
- Button1.text("关闭中");, s+ |; A, y i. G
- . ]/ y9 i. [+ P
- }
4 Q: N _$ J& v5 {+ K3 J - }
3 {" f$ R3 {4 O - //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; G! x* X: \8 e6 A( v" A, i6 s - void setup()
7 N2 A* y4 q! a( D+ Y# }& b v - {
* e1 g/ g5 e* L( ?+ ]( n - // 初始化串口
0 n7 }) n/ a! `0 _( g$ \+ e - Serial.begin(115200);
& h4 Y4 W9 h( {, h. ]; X - delay(10);
& W. M" i' z" g; D& i3 F c - BLINKER_DEBUG.stream(Serial);+ V. n0 ~3 m1 Y5 _' c
- // 初始化有LED的IO
0 B! F$ c- K! j4 o - pinMode(kg, OUTPUT); % O" w% ? a+ R- L. I
- digitalWrite(kg, LOW);//初始化继电器上电状态
6 [* ^! W$ H8 g8 K$ c. R - pinMode(de, OUTPUT);( p9 I, V7 j& e, I' h3 o- h0 ^
- digitalWrite(de, HIGH);
4 u" |8 G2 f! g! ^4 l; |1 c - pinMode(key, INPUT);
; P' G% u* b( R0 P) L - Serial.println();
7 }2 W" T/ O% P$ N. h6 m1 _. {, A - Serial.print("Connecting to ");
# l# P* {$ }1 p4 H" c S - Serial.println(ssid);- Y$ }! c+ X9 |* V. k# F
- WiFi.begin(ssid, pswd);6 Y8 G( b7 Y! i7 G& Z! [/ o
- while (WiFi.status() != WL_CONNECTED) {: P. }7 [& |, {
- delay(500);4 \% S" N% z8 e9 y, m+ e8 C. s- [. c
- Serial.print(".");
h* [# {3 ?5 ]2 U, [" Y& I. C - }# c; \( S# ]1 {% n( y: _7 i3 P
- Serial.println("");
' ?( F- p# t# g' p - Serial.println("WiFi connected");# d. V, f3 S' @! U% S
- server.begin();
C& t* ]0 |+ f# v. S6 S: N - Serial.println("Server started @ ");+ d3 B \ P$ b' j4 u+ T: T
- Serial.println(WiFi.localIP());; u/ ^) E5 p! W; v$ u% H8 C. f
- //打印出IP地址,后期可以制作显示器来外部硬件显示ip P9 q& x7 d3 E( D; k* y: S* U6 b
- Serial.println("To control GPIO, open your web browser.");
/ Y) s2 p, ?- H) z$ q1 ~ - Serial.println("To set GPIO 0 high, type:");$ O% {& @" A9 _
- Serial.print(WiFi.localIP());9 K, L! b2 n, E5 u' r
- Serial.println("/gpio/1");
2 o$ X4 `# k: c* l P# C& M - Serial.println("To set GPIO 0 low, type:");, w8 J) z9 Q! R" W/ d- l
- Serial.print(WiFi.localIP());6 G' L% E7 Y! f; X
- Serial.println("/gpio/0");" i( b% h6 [8 m3 ^+ q+ Z. c. l, W# Y
- Serial.println("To toggle GPIO 0, type:");
/ {4 T. @; N0 P& C - Serial.print(WiFi.localIP());6 O4 j9 C: g0 `! K! j
- Serial.println("/gpio/4");" l2 h _' f! b. D
! E! I- @( o* I( N( o4 e0 q- // 初始化blinker
( S) Z* }% T( F( G - Blinker.begin(auth, ssid, pswd);2 D4 ?7 t' E" Y
- BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数
, C9 m$ C) }! [7 @) {( E - BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数
* I* R: i8 j6 D8 p ^6 v/ \ - Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。& B; H0 J9 e/ C% N1 [! D
- - d2 M& d& Y; x6 d
- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback* j7 Q* C& B1 b3 |' l
- }
0 e7 T# c, ^' m9 U2 x5 T - void dataRead(const String & data)
5 y; v/ L! v; V* P - {& R" }: x. {2 q2 ^; D, h+ D
- BLINKER_LOG("Blinker readString: ", data);
3 ?! V- W+ C N* f6 I - * m( k/ {0 l; U3 a
- Blinker.vibrate();
, w% J) A% H) e8 h$ m( j+ l -
* ^" }* R- A% _6 [. W- g - uint32_t BlinkerTime = millis();
2 o: r7 P2 x5 A2 ~4 ^$ ? -
4 R8 B9 B& j" |5 [. r9 [ - Blinker.print("millis", BlinkerTime);3 @; Y7 k, A. c
- }$ T: ^8 s: f4 f& z v' Q& Y
- void loop()
' z/ g; b) u+ L% t$ i" e+ `9 @! w - {
% B" z9 d% Y# m$ T - Blinker.run();
- K# L5 c. k5 g - if (digitalRead(key)==LOW)- a6 N$ ~- z8 u( _2 F7 C* h: q
- {
. z1 X; D* S9 S/ R- x - Blinker.delay(200);
`: _( ]' ]( e* \0 u - if (digitalRead(key)==LOW)
$ ?, N. z' B( ~& }2 N# y - {
: Y B" D, s7 g+ [2 D! r5 r - if (digitalRead(kg)==LOW)
6 u9 c7 F1 [2 I/ C9 D/ S$ t- K - {0 F- C& D+ S: O% A0 V+ Q. l
- + \( p+ }5 m6 {9 b
- digitalWrite(kg, HIGH);" v, {9 T; P& ^8 j4 F6 o
- digitalWrite(de, LOW);
, b1 Q C; ~4 W! ^3 x3 t5 m) A - Button1.print("on");0 w0 g' N. P2 M/ z* h: n5 u6 v+ A- s
- Button1.color("#0000FF"); //设置app按键是浅蓝色
( ^6 u& A" ]9 `. B1 z - Button1.text("开启中");$ Z L: L7 J0 g7 P
- }2 G7 k/ e7 `6 Y) ^, j
- else if (digitalRead(kg)==HIGH)
) ~! W }9 C( ~+ y0 F9 B3 W4 z - {
. N3 n' u/ `3 ? - digitalWrite(kg, LOW);
( l ?3 U6 _5 N4 q/ r0 l - digitalWrite(de, HIGH);$ C$ ]/ D5 @& H# \* E' u
- Button1.print("off");3 S9 o: z3 L( ^& f0 I
- Button1.color("#00FFFF"); //设置app按键是深蓝色$ K! F/ G- o, F/ G4 B d: z+ T
- Button1.text("关闭中");# X$ N$ U5 @8 m' q1 e
- }% i9 B" k$ j; u) {7 Z
- }7 D9 X4 I& v& u( N% |% J. {
- }
9 H- B* ]' C* H" m - }
复制代码 9 Y# I; P. h2 Q0 @4 A
* u, o. e# E9 W' o0 R5 Z% x
我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html5 @. x+ V% r( T5 [; I* }8 e% \
G8 \1 ~% F4 T把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。
9 j$ q9 e* y2 N) Y+ `' V- N3 h% Z+ ]5 `; [4 w
5 [2 S3 W l) ~0 |* P) x/ A |
|