|
|
本帖最后由 易记 于 2021-8-21 14:05 编辑
2 N C# f9 b- n6 ~7 ?% H7 c R
1 R, d6 j- z$ N最近玩ESP8266,想做个天猫控制开关。
0 }9 R; o6 v* g% V' k7 C- W V" L- \但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。 z# r8 s3 K1 j, C* {% ^0 |$ N3 z9 {
还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。
0 b" L* _' L1 j. U! i- K
2 j3 @( E0 `8 D& H
: v8 d, A5 _" g' ~$ u
% J6 l* q& s u3 ~5 @问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。% [# I9 A* @5 M" b. Z7 c+ J2 C. k# i
- W7 G, W& L0 F( f) I+ t
( F+ c d9 A) K S' x% g+ o3 r$ _! m9 P
/ z0 O u2 t# j! x6 m! Y
6 ?9 B" D- h; \4 c
; t" |0 W: v" i5 k8 o8 _; ]
到手,当然是拆拆拆。
3 t& B: O3 h, O9 U. l
! t3 A4 y5 G* Y5 s* P
' p- N# z+ B2 Q+ n; d3 F+ a% p
" i7 E, f& a" ]9 ]( f联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。& v6 E e! [" G/ W7 k& G
1 C3 n9 u, |3 X, a" @9 @( e2 u1 J- g" W7 ?0 C1 J8 g' o
; |9 F2 o5 `% d/ |
继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。' ?6 m8 q/ M6 W$ f% z/ O) J; Z
7 f; y$ w# z- Y( m8 h$ h
3 Q5 O$ K+ ?3 b
$ I C9 |" k- L# G) K% s1 ?. {7 u/ a5 k* z$ O- k4 N
电源芯片
2 a# x. L( `6 U' s
5 N7 N" z$ {/ O
/ j I- A3 `; N/ i' |, r* x4 U4 ?) a+ A# O+ i. _
有一个按钮,按钮有二个蓝色LED灯
. t2 C7 l1 t1 R: l; W1 z0 {- e
! W- |! c* v1 K$ E! G' U- j/ v3 b! W8 C8 I
0 c, o! J E6 y! O: P6 j! h8266
. d, v$ e: A' i8 Z4 Z+ Z
& h: u2 v8 o( ~6 o% R5 l$ q8 i2 x7 h. Z- U
( _' @9 ^/ d' Q8 `7 k4 g0 |: z# w! \+ H$ m! k
9 T9 h. q0 B. }% g: p/ R接下来就是刷机了,版子上面都预留测试点。
# m/ v$ c4 T# G7 S' q接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。
2 I; M: A( L6 k0 p# u# G
B; D( Y; H; ^: t9 b \. A注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。
/ J# I" a. m* |7 j要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 | t0 N+ s" l$ C6 r
4 x3 p' N, ]% \2 t( b
: X9 s, C( B/ [0 L7 M3 e: K$ E) v& e7 W$ t+ y: y
/ ], E% \1 Q& [+ ]: a
7 _1 D- {" k( q- h$ p, y 5号脚位是继电器输出; V, `3 a O' N# g) P6 ~
12号脚位是灯输出: m- t3 ^- Z) G
4号脚位是按键0 j9 K, J. a; |' [# t
1 K* w: B5 [; B" x" Z
- f4 `5 Q) b5 X" d0 ?
# `6 H; q( l% @( {/ T9 ^
3 J& o q' B7 U6 f' E卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库) H* I+ }7 P0 {" ^1 y/ N
- #define BLINKER_MIOT_LIGHT // 设置小爱灯类库
" Q( r/ T( Q1 u" J1 ~; m5 }+ p - #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库. i' w- F# C8 G* `, E0 c0 H
- #define BLINKER_PRINT Serial //串口协议库
0 I% w' h. t$ v$ T. w, t& {" j% { - #include <Blinker.h> //官方库
0 ?! Y$ _8 z& B% j8 W/ ^6 U - #include <ESP8266WiFi.h> //官方库
6 N' p/ l4 E' d - WiFiServer server(80); // 服务器端口号8 ?9 q" q* ^. o0 ?8 s G
- + X6 E/ g: Z! W
- char auth[] = "c4942fb1d5e4"; //设备key
5 _+ _ T& a3 I - char ssid[] = "wanboshi"; //路由器wifi ssid1 X4 H% s9 `9 k7 S% }
- char pswd[] = "1365662999813586348220"; //路由器wifi 密码1 ?0 _* _+ z% |* C! |7 ]2 }
- ' ~: m/ {, e6 l7 ^
- bool oState = false;6 W* g9 d2 Y0 b. w
* E. f7 N r5 O) O- int kg=5;//继电器输出% [( V# `; s6 Y
- int de=12;//灯输出
* Q) P5 C1 i$ L/ H! Z - int key=4 ;//按键2 ^; P6 N n- F6 s
- //*******新建组件对象
4 H3 c' ?' d" @7 l. k& R* l - 4 x- Y0 y# e- }! O, _
- BlinkerButton Button1("btn-abc"); //设置app按键的键名$ l* Q3 y5 v- i7 u- S" x. F9 c8 j
- //*******app上按下按键即会执行该函数app里按键 x# d; S p% e7 |
- void button1_callback(const String & state)
( w l+ W$ e) {# [4 {8 d- s. c - {* l* D5 |( g6 ?
- if (digitalRead(kg)==LOW)! E' H% l/ b' w [( q$ A- _. ^
- {! ?- X7 v% K0 X% v6 t" _
- BLINKER_LOG("get button state: ", state);
1 H7 B: N" f9 x) N - digitalWrite(kg, HIGH);/ [) A. r5 { U) e- `8 d# }
- digitalWrite(de, LOW);
2 n5 p( y. r: i" O - Button1.print("on");. r: `2 V: |* b9 N! A
- Button1.color("#0000FF"); //设置app按键是浅蓝色& C5 k+ p p: c/ ~
- Button1.text("开启中");
4 O7 s( _* Q, F3 x( [( R - }
% [8 T- _) e# U0 J% u' T - else if (digitalRead(kg)==HIGH); S9 e9 \, D2 T
- {. K6 w7 Y' @! l4 R. ^" P
- BLINKER_LOG("get button state: ", state);% f4 m3 M/ q1 j3 Y8 M! [
- digitalWrite(kg, LOW);! c) w' [0 z. Q X/ \" m
- digitalWrite(de, HIGH);5 A' x( b: T# k8 L. B4 e: K
- Button1.print("off");8 U1 J; M* h" U1 R4 R3 @
- Button1.color("#00FFFF"); //设置app按键是深蓝色
k6 _& _" q$ [6 y' X6 x5 d - Button1.text("关闭中");* ~& l4 W$ C ^% @5 t
- }* A' H+ D: w: f- D" m$ x# o
- }5 j& s6 v0 d. ?& o; V4 [! V0 }% g
- G- w% Q8 z, t& w6 i8 a- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++. g8 o7 Y/ h3 p
+ H% W7 H8 r7 V" J) Z- //*******如果小爱有对设备进行操作就执行下面# x/ s K0 z( ~$ a0 x/ y
- void miotPowerState(const String & state)
0 Y& ~9 H% l- d/ l- `" E) u - {
7 y3 u% q! P4 c+ z - BLINKER_LOG("小爱语音操作!"); //串口打印4 | p' v2 Y2 k
- if (state == BLINKER_CMD_ON){# p, u: Y7 R% ` }' w
- 6 e. o/ I6 o5 W9 U; M k
- digitalWrite(kg, HIGH);( t4 V4 o* F% \9 u
- digitalWrite(de, LOW);
5 A, C) _4 u4 }- t5 h" D - Button1.print("on");) l4 c2 r3 `) x1 x7 R
- Button1.color("#0000FF"); //设置app按键是浅蓝色
3 J: v( G* Q( ?8 p h$ n - Button1.text("开启中");
8 Y; K% o! h& |- { - BlinkerMIOT.powerState("on");
6 L% ?* \, C X- F9 T% E - BlinkerMIOT.print();
V1 ]6 F% ]9 y# o) x' | F6 C - }
; p9 }5 A) `* \ - else if (state == BLINKER_CMD_OFF)) t( u- C1 _# z# V1 @7 k- Z
- {
- G2 o) S4 O3 D. v8 L+ c$ g - 0 }+ p8 u; Q' D1 F& X4 n6 r! e
- digitalWrite(kg, LOW);
4 E H# k* V5 I% f - digitalWrite(de, HIGH);
( J/ L/ a& A! _$ I/ f( @ - Button1.print("off");. K- S5 _5 m% N
- Button1.color("#00FFFF"); //设置app按键是深蓝色
) {4 D+ r0 D5 R. Z - Button1.text("关闭中");
0 t$ A$ z$ ]2 c) b6 ]5 z4 L! V* m - BlinkerMIOT.powerState("off");" w# y1 {" |* ?! }" m
- BlinkerMIOT.print();- X8 ^3 Z. y( R* W {5 M
- }
; J" n+ _7 L/ y+ v- n5 m" | - 8 y3 y% w+ M. f! P4 M. u# E3 v
-
! |: P+ r) ?# s$ P4 m1 s+ C5 f - }
3 b0 j9 a- G6 o4 ^' T - //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++* o& x1 t% }) t6 ^
- //*******如果天猫精灵有对设备进行操作就执行下面! _+ g) A; v) W. y# B6 T. Y2 t! I
- void aligeniePowerState(const String & state)
, `) v" H1 K% Z- U6 o9 J - {5 ^; h9 u9 b# M( }5 x, Q1 e
- BLINKER_LOG("need set power state: ", state);( A7 Z/ B! M9 r! s% r& _& `
- if (state == BLINKER_CMD_ON)4 i) K! {, x3 B* i, D' Z0 q" x. m) o
- {( {8 T3 M4 H4 r* P
-
1 A! j" q) ^$ m2 o: ?: L( |: }. f7 l - digitalWrite(kg, HIGH);
& @5 U$ N# U, T# J) t! I - digitalWrite(de, LOW);
6 ^! k* {! W) _, y" i - Button1.print("on");
5 L+ W( f$ q& E' a6 z0 ?- T9 E - Button1.color("#0000FF"); //设置app按键是浅蓝色 K a, v; ?' _
- Button1.text("开启中");7 T1 B) k/ l) ?# x- Q
- BlinkerAliGenie.powerState("on");0 F+ P4 U9 V, P( u' P) Y3 P' B
- BlinkerAliGenie.print();, j' e& V: M r0 x* d
- }7 j5 O" a1 _. w$ R/ S5 [# `
- else if (state == BLINKER_CMD_OFF)
: n2 y: C9 n% ], I5 m - { S+ ]$ j, ~/ S9 o, i9 F7 {
- 3 i* S9 I }: ~9 ~( |* W- d
- digitalWrite(kg, LOW);
/ L4 F2 m2 `6 g7 u; i) H - digitalWrite(de, HIGH);9 `' v2 c( U! ^, Z$ V# }' f& L5 d
- Button1.print("off");4 L' s/ q) A+ X' C! y9 ]7 i$ l, b/ ] f
- Button1.color("#00FFFF"); //设置app按键是深蓝色7 z$ x; M9 Y% l/ d$ k
- Button1.text("关闭中");# P4 ]. W. R! T; c) u! @1 J( s) e2 T
- BlinkerAliGenie.powerState("off");
: v- G; h( l) Z8 ~% r* p - BlinkerAliGenie.print();
( u1 h6 i' M1 w5 f0 Q, y& Y m - }6 W1 F( \9 @' j1 B3 f! ]0 o
- 1 z: \2 M1 H- n" j1 ^
2 J, M" h6 W1 i# m8 C2 m! N7 N, ^- }
0 L1 y# d$ n8 V6 I- q - //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次
$ ^$ \! R- o. M% x' S - void heartbeat()$ b8 d2 ]6 x4 o$ o% a/ E
- {9 z. \( v3 q8 @+ h
- BLINKER_LOG("状态同步!");
, A' f$ v& O& B A1 s. V3 o; p$ k - if (digitalRead(kg)==HIGH) 9 t5 m4 y* ]5 @. M( W
- { $ @% M& L6 h( {; b
- Button1.print("on");
% Z R1 l4 a: g+ i) ~4 K - Button1.color("#0000FF"); //设置app按键是浅蓝色: a7 B8 z; {5 e8 D5 k7 Z& @
- Button1.text("开启中");
9 Y0 J- l6 q p" L8 D - }
# Q0 G3 C; d, Q4 c5 u3 m! U - else - d( T9 a/ t! {, }
- {" p+ o5 K- A8 p+ N* w- Z. B F
- Button1.print("off"); |1 d( v4 P8 b7 ` g, r2 W
- Button1.color("#00FFFF"); //设置app按键是深蓝色' D. J# {7 s: \# f: d% X
- Button1.text("关闭中");; j' O1 P* C: b
- . Z% f) Y( M- y/ t S6 l
- }3 t \% C( f5 O% H! x6 b
- }: m3 e1 S6 ^ t7 [* \! t8 i8 _
- //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++& T( T9 S$ X: T2 z1 ~2 e- A1 ^
- void setup()
, J) P6 j2 W) G, j# Z6 } - {
4 w% d6 h9 {+ X# ?9 S1 e2 [+ N* d - // 初始化串口* i2 L, T& h/ k
- Serial.begin(115200);
+ T' @3 ?/ N+ O9 d! x% W- q# f - delay(10);/ e1 z& {8 }5 E L7 p
- BLINKER_DEBUG.stream(Serial);
# Z$ r- K$ N1 h* a2 s5 q - // 初始化有LED的IO
9 V8 O z% E" e% O - pinMode(kg, OUTPUT);
* u b' u' ~" j- {3 `( A - digitalWrite(kg, LOW);//初始化继电器上电状态
# o5 t$ M& R" C# G7 N" k8 N0 a U; ?; N - pinMode(de, OUTPUT);( i: u% B" i) J- K7 c. T
- digitalWrite(de, HIGH);
: H# S( T. |; E' |' m$ I" y - pinMode(key, INPUT);
* f6 O' `. \" k/ D. p w - Serial.println();" k' ], F; I1 p; H) M) f8 _7 f
- Serial.print("Connecting to ");
6 j8 J. y8 X5 k$ \& k - Serial.println(ssid);$ }6 k% k5 X9 i* y
- WiFi.begin(ssid, pswd);9 O) R$ @( N9 ~
- while (WiFi.status() != WL_CONNECTED) {
, `8 c* o7 i1 g7 N2 b+ b! i - delay(500);
6 j9 \6 I4 Y a8 J: x - Serial.print(".");" @( M9 }$ o5 [7 @4 A: ?
- }' f/ w9 `5 u; m; I+ N* \5 t" c
- Serial.println("");' [ T, e0 s" m: z
- Serial.println("WiFi connected");
$ D! e$ s$ D5 d: s3 p - server.begin();
* i- {8 q. D7 a4 M' }8 t - Serial.println("Server started @ ");3 Y) h8 r( g" r" O2 }, F
- Serial.println(WiFi.localIP());( O; K( D8 c5 u$ v
- //打印出IP地址,后期可以制作显示器来外部硬件显示ip
( ?0 F. S& Y9 D - Serial.println("To control GPIO, open your web browser.");, |1 |9 i6 E4 q0 i* b) r5 I; {
- Serial.println("To set GPIO 0 high, type:");
& x1 t5 z2 v# s6 H0 N6 K - Serial.print(WiFi.localIP());! {" A, l2 h5 B, G; l% e
- Serial.println("/gpio/1");) i" t% J# o5 r4 m/ m1 b5 I
- Serial.println("To set GPIO 0 low, type:");4 n; n! ~# m% B7 n# w
- Serial.print(WiFi.localIP());0 `* J+ F3 l+ m# Z
- Serial.println("/gpio/0");+ K+ I: T9 F( G
- Serial.println("To toggle GPIO 0, type:");
8 C3 A5 K' l6 w. @$ b# |/ x6 j - Serial.print(WiFi.localIP());
T( ~; E* h4 x- _+ M ^1 d - Serial.println("/gpio/4");
7 T( w& T, e; h' I# x
$ V: t9 o: s2 ~/ O- // 初始化blinker
4 C: x4 \+ [5 o& p - Blinker.begin(auth, ssid, pswd);: e# U- a" U6 K" W% I. P
- BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数
! g- ~& d# a1 f6 j - BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数# T5 P3 U% t9 N8 O6 S4 S
- Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。
$ U* H7 d. c' @& N( a' R9 S
' \- [3 K9 I: E- D- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback T" t, Q" d! d$ l, q
- }
# t% m5 a& g% j - void dataRead(const String & data)
; R3 e1 x' c$ q - {7 n+ K p- I _, U2 A+ \
- BLINKER_LOG("Blinker readString: ", data);0 @1 m( R$ U1 E8 r# Y
- 6 ~4 \% D3 i6 Z- z, w
- Blinker.vibrate();
# A4 F$ q: a8 G8 v - 3 Z5 j+ K d) \8 Z0 v) @# m. k3 R
- uint32_t BlinkerTime = millis();
9 u9 m/ K; K5 X - ) \& N9 a5 L. Q% [( x/ `
- Blinker.print("millis", BlinkerTime);* b; N0 S; k' x" \8 t% v
- }( E$ {: _3 P% t( [* D' M' i
- void loop()
" N: J! @- q. O* A7 i - {) O# q" M& B& s* W! ]1 H# I8 e
- Blinker.run();
; w% s9 u, ^$ I" ? - if (digitalRead(key)==LOW)" o' H5 b, y% ?+ P0 I+ `, W
- {
4 e2 E( y6 E9 w- y' M - Blinker.delay(200);- a6 }6 N F+ u! N8 L( V+ _
- if (digitalRead(key)==LOW)
6 H4 X6 K5 U7 Q$ K: |% x% F - {
) O1 t; ?1 X e4 M5 U$ \: F - if (digitalRead(kg)==LOW)8 J' {5 ^7 A6 _0 P# P0 L" {* P
- {. S) p) A2 i; v* L2 w
-
' ?8 ?% Y9 _& X2 D! i1 }; P# ` - digitalWrite(kg, HIGH);. R) ~6 R( \$ I' b
- digitalWrite(de, LOW);/ O$ p/ y" _) T4 {
- Button1.print("on");
4 N3 e! V; i6 Q' S4 ]+ U2 } - Button1.color("#0000FF"); //设置app按键是浅蓝色
! s3 ^# d1 ~/ ]& Y - Button1.text("开启中");* t7 [& B( v1 p/ z6 F& x+ b9 v
- }; ~- X0 M. {& T: I( _ x3 C
- else if (digitalRead(kg)==HIGH), U4 B+ y) m4 W# p. X8 m- E2 \' ^6 t, I' R
- {
7 y5 a6 w- `! U$ z% @$ y* b - digitalWrite(kg, LOW);9 D9 d% \# K* Z8 n1 Y2 Z$ L. e; F5 }
- digitalWrite(de, HIGH);
9 n( S; J5 o8 j2 H s0 T - Button1.print("off");
/ H0 q* K( |) z - Button1.color("#00FFFF"); //设置app按键是深蓝色/ F/ C0 `* V. e9 v7 p; i1 e
- Button1.text("关闭中"); \- Z |4 @! Z, q! b
- }2 L1 c% b: i! U q/ ?) |8 o
- }
5 t: g: n/ E8 E3 ` - }" _- O+ G' E" @9 b: O) k
- }
复制代码
" ] }$ V- ^0 v$ z
$ @" z9 @: E" I我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html+ t- V. {4 r; O0 E, D- c2 W
0 i7 K+ I. @1 s' a N
把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。
& Z }7 k7 ?# m0 H3 P5 _
O1 |0 l5 y+ Q9 V1 o! _# A0 _+ ]* d$ C9 o
|
|