|
|
本帖最后由 易记 于 2021-8-21 14:05 编辑
7 d. Q8 Y$ O6 q5 Z9 |2 H7 H2 @ ]1 i9 j! g+ f1 S& f0 Y7 |
最近玩ESP8266,想做个天猫控制开关。& c* @* `/ \5 U. ]
但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。
9 ^% e ^5 \0 x) \还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。
0 j' j# m& K1 {. {2 {/ V, Z0 {
$ S( S- \; \# c
2 }8 }- |- L. @9 p T; o5 f
6 C# `$ q" c; B" U0 f6 i# r
问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。
6 V1 K+ I/ V$ g1 P
U0 g! o7 }. b4 o6 z
' @- n; v! K6 n. _$ i8 G
/ C' Z! ]9 P5 ~9 p, O [8 l7 d4 h W2 g2 p
. a/ K' s1 d, _5 @6 o
到手,当然是拆拆拆。
* `: o3 y8 j- ^3 `2 L
( T& S8 c, h$ e# X+ R5 u( [
: }4 ^, i! r' T; o
0 |( q8 \; f% h2 C4 |9 f联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。3 G4 g. u: z, ~9 g0 @
" P2 `- X8 `( H, c/ g' ^
. q4 b( k2 v3 i0 y) g+ U) ~3 f# N/ H+ D- O5 E9 c
继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。
4 ?0 Y* |6 z) T3 y
! e# v% |- S* }7 B3 L/ k) O6 Z0 f' Z2 D- ?. Y8 {; ]
( l% K0 @1 f# b/ U: v+ o! Y
7 E) T. h0 V% u! ~9 j
电源芯片
3 ?% i: `2 y9 _ W0 ]- ~
& N. M6 ?4 @" i! U3 R+ X
2 V" I8 U( ?) e
+ T% D1 D! D) L$ y& W有一个按钮,按钮有二个蓝色LED灯
1 Y$ v3 }/ o1 s- H- u
3 x1 s# c. n5 d8 P a4 |9 V
5 M3 `4 f1 C' {9 T: k4 N7 x) z# x4 x* u0 K
8266
; Z1 O# H6 |/ ^6 |4 k2 u) J) l
% x2 }0 p; R% m9 O( A
3 J$ p# E' w) G5 ]# y
3 ~1 n X, ~. `9 _8 ~! R) u- K, w8 g
9 ^! T# q' I2 y4 ]+ U$ M接下来就是刷机了,版子上面都预留测试点。1 e. \. K l$ m) ~- c5 L- r. Y' Q' D
接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。
8 ]* ^) B3 B1 Z: i# P& [1 B3 N
- L$ L3 t0 H1 V( i& _9 ?注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。
% |- Y+ z4 R) [! e; j' T/ u要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 | . u6 o9 t1 p! |% e, Q5 s$ W
/ `) S; ^8 l+ K' k* `8 i- S, u& Y
. P" i" O |$ s+ q+ ` @
4 N$ x7 [; k# D! S& A5 C' M) C, m0 S5 {6 D$ e
. a; Q; J, ?* D1 A, V 5号脚位是继电器输出7 o7 i1 j# u3 e) e* H: I
12号脚位是灯输出
/ n U2 W: m2 }; p$ Q$ a+ Z; D 4号脚位是按键+ D+ p6 B$ \# T: {4 T" D$ Q# s
8 l- w) n& H; t6 n+ C1 w( H
" W- E4 c% b- B2 w& z
& X3 g, z( B$ A8 _4 I4 Y+ B {0 Z
$ W) ? O1 m0 h! ]: F卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库 ^/ \8 e: K- }6 Y( Y+ C! F, q
- #define BLINKER_MIOT_LIGHT // 设置小爱灯类库9 H, s0 D: `3 T: U8 |
- #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库* N7 U5 o; k6 Q0 d' u! `( q" ~
- #define BLINKER_PRINT Serial //串口协议库- [4 W& |. _- f* w: m- [, w: J
- #include <Blinker.h> //官方库
2 r, l; g" x. W7 j2 j1 K! \ - #include <ESP8266WiFi.h> //官方库5 c& l- Y0 h8 B
- WiFiServer server(80); // 服务器端口号3 P* ^; V' S; F" o6 b
+ O U% ~, N$ G) ^* @# [- char auth[] = "c4942fb1d5e4"; //设备key7 L& e" l0 k8 @9 N; \, ?% M; T; e+ s
- char ssid[] = "wanboshi"; //路由器wifi ssid# T$ j H$ z( T i/ \2 S
- char pswd[] = "1365662999813586348220"; //路由器wifi 密码
8 L0 [1 G2 ~& g( Z5 c P# j, i8 Z+ a - ' z3 H$ U0 \7 O" m' k
- bool oState = false;$ v/ g. ]7 |" _* ]" u0 a K
- 5 T4 U; s: x; [, S" {
- int kg=5;//继电器输出+ [8 y! u; F. Z9 ?6 X$ `
- int de=12;//灯输出/ Q" [( }- A5 A; G" t& B6 O. E' H
- int key=4 ;//按键- d* w) W. _3 x. g! o
- //*******新建组件对象. n, E) |$ N: r0 _) f; u0 {
- 1 i: j# D/ w6 G0 Q/ @* }5 _
- BlinkerButton Button1("btn-abc"); //设置app按键的键名
( I$ Q# c+ D, ^0 r! V. U- G# |1 z - //*******app上按下按键即会执行该函数app里按键, Y/ ~; H4 G$ ~# a0 R6 K
- void button1_callback(const String & state)+ T; l( E6 h4 `+ ^
- {, G$ L% t$ x) q4 W' M) m$ G
- if (digitalRead(kg)==LOW) C# w% \- T2 L, L
- {
e/ E% R8 f/ M - BLINKER_LOG("get button state: ", state);
+ K2 u2 U6 [8 `+ g; p2 c; a) i* M - digitalWrite(kg, HIGH);1 d# l0 i0 P5 Q& W) B, v# `$ b, a
- digitalWrite(de, LOW);0 ^7 {. I& K7 I
- Button1.print("on");! a1 l9 m6 b; R$ L4 P% |+ b o& q
- Button1.color("#0000FF"); //设置app按键是浅蓝色! v% ]; ~1 P( n
- Button1.text("开启中");8 x4 B# a$ j- ^
- }
* d' p2 L1 C- f6 w# T( z5 I4 f: @ - else if (digitalRead(kg)==HIGH)
* X2 ~% t& y' y - {
9 K x/ }6 w2 J# K0 }5 U3 P - BLINKER_LOG("get button state: ", state);
& p& F5 E3 g9 i9 G - digitalWrite(kg, LOW);4 A% k* _7 z9 Q8 \' v u2 i8 _
- digitalWrite(de, HIGH);8 n" E, ?' U1 r a( v. _3 v+ E, }
- Button1.print("off");0 @3 b; B$ N' ]
- Button1.color("#00FFFF"); //设置app按键是深蓝色
4 r T& w6 c9 V) ^# ?" h - Button1.text("关闭中");- L6 d8 K$ I: A6 G9 `
- }% A( F }8 @* n, P% V$ o6 `
- }
8 P& B. {7 d2 t j! { - j* ]7 _. k5 p2 q
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
, I( f% J) Q$ ?+ z
$ p$ d5 j: R0 A. K2 a- X- //*******如果小爱有对设备进行操作就执行下面
3 s5 z. a' q g- K: T& `& L - void miotPowerState(const String & state), r9 | q+ h& i
- {
$ T, h8 p- S2 ]5 b% u9 R - BLINKER_LOG("小爱语音操作!"); //串口打印# U2 E; `- H! H8 D. U
- if (state == BLINKER_CMD_ON){
& Y2 W5 X9 }( ~ - ' A% V) I: ^$ V1 f4 `6 j
- digitalWrite(kg, HIGH);
8 e7 \- e! Z* ]% H - digitalWrite(de, LOW);' q7 v. q/ A# i2 S# k, N5 r8 |
- Button1.print("on");
, N) _* z& e1 W. Y8 R$ u. g - Button1.color("#0000FF"); //设置app按键是浅蓝色
' Y7 }" p6 J0 o* W) o: V6 s - Button1.text("开启中");9 k8 `4 B5 d A: t
- BlinkerMIOT.powerState("on");3 b8 n7 _/ E: i& h# s: Q( Z) K2 G; P
- BlinkerMIOT.print();: W* T, q) F. l( F# m; X/ m
- }( ?# x2 W- \/ Y& }5 K* X
- else if (state == BLINKER_CMD_OFF)
' {4 y+ N' I( o3 Q' P - {
: M Y, o4 [" r0 P+ I8 r -
! d9 m3 p( D) I; `) c - digitalWrite(kg, LOW);
0 C; V/ E1 Q- }5 e/ o0 } - digitalWrite(de, HIGH);
% ~9 m! p Z. h. i( W - Button1.print("off");$ k7 @* Q' t" F( J# H+ z! N
- Button1.color("#00FFFF"); //设置app按键是深蓝色
7 c7 n5 l; t }- F( r - Button1.text("关闭中");
* V! R7 D* N. Z! e2 Y. a4 J3 I - BlinkerMIOT.powerState("off");7 m6 V% f9 A( `$ @3 ?, T
- BlinkerMIOT.print();
4 ?, b9 I( E2 u" ?) K! ~6 J - }- w- N$ u% ~3 P% ]8 z* t; V
- 7 M: m5 j0 X& O
- ; b/ Z" v- H8 g
- }/ z# G8 U! B% Q; K) g
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 D. ~ t" f9 V7 A3 l& P - //*******如果天猫精灵有对设备进行操作就执行下面5 J5 K+ L, f+ M. c) ~9 g
- void aligeniePowerState(const String & state)( T1 w/ S# m% j& t5 W
- {
7 S3 {1 M5 [+ b - BLINKER_LOG("need set power state: ", state);
# R# w; \) ?( i8 S1 y8 ~ - if (state == BLINKER_CMD_ON)
7 |3 z& r6 z) Z* N s - {
0 o+ m5 }+ C# @, g; T" p4 v -
i" F' h& j9 ^4 Q - digitalWrite(kg, HIGH);( ]/ b5 Y: ~9 |4 ]. ^
- digitalWrite(de, LOW);" y/ C( f9 ]. T4 D
- Button1.print("on");
s% n' g2 G, z - Button1.color("#0000FF"); //设置app按键是浅蓝色
( `8 d, L1 Q5 }! M; P, h' ^( _! ] - Button1.text("开启中");
9 q* ~ _: v# I& j - BlinkerAliGenie.powerState("on");# {# N1 V- `, g# [
- BlinkerAliGenie.print();
0 Q: t' _$ y# V, V. `5 f7 k - }2 F! j' O6 N) R7 W2 V8 e1 F3 H2 v- i
- else if (state == BLINKER_CMD_OFF)% _" a3 \3 Z n6 h# c1 J' w, ?: ?4 v
- {9 w) M* f4 M; X) A% X* j
- / E4 W/ d/ A$ U* r& U1 y) N
- digitalWrite(kg, LOW);
' t4 d% H5 N' Z4 i" [' T/ E0 a) b$ a - digitalWrite(de, HIGH);
0 h8 X# @& C' s! A+ y - Button1.print("off");
' i. G, @$ T/ A- I* K# f& U4 K - Button1.color("#00FFFF"); //设置app按键是深蓝色; c ]) X) S/ ^) V# z6 D- c/ o. C
- Button1.text("关闭中");
% ~7 n) a- F/ i) ~% h0 f - BlinkerAliGenie.powerState("off"); d8 p; B2 a. W% ]8 f1 z+ a
- BlinkerAliGenie.print();% Z7 V4 Z, O' B' Y( p9 o# O; j
- }3 |& ?- t; s1 v# L, n# C5 V
- u) b. ~& c) x# S8 t' h( o
4 _; M) }& Y B2 r# o* { y. P- }$ u, j! E; l0 `+ Q$ C/ a I
- //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次4 e! [7 g3 r( L8 H1 Y" J' U$ ^
- void heartbeat()9 k) g! W: o- k* D2 ]
- {
- `& N: q/ A" [: Z/ h* W6 V, R+ G* l - BLINKER_LOG("状态同步!");
6 N& F9 ]0 F: g& u+ b* W- m: | - if (digitalRead(kg)==HIGH)
A- ?7 l) Q$ u. T" E* _1 @9 ? - {
+ }7 K! v, V% e - Button1.print("on");
6 A/ d! l! f9 O$ t7 o& J% |" A - Button1.color("#0000FF"); //设置app按键是浅蓝色- b$ J2 m9 i7 M3 p+ j2 {
- Button1.text("开启中");: u! m( f! H; _
- }
8 ^+ i- G$ s; e9 e - else
8 A& M* w6 B! R - {% ~( `: ^+ z. @* E1 y
- Button1.print("off");
3 ~& k* z$ e$ b - Button1.color("#00FFFF"); //设置app按键是深蓝色! I* Y- w( w; ^
- Button1.text("关闭中");
9 w8 |' m9 d- S3 M/ G -
: `) P$ x- n$ M1 F* } - }
0 a& Z5 `3 T' c6 N+ E7 ]" Y: ?$ z: X d - }6 A5 F3 K7 v: ^! ?" Q# S0 h
- //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++0 y8 F+ a+ q* h! @! W
- void setup()
) ~) v. D2 y1 S' Q- B% T8 t - {
* i) S" {1 v/ u, l - // 初始化串口
" @' E' Y! K0 a7 ~ - Serial.begin(115200);$ E9 o7 J, Y3 D4 \6 w& M4 d
- delay(10);
9 l) r: T5 A/ Z( ^- b3 J( ? - BLINKER_DEBUG.stream(Serial);) ~9 t6 l* M. @* g, S# M: O# x
- // 初始化有LED的IO; t' F7 O6 y8 F& K; o! Z
- pinMode(kg, OUTPUT); 8 P' m8 I5 [; B( }" y
- digitalWrite(kg, LOW);//初始化继电器上电状态
' \% o. U2 H; \) { - pinMode(de, OUTPUT);% I; Q0 A. x/ `$ Z8 n
- digitalWrite(de, HIGH);9 S! G7 [1 u$ H
- pinMode(key, INPUT); 9 R, b/ D$ Q) _
- Serial.println();
$ w: y% k b/ A; R- Q/ A - Serial.print("Connecting to ");
( K, u3 h0 {$ o9 f% i - Serial.println(ssid);
( z! D. s2 ^& E: X/ m |7 r - WiFi.begin(ssid, pswd);: ?0 g- }3 P$ ^# e6 _
- while (WiFi.status() != WL_CONNECTED) {( r: }+ t" G- S# j
- delay(500);
/ ?' N# ~7 G6 l# x( Q c; V. q- i - Serial.print(".");$ F( N9 K5 U6 r9 V& k; v' C
- }
6 S7 f5 W$ o9 a# F - Serial.println("");4 Y$ P: ~( U6 F' C- m! C
- Serial.println("WiFi connected");
' h) G. r ~( F2 _- r - server.begin();
. u/ X, J2 Q# n' S, z. @8 S, d- h - Serial.println("Server started @ ");
7 u9 t0 s: G% A. R6 x" o& r) | - Serial.println(WiFi.localIP());" I7 \7 j' l/ z* E2 E9 J9 j
- //打印出IP地址,后期可以制作显示器来外部硬件显示ip
& m; O: B8 r( @& k# r6 ]" {9 D - Serial.println("To control GPIO, open your web browser.");
0 C7 z& T% D/ k; V8 w; A. g - Serial.println("To set GPIO 0 high, type:");
~$ E8 g$ Y$ i8 ?7 F5 R - Serial.print(WiFi.localIP());
$ B4 I3 V ]1 d0 f% O. \ - Serial.println("/gpio/1");1 l# J; D; I1 p3 _; Q) |4 N" A# ~
- Serial.println("To set GPIO 0 low, type:");
# r5 q4 @) ]& ~ - Serial.print(WiFi.localIP());/ z) @5 g3 x7 c; }/ E6 U7 }
- Serial.println("/gpio/0");
$ }& Q! Y, [7 B! O - Serial.println("To toggle GPIO 0, type:");2 S! }0 {2 M$ S
- Serial.print(WiFi.localIP());
- ~3 Y3 Z$ o- ^) d% U6 l8 t - Serial.println("/gpio/4");
4 A2 z: q; T- i G6 X$ P - / m3 B3 {0 N8 I8 l { E
- // 初始化blinker3 X+ _& ?1 C1 t+ i
- Blinker.begin(auth, ssid, pswd);
. B! i7 c8 t4 p6 J2 H2 O% K8 C - BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数
A+ ?" [1 D* _8 n/ h - BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数% ~% m6 {1 h- t% Q- o$ B7 z. C
- Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。
+ Q8 m) g% e' A) q4 X( l3 E' O2 r7 H
' a& z2 }9 I3 d/ z4 G1 T1 P3 ]- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback
2 @) J. ~/ n: x - }, J* f9 ^+ L; P; Z! \. P
- void dataRead(const String & data)4 W2 |' }4 X% d+ c/ T6 a
- {8 H) _4 Y! _9 G" z
- BLINKER_LOG("Blinker readString: ", data);
1 X6 N' y3 |3 a. i% ~ - 6 E7 U) t; a f2 ?6 P; F J7 }
- Blinker.vibrate();0 E) k9 V- t4 W- Y$ t+ L8 Y
- & w9 Q6 f) F, d( c
- uint32_t BlinkerTime = millis();
& M' x" D( y& k2 p8 U! J# M& H/ X -
3 i# { X- R; u. b# E" M$ j% D - Blinker.print("millis", BlinkerTime);9 A" i9 n; T; ^4 Y4 e
- }
& v H: R# B, [9 c. b$ P - void loop()4 i3 p# Z( Z+ X7 Z1 a8 I, R& L! G
- {
J2 e* \& d0 s - Blinker.run();
! ]1 X0 i/ N8 [4 G) v5 y, |6 p - if (digitalRead(key)==LOW)% V3 `, ]3 v9 _9 S% L3 I( J4 O& f
- {
?, n; _) `: ?! y- k- ?% `% D2 R - Blinker.delay(200);
! t( Q( W7 ?( A - if (digitalRead(key)==LOW)
7 J- w! \8 S4 ?; ~; } - {
* u( {& |+ J7 w" H) ^& P - if (digitalRead(kg)==LOW) u5 G( A" `+ k1 C
- {
& D2 m) O& L/ W% r) J - : D9 c0 |: i& G, U' d) m1 v( A
- digitalWrite(kg, HIGH);
* r3 G) U6 J, { - digitalWrite(de, LOW);
1 `4 [6 v" {1 i' {0 i7 X: B8 K3 O - Button1.print("on");
* ^& j8 q2 k6 A } - Button1.color("#0000FF"); //设置app按键是浅蓝色; o. w6 V6 M& U: u5 ~
- Button1.text("开启中");* k" b" m1 w' y6 s% ~
- }' c2 K: n3 n" M* Y% ?0 S( G. P, Y
- else if (digitalRead(kg)==HIGH)5 j( w2 R' A/ e
- {
% w; y* I3 G- o3 [ - digitalWrite(kg, LOW);
7 w7 g! d' b3 @) E5 k, R0 L - digitalWrite(de, HIGH);
: J; G6 p, t8 B: U5 G0 ~% o - Button1.print("off");
; W1 G/ W G) b! E U2 T7 n - Button1.color("#00FFFF"); //设置app按键是深蓝色
( A, h9 b3 C* ?) w7 F - Button1.text("关闭中");5 L* I) O: F( p6 L/ z
- }
9 {' G5 \0 V% w- p9 w - }0 N8 ~# u+ B+ O/ y' p2 m% k8 R, M
- }3 A2 q$ l: V* v
- }
复制代码
2 b# s0 ^3 l4 n% p$ T% |* V
5 F/ I! `: \2 {( T- q我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html
t M) K7 D/ g( c6 N$ v8 y/ G2 G: V& p: z* g" k' `
把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。$ M4 ^" ^6 b Q5 B+ b" W: `; B
2 i+ G4 t3 `) H; r4 V+ E- h& ]
d2 U* k e( [
|
|