|
|
本帖最后由 易记 于 2021-8-21 14:05 编辑 ' ^$ ~4 A [: X% \; m
f5 |8 @2 N2 R$ Q' d1 U0 [$ I最近玩ESP8266,想做个天猫控制开关。
: x* m! J! g9 }/ S但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。
9 z8 g- H' c! d6 n4 N还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。
9 U" }0 r) U# H0 t. y& P% r4 d8 t
4 p+ h! h/ j- l) O
% x) B1 c- d7 ~, w. ]* z1 J; _; T |0 H; n& I6 j8 c
问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。
8 ]3 ]# C4 M; |0 U2 E$ c9 G" B7 `/ O5 ]) j, K, V
. s8 O4 Z) _- ^! Z3 ^: F: }
! b+ t$ e0 |& I5 y4 Z4 ~* e4 A( M* S
7 b* A1 Q' P j3 T$ H( h9 w* a/ C; \8 z# A6 \
到手,当然是拆拆拆。 _7 u6 w+ p0 C. E7 F5 E1 ` X
! @7 {$ r3 J9 Q* }
3 J$ F r, G. ~
7 K& l. ^# R# q) }, w( k联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。* N6 j* u, Z. b- z
$ g- E, N) G* O" R0 t" w5 [* e
3 x, P. ]& x L' [" q- M8 L. T9 X, p2 Z
继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。
/ |2 L* m& v6 q o
7 \% l) L' j6 p% Z
) T4 a8 y& K6 m3 w, \' W
; C0 m2 e# m2 `9 f+ L2 `/ }1 k: F- y# c4 B. ?; I/ E
电源芯片# ~- ~; N4 N# y# q8 Z" J1 N
6 B. V/ h2 _. m
% W9 ?( y0 D$ G' k7 n+ f7 P( X5 g$ B A
有一个按钮,按钮有二个蓝色LED灯' V! r$ Z' ^! r Z* X, W. @
B0 S" `/ y! L" N
4 ~) ?6 M( P7 b: G/ N
1 z* ~5 i4 W5 X5 N7 B S' r8266
7 j0 E0 ^9 `; b9 `
; ]( j! u+ N$ r
9 q _' J2 x/ r4 s' B9 e# M
$ `+ w" U' {( ^: i, l1 Y
( o3 ^9 b* C/ Z$ ^/ E6 C) n
0 t6 z" E: _& d9 G接下来就是刷机了,版子上面都预留测试点。
. k- S) |" k- D. H) m: Z2 J接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。
Y) Z6 N- G" k7 g
# o/ P* I" }# y" ]' h% k+ @
注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。
3 j; Q# O, ^9 E9 [( ]) P1 l要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 |
- w8 I7 R3 z5 v* m- O+ O3 J( O, Z: X3 X; Q" T
* p a$ t$ g d0 d5 P h) m
- u% W2 m" i2 m7 {
; Q# o* m( |) j2 c$ i
7 R6 F9 s; k9 b! f
5号脚位是继电器输出- G5 i( s2 p5 }
12号脚位是灯输出2 g9 A) x4 a N* Y0 J# V
4号脚位是按键% b, T, l4 C$ @# \( g( r3 q
! _6 T# i8 ~5 ^' R7 {* `# K/ h, k- X- |
+ D4 x& N1 H5 l
, X9 \' p# c, U# } S/ p( t/ _
卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库& e6 r$ Q1 m& V! {$ f# U4 w0 L
- #define BLINKER_MIOT_LIGHT // 设置小爱灯类库
0 E, v8 _. x% d - #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库
" _" N ~' i1 W# F4 F+ M3 k - #define BLINKER_PRINT Serial //串口协议库6 x+ J6 J* c% ~2 e
- #include <Blinker.h> //官方库, X* _. Q* O0 E( j6 _5 x; i9 k9 P
- #include <ESP8266WiFi.h> //官方库
8 A% z) r# z6 ] - WiFiServer server(80); // 服务器端口号. L. d1 s0 J9 N/ d
- . j+ W2 M, ~5 Q2 I5 Q
- char auth[] = "c4942fb1d5e4"; //设备key& h, L* Z9 \3 ?, w8 \
- char ssid[] = "wanboshi"; //路由器wifi ssid7 r$ ]5 n( P ~7 r# k9 \
- char pswd[] = "1365662999813586348220"; //路由器wifi 密码 C' H1 E8 V4 r5 _# z7 [
4 l5 C Y* r: A1 [9 @- X# G- bool oState = false;) `: s+ [8 L6 e J
; C% k1 \7 K7 ^0 D- int kg=5;//继电器输出6 U# @5 F+ u; f1 R
- int de=12;//灯输出
: B, c; }3 _) s4 K# g" ~ - int key=4 ;//按键
* B* B' [% H6 k2 w6 u8 { - //*******新建组件对象! [% a) ?* m, [
, S& Y+ E* X8 b6 K! }- BlinkerButton Button1("btn-abc"); //设置app按键的键名
3 q0 b# A) c7 U6 j. u4 s2 g - //*******app上按下按键即会执行该函数app里按键
y3 z! Z8 H8 y5 ^) ^* v9 |# S# Q - void button1_callback(const String & state)
' q$ j9 m' R6 L. s; B" X - {
$ j5 Z: T: b% w6 U7 k# s# w - if (digitalRead(kg)==LOW)& N7 l. ? }) H% Q8 P5 S3 U
- {
8 E) ?1 f G* I7 }0 \( x( W* g5 J - BLINKER_LOG("get button state: ", state);
# @+ f0 K$ K3 f1 X! C - digitalWrite(kg, HIGH);
6 Q4 \: s6 ]# w0 b$ W! m4 ^2 N - digitalWrite(de, LOW);
+ P) C5 K% Q- L ^; V - Button1.print("on");5 j( D7 T8 O! K0 Z) p4 T" l
- Button1.color("#0000FF"); //设置app按键是浅蓝色
5 d7 ] |1 p- F: F$ t# P( h - Button1.text("开启中");
4 D* \+ f6 {- v9 P' T - }
( {2 `% B" J) ^" A* D! f1 ~ - else if (digitalRead(kg)==HIGH)
3 ^* K7 l* S" y - {
! T" I6 M$ r3 S8 g! ^! ^ - BLINKER_LOG("get button state: ", state);( ^4 G$ k$ T ?7 c
- digitalWrite(kg, LOW);& R I- I0 w0 ]* u
- digitalWrite(de, HIGH);3 L) z1 N, V( Y
- Button1.print("off");
; o$ T3 D: z2 o! [* f( a5 N; I1 x - Button1.color("#00FFFF"); //设置app按键是深蓝色
3 K( ~' w. j5 W# o% k - Button1.text("关闭中");
2 r6 M" ^% H: p6 R! h - }3 j7 l: p& z' u4 a% V' E% v/ @
- }- _( H2 p/ J* N6 k* E; b
+ y* }3 k9 f+ ~, q: Q- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++2 Z0 q/ j1 }: E: `
- ' ~) I5 \; T/ b6 L
- //*******如果小爱有对设备进行操作就执行下面0 |$ \$ O L! M! m7 b4 T+ ]8 g3 ?
- void miotPowerState(const String & state)
0 B, @6 ?8 v0 q/ P% [* r - {
" Z( }" V$ U( q) n0 R" M" n; t2 @& L - BLINKER_LOG("小爱语音操作!"); //串口打印
) I) I K" G% G5 }/ w& { - if (state == BLINKER_CMD_ON){
. o% d4 a, s" I. ?, D; M - 3 f/ Z: A9 s, p1 Y6 b2 _
- digitalWrite(kg, HIGH);
: {5 E# S; W! D: y/ w - digitalWrite(de, LOW);
+ Q g0 ?6 N+ y) K - Button1.print("on");( P& }4 _+ |& r! w9 Y
- Button1.color("#0000FF"); //设置app按键是浅蓝色9 V, u4 x1 N$ y: J A/ J# ?: Q. Y+ r. x
- Button1.text("开启中");7 K7 |" P0 d6 E% I8 P. |: }
- BlinkerMIOT.powerState("on");! S2 L4 m/ k8 C* q' m: U2 A7 K
- BlinkerMIOT.print();
* H7 O1 Y K( x' u# G - }
; N7 U1 p7 _: ~# ]; b1 L - else if (state == BLINKER_CMD_OFF)/ ^0 K6 D2 T3 i$ ?9 n* y
- {
. B# [ \& ?1 t8 J* ~2 R8 @3 W! J7 @ - : ~+ a% v% j; |
- digitalWrite(kg, LOW);
& _& }6 O ?- n - digitalWrite(de, HIGH);
3 P2 h. b$ c6 i. h, F! b - Button1.print("off");
& R6 y# S f1 U0 B - Button1.color("#00FFFF"); //设置app按键是深蓝色7 ?, \! W# U+ d+ e- `
- Button1.text("关闭中");
' ]$ q1 y/ J# S S, ^ - BlinkerMIOT.powerState("off");! S, s k8 E7 j: e
- BlinkerMIOT.print();4 `; P+ U$ S0 a% H; J
- }
& B! c, k* v. n -
2 y! j- ?2 f! d' |+ f -
- q. ^4 N/ Z! N& P8 P - }
/ [6 ]& l. _6 [9 d5 B6 \ - //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++& H% J5 I, f5 K/ ?' r, R
- //*******如果天猫精灵有对设备进行操作就执行下面) } D' c. d+ e4 X, R
- void aligeniePowerState(const String & state)$ i: t) ^7 z: D; P
- {
) ]9 q6 r+ K: _0 J) B - BLINKER_LOG("need set power state: ", state);
* w5 `" V6 M; Y - if (state == BLINKER_CMD_ON)
( V0 D( R5 M) W: j - {) g0 K! [; p. n5 A. ?8 G
-
8 H: y# _3 W% }, [# [+ T# O# H& ` - digitalWrite(kg, HIGH);
: r0 |6 I& t; b' X7 F6 ] - digitalWrite(de, LOW);0 A6 L- l3 u. o v8 s! N$ @
- Button1.print("on");
! M+ V, d) \( P$ W+ U3 n$ Q# q - Button1.color("#0000FF"); //设置app按键是浅蓝色7 K+ H7 `8 }& L4 w
- Button1.text("开启中");/ g6 F# p- V$ z! l0 T/ d. G
- BlinkerAliGenie.powerState("on");
* h8 v3 Z9 g; F# S - BlinkerAliGenie.print();; [! }3 J5 [6 m/ A
- }
8 a' Y$ w6 J: I2 c0 C - else if (state == BLINKER_CMD_OFF)
, h' {1 B" y& S! h - {) w/ ?0 F1 i8 z$ w$ Z7 H
- 9 k! t4 E" h7 O! O) X i
- digitalWrite(kg, LOW);/ t1 i1 Y2 `% m- a
- digitalWrite(de, HIGH);( Y! ~7 a7 }( Y0 Z7 @
- Button1.print("off");5 G2 W2 j' F& S( \5 x
- Button1.color("#00FFFF"); //设置app按键是深蓝色
, a# {* U* N$ e4 M0 H - Button1.text("关闭中");& U1 u: U, X; Y2 a
- BlinkerAliGenie.powerState("off");
/ f- A: J; n+ P - BlinkerAliGenie.print();
$ g+ C/ p* h* ]' k3 g! B0 U - }! \* c" t1 B' _+ t
- ) l3 X: l& l0 x2 n5 P1 I
5 b& Y( y# K( D2 |" q- Y* b- }: u- |+ S; f7 h+ \
- //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次1 Z, g/ H# h& p
- void heartbeat()5 M! ]. ?/ s7 K
- {
4 y* u9 @/ V4 I% H - BLINKER_LOG("状态同步!");
- E0 i) d2 ~, {$ V! ` - if (digitalRead(kg)==HIGH)
8 f: d' Y. \- M6 Z - {
% j0 C# e8 K* S - Button1.print("on");
! q1 R/ L0 P5 ]- m. l4 M9 Q0 M - Button1.color("#0000FF"); //设置app按键是浅蓝色
% x+ A3 l% m- w- m& M( U/ g - Button1.text("开启中");
4 }4 X; U9 A8 E+ S8 Y# o7 ` - }
1 C2 C9 g: r8 l. R- D$ E/ k - else
9 O9 F& ?: |7 i- p- J - {! @' [7 g! i, Y- y
- Button1.print("off");
6 f/ [( W0 M6 t4 S - Button1.color("#00FFFF"); //设置app按键是深蓝色. h. t. ?! |: Z; R% P
- Button1.text("关闭中");
: x$ J( p1 c! U) e1 M- [4 C# j - * V- W$ C0 T5 G/ y) c
- }
1 ^, x: F+ _) b' f# ^ - }
+ \2 T- D1 X9 K6 z5 g - //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
. k' Y& X' ]+ t/ @0 | - void setup()! R# K; t; m9 z- d5 k' m5 W
- {
0 B! j) @, h6 V0 [6 F2 ?$ v) a | - // 初始化串口# I @* l0 w; V
- Serial.begin(115200);
: b/ ]+ `8 _+ l+ P, Q% E - delay(10);9 M, G2 Y2 Q/ t
- BLINKER_DEBUG.stream(Serial);
% P4 K% V4 P C. n. N# q - // 初始化有LED的IO' I8 o7 l, l% j! M( f3 v N) L: Z
- pinMode(kg, OUTPUT); ! Y0 @% D: _8 ?, U
- digitalWrite(kg, LOW);//初始化继电器上电状态 @* W; B. ^ x2 I7 Y" Q
- pinMode(de, OUTPUT);
" s: j, o3 Q6 J; O; S - digitalWrite(de, HIGH);
& Y0 D* P: y! _ - pinMode(key, INPUT);
1 t' q) J* }' r0 X; g# A) d1 H$ Z - Serial.println();
4 ]2 d' q- b9 Y1 j" n* d - Serial.print("Connecting to ");
o9 N, |+ Q Q2 N - Serial.println(ssid); A4 S8 e- f6 ^0 e" ~/ u1 c' m, ?+ S1 ~
- WiFi.begin(ssid, pswd);; O# I u7 E: h2 B( S7 k
- while (WiFi.status() != WL_CONNECTED) {
- W u. c1 d& ?4 b - delay(500);
- R2 o4 A0 c' Q, K! {5 X& H - Serial.print(".");8 b/ B/ ~$ Q4 i7 ]' s* u C
- }+ S- }/ ^# o# P4 e
- Serial.println("");, n0 M+ r2 H! z
- Serial.println("WiFi connected");
7 |* E/ v0 X, o4 j' x% Y3 S- r - server.begin();
" @$ G# Q6 W5 g! R: N - Serial.println("Server started @ ");
- b5 ]$ C3 A3 N3 K - Serial.println(WiFi.localIP());" l% l' `. B* ? [ u# q
- //打印出IP地址,后期可以制作显示器来外部硬件显示ip
' q. @! Z6 t4 k$ p' \! N6 M - Serial.println("To control GPIO, open your web browser.");
' ~6 U& F: p; {' n - Serial.println("To set GPIO 0 high, type:");
' o, [7 w9 M- Y% K - Serial.print(WiFi.localIP());/ @2 `; {* f5 P
- Serial.println("/gpio/1");
7 o1 a. Y! J. s: t; ] K1 ? - Serial.println("To set GPIO 0 low, type:");
0 P: q9 G/ f+ l. C5 W% l - Serial.print(WiFi.localIP()); |( m- c6 ]( p; U
- Serial.println("/gpio/0");
' ]1 }2 y7 O; U9 {1 { - Serial.println("To toggle GPIO 0, type:");5 N3 A4 m* q9 i* ~6 a3 X8 V. N0 a7 @
- Serial.print(WiFi.localIP());8 w* r1 {% W) c# u
- Serial.println("/gpio/4");6 b1 `! m9 S( @4 Z8 z
) k# m6 y' R3 ]4 M; E: r# F5 |- // 初始化blinker
+ C8 H" J* U1 q4 a6 E4 f - Blinker.begin(auth, ssid, pswd);
T: I# F: u$ z" u4 S! e% Q3 g9 h4 E- d - BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数
* ~( y2 u: M% s - BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数4 ^( K& f) L) ^ m; m
- Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。 S( S8 O& R/ |2 `0 o
- 6 I- q) D# K& C5 |* U+ a
- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback
5 }3 @1 M* D8 X1 r4 S! I - }
3 A* j, X/ N5 V* H) z% H$ Z - void dataRead(const String & data)
, z& {! K& O9 n" `9 V: e - { K2 m F6 z7 I& G# V
- BLINKER_LOG("Blinker readString: ", data);
8 F3 P( Z) R1 \! V) y
: `) |* b7 G5 s0 h- Blinker.vibrate();
) J* j. J, \1 n - - c# u% B) U+ C; N u4 }
- uint32_t BlinkerTime = millis();
& G5 P. t5 x* y1 V - ; C& D/ F c5 K; U3 O, q
- Blinker.print("millis", BlinkerTime);
$ B) r1 ]3 _4 U; F/ y - }
, S* s- k: x( d# G( R C - void loop()
2 H& j3 { Y4 c6 Y/ w - {6 ]3 h1 h2 s& \/ K1 @* E
- Blinker.run();2 T9 p8 L8 `9 C
- if (digitalRead(key)==LOW)
: {5 y( Q) Z0 O0 G' e2 m2 u+ } - {, b$ N. ]& n. T: g6 E; p: V
- Blinker.delay(200);
8 E U: ]7 l O9 D7 ? - if (digitalRead(key)==LOW)
- z$ c1 A1 J3 L& J9 p, P - {
6 q8 ?' A/ Z d - if (digitalRead(kg)==LOW)
; x9 c% ]4 S9 j - {% c/ M) c: H' C& T8 L! J! r
- / w8 \3 m0 u# Z6 L
- digitalWrite(kg, HIGH);) T- Q4 ~7 |* U" l( `# A9 F* T
- digitalWrite(de, LOW);- z- m; l! I. Q1 ~: r
- Button1.print("on");
- c5 Z* {4 K( {4 g2 [+ S( T - Button1.color("#0000FF"); //设置app按键是浅蓝色% F/ G# T0 B) l6 K; T% W2 K$ P5 j4 V
- Button1.text("开启中");- _9 I$ N) s' X9 U
- }5 ^5 c) n( L5 C. ?4 U! p# Q
- else if (digitalRead(kg)==HIGH), c/ ]2 v" U- L/ n, V3 C$ ?1 g
- {
" k; Y8 v3 e3 L8 t* v0 H8 p, p - digitalWrite(kg, LOW);
4 z2 ?0 E1 r) ]' T: {6 V - digitalWrite(de, HIGH);6 r% P9 j" O/ D" o! P V
- Button1.print("off");8 p8 C0 A2 G4 n* }- p# A
- Button1.color("#00FFFF"); //设置app按键是深蓝色
: a( Z: B ^" i1 G+ f& ~/ V - Button1.text("关闭中");
1 L1 L* O8 j2 y: |' B - }, l3 q$ i5 e4 Y2 E8 K) q: c
- }
- P" ^* J6 Z$ H# g - }. B5 t: @# w8 A4 T% a& t( t+ d
- }
复制代码
/ z/ L) D7 |9 E1 E$ Z3 I- p; C# [8 A4 N( B& \, F
我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html7 J; u0 k' r. R Q
) w! g1 O! W, k5 Q- w$ ?/ S! t把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。
* p0 m4 R9 F& ?, n2 w, C
/ l4 k) B* q+ A7 l5 C7 _1 @% n( R+ x" t( o* Z- u& j5 N3 x
|
|