|
本帖最后由 易记 于 2021-8-21 14:05 编辑
9 F$ Z+ h! W5 T
# }: K B, y- x* S) y+ Q' o最近玩ESP8266,想做个天猫控制开关。& `/ B0 i# }4 B; V
但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。
5 x4 d3 x# _9 y, t" c0 M) W还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。
) c1 R# h* p( E5 Q
# M5 Z( F$ Q5 t b5 a
# }# S z; T+ h' u* M
. ? r+ s M0 k
问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。: l2 s0 b3 h; S; `8 i
3 `3 T' a+ a5 R3 D B; O
" ^9 K! n- s" s' j& Z1 x5 s0 }
Y* ^2 _5 Z$ }
( c( w5 W! b7 x! f& J
1 _+ t1 M' z& T/ a5 z到手,当然是拆拆拆。
/ t) G( l; N8 I
$ ^& k _2 |5 p X
7 j! B0 e+ M* y' p
& C) W0 f$ ?$ y5 }" B e! u! k1 B
联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。
8 O5 } @; e% M
: ^; N1 G! m: v5 h/ q1 [4 b# [" R
; S4 n/ Z- l# g2 w! R2 ^: W0 Q, I2 h
+ f2 P* b3 {$ i; a- Q' _继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。
; q* G% l7 l$ s
2 p3 ~% D) d4 N. X! t7 G) C$ b3 Q6 q/ k% P4 t
. A$ g l4 D! d, P. L- ]/ }, F% v- y9 W
电源芯片1 v( M3 s1 i* L
9 L$ V4 L& M" @2 I9 S
9 g* a9 R1 C1 y5 ]9 q) S8 X( v8 E/ t) T# R/ I
有一个按钮,按钮有二个蓝色LED灯
' }% |' s% |9 J" ~+ N/ v
$ w+ e, U" i: O) {; n5 P* ^. N% Z/ l6 i v2 s! o8 X' S; I
9 l+ N3 U n9 R6 D
8266
/ u' U, n" X2 e
2 V! i8 @) r a
0 ?3 q. C5 x! e }$ L- p
! l+ g6 R' z6 K5 i; w
3 Y; i1 K, @- V' S
$ `; R# y1 M+ e1 d$ }( m, W接下来就是刷机了,版子上面都预留测试点。
7 o R+ ?9 J5 ]& p# J接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。9 k7 Q( U0 R! W* r4 D( v
* n& x* h# ]# h注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。' \- L8 Y! M( a6 q3 g& Q6 D8 D
要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 | + X8 ] B; W- @! Y+ g! o/ t* \
. H6 p! q D) o, _% S) g; Q3 r$ t! p; w# H. b- K
3 _$ h& G; W: L4 d7 h7 C& H/ l5 z
O- M2 \) O5 v) W4 v9 R2 c9 j* n
5号脚位是继电器输出8 U# J1 N5 L7 I& }( n6 Y
12号脚位是灯输出: z# p. b! e" k
4号脚位是按键: j# h# ^0 d# W* u% Y- d/ ?
: R& k" a$ A0 i9 H: a, O) {+ p# Q# Z0 A' i6 u6 [
1 M+ L W; z& a
2 A9 r$ Q0 H% i! Q1 F: q
卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库% \( C- c+ s) R
- #define BLINKER_MIOT_LIGHT // 设置小爱灯类库5 x( {/ V8 O- X
- #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库
p: I: s2 ?, X k - #define BLINKER_PRINT Serial //串口协议库/ B3 f/ j4 ~ w2 l& U9 J N
- #include <Blinker.h> //官方库; r/ r+ }* K8 U3 }2 i9 t* i. P% }
- #include <ESP8266WiFi.h> //官方库
& d9 ?" e, z9 s2 Y; Z+ R, c- m' A - WiFiServer server(80); // 服务器端口号
' ?, O+ u2 q {7 M' N - - g+ F8 x/ F5 e6 a4 @( V
- char auth[] = "c4942fb1d5e4"; //设备key
! E( p! c4 a# P( g - char ssid[] = "wanboshi"; //路由器wifi ssid0 w7 Q: i% G3 I) }* [: p" g b! r
- char pswd[] = "1365662999813586348220"; //路由器wifi 密码
~; e$ T# n/ r$ Y6 k
/ W! `3 @! O+ o7 c: L- bool oState = false;% R" [. Q8 V3 y1 S& ^; W8 y' j6 b: T' r
% x9 O, V7 o. a, c/ Q6 [- int kg=5;//继电器输出
% a7 y: T* O* W - int de=12;//灯输出$ [3 D# g; ~$ {
- int key=4 ;//按键- h6 w' ?% V0 h" Y
- //*******新建组件对象. d% O0 J4 v+ |& y
- ( ^! E6 S& K1 _; b
- BlinkerButton Button1("btn-abc"); //设置app按键的键名8 z" C! h3 \8 k9 _
- //*******app上按下按键即会执行该函数app里按键
# V* _$ I! e# M g- M - void button1_callback(const String & state)* O- z# U ?4 r( f7 O
- {
4 n) s% |0 M$ X9 R - if (digitalRead(kg)==LOW)
4 C. ?3 u- \' p% @+ f# r; t - {7 Y! p5 b: j. D) t
- BLINKER_LOG("get button state: ", state);
4 i8 \+ s. P) Y, f* T+ b - digitalWrite(kg, HIGH);2 Y1 f$ B6 a+ Z
- digitalWrite(de, LOW);
# @0 |2 {3 W3 h+ p. Q$ i" x - Button1.print("on");7 O1 y' T* t* D5 I' M4 t7 z9 N# [
- Button1.color("#0000FF"); //设置app按键是浅蓝色
) j3 i; f9 Z# I2 N% n - Button1.text("开启中");4 y% p8 X( _" B( ^( o6 W0 t# G" D
- }
# |4 Z0 h" Z" ]& v2 s& X - else if (digitalRead(kg)==HIGH)$ u" I# h+ w: k7 k8 t8 ?
- {
9 Q, J1 T6 G2 z - BLINKER_LOG("get button state: ", state);" n5 F# q9 e' T" V8 |: `' p
- digitalWrite(kg, LOW);
* s4 V7 k( M/ r- N" J' z - digitalWrite(de, HIGH);
8 B% J& J" c( z7 h5 V. q5 @2 B1 z; ^ - Button1.print("off"); A4 ?/ {0 M9 y. s
- Button1.color("#00FFFF"); //设置app按键是深蓝色) ^8 v( K; r# l* b# G
- Button1.text("关闭中");
; k; V0 M; V* |( c- c3 `' f8 d - } w: R/ i' z1 r3 ?0 H+ N+ B
- }
* c) A# S* V% F9 Z% o( x( {$ O9 [
( H8 i, q/ F4 z- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/ P4 l- U# Z+ e1 ]4 { s4 J
2 J, h: K8 u6 w- //*******如果小爱有对设备进行操作就执行下面# B5 E) Z9 w4 \) b4 `$ g
- void miotPowerState(const String & state)# I9 M0 \/ {+ `8 a$ K' V( m
- {2 m5 i9 |4 x) y
- BLINKER_LOG("小爱语音操作!"); //串口打印
. ? `1 k. B$ Z- B4 k. J; k! H - if (state == BLINKER_CMD_ON){
) ~( G( Z& s& e/ e! D; r - 3 F/ T6 } N2 L1 F/ X0 `
- digitalWrite(kg, HIGH);+ i* n4 \* U# B
- digitalWrite(de, LOW);
; b3 k, Z7 ~* X3 F - Button1.print("on");9 y- U) r7 }( U! f9 U! a3 K
- Button1.color("#0000FF"); //设置app按键是浅蓝色' X/ Q$ H) ~/ ]: f" A' P
- Button1.text("开启中");
. }& v" ~) \6 S - BlinkerMIOT.powerState("on");, x! j! w" V, n- {4 M# w/ u2 w+ O
- BlinkerMIOT.print();+ B- L3 ?0 J( e0 \
- }. t' E" z1 J: ~# N
- else if (state == BLINKER_CMD_OFF)" I; Z6 K, t# L% a1 T* `5 Q! ]
- {
) ]* @6 e: [8 f& T# C - 6 m5 q$ `7 _+ c8 I5 O- S1 `8 ?* w' l
- digitalWrite(kg, LOW);9 H% S1 K/ k6 r8 Z6 |0 S8 Z
- digitalWrite(de, HIGH);
/ ?9 J4 q8 y: O* E: s4 X - Button1.print("off");& w: c, i0 w& k
- Button1.color("#00FFFF"); //设置app按键是深蓝色
7 `6 d5 M) h. \) \3 Y6 [/ ?! N9 L - Button1.text("关闭中");5 y- d+ l4 ?: M
- BlinkerMIOT.powerState("off");
0 g6 ?; a' |( Y$ F - BlinkerMIOT.print();
8 I/ ~* g, F% G" [+ a2 k/ P, M$ @0 U - }& }! }/ c$ _ d6 M- e$ r2 ^+ ]
- 0 y6 ^( s+ @- {7 ~2 O' ^% y: I% C
- o( b$ J8 G# p3 G6 g; \
- }3 I) ]. y% P# s5 V+ ]! t
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++5 F, a6 H# v2 j3 L8 [
- //*******如果天猫精灵有对设备进行操作就执行下面
4 q3 H( I7 W' V9 z - void aligeniePowerState(const String & state)7 n6 J+ w. H2 P! p3 g
- {; z7 U: x5 [- k8 }( o4 b) i0 `( _
- BLINKER_LOG("need set power state: ", state);0 S/ O! B1 _% f. n) j3 b
- if (state == BLINKER_CMD_ON)
a/ R$ z& {' c; a( y - {7 x# k: a7 n2 [* z
- ; }0 w% g8 ^9 ]0 o
- digitalWrite(kg, HIGH);$ ]. M# [8 r+ \. ^% {
- digitalWrite(de, LOW);' q5 }( p+ u" C2 m( Q' t
- Button1.print("on");5 z9 K7 W: S! L, G& U4 a, N" D9 t. L
- Button1.color("#0000FF"); //设置app按键是浅蓝色( `' Z! r8 X- p
- Button1.text("开启中");
/ s0 F( ^4 I2 T" R, V/ j- U8 u - BlinkerAliGenie.powerState("on");
' z' K% x* J* |$ S8 S1 T$ A - BlinkerAliGenie.print();* I- F' p1 }7 w8 h" N& J1 L
- }/ o) {9 y, D2 b! C$ a% i& E% M
- else if (state == BLINKER_CMD_OFF)3 C& b' W# ]0 y. Q+ Y, \) W
- {
, ^& d+ j4 e- q. j -
1 }$ l/ S4 U0 U - digitalWrite(kg, LOW); G* @8 Z5 {+ T* I
- digitalWrite(de, HIGH);
* n1 ~' ?+ C$ H4 `3 U - Button1.print("off");
& X9 j c3 M! q( V- v8 ~ - Button1.color("#00FFFF"); //设置app按键是深蓝色# g. V+ B- u: P* b, d% v4 k) P4 ]
- Button1.text("关闭中");2 ]7 J; C/ _: N2 V+ l* _
- BlinkerAliGenie.powerState("off");
1 b3 u) S$ O) p+ t% g6 | - BlinkerAliGenie.print();: G, M+ Y' a9 F0 ~" R
- }
- b/ f9 {* ^6 k, q - ( F* K' R- `, \) w8 q. s
- - {/ v' B8 \9 g& J2 @' E/ T/ S
- }3 S$ g/ y8 r/ Y$ _/ z" z3 _
- //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次6 _( C# f8 N4 e t
- void heartbeat()
* _ y* ]$ K( t2 D) V$ U7 R - {9 t( h% n) g. q4 Y2 m8 b
- BLINKER_LOG("状态同步!"); 8 Z! a5 J' w6 Z7 c
- if (digitalRead(kg)==HIGH) 5 x. u) O6 D T) [. C, |6 X
- {
" q9 p; W, j" Z: o* t8 H9 N - Button1.print("on");
: C8 l0 K5 \+ q% w$ \& d; f - Button1.color("#0000FF"); //设置app按键是浅蓝色$ E& M& X8 i0 g; f7 B* Z/ t5 G
- Button1.text("开启中");
4 \" b% U: S# p% U/ ^& m - }. g, ]+ C8 i/ j
- else
2 z7 {0 q7 O) a - {6 g( Z; ]3 x' l' s6 N# n
- Button1.print("off");
5 ]* F+ w; \/ O1 F. V - Button1.color("#00FFFF"); //设置app按键是深蓝色9 R5 |' [- Q% }! ~& B9 e
- Button1.text("关闭中");( N% _( X9 N0 ~# D& P! B/ e
-
% C! w- q, T/ e0 F' Z7 X" @. \ - }# C1 |' `$ D* d3 B8 f# |! R
- }3 r! W! K' ^: @7 d0 z/ i3 ^% R
- //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
8 Q; }. f( o' u G - void setup()
# T) [5 d% V! H2 H" Y, }* U - {: r/ i3 Y2 u3 T; t; X7 I9 J. m
- // 初始化串口) u% N' ]1 C) H3 ]
- Serial.begin(115200);" M( F$ o7 |! ?; [( ~
- delay(10);& t) [ P, a: |4 }3 Q7 d
- BLINKER_DEBUG.stream(Serial);0 \$ D+ `. {- Q; W
- // 初始化有LED的IO' A* s$ x! x4 c
- pinMode(kg, OUTPUT); 6 O3 W. n0 I0 i0 [. _
- digitalWrite(kg, LOW);//初始化继电器上电状态
5 h- r6 b \4 E9 N - pinMode(de, OUTPUT);
( ]; _3 P1 @, c - digitalWrite(de, HIGH);
* {) n# E R, ~) Q# M2 M - pinMode(key, INPUT);
?* v7 w9 p9 {$ h: p - Serial.println();
! _2 x1 o$ D- T5 b0 v - Serial.print("Connecting to ");
8 D2 k$ `5 f* D( w2 z+ O - Serial.println(ssid);
" s) O \# h/ c, D' ^" i k+ b - WiFi.begin(ssid, pswd);
. W$ i4 @! V2 r) x6 ?' ] - while (WiFi.status() != WL_CONNECTED) { t- {, b/ h7 q7 [7 J1 c6 t! y: H1 T
- delay(500);
2 I/ C- a" M* d9 l3 h' y( C - Serial.print(".");
( L$ H, k' k, o9 g6 L - }, o( a' w; P! ]. ?5 Z7 u
- Serial.println("");
. e* f `& r0 t5 v - Serial.println("WiFi connected");
5 M* J# i t* j- I$ ` - server.begin();" D$ d; B3 a$ Q8 z: ~3 ^
- Serial.println("Server started @ ");
* P4 \/ u! I: [; W7 \9 W - Serial.println(WiFi.localIP());) h# Q2 H5 f- O/ U
- //打印出IP地址,后期可以制作显示器来外部硬件显示ip" p, P0 ]1 Z9 \. }9 j" \
- Serial.println("To control GPIO, open your web browser.");3 Y; h7 W7 Y7 o2 R$ Q% _$ r
- Serial.println("To set GPIO 0 high, type:");
# q( |# x1 s1 h8 \$ c2 ~ - Serial.print(WiFi.localIP());
: n, [5 h9 H' s ~1 ?- u- Y5 l - Serial.println("/gpio/1");
" l3 q( R U$ ~# S& m* w - Serial.println("To set GPIO 0 low, type:");: ], r6 B1 H; ^! ]# W( {
- Serial.print(WiFi.localIP());- @) b5 D, y& @/ u
- Serial.println("/gpio/0");, x+ i+ f/ o" E2 l: h
- Serial.println("To toggle GPIO 0, type:");
( h. \2 O9 y+ n% r5 _ - Serial.print(WiFi.localIP());+ I8 Q5 j2 H4 D& p. O2 A) Y
- Serial.println("/gpio/4");3 d% w E0 M) a, M8 E. z
) l/ {' m+ c; h0 {- Q- // 初始化blinker
! |/ C) I: ^' ~* {6 f0 R# v' z/ O) } - Blinker.begin(auth, ssid, pswd);% A! u# [$ E# Q# y3 v
- BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数
. m1 V ?( |) C- b9 J" K" O9 m - BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数! x3 [1 f% K: U6 W. `8 i0 R) @$ i
- Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。; e( i% g, B4 _
7 J7 L, n% p' I }- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback4 l, G: f3 e* q- {
- }
' W# c; z% T9 L+ C; u8 |, Q5 U0 W - void dataRead(const String & data)
" C4 G6 x- q$ c/ r - {
. x6 W/ n/ K5 x; m( n) R - BLINKER_LOG("Blinker readString: ", data);, K$ [! K* e5 |& `8 t" Q* J
- 8 j( ^5 }5 E, s
- Blinker.vibrate();
! x5 b" p" n9 _* l( R# q - : O2 C" z, _/ R; y1 R- F
- uint32_t BlinkerTime = millis();
4 ~ p# M8 E) S; F& w# @, P - ' d( v2 v! R! ?0 n
- Blinker.print("millis", BlinkerTime);" e5 a h! l5 g) ]$ j( y
- }
5 N" ~/ u( D \9 M+ y5 C0 u0 Q - void loop()
* k% ^# X0 M6 J# V - {
3 V( A8 U; m [- ^5 z - Blinker.run();$ w! z. o7 q" q0 P. S% Q
- if (digitalRead(key)==LOW)0 J; g9 a! U9 s8 B F. ~) ?
- {
" ?3 z4 M+ K* Y# j - Blinker.delay(200);% B/ t j# b/ H6 |" r. A
- if (digitalRead(key)==LOW)' ]* \$ t: _8 B; [- E
- {( j3 o# K5 @, J/ u+ {: `
- if (digitalRead(kg)==LOW)1 x6 B5 t4 ?/ g5 S- |
- {
) ]) T7 Y* D1 i; @7 Y- V) w - 5 m& Y2 M. T1 q, `" e+ L
- digitalWrite(kg, HIGH);
- y) ^! S* H% s - digitalWrite(de, LOW);
3 u8 h \8 P7 U) K - Button1.print("on");" M1 g% N9 m6 ~2 g+ S2 F- ~
- Button1.color("#0000FF"); //设置app按键是浅蓝色
7 ]6 @8 ^$ ?: c2 H - Button1.text("开启中");- G$ i9 O) j0 M
- }
; W& M7 }, Q: v2 ` - else if (digitalRead(kg)==HIGH)2 m1 I5 Q' ~1 ]4 s# _
- {
M7 O9 W- h9 a9 w9 S$ c - digitalWrite(kg, LOW);
! C) W2 K/ [9 J K& G7 `9 O - digitalWrite(de, HIGH);4 k; e* ~8 V) p/ X& t: _
- Button1.print("off");8 u+ i0 L( N. a7 M i# P Q6 U# i
- Button1.color("#00FFFF"); //设置app按键是深蓝色
* ]" F: M- i4 }9 ~4 T - Button1.text("关闭中");
: S! v# W" e; u7 n. C+ O - }) I! P4 ?5 `6 A3 X3 N
- }; |3 L3 |7 U9 Q8 N5 W
- }
' q- V- V/ A0 }$ x! j) b! Q - }
复制代码 ; f/ r8 h( P$ g5 H& B$ u* ^2 A& i
* k+ s1 o' G* H$ C3 {0 t
我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html
9 ~, t. Y: T% X& x0 I0 J3 H1 x' F# N' f( a d! @
把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。
1 ], C9 K/ n3 G
' `/ G" ?' l0 j @
G2 g8 O; C. u% ^! A. v |
|