|
本帖最后由 易记 于 2021-8-21 14:05 编辑 * L; y2 q( q9 H7 D
$ Q2 |! A- `) }3 e4 I5 t8 P B最近玩ESP8266,想做个天猫控制开关。
* W3 D0 n3 \+ Z5 j但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。* t! ?; V4 n" _, w: e6 Q; }
还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。8 s3 N' n. F& s0 x4 ~
- w5 h" D7 x( i) f4 e- g
8 P. |! X4 q& Z( S" Y
8 P" H0 Z- R, u9 f9 o& g问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。
2 N5 O3 G. D. B8 o' y, Y! L i
, t; G* }, z: u# B- D3 G
$ ?. ]& D) l& ?- N0 m0 c; P- |6 J0 A _* }
9 N4 M* l1 u4 a
, a- f) L+ k n" g: F. A1 \" V/ j* [1 p) |2 p
到手,当然是拆拆拆。
; ~2 Q( b" S* Y# J/ W! D+ i6 q, B( i
1 a/ X$ j. w1 U& h# ]4 s
7 g5 S. L; B4 y. i D9 M, N4 @8 H
- G. ~- ~, H% y& k5 x
联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。
$ e4 y3 f, y% d/ ^
' _1 }, ]1 z* h( a. ]% ?& r
3 U" ?% m5 x7 T# U' }
. |( ^' w# R9 f# r) F: p% F- m
继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。9 D3 Q( |1 v( s5 n+ k7 T( o% {
9 T" ~- N- ~% a. @' k# U) O5 V& k' s, l/ e
J2 k, N4 {( s
! K+ @0 M/ @6 z: p' c8 `% \电源芯片
, I/ B. ]( Q$ S1 r' @
( Z; y4 S6 D# [. i. `$ T& M
6 e7 w$ N; b/ A/ \6 R4 N1 Q/ ?3 A* E. }$ D$ o' ~( m& p0 S/ d
有一个按钮,按钮有二个蓝色LED灯0 q$ c# i7 {: T4 [
* q/ ?# J1 f! r9 K9 X& d/ ~6 n1 ]. K" L, @+ v) Z
' S+ ~1 ^ b) L& ?
82669 S6 O) O; }4 O+ T; x J2 T
% G3 x. |) a5 u) @9 s8 a( g
: Y7 [6 O3 {' o# n( \9 d& j
" W; y8 [+ h" h' S$ D5 t$ f, T
4 Y7 t5 q7 K: v! ~# s* e" N# {- Y1 A
接下来就是刷机了,版子上面都预留测试点。
) r1 R$ k0 h& i$ q0 A接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。
5 o8 _3 r; t/ o/ A: a2 ~! O \
, b/ e( A T$ |1 y1 t# g& F
注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。
9 ^5 S: V( P% a! G- V! u要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 | 6 I" V5 W# [. o3 j3 Z9 f
" a3 d, G5 o3 q; E( \6 E& p/ ]2 V) L/ e; R4 S6 G g/ W2 N
7 A6 Z( \7 }6 f. A; _' g
7 F) f$ n2 ^* {: u" D: e; E B3 g( x
# u2 w! ^! A: g1 E5 q 5号脚位是继电器输出. q& w+ W( e7 b$ h5 F
12号脚位是灯输出
: u1 W% x [0 _" U* Q) p 4号脚位是按键8 A W- i h6 @7 O; _1 o
" P& b8 o. k3 m7 q, S7 m9 F" ]1 `' K
5 l% f" p$ e8 d v3 E5 \' H8 G( T" ^, D4 c9 |! i
卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库
' {/ U! A6 Z! d4 K2 r - #define BLINKER_MIOT_LIGHT // 设置小爱灯类库; n& ~4 C i, N- o; D% l5 T
- #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库; {0 d$ ]$ j8 k; E4 q" U$ k
- #define BLINKER_PRINT Serial //串口协议库! T* N2 B+ A' l8 P; R6 g6 \9 ?
- #include <Blinker.h> //官方库
) L! J0 s- c5 H' j9 L) O - #include <ESP8266WiFi.h> //官方库8 h$ x) Q! P1 T' m
- WiFiServer server(80); // 服务器端口号
4 _, G% o/ o( }+ q+ [ - - a3 D @: K: Y" [& j, O
- char auth[] = "c4942fb1d5e4"; //设备key# w# ~4 {& d8 ?
- char ssid[] = "wanboshi"; //路由器wifi ssid' N5 V4 N u1 H; ?8 W, v# U; g1 h
- char pswd[] = "1365662999813586348220"; //路由器wifi 密码4 W, @8 V- d: ^7 f: ]: m9 ^! n
- 4 d z& g! {2 Q( I3 Z+ X
- bool oState = false;+ S4 v5 A1 R8 H+ e$ n
- " U$ }6 x# r8 o: M* [9 C
- int kg=5;//继电器输出
- ?6 S( Z' Z( A9 v, O" I- ? - int de=12;//灯输出% l% M T$ g! P! j$ X' c
- int key=4 ;//按键8 V% y) ~. C4 h1 j. {6 K0 `
- //*******新建组件对象7 x8 o$ E+ ^/ p9 x J
- 7 {5 A3 l+ k" w, N
- BlinkerButton Button1("btn-abc"); //设置app按键的键名
. D) L- e+ `( `& x9 V: F - //*******app上按下按键即会执行该函数app里按键1 W: T7 s, F W
- void button1_callback(const String & state)
6 o6 x8 ^/ K: S. f9 [- b - {% ?0 o% B* A0 y) ?2 n$ E
- if (digitalRead(kg)==LOW)! W2 x! Q; X2 P+ L: `
- {4 O. ?/ v* d( {$ a0 h( N6 L
- BLINKER_LOG("get button state: ", state);
/ x) a3 ^" C: w5 A/ Q$ s! B - digitalWrite(kg, HIGH);
5 @# E. h6 a& R$ D/ z; z - digitalWrite(de, LOW);2 I- A( k$ A5 i7 }8 R* \$ r7 U2 M- j
- Button1.print("on");
% m0 H T+ j0 T/ h$ [, b7 r - Button1.color("#0000FF"); //设置app按键是浅蓝色
* h& B, [; u: s - Button1.text("开启中");
/ P" o6 p; O q9 W6 z - }
+ T4 s- [1 k+ k! L! I - else if (digitalRead(kg)==HIGH)
z$ ?* U4 s: K' h, F6 _ - {
9 x$ ]2 J8 ^% E: i - BLINKER_LOG("get button state: ", state);- E/ g" H. W0 Q! H) w7 P4 m
- digitalWrite(kg, LOW);! m5 t5 K* S6 {& Z8 J! [7 {0 _
- digitalWrite(de, HIGH);. A7 ^+ L1 q4 k( y
- Button1.print("off");
0 v0 ]3 m6 [* k. w - Button1.color("#00FFFF"); //设置app按键是深蓝色( `2 [1 O/ H2 U
- Button1.text("关闭中");4 G* s8 d3 R$ ~% v- N) d; H$ ?+ [ l
- }5 ]4 I7 h4 z8 o+ ^
- }
( ~# I0 X( {4 m0 p7 e; l - , \& b7 @# w" {" L1 b$ O$ n" Y
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/ C' }8 b% F2 E5 `
! L0 M; q6 K2 Q+ [- //*******如果小爱有对设备进行操作就执行下面' `- E$ V! A5 g, g
- void miotPowerState(const String & state)
0 _# I( t3 Z. W, W" t - {
Z) v y7 {) J# h" e - BLINKER_LOG("小爱语音操作!"); //串口打印
2 g) q8 ? I6 W - if (state == BLINKER_CMD_ON){2 J, @! y( ~9 F- V7 ~( t8 z1 |6 R, [
-
% g, q: {, w) M) J# o: O - digitalWrite(kg, HIGH);/ Y: ?7 _$ c$ n6 l- G6 n: D
- digitalWrite(de, LOW);% @, G, L0 D5 ^4 m0 }
- Button1.print("on");
7 b: \+ z; {8 ^$ H4 Q2 ?+ L - Button1.color("#0000FF"); //设置app按键是浅蓝色7 c# }0 D& _' Q& e& k4 _* u3 _
- Button1.text("开启中");
6 U8 A2 V' R) m) B% a; d+ M - BlinkerMIOT.powerState("on");* _% D$ } p& t* |$ O
- BlinkerMIOT.print();
9 B- W/ d/ M7 `. \ - }
g9 D% [ E7 p$ @1 X - else if (state == BLINKER_CMD_OFF)5 n/ G8 ^0 L: c2 L0 b
- {
N- r T, }1 F, @' e" h -
5 X$ n+ \$ `2 V4 F1 ]+ Z - digitalWrite(kg, LOW);
: \; a: L: K, u - digitalWrite(de, HIGH);7 ?7 J. v! E7 x, i2 G) N$ R
- Button1.print("off");
& r$ b6 ]+ n) w0 Y" a - Button1.color("#00FFFF"); //设置app按键是深蓝色
# R+ b9 \# @" I6 g: P8 t3 y* u - Button1.text("关闭中");4 D& @- y5 j" L6 J z: S
- BlinkerMIOT.powerState("off");
/ K$ m C+ n+ c - BlinkerMIOT.print();, |0 S. u+ Y5 r+ A: V: @" X
- }
, d" e+ v/ J4 X' i1 P+ K+ x - : B' R7 ?# t% Z& i" y6 q2 |
- ) x' m U- w3 r
- }
+ K4 r: A' [2 t - //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
, W$ b2 w$ o, R( E, t- `" N4 `8 c5 r - //*******如果天猫精灵有对设备进行操作就执行下面7 o% s0 F- F& }8 m
- void aligeniePowerState(const String & state)$ s* m, \1 {' l+ O* ?3 I
- {
: J& S1 J; m1 c; h# x. q D - BLINKER_LOG("need set power state: ", state);3 |6 ?1 i5 c8 Z( O/ h+ F: W1 k+ N
- if (state == BLINKER_CMD_ON)& G y z4 m0 Y
- {6 Q4 Z% \8 w7 \' c
- 4 M4 Y( c5 i b D+ Q
- digitalWrite(kg, HIGH);
6 \* ]; w2 o) F2 t) E7 p% S1 Y - digitalWrite(de, LOW);, L9 e% q7 r1 q0 `2 j# I& y
- Button1.print("on");
/ f: p1 g9 h" P9 T ~% ` - Button1.color("#0000FF"); //设置app按键是浅蓝色
! e0 [( S: E8 G - Button1.text("开启中");4 N6 |5 D0 Z3 c. [4 u* }9 G) J
- BlinkerAliGenie.powerState("on");0 Q( V/ s5 j0 v& l+ }. d! |1 g
- BlinkerAliGenie.print();' |- |( z/ a; X$ a4 C. ]
- }* T# f8 o0 U- M
- else if (state == BLINKER_CMD_OFF)
) A) H" d4 S+ m! z9 \$ ?% U* a - {0 m* v- O# D# m
- , p8 {" q2 y# M
- digitalWrite(kg, LOW);; Z5 c% s4 q; L3 {
- digitalWrite(de, HIGH);
) y5 b# M M: W - Button1.print("off");# a$ e/ _% j" I( |+ Q+ _
- Button1.color("#00FFFF"); //设置app按键是深蓝色$ c1 `- w1 a6 t, p
- Button1.text("关闭中");1 C: ~5 D$ M& _8 R9 l
- BlinkerAliGenie.powerState("off");
+ A5 B# S$ C+ n - BlinkerAliGenie.print();
( z2 q/ o! d6 C; d; \: S; E - }- s, U. v! u d q
-
. t" e3 }: z E O8 u k" m
( P4 @% W. l" x4 }- }
8 B( b+ ?8 O4 `1 \! t; M1 F# ] - //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次. Y% ]' N% l7 u8 B, f% n( T* E
- void heartbeat()
, {7 t+ c; c6 C; c) f) v, ^ - {
. L Z. C2 A& X6 \2 W# N - BLINKER_LOG("状态同步!"); 8 Y0 u6 s' {- S* f7 D* s
- if (digitalRead(kg)==HIGH)
+ g" J3 B# e& s- ?* E( a - {
* P. F h6 [& |" e0 G; v8 ? - Button1.print("on");6 ?: m+ L3 `9 v' o
- Button1.color("#0000FF"); //设置app按键是浅蓝色
1 x8 Z# Y" ^8 ? - Button1.text("开启中");. q- q7 F8 u r; n4 [& T3 a
- }) P# @, ?* g: }/ w2 ~
- else
+ W" C: n5 m d. M" a - {
/ l- r& C% n& `6 E: [" O( P - Button1.print("off");: C( w! Q$ c4 f1 r
- Button1.color("#00FFFF"); //设置app按键是深蓝色/ b6 V# x! N- x' z9 S+ K# k% q! |$ B, @
- Button1.text("关闭中");$ y* b) E: E W) p" s
-
" h3 d L) ]' `1 `2 U - }
; E, x6 k, i: b& S- q: F7 `& V - }
k: e# q. k" n - //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
t) j% H$ a' V& A8 s- b - void setup()
3 C7 K2 p" _5 _" M' Q( N - {' V4 |" y3 r, f6 }$ F
- // 初始化串口) O& S# l/ n$ F
- Serial.begin(115200);/ Y+ W. d9 }! Q1 ` p/ N
- delay(10);7 ?. M1 A2 ~' S) E+ z0 }7 k2 f1 n
- BLINKER_DEBUG.stream(Serial);
1 W0 f) |, Q4 O* [" G( t - // 初始化有LED的IO
- e% J6 D, E* h: U% d! X - pinMode(kg, OUTPUT);
: a% n! j I7 \0 j% U - digitalWrite(kg, LOW);//初始化继电器上电状态 - r i$ X7 K3 R* c1 p5 {5 _
- pinMode(de, OUTPUT);
! F4 L1 g9 W( P" l' f [8 R4 j! a - digitalWrite(de, HIGH);
& {* O! j0 K$ }) J2 M - pinMode(key, INPUT);
6 }9 ], }& K* \* _3 e - Serial.println();4 K0 d( X: u+ h* H7 N
- Serial.print("Connecting to ");
* ] P/ [' r" E/ g- g& K& p - Serial.println(ssid);. e4 l% N# @7 q! P0 E
- WiFi.begin(ssid, pswd);
+ I- ^3 l4 {0 ~% }7 D - while (WiFi.status() != WL_CONNECTED) {
3 n L( z/ t* \* c2 d0 M8 K - delay(500);. U, \9 N- D: a) F
- Serial.print(".");" A7 Z, l. ~1 H" w
- }5 n% M# y/ J8 d+ E5 V. m( A
- Serial.println("");
/ r# L/ I7 n+ n# [. V# i( N - Serial.println("WiFi connected");
+ l, `( \* U: f9 u! b - server.begin();
' D1 r+ \8 |2 J2 A+ ]8 ^" d) s' y - Serial.println("Server started @ ");6 h, @& K( y; ]% O( J! t
- Serial.println(WiFi.localIP());
3 Y. H/ P, |5 A* u) S7 ]1 Z: W$ c - //打印出IP地址,后期可以制作显示器来外部硬件显示ip, d/ N0 V. g1 o. M
- Serial.println("To control GPIO, open your web browser.");
7 z; h$ j4 k1 w+ w - Serial.println("To set GPIO 0 high, type:"); p) O- O2 n# }, f" U- G" s; d
- Serial.print(WiFi.localIP());' n! x7 F4 n( I; ?' `- c* G
- Serial.println("/gpio/1");
0 S F" ?+ _$ r/ u* q - Serial.println("To set GPIO 0 low, type:");
7 r8 T# e% g5 z0 ^# F2 v' F - Serial.print(WiFi.localIP());; B& j' Z0 y( D0 d; a) G, V( Q
- Serial.println("/gpio/0");
0 f" |7 z+ `2 z4 A - Serial.println("To toggle GPIO 0, type:");8 O0 a5 y( U6 e, c4 U
- Serial.print(WiFi.localIP());
5 M( w$ i c9 [; j: O2 i2 i9 a - Serial.println("/gpio/4");
: z; o& M- B6 s- f( s& {; v$ d- d
% g- _" [( K3 G# Y* H- // 初始化blinker
# q1 {0 X5 L# [ - Blinker.begin(auth, ssid, pswd);
6 [. q. U; J7 ? - BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数6 ~7 e6 p0 r4 X+ w6 C
- BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数
, e- [6 r$ \) o; P4 ] J- ?: g& h" V - Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。+ f2 H2 ~! m: S r. d5 r
; J. Y# L. w, W9 ?8 O& a) S- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback- ~1 e* {0 y6 {0 L
- }, W' S. r# }5 `- a2 y
- void dataRead(const String & data)3 R2 }: r3 ~8 i( u# c, d: x5 Z0 j
- {! o2 h1 v+ V) {- G
- BLINKER_LOG("Blinker readString: ", data);
- `- g& g# W1 Z4 `
/ _( \# T- |2 z' }3 F- Blinker.vibrate();
9 u, n0 h! W% ?8 n7 T5 @: u - 6 `; Q! l7 q& k8 D6 U1 B6 q
- uint32_t BlinkerTime = millis();+ D$ q$ |9 Q( R( b& R' }( C8 R
- ' e& `7 Y, t3 V4 x4 f1 m
- Blinker.print("millis", BlinkerTime);2 o; L6 b+ n% r4 T0 E
- }
( K' z O: Q# ] - void loop()
7 L1 X7 O6 P$ K# ]9 K, ?0 J - {+ ]0 |1 l1 ?/ |
- Blinker.run();1 ~1 D& h4 \) p4 q) D5 d0 K, q) Y
- if (digitalRead(key)==LOW)* [8 e0 v6 |% L. l' C' n7 j9 f6 y0 o& I1 N
- {
- `, c/ k5 H; ^( L/ t - Blinker.delay(200);1 P2 q# O4 z( q
- if (digitalRead(key)==LOW)6 ?% ~8 S" v/ o5 z* W, W% v
- {
5 @; z [# N/ p! G0 H" b - if (digitalRead(kg)==LOW)
7 i/ e) I0 }: ~' j2 s( t - {5 D7 m& T2 @; C2 }5 }% Y H- ^
- 8 R* A# E' g0 M( Y; I
- digitalWrite(kg, HIGH); X) _! D) Q0 Z
- digitalWrite(de, LOW);8 R$ h5 K* v3 g. X, e
- Button1.print("on");: T$ z# g7 V8 Y/ Q
- Button1.color("#0000FF"); //设置app按键是浅蓝色
) ?2 U$ R( t3 p, P - Button1.text("开启中");
% L, e; W) r4 Q4 N - }$ r; C; Q" \; `) v3 X: F; o. @7 }
- else if (digitalRead(kg)==HIGH)
3 P$ s% r" e6 s# q! N - {$ N, `* s: o! q% Y Z( M/ m
- digitalWrite(kg, LOW);
( \9 }, N0 R; J1 T) t( d, L3 x - digitalWrite(de, HIGH);& ~0 ~3 Y" T6 b6 F2 h- Y! _/ ]
- Button1.print("off");; _3 O. X% W* N
- Button1.color("#00FFFF"); //设置app按键是深蓝色' r4 k. G: c7 C9 q2 D' G
- Button1.text("关闭中");
5 G f) o# A2 J - }
- L! t+ V0 N' M( c( h1 W - }
/ o$ s+ [$ W" C9 H - }
5 Z; y& H0 p2 a* J3 g - }
复制代码 " y0 n6 ?1 S, I5 V2 X4 U
: e8 x0 J* ?* M5 Y& g' y( }我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html
$ ?6 r& A+ i, I% E' g
/ H) q& n0 J1 N0 |$ b! A把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。
% Q/ j; r. B0 f( f) e
+ j: G7 m% |: n4 z6 L
7 c/ P3 W k! ^6 _. | |
|