|
|
本帖最后由 易记 于 2021-8-21 14:05 编辑 % A+ D6 y6 k# @9 v& S( Q
* U0 J! |; x7 O$ v- m最近玩ESP8266,想做个天猫控制开关。& U2 V+ h9 E7 Q
但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。- D% m R* A# J7 U
还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。
6 j. ~9 d( Q2 H8 n2 z! ^: B' }: _
- u& y \, `7 q" ^3 d& d) @9 \9 H; D$ v6 p$ F' s9 j6 q/ W) n
$ r- I/ T2 ?9 N! n
问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。 Q5 Y" I9 z3 M9 ^7 [
# A$ h+ u9 l5 r) Z* X0 J2 W* ^" A
0 r+ w5 e+ @ m& ` p
5 t; h; j) ^2 h1 ~
. N& n# E8 ~" d. d$ A. Q. A
& b: z* x; }# v# A2 L8 K到手,当然是拆拆拆。
7 D- O" K- M2 H
- U: d7 V# {5 w; a4 o( O( i1 B
- S1 Q+ L$ x0 \$ q
( |# Y6 p/ T$ ]3 F/ ~4 d联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。
0 x# r2 h# J9 S% ?) K" T
! k L, X( Q/ p) `
7 X* o$ Z; E8 m3 p9 V) c1 F2 M$ p/ W: R0 `7 l
继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。
- D0 O& |+ a0 F; j3 q+ z
/ X9 X* V9 W; y/ J( M9 h3 d6 O# r8 Q: H' v$ b' \) E& k" n6 O: h
# t% p4 L* V# _: r
: N: s4 W0 Y6 ?* m/ _/ j# y: L6 I电源芯片) E; s# f0 G$ s+ M! f5 }1 u2 H5 @
0 H; s+ D8 E' t. R$ s! |( T' e. y2 x
( ?$ T2 p! _# s! K# m' M8 e- `
有一个按钮,按钮有二个蓝色LED灯
. h2 t% |' A& O# f/ B% l5 q
/ g. t5 C. f9 Y
]; k& e1 r: F4 _% V0 o/ L$ v# o$ l
8266
9 C8 g C7 w9 W% O. h5 {0 Z% u
; e/ k2 j0 o4 m1 S6 G- ~, z
2 |- |- @; p+ T: I% Z* D/ P' d
" c0 T9 [% K s- V/ A/ y
+ F: d: J2 C# W- f! g+ o& e8 h/ u3 r4 ]$ G( p$ C
接下来就是刷机了,版子上面都预留测试点。
& p) O( ?- J: g9 H- z+ N% O8 c接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。
* y6 ~6 a+ ~& d8 v+ N
) X+ w4 X9 r7 |* h# c注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。
+ J) Z, E: B1 g/ `8 Q6 m要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 |
7 W$ h! h. [) E- ~! n& E
' ^- N, i2 d# h* _, g4 ^- F8 H7 `' l& X: n% `" Z4 h, k2 w4 X
3 q+ A( U' Q2 u( k: Y+ U3 C
4 q, j8 G) B9 s" q) d, x, R6 ~) N# q7 z* Z* y4 `( G" K9 u# q
5号脚位是继电器输出6 s! @! y: {- i |5 h& }+ f
12号脚位是灯输出
' |# u$ _6 o. y: }( { 4号脚位是按键
( A9 T3 n7 K: x& f" Z' G6 C( N0 W+ r1 S6 v9 C. k. x. i
7 l% M+ U' \/ M8 b, M8 n- r S& d; e1 t( J) X
. N' |; j6 |5 e( y卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库, o' m* n" X4 a2 _
- #define BLINKER_MIOT_LIGHT // 设置小爱灯类库
p$ \" U8 B% N/ o9 d9 v) U - #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库
9 R4 Q; M( \3 I$ r; V! C - #define BLINKER_PRINT Serial //串口协议库
, N2 k" @9 F0 T0 f - #include <Blinker.h> //官方库3 s! d+ @ w6 B
- #include <ESP8266WiFi.h> //官方库
+ \) s6 `; I1 a% ~+ ^; B - WiFiServer server(80); // 服务器端口号
7 B/ v* \. H9 K) r) n3 ~# U - ' I8 H, y3 W1 B/ z
- char auth[] = "c4942fb1d5e4"; //设备key
' N& d* G3 U- i* p - char ssid[] = "wanboshi"; //路由器wifi ssid
! \% [0 L3 ?- j3 ]2 L, x - char pswd[] = "1365662999813586348220"; //路由器wifi 密码
! ]8 m: w0 j3 ~! W! A3 c6 J
! y4 f4 \6 \5 U; I3 T- bool oState = false;& q/ {1 S E( o. e: Z
' e! b- D0 e1 l- int kg=5;//继电器输出
( j8 O/ \9 z) A9 t! g( F7 ?: x0 r4 Z - int de=12;//灯输出' u* E ~( [* ?" n6 Y
- int key=4 ;//按键1 ]2 K- V9 z4 F5 k* Q2 e
- //*******新建组件对象
( F. W4 ^* p! i- P+ O
, x& A4 \% O' y8 ^2 C" v A- BlinkerButton Button1("btn-abc"); //设置app按键的键名2 y$ P- ^+ b$ h! A, v' | w" i6 x- t3 f
- //*******app上按下按键即会执行该函数app里按键
6 ^& |8 J$ Q8 e$ G - void button1_callback(const String & state)
* b$ ]* R6 F* B+ h3 s - {
& ~( g/ r% N) L' |" K: T8 L: U+ b0 G - if (digitalRead(kg)==LOW)* }# ^# ~! P0 J; Z4 N4 _
- {
: e" }: r( ~2 s, j - BLINKER_LOG("get button state: ", state);
+ t3 x8 @0 p' t. a' n - digitalWrite(kg, HIGH);
6 A! @5 t8 P! x- R) | - digitalWrite(de, LOW);6 {6 H% u- `; Q( m+ X0 i8 P# |
- Button1.print("on");
* h" a7 w% G! d+ Z$ ?% \ O - Button1.color("#0000FF"); //设置app按键是浅蓝色* J4 L2 ^6 J: q) W4 e7 o& ]2 B5 z2 B
- Button1.text("开启中");
( l4 d. c+ x' U" j, | - }
. W& @: Y* q% Y - else if (digitalRead(kg)==HIGH)
( @$ Q- e% e9 ]- ^ - {
* ~2 `! {* l; [) X - BLINKER_LOG("get button state: ", state);- @2 a S/ s4 d( G1 Y9 y& l7 Z
- digitalWrite(kg, LOW);2 d7 W2 [: s8 y2 _
- digitalWrite(de, HIGH);
7 P" A: L, |3 D% n8 i - Button1.print("off");
# z$ m& J; b7 ~5 ^0 b) B - Button1.color("#00FFFF"); //设置app按键是深蓝色6 \9 V9 k# V' d$ j& r
- Button1.text("关闭中");# {* k& Q+ G1 G
- }
& @9 t" q4 c7 D3 l0 Q - }' {5 U( ^5 T/ G X; E2 N7 K' p
3 j9 n7 V0 h) h' t. h3 V2 u e( k! I- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 }7 ]& B% O( f. r - $ Y* T% A- U0 m3 u0 _6 C- E7 i
- //*******如果小爱有对设备进行操作就执行下面0 c0 W8 h& F2 J5 X- |
- void miotPowerState(const String & state)# R/ H+ K l( ^2 c: ^
- {. J# {( `! i2 K
- BLINKER_LOG("小爱语音操作!"); //串口打印
$ h3 u G- \ {1 z6 o1 Y! k& h - if (state == BLINKER_CMD_ON){, \% U/ Z' v2 } }; \3 |1 Z
-
5 V- N5 _: [. Y& x9 F& f v0 [& J - digitalWrite(kg, HIGH);5 L* }+ G: t6 d. R% W% \* m
- digitalWrite(de, LOW);
& t8 E1 p2 _ V8 C) t - Button1.print("on");+ r% g8 |3 F- F" ^3 V
- Button1.color("#0000FF"); //设置app按键是浅蓝色
5 |9 }4 Y5 @5 L8 h" V6 N( v$ P - Button1.text("开启中");* m# H( e5 u0 o4 v
- BlinkerMIOT.powerState("on");" m4 ^! \1 u, R
- BlinkerMIOT.print();
8 I- p6 l' _6 H - }
6 D: i2 c: p4 C3 @) w - else if (state == BLINKER_CMD_OFF)6 |( k8 ^$ A4 f5 z: ^4 V+ {# t
- {
" _( @& g* ~9 E - 9 |5 C% a5 [4 v. n M0 g+ o
- digitalWrite(kg, LOW);! W6 ^+ g5 k/ Q% k
- digitalWrite(de, HIGH);/ h8 f# p" |2 a7 R) _
- Button1.print("off");; i: s8 o1 s3 b' G8 F/ U* q
- Button1.color("#00FFFF"); //设置app按键是深蓝色
- c* p4 b! ? }0 A% @ - Button1.text("关闭中");/ T2 r; Y9 n; v" H. f0 _8 T
- BlinkerMIOT.powerState("off");
6 q/ S1 X* V' M* H" R& Z5 z - BlinkerMIOT.print();
3 r* H- `5 `4 Q- ~* T& W+ Z9 C! P - }
7 S$ _3 @# O! k$ I: n5 [: g L; ^ -
8 A* r# P/ F. P& s/ z$ C9 q. M! ^ -
% c* ^) V' T& u. r5 J - }
$ d* d6 N, @! k) s1 I7 p; F - //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Z8 `2 Q( ?9 S - //*******如果天猫精灵有对设备进行操作就执行下面: G' S# h; f4 P( {/ C
- void aligeniePowerState(const String & state)
4 P' e& g% }" f# ]' F' u' W - {
- [( N- }. J& N2 Q' u8 i - BLINKER_LOG("need set power state: ", state);
( x( S& d# G8 E8 z& w, H - if (state == BLINKER_CMD_ON)+ s! y$ T4 S. r. B/ n
- {* A- i4 A& T: `3 O: d
-
9 K# \5 z/ m L6 M9 k, H) b - digitalWrite(kg, HIGH);
" s9 ?) g8 T2 ?& o3 v5 Q$ a5 R - digitalWrite(de, LOW);+ d# c A" v) s
- Button1.print("on");
2 w- Z: o% X9 E, Z! z - Button1.color("#0000FF"); //设置app按键是浅蓝色5 A& ?1 U$ v/ \& n" V9 {) _
- Button1.text("开启中");
/ ~1 g7 c4 P, h6 Y6 g - BlinkerAliGenie.powerState("on");4 f1 }/ b6 ?6 i( C: n
- BlinkerAliGenie.print();
/ h) A4 g+ o( S( J - }
: }: u k8 S. t - else if (state == BLINKER_CMD_OFF)8 i1 m) ^# ^% R) t4 U1 R: t
- {+ e! g& Z2 A) Q2 w/ f% R) {
-
1 m/ a3 b2 A3 ^ - digitalWrite(kg, LOW);. Y0 Y4 t9 R( l4 a! d- B% O
- digitalWrite(de, HIGH);
9 W( z* z/ n1 h, R" \3 ~7 x - Button1.print("off");9 l/ h j2 P( l0 H) m
- Button1.color("#00FFFF"); //设置app按键是深蓝色( w" t) Y& {7 c% u. ^, s, O3 F$ R
- Button1.text("关闭中");% X9 J! C4 g% m( a) [1 H0 t( p
- BlinkerAliGenie.powerState("off");
6 E" S, [- A( c- S; `; D0 j - BlinkerAliGenie.print();, ~( K& J; q, e8 N
- }
" ^) g1 z/ I: [: s -
0 y+ l7 [& a m - , ~$ d4 q, z+ x3 w9 K0 I6 y2 Z
- }
# x: ?6 }: m6 L+ N2 M- Z - //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次3 w1 L3 Y0 ]+ u8 `* U
- void heartbeat()
& }& F- Q+ {5 W/ |; | - {
; m9 M' s& j9 L V - BLINKER_LOG("状态同步!");
" u- W5 `! [9 N% I3 o8 X - if (digitalRead(kg)==HIGH)
* p: H* k6 D* @ t; L# A- T - { 8 y l* O% G1 W: W
- Button1.print("on");3 L2 ?7 L+ D8 l2 W1 q
- Button1.color("#0000FF"); //设置app按键是浅蓝色
) s9 G. L2 F% J' m6 ^3 @ - Button1.text("开启中");
! {" V( z' G4 T; d+ s - }
5 m& e1 S: k" t7 Y2 I3 a( Y. v - else
0 B: v2 \, ?# u0 a - {
/ u K" q1 p. s4 d - Button1.print("off");
% c" A+ i2 d/ m8 u# H0 d' ^! I - Button1.color("#00FFFF"); //设置app按键是深蓝色. r" Q" O. T8 k; P0 t- J
- Button1.text("关闭中"); F/ y- y1 m* ~( b% K
- : n0 x* I* n! f: W7 p
- }1 u+ `7 R6 A n+ [( e; {: t
- }
* w! h( ^7 b2 \" J5 \ - //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/ H* r+ \& E- Z% T! @& f) |. d - void setup()% X& `4 Y/ ^. ~, j
- {+ L! i- G( w% X u
- // 初始化串口
$ i0 f9 Q. J6 K1 R3 t5 X. e9 I& O2 l - Serial.begin(115200);5 x6 I; F* V3 v. |" w* i @0 B
- delay(10);2 B- W5 E* V: A3 q6 v5 D% i
- BLINKER_DEBUG.stream(Serial);
7 C6 N( ?5 F9 n& R - // 初始化有LED的IO/ [8 {# z! G- Y* O7 I( g" H3 Y5 u
- pinMode(kg, OUTPUT); " X( Y$ r8 L; W5 r7 j: l
- digitalWrite(kg, LOW);//初始化继电器上电状态 1 ]' u' J& O" o
- pinMode(de, OUTPUT);
' a, G5 u; P1 L$ V# y - digitalWrite(de, HIGH);; B- S0 J7 g+ [; a* Q: e) |( G
- pinMode(key, INPUT);
1 |& X- |3 W! D/ w1 k0 k - Serial.println();
+ N, @: W; ?% h - Serial.print("Connecting to ");
: d8 |/ L9 ^' g - Serial.println(ssid);& `8 E# a" X: N$ I0 ]/ P) L) x
- WiFi.begin(ssid, pswd);
) f: Q; Z$ K8 d8 | - while (WiFi.status() != WL_CONNECTED) {
& f" I1 e. |5 V# j- T2 r - delay(500);
2 w; Q4 R8 h8 P* Q1 b! [ - Serial.print(".");
" v+ o4 Y/ ~0 J$ F1 I% p - }
/ u% M6 e ?+ m7 C& A, h9 l7 a! F - Serial.println("");
& b. z# x D& `( Q - Serial.println("WiFi connected");2 U4 m. B0 I5 v' D
- server.begin();
& V# Q! N3 X# U% C$ p6 _ - Serial.println("Server started @ ");/ y- _! F+ q: ]8 J- |
- Serial.println(WiFi.localIP());
0 t; U, n5 J# ? - //打印出IP地址,后期可以制作显示器来外部硬件显示ip
1 ~$ c' t$ E3 }+ H" B8 }5 B" M; I - Serial.println("To control GPIO, open your web browser.");& v: ~2 ?9 c, x8 Z
- Serial.println("To set GPIO 0 high, type:");! P+ H" d; v, H& c- x9 i$ [/ A
- Serial.print(WiFi.localIP());0 v, N. D# M# ]( U5 a
- Serial.println("/gpio/1");
+ y8 `9 I' z3 e, N* D5 D2 m - Serial.println("To set GPIO 0 low, type:");
/ k5 }% Y6 \0 ~ - Serial.print(WiFi.localIP());3 `3 Q, u9 i* S
- Serial.println("/gpio/0");
* M Y4 |/ k: V' k - Serial.println("To toggle GPIO 0, type:");# G3 U2 T5 y: p( G! P8 s% a, M
- Serial.print(WiFi.localIP());
0 D1 K5 {# T& ^* d, o - Serial.println("/gpio/4");* I; h X( W+ \. ~- I3 o( L
7 A. T8 d( E; c3 Y: r( r- // 初始化blinker* N3 D" T, y, N$ d
- Blinker.begin(auth, ssid, pswd);( E1 }0 b# g0 ?
- BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数* R8 d' {6 U1 [ L1 ~2 F
- BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数' Y) r: `" {8 x1 e
- Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。; t6 \3 n6 q7 Q$ F+ |, a4 N
- ! U6 M$ G0 Z/ }$ @; l) f0 ]
- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback8 O4 ^8 D( G% B6 m4 M2 H' l
- }
5 G3 p! M+ R9 b) B: H - void dataRead(const String & data)0 C# n m; [3 D/ T- f
- {& T; {5 s. N6 k# ~
- BLINKER_LOG("Blinker readString: ", data);/ T- Z4 d. [+ b' t3 ]
- f0 ]' }1 K# v [% C) p. l h- Blinker.vibrate();+ p7 t ^7 H+ X0 [
- ; P, E: s; N4 m# d2 p6 y4 A
- uint32_t BlinkerTime = millis();
4 G& S- }3 _2 Z3 u) ^1 p, Y5 h -
6 N# a) }9 |; Z: P - Blinker.print("millis", BlinkerTime);
# I. [8 c. [* L8 _ - }: h$ p/ q) g8 V# \6 w* l
- void loop()
) |5 Z; V$ `8 v3 D - {: m/ W O$ E$ V
- Blinker.run();9 A/ c' T1 b+ f8 [
- if (digitalRead(key)==LOW)
3 M) n C3 P1 Z, B3 @$ I! [ - {
0 t$ k7 p; L. S% B - Blinker.delay(200);
* [' I6 U6 z7 l$ D' J+ t2 X - if (digitalRead(key)==LOW)1 h- W: { v! c# p9 T& _; ` \
- {
/ W! e$ k' ]2 D9 {! g2 A3 b - if (digitalRead(kg)==LOW)( A# M6 \) Y. ^' E
- {
5 _. u( B. C S" P - . H+ M" H# `3 C2 F' k
- digitalWrite(kg, HIGH);
) y0 p, ]# X& p" ]" ]) S - digitalWrite(de, LOW); [9 j4 \" g% I; Q L+ c. h2 d
- Button1.print("on");$ W4 c3 m- t9 \" o. G
- Button1.color("#0000FF"); //设置app按键是浅蓝色# s3 ^$ W; ^) I* q0 o' \; M
- Button1.text("开启中");1 O8 E2 T5 n% `3 X. K- _- h
- }
$ l$ j! r6 F! T - else if (digitalRead(kg)==HIGH)
3 e. a' R1 Y. M) j9 b* a - {
2 N. _, ^; ?, r1 b! m( `. b - digitalWrite(kg, LOW);
& U# M' S9 D, m/ m& B; F - digitalWrite(de, HIGH);
$ P, y. D5 z8 W4 t- p% @' u- \ l - Button1.print("off");
' Z! b" C) i: u+ t - Button1.color("#00FFFF"); //设置app按键是深蓝色
4 o& x3 X- ?$ N1 a. h& S+ P! l - Button1.text("关闭中");6 x* M8 W( h$ u' a" h1 e
- }
: C8 @; \! X; V - }5 D2 }) E$ G# ]$ N
- }
& y/ Y$ ~) @7 C9 Q7 C - }
复制代码
- W3 e! e) o3 K' c8 V P) A" S& ^' E- x& m1 q" m1 A8 P
我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html! _( D+ s$ @. c+ _6 O( ]
4 T5 r) c% K, g5 f$ \/ B
把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。1 b) A. K1 k, A0 i. h% k# H
- L e* e+ Q- U4 H: O9 _: ]- k" D" Y; u) C- k* C1 F
|
|