|
|
本帖最后由 易记 于 2021-8-21 14:05 编辑 ' A1 y$ E7 p# ^" n6 r
0 A) M- C/ ?/ W8 K: L! |) \& n
最近玩ESP8266,想做个天猫控制开关。
1 A7 b8 M5 {9 t4 _$ j; J但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。
# A. J- T) n; m$ w" @5 G; W还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。
1 l$ k; U6 W& ^8 Y$ G- {
# N/ i9 a3 b0 k- Y) b
/ i) X2 o: F, d
' d8 T+ s; n9 V2 R8 A" G问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。
+ [! L5 o9 i$ s! x/ y: N
- t3 r8 T6 {: P Y: b
; @8 ?$ Y0 L2 `
0 ] n. I/ H7 X' @
( e+ }$ c1 G, w/ q- ]3 C$ |7 e R' G; @0 d1 s) m
到手,当然是拆拆拆。
8 A+ U- v% @9 G, Q; C% t0 b
+ D' f% G9 S1 t& B; h, j* p Z4 U
& }# e3 T9 S9 W7 N! ~/ M: I5 e
/ `/ Q) h0 Q7 i$ i/ R联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。; Z# x0 u4 j5 @% V3 z7 m- ?
# l* F ^1 y* R4 d
: v/ n0 D, q& p1 y7 ]. L- B+ F' R K& C: r
继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。
' G8 \, n# R7 L s) @1 Q& }
{1 Q+ z3 j a6 ~9 X) V; D' A Y2 f
: E* N6 Z$ r- r9 p
( W+ O8 B5 F. R: Q* f' v- Q电源芯片% w1 n6 ]" V% C7 [9 X( Z) {; m) i
( W0 s% H* I* _+ f* ]0 [
: K7 d# }4 b" a. ^. X+ {. U k7 X1 }( C: S" ]$ |% X
有一个按钮,按钮有二个蓝色LED灯
( y1 p/ c h/ t& X% S$ L
& i6 z% S; i1 C
9 X$ P# z9 T5 I$ o$ |! h; C, S- T
8 H4 J! x2 b- n. Q/ K. \8266" s9 B) S1 y2 p3 y. W2 A5 M
' M+ Y# f* z3 J/ s. w* x2 R
& L8 x p- y; H- n: u! f/ J5 W1 Q) j' |& F* q
# y' f- i& A: J' @
( o3 u( x5 V* m/ X9 U
接下来就是刷机了,版子上面都预留测试点。
0 h- Z. ~3 N8 g, e% l: ^接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。
4 {" |0 L- Q% t4 j$ z
( X; j- q3 [# ]$ x& _2 K
注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。+ x+ j- @: n2 _2 Q* A; t
要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 |
3 a' W: R4 b# @% c7 B$ m# z4 a+ V% `/ W- x+ E4 u, d
$ s6 w" X, X# `! F: N O) U
4 E0 E: @4 N- ]3 E
5 H' V1 i5 j& h( |) e* D" j: a9 B
5号脚位是继电器输出
) w# q& w" b' L 12号脚位是灯输出! W; \) B i$ a' b) K
4号脚位是按键
' V g9 R/ A" \, H$ [# D6 W0 k! i7 [6 v
) a! T# q% A) T+ \4 n& V
1 ]# B$ b* S1 o1 x. i, V% ]3 y% M$ E2 E9 j9 F: i( z: F* S3 K
卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库8 s, L! W+ m# J. t
- #define BLINKER_MIOT_LIGHT // 设置小爱灯类库
6 E9 p5 @0 M' q* N% v - #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库7 J' H: _+ R. @* G
- #define BLINKER_PRINT Serial //串口协议库
# }% v9 f+ }, j, K - #include <Blinker.h> //官方库
0 X, j H, H6 n' T7 H3 t o$ _ - #include <ESP8266WiFi.h> //官方库" S* R2 o. q. y! d$ P- x
- WiFiServer server(80); // 服务器端口号
a5 Y: K# L0 G- |5 c
: F- d" M0 e4 b( C; g# \% E- char auth[] = "c4942fb1d5e4"; //设备key
$ w6 J% r& @9 J* K0 D( K - char ssid[] = "wanboshi"; //路由器wifi ssid) o5 d3 a- _. Q j
- char pswd[] = "1365662999813586348220"; //路由器wifi 密码$ y4 L! Z. o4 r4 f' e, C
- 7 s' m8 M$ ?& }3 ~# P6 q b% \- a
- bool oState = false;
: s( ]' f" K" [( y - 8 R- c) v1 u w
- int kg=5;//继电器输出; `! @; s' f" i" ?2 c0 k0 q, }
- int de=12;//灯输出
0 ~* W/ X& o. P9 O5 ?; [ - int key=4 ;//按键+ Z/ C$ e$ w; N9 |. K9 b' T2 Q
- //*******新建组件对象3 u j; H o+ p5 n* k1 o: m3 @6 H
- 8 Q) P- j4 J$ K$ O0 z# x
- BlinkerButton Button1("btn-abc"); //设置app按键的键名( P% K* P O8 u. w3 ^7 _3 L
- //*******app上按下按键即会执行该函数app里按键
, g: j; z4 S4 v - void button1_callback(const String & state)
* s- L# I8 R; q8 j7 }0 Q x - {
) H& E+ Y6 K1 [" p* b - if (digitalRead(kg)==LOW)
8 N4 ?* Z I1 d: c2 r: E - {" N) J7 \* G0 L0 _' s! E8 {
- BLINKER_LOG("get button state: ", state);
: n( l7 b. Q4 r% _ - digitalWrite(kg, HIGH);' j5 K. q8 v" z! P" P8 }
- digitalWrite(de, LOW);5 `$ ]% a$ A, N$ z6 D- d& |
- Button1.print("on");
1 \1 e, o; Y$ v" g1 r* Z - Button1.color("#0000FF"); //设置app按键是浅蓝色+ Z0 {' E9 A' K) i* Z
- Button1.text("开启中");* H& L# U, N: V9 S" A. V
- }& [9 k% B. P; X& s& o$ W J
- else if (digitalRead(kg)==HIGH)
0 L8 s6 P4 A J y1 H9 \% ~. S5 K' @ - {+ ^) x2 n3 d) M P8 S) N# ?
- BLINKER_LOG("get button state: ", state);
* M/ D7 G+ d- r/ D; U - digitalWrite(kg, LOW);
: E( J0 Q6 P. B) ?! S F - digitalWrite(de, HIGH);
/ \& i8 N7 }. f2 O1 I8 _: |2 s - Button1.print("off");
1 Q& ~) W- v- `, L7 t - Button1.color("#00FFFF"); //设置app按键是深蓝色) {- T2 h3 m1 G4 S4 D+ p- e' e
- Button1.text("关闭中");
! ~6 x, s/ [( J/ Q. J - }
' R" U1 k& h2 w U - }
7 w- V- R, O6 T$ [* L
0 c7 V- C+ q2 E: n; q- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ b9 h, l, {- o. O+ v - 8 Y$ l0 L) e* v7 H4 E
- //*******如果小爱有对设备进行操作就执行下面
- A, d. e; O3 V2 c/ x: N1 h& r4 } - void miotPowerState(const String & state)8 f) u4 ?+ ^3 S% @
- {$ S. k2 o! \: y6 u! d5 |
- BLINKER_LOG("小爱语音操作!"); //串口打印
$ j3 z; y Q! ~/ T' j6 ]7 }( y6 T - if (state == BLINKER_CMD_ON){8 J6 B6 `1 {$ r2 y* [' c& v
- 6 F, F, H2 L0 c& C- P
- digitalWrite(kg, HIGH);
6 z0 n% Q# ?" q0 U! | - digitalWrite(de, LOW);
0 ~! ], M Y* u - Button1.print("on");: v4 ?. i4 B* G* \6 I7 z; |
- Button1.color("#0000FF"); //设置app按键是浅蓝色' y& C! h5 I$ W7 x
- Button1.text("开启中");% i5 E# U# L, |5 m7 B
- BlinkerMIOT.powerState("on");
1 P5 S' o% L( `# g - BlinkerMIOT.print();
9 u9 d# @8 @: E4 I# z; n% n - }
0 Y0 }3 O- E' R% K$ n - else if (state == BLINKER_CMD_OFF)
4 R. o: e; e( \5 Q C - {
: H* J/ s6 y* `+ q& T9 y - ( ~2 S. G8 Z* ]( Z! g& U0 z
- digitalWrite(kg, LOW);2 _( N3 w2 T y- l8 x
- digitalWrite(de, HIGH);
. ?1 H+ u* Y' D" B& X3 C% G - Button1.print("off");
: m+ i" t/ v. H& L4 [ - Button1.color("#00FFFF"); //设置app按键是深蓝色# G& K$ g+ l5 `% [
- Button1.text("关闭中");
% M- ?$ n" [. k - BlinkerMIOT.powerState("off");. u4 P& u6 s, D, w& q, T& [- X
- BlinkerMIOT.print();4 ]% q2 b( r+ k. [/ n0 K4 E; A
- }
& K0 ?) s% X' B" F+ z& X$ Q, L -
4 A0 r% X z2 Q9 k - 2 t7 k3 {2 r, o" P2 v7 U2 P: }
- }4 }& H& O* g' q
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++9 s$ E* J h; {2 h% o
- //*******如果天猫精灵有对设备进行操作就执行下面
" ` M3 I1 [" i! H$ v - void aligeniePowerState(const String & state)1 j) N( z+ R$ g+ f! O4 i
- {9 y Z8 C0 H) v) t' |
- BLINKER_LOG("need set power state: ", state);. x ]; R2 S: x+ X* X6 H0 X' r8 j
- if (state == BLINKER_CMD_ON)
% [# [0 f. k8 k8 P7 I4 N - {
" T2 h, Q, B; G. _: n) M' E* g9 X - & V. v" i: W; R" f7 \* V% Y
- digitalWrite(kg, HIGH);1 H* x$ h ~: O" q7 q5 _
- digitalWrite(de, LOW);8 B; U3 n: ?1 _6 m2 X3 g
- Button1.print("on");
% S+ @; f g, ? - Button1.color("#0000FF"); //设置app按键是浅蓝色
5 `6 r4 [1 Y: ?' v& F - Button1.text("开启中");' c- P5 _1 N0 b! P- F. P
- BlinkerAliGenie.powerState("on");. d3 X: \3 H; w* w% T- ?
- BlinkerAliGenie.print();1 r g( X# ?2 H- M
- }
9 j6 V0 N7 x# i" d7 y% v - else if (state == BLINKER_CMD_OFF)5 O, f' l1 \8 _' V/ X* ^/ {2 S9 ^
- {5 S- k( j* X6 L) E7 v( @5 }4 ^# [5 z
- * ?& ?) A- `8 V
- digitalWrite(kg, LOW);6 X+ ^) x; k' T3 Z6 P* B) u- T$ h- I
- digitalWrite(de, HIGH);
4 T4 Z6 \9 N# w - Button1.print("off");' S/ Z v/ w$ z! r, b1 ~4 }
- Button1.color("#00FFFF"); //设置app按键是深蓝色3 G: @! s7 V4 Y; ^% B, _" F
- Button1.text("关闭中");# e3 [5 }6 o! c; V
- BlinkerAliGenie.powerState("off"); H, w; b* s) A! W
- BlinkerAliGenie.print();
: W% D* N! d+ @2 B+ O - }* L8 ^, `; g5 F
-
5 i8 n. C* [" X* r/ u/ e8 m& Q, X - 1 Z1 [3 n. q$ ^( t' [: q9 x
- }
* P2 [# f. u7 K5 n - //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次3 Z" `5 \9 l; {* G
- void heartbeat()! P* L) ]/ H) b; B/ X$ q$ ~
- {) |2 k' y* {# I4 X. [
- BLINKER_LOG("状态同步!");
+ F6 C% s+ q: F9 V+ u+ \ C! O - if (digitalRead(kg)==HIGH)
: H! _5 O& B6 c0 W0 [0 ]( z$ ` - { 3 L* s' {4 t/ g& l
- Button1.print("on");# s4 Y9 T' o$ K# @. `
- Button1.color("#0000FF"); //设置app按键是浅蓝色8 S+ a, L+ Q* Q! Z5 S {0 X
- Button1.text("开启中");# T8 _4 _ {3 D+ m, c& J" `5 i
- }
% c6 f" F+ J5 W - else 5 X% d6 `% x+ D/ d& c
- {# E+ D3 b& O* H: v
- Button1.print("off");- |) B5 E6 s$ U8 p& U
- Button1.color("#00FFFF"); //设置app按键是深蓝色
9 A7 R' Y/ Z( S4 D7 Q% [ - Button1.text("关闭中");9 I* f1 y+ v2 y- W7 k5 \6 ~( ?0 c1 y1 R
- " i9 B; z: ~1 W$ D; v8 p- d6 D# o
- }% m6 b1 I, F- h: \
- }: ^, \; D. b2 ^8 k1 u; [
- //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++5 f0 l+ O- y$ A: b$ s4 Z& q
- void setup()( w. x$ O7 G% ?8 Z1 c8 N
- {4 [6 t0 j ~8 b1 s4 s! Z
- // 初始化串口
4 E( G4 L+ N( Q" q - Serial.begin(115200);5 T# k$ u z' ]! F: `8 L8 i! \
- delay(10);
# k# F) l" ^$ V R6 o/ K6 U: ~ - BLINKER_DEBUG.stream(Serial);. A$ t. b+ j: \8 A9 q
- // 初始化有LED的IO7 t. ~9 r* k6 \: z; J4 A$ q7 H
- pinMode(kg, OUTPUT); + o/ V; `1 R4 d1 o( N9 {
- digitalWrite(kg, LOW);//初始化继电器上电状态 # \+ k0 Y1 @0 M7 Y4 N9 N. f% z% U4 D6 O
- pinMode(de, OUTPUT);, |" ]+ p: h9 s
- digitalWrite(de, HIGH);
" Y; V8 X3 i# b E M8 k0 ^* z" w - pinMode(key, INPUT); , b* E! w0 u& K- h
- Serial.println();4 u# u L8 r$ _! T$ C: G& a; N4 l
- Serial.print("Connecting to "); D. |0 J4 o @+ n& ]5 P8 F
- Serial.println(ssid);
9 A6 V) I6 y: s4 G1 t - WiFi.begin(ssid, pswd);
/ x) Z: l7 I$ v; `0 O! ` - while (WiFi.status() != WL_CONNECTED) {" c7 |- e. q- X5 O, \
- delay(500);
8 e+ n( m. h! V- f# k7 H' ^: g# v6 p - Serial.print(".");
. [( l8 I6 T: | - }
/ X& i* g& M9 m7 ? - Serial.println("");) j0 A0 o9 \+ y9 l7 `8 N
- Serial.println("WiFi connected");
2 B( \* y N0 q" K: d - server.begin();
) B; I$ p8 ?2 q# [* Z$ v2 A - Serial.println("Server started @ ");2 @5 a4 I7 \2 _( r" y+ T+ M
- Serial.println(WiFi.localIP());+ E% b! Y- T( N( y
- //打印出IP地址,后期可以制作显示器来外部硬件显示ip' d& E1 |! ~0 w5 n& H! I
- Serial.println("To control GPIO, open your web browser.");
5 c5 ^$ c5 j' A+ u. N" f - Serial.println("To set GPIO 0 high, type:");" @% H/ @! K; D# b0 B! Z' [# u# f1 A. i
- Serial.print(WiFi.localIP());
, Z5 q' F+ B5 n$ d$ k - Serial.println("/gpio/1");
. p3 h6 Q# B* @6 T7 w+ s0 D - Serial.println("To set GPIO 0 low, type:");
( u6 x5 k6 Y, _* o- ~, e2 Z - Serial.print(WiFi.localIP());! {, a5 _0 s. x( Y" @. T
- Serial.println("/gpio/0");
. ]9 t+ b$ J0 U9 R( \ - Serial.println("To toggle GPIO 0, type:");; q2 }" }( X. } G* F+ F
- Serial.print(WiFi.localIP());
! Y g. K1 t2 j, a% Z# j5 r - Serial.println("/gpio/4");
- V; x! r1 |, i' M1 s( ` - X: r/ W" o+ O' r+ A! U% b6 S
- // 初始化blinker( x1 e3 \9 w j* g
- Blinker.begin(auth, ssid, pswd);8 `# [+ d' Y9 i: G) _; R2 h
- BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数; s0 {5 ^9 O2 {0 h% s/ f* e
- BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数
. m. ] x" j: O& N; a) ? - Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。4 w) o8 z* k5 Z2 H5 c" [* w1 q
$ v* X) r" F( R7 n- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback" X6 I/ Y. k: i
- }: m2 I- s. x# H. [- B; v; o
- void dataRead(const String & data)9 g0 Q1 Q, J+ B2 m! _2 `; ?- D! [. N
- {
! z9 R9 C) N$ N. t# E7 T - BLINKER_LOG("Blinker readString: ", data);! [/ {* l# \' N4 N- \. N
3 E+ Y0 r* {# G1 e. k' |; K. a) x- Blinker.vibrate();; t: V% }3 t7 [) I! S
-
6 v/ @; w' @9 r4 g - uint32_t BlinkerTime = millis();3 T7 i* I: Q/ p% e$ e
-
+ w" D. Q) w$ K: C - Blinker.print("millis", BlinkerTime);" y8 e" P2 |$ Z/ Z0 k
- }& h$ O9 Q1 y6 j
- void loop(); {& y# ?% S0 F2 q4 S4 ]# O( R1 H
- {0 v( x7 d3 t" D# } L8 _
- Blinker.run();
" \8 M0 m9 ^6 e7 ?& P5 I - if (digitalRead(key)==LOW)
# j2 C% ^4 `7 j# n - {7 n7 d) U# `: Y d" B1 r, z
- Blinker.delay(200);+ o [% K4 l4 M" d8 u8 \2 N
- if (digitalRead(key)==LOW)
9 ~# J9 N% n. y! c - {5 ^ N" [- C5 U, R" D- N
- if (digitalRead(kg)==LOW)) t) c" V1 F* K) K
- {
) A+ ?0 s, n f7 t5 } - + U) I9 L- m' I! s$ h% c5 [
- digitalWrite(kg, HIGH);
$ V G E! |) t$ ]- R9 g! H - digitalWrite(de, LOW);; U7 I i8 X5 e+ I8 z) g
- Button1.print("on");5 W! z8 Q. g: S& C- h0 H
- Button1.color("#0000FF"); //设置app按键是浅蓝色1 J& u( Z4 m# d8 ]8 M; y
- Button1.text("开启中");
4 _) Z* V; T+ Q: O7 L7 u, w - }
5 k: c% R$ T1 {# ]; \4 z+ R - else if (digitalRead(kg)==HIGH)
+ R6 S" U: Z6 k. {4 { - {# S1 l: t$ Q( b, D1 O
- digitalWrite(kg, LOW);
) _0 c; c* g( d; k* E$ h7 m4 C, z* k - digitalWrite(de, HIGH);' m! n b8 f! k% b# G" v7 ]1 o0 {
- Button1.print("off");$ t. |& |( r- W' P i, Q# e
- Button1.color("#00FFFF"); //设置app按键是深蓝色
# ] J; [! R3 I4 M1 z - Button1.text("关闭中");
6 |+ J2 m, b( e - }
N, u: I5 J5 e x! w! z - }9 J% O8 E2 |* ]: n% {
- }$ V- A1 Q7 b9 I: P
- }
复制代码
8 L5 o, Z& J o0 \' l/ X2 B. |
' @, l \' x2 w. ^' ? y我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html
# E5 [$ q) U/ x2 f* q. Q
# X3 _9 F! c( r- O把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。
! @- v% a# Y' ?6 r6 H
* i( H/ A9 d( d& \( _% U; O! R, v0 V' ^; `$ o. ~
|
|