|
|
本帖最后由 易记 于 2021-8-21 14:05 编辑 ' S/ M6 ?5 G6 N. Z" F
+ Y" m" H7 z6 D$ N Z, ^! ?, A: A( P最近玩ESP8266,想做个天猫控制开关。
% I- ?' h7 }: M, m7 I- [但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。0 I2 V# o! _4 i9 `6 ^, _
还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。
! f) ]7 w7 @+ ^8 N
6 S! P& _' W$ R' f R9 A( S7 N- W3 u/ T: z
: _+ M- C P( c% b# f. Z+ W
问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。" K& o* u- ~( C' c5 R2 ]
: d. ~. v4 p, ~1 X
3 J4 y L: z) X* P' z: p
9 c8 p3 k$ P4 l4 S7 c/ O. r, g/ {8 R* l
6 C4 N" A, ^. V) I4 a
到手,当然是拆拆拆。
/ I- V. @ t) _% n4 h
7 H3 H. S; }# s/ e7 @% R
% V# E r: G2 f% a$ J" L9 |4 N
! y2 [; c, u6 S9 F; c8 x& g+ v联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。- c5 P; X H3 i3 o& I9 J2 p. u Z2 j+ w/ o
V2 _/ Y1 A3 ?5 k Q9 N' [
! _9 q) `6 W/ r, l
# W! N0 W) U6 x5 e: z& v继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。; x& e3 X# G# t, u D( n) O
! W, e5 \8 j5 n9 H9 z- K7 x/ a# q* {9 e" U
* x( P" n* c3 \" X
2 p2 w& L% _( \) t/ t, L
电源芯片
% c2 w2 Z' I0 q5 d
' S3 V' k7 Q, D3 X9 X8 S
/ x; |+ g) |! ]; n* q: Z8 L5 R9 q" O" k: b+ x8 F
有一个按钮,按钮有二个蓝色LED灯
3 v5 L, c# v6 V9 R4 W% |; M. \5 v `
; O# s/ N- L+ Y
/ t2 l( _' B" y" v- K- i6 z8 F
/ w7 ]; Z$ Z. g- J! W2 L8266* q1 O) E y% c! M
. ~% }7 ], z3 O: @7 U- L
* {' S( Y2 \4 `& Y. _7 U7 Q
/ v9 @7 P: v0 u- d$ a8 n& l5 ?. b6 w0 L& r8 _# V5 N
* @& S4 x4 C8 r: ?2 \/ ^
接下来就是刷机了,版子上面都预留测试点。, v- i( ~$ P( ]$ O" S5 c& G& f9 e
接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。8 ?: @8 y; _' s. N7 B
) j2 Z$ r! W) ]6 w
注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。
' V2 S5 L8 ] w( `( v要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 | ; K9 G( ]! ]+ [' V! y, V9 e1 \* F5 h
* [) |% L. X5 s. f
0 L9 D- p3 O* I; U: V
# B4 ~# Z% g+ X2 g; `9 F& t2 q* ^9 x
5 m1 Z" t8 l/ U8 M( V! W 5号脚位是继电器输出
; ?! L5 b! a$ r" ]; H3 Y6 P( e, A 12号脚位是灯输出0 b/ p" |( ?1 b
4号脚位是按键# h( s$ p; C7 |3 F0 U$ {
5 Y; v N8 ^$ w7 U" \" H
5 @* |, T: z4 C% s& O8 J: C+ P
# t" R( p4 ]1 ~2 @0 i/ e% m& d% G* e1 ~
卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库
5 X [8 S$ b* g" \( w h1 z - #define BLINKER_MIOT_LIGHT // 设置小爱灯类库$ U$ d( q5 V- r" T. j. i% x
- #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库! f9 P4 I: f+ n* y; B" l
- #define BLINKER_PRINT Serial //串口协议库
; s( d% Q5 n' c8 ?+ A; N - #include <Blinker.h> //官方库" `) k6 E: s) F6 y3 I* F- j. w2 c8 O) r
- #include <ESP8266WiFi.h> //官方库
9 f d' D5 c1 w2 D ^7 b1 x - WiFiServer server(80); // 服务器端口号
9 `* c+ D( t: D1 B/ S - % t1 S4 I: \# W' v2 l% X' E, P
- char auth[] = "c4942fb1d5e4"; //设备key
) \$ [& p- I# M2 b - char ssid[] = "wanboshi"; //路由器wifi ssid! f% |. n4 G3 ? `; Q
- char pswd[] = "1365662999813586348220"; //路由器wifi 密码
) ] @, x6 H2 ^' [5 i+ j
9 N5 D9 d" @6 o% l4 a( }! w8 }* m- bool oState = false;! P5 m$ W* u/ Q- z" G6 E; ^2 v
- ( i1 x t3 b9 b* o2 ~
- int kg=5;//继电器输出
3 C) \) R' `" C8 i - int de=12;//灯输出4 q" l! F3 U/ e6 |1 m* \$ G9 @, ]
- int key=4 ;//按键( t5 C4 S+ s! |* p$ {, I& `
- //*******新建组件对象
; Q$ _4 c% X" } - 1 n- F# @* @, a& Z4 @3 K8 ?
- BlinkerButton Button1("btn-abc"); //设置app按键的键名# H. z7 @" i/ O6 p* U- ]' r
- //*******app上按下按键即会执行该函数app里按键
& ?% l% ~' p- s1 ]! b% ^; C - void button1_callback(const String & state)
0 F( N% {0 r/ x, P! k - {
, {+ A2 U0 n7 R( L! G8 Y- O$ _ - if (digitalRead(kg)==LOW)
/ {6 `" `+ h9 W4 S+ q0 _( y - {
/ J8 r8 ^; t$ y9 i3 i. |7 ~4 z! R# G, I - BLINKER_LOG("get button state: ", state);0 U1 ^6 P6 V! i p# i5 m/ z
- digitalWrite(kg, HIGH);1 i' `8 Z- b- s1 b
- digitalWrite(de, LOW);0 T+ _7 ]4 J4 Q6 R! J6 c
- Button1.print("on");
3 |6 H9 K8 ^! U- @: u) c% A - Button1.color("#0000FF"); //设置app按键是浅蓝色
' T& P" ^( I# v4 u. U3 C - Button1.text("开启中");
6 @+ n0 `" V( Q1 Y6 w - }* H) z. U5 N* x G, D
- else if (digitalRead(kg)==HIGH)
+ N4 D2 L7 y& a+ | - {+ f8 |7 d/ d" l6 N
- BLINKER_LOG("get button state: ", state);
& F9 S2 @+ C4 G( Q# U2 S3 K - digitalWrite(kg, LOW);& X4 Q- c' c3 V) A
- digitalWrite(de, HIGH);2 S$ B& a' ^% ~) y1 `# l* j3 D
- Button1.print("off");
/ W% Z8 i+ Z4 S b - Button1.color("#00FFFF"); //设置app按键是深蓝色! y4 m3 I1 X& I/ l
- Button1.text("关闭中");# C9 B6 }; b4 `; b3 ^9 k/ S2 x! W
- }, {, i9 g. C+ X! d5 k
- }
3 \: b+ x: k0 o3 o+ ` - . P! }" n/ E: U% c8 m+ j" f* C
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++& T5 e1 p m- ~
- q Q3 {8 m1 C* ?4 y5 Q
- //*******如果小爱有对设备进行操作就执行下面
+ a7 u* C0 _7 Q: e, L/ { j( t1 { - void miotPowerState(const String & state)# Z4 H6 J* ^- B, ~2 ~$ h0 s( I
- {
, D5 P4 f- v: J( b# `5 H( @ - BLINKER_LOG("小爱语音操作!"); //串口打印
h* X9 P* t! P3 d+ j7 m5 ^ - if (state == BLINKER_CMD_ON){
* O2 G, N6 x2 [ {6 }3 R - 2 J# E6 [7 |" x* I
- digitalWrite(kg, HIGH);# R, i8 f) i$ [( e9 D% `5 [& s
- digitalWrite(de, LOW);
3 N& a3 w5 x9 b: q - Button1.print("on");
2 y7 F% q8 g2 ^ - Button1.color("#0000FF"); //设置app按键是浅蓝色" d8 }, ^, t$ d; N6 x1 I
- Button1.text("开启中");
/ m/ `( B7 K" q2 g4 [ - BlinkerMIOT.powerState("on");
0 t- P, } L7 |; v% { - BlinkerMIOT.print();
( Y% y2 t9 b; d6 y$ H - }
# y1 t- \) x6 x3 z# l# X3 N z# m - else if (state == BLINKER_CMD_OFF)
* ?0 N! W8 i5 ]+ H# Q1 Q% Z - {
+ `/ r; H, e/ Z$ w9 z - ' z0 ~* g/ @ K2 |1 B
- digitalWrite(kg, LOW);6 K/ a1 m8 [1 O- A9 b2 r
- digitalWrite(de, HIGH);
4 E0 F1 ^" L: v$ K* F0 ~ - Button1.print("off");& |- t2 \1 `5 k0 K+ p" T( ^' R
- Button1.color("#00FFFF"); //设置app按键是深蓝色
* x; b0 x- F) k0 J) f# ` - Button1.text("关闭中");
! `0 |4 @ K( ], H* i - BlinkerMIOT.powerState("off");; m4 f2 y X/ B
- BlinkerMIOT.print(); Q+ L5 n4 G4 X5 s5 t* d# r
- }
+ S7 s& {' r& L. U6 u1 U9 k - + N5 |5 n- Z" n% f' @& O
-
0 k* z/ z5 N: y - }
7 g; y% O3 }. f - //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- b5 l' b3 J: g" {% P v8 F
- //*******如果天猫精灵有对设备进行操作就执行下面2 d* A+ N7 l, p: S' K, @- U
- void aligeniePowerState(const String & state)/ E; {. T' Q2 j7 |" o
- {
+ Q F, d8 J2 H$ h" f - BLINKER_LOG("need set power state: ", state);$ l4 }& @7 ~8 S6 o, A& L- p: A
- if (state == BLINKER_CMD_ON)
7 Q" p1 R2 l5 e5 n* ^# j# L+ V4 n - {- F. T* p6 t( r
-
) _5 m6 i- r6 s+ E4 { - digitalWrite(kg, HIGH);7 U8 G' \ z2 J* V; h9 E
- digitalWrite(de, LOW);6 w2 E, m9 ]+ M/ c7 y# A
- Button1.print("on");8 x, p) L0 I" ~3 [( J0 P% ^
- Button1.color("#0000FF"); //设置app按键是浅蓝色. n7 }% M4 y; M9 n' S1 o3 N
- Button1.text("开启中");
: j, K$ v) F& h5 P( t8 ^9 I% \ - BlinkerAliGenie.powerState("on");0 g$ r5 u8 p; t& X1 H4 ^. I
- BlinkerAliGenie.print();
! b& ~7 m7 Z4 c2 k# h - }
1 S* F1 J# T1 `2 a+ w - else if (state == BLINKER_CMD_OFF)7 S. n& v6 R5 I2 I6 Q
- {
- y0 X$ k/ A+ x. i4 u1 W - / T2 ~2 E1 g$ V5 g
- digitalWrite(kg, LOW);
/ V3 V" t s0 {9 q7 Y! m - digitalWrite(de, HIGH);: M# h8 _7 z2 e! P5 ^
- Button1.print("off");! Z8 k; j, N2 r/ J' U! w) f
- Button1.color("#00FFFF"); //设置app按键是深蓝色- P: L1 i: A9 W
- Button1.text("关闭中");0 u; g; @+ {+ k5 U$ m9 K. l! i
- BlinkerAliGenie.powerState("off");) v j* H$ m% |
- BlinkerAliGenie.print();# C; |/ S% g y) z: E8 H$ K0 Y. S, o
- }
0 {1 A( j9 {/ i' E -
5 }/ C, }# B6 K; w' e7 U- z - . M" q7 c3 v7 [) {" n9 R4 q! Z/ d
- }6 P# y. z: B$ I
- //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次
4 y, t: z: _) K5 {9 L - void heartbeat()
# k7 T' ^. C* G$ D# s- X - {
: L. e) v8 n% k& y# G x - BLINKER_LOG("状态同步!"); 9 L7 X5 O2 P6 M' r: Y
- if (digitalRead(kg)==HIGH)
( Z9 B$ |0 i m$ V+ @# U - {
# V E6 X6 y2 p! g - Button1.print("on");
; R; A5 l1 m8 [7 v; `* g3 T - Button1.color("#0000FF"); //设置app按键是浅蓝色
5 p3 }- u% y7 O8 f3 ~- R - Button1.text("开启中");) A' a" C2 {4 `, b, L
- }
+ f) ~* u- |) S - else
1 G& _5 a5 U. i - {! b2 |, |3 X$ Q' c% e
- Button1.print("off");4 }9 b C6 ~7 t" S$ V+ N8 H; ]/ C
- Button1.color("#00FFFF"); //设置app按键是深蓝色: h3 f$ ^ P% [# S8 k9 W3 @8 S
- Button1.text("关闭中");( g( i; N' c- V! B$ q: G% d# k
-
; ?8 w Z5 D! X) k/ v; s5 Z - }7 }! Z2 M- h6 n" v' L. e5 L
- }
+ a3 v. z% }! [, M3 Q) L - //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++$ r6 o8 K# `( U8 V7 }
- void setup()/ f8 K! `& y0 j
- {
; P6 @4 [/ l8 S( O5 x2 W6 m8 m2 ? - // 初始化串口
% v$ P$ ^+ s# o7 N! k4 n - Serial.begin(115200);, Z' S& Z+ G' q7 ]6 @9 b
- delay(10);
; Z9 ?* D Y! B( e) [/ A* M" F, ? - BLINKER_DEBUG.stream(Serial);
1 C- q6 @3 a, t! W ] - // 初始化有LED的IO
- ~0 p# Y* ?' V8 {+ J* o - pinMode(kg, OUTPUT); + k, T! B& D/ @, [0 y
- digitalWrite(kg, LOW);//初始化继电器上电状态
( e% A9 t' l* Q - pinMode(de, OUTPUT);1 G- a, _9 N: G H/ d" V5 }
- digitalWrite(de, HIGH);" s: S4 y- h% W u7 Q/ D+ _) S* S
- pinMode(key, INPUT); ) ~4 L% m5 C' ?. {. y. t
- Serial.println();" S2 M, ~% j) h9 ]
- Serial.print("Connecting to ");
' e+ a- M! J! E - Serial.println(ssid);3 ]# }! `, c+ D( v1 s; q' ?# @
- WiFi.begin(ssid, pswd);9 T3 \) G. I- T0 ?( i7 ~" g
- while (WiFi.status() != WL_CONNECTED) {
. J0 F/ A' l. m7 x- ~5 e - delay(500);# O- T( w* c# k1 H H! l8 d' f& L
- Serial.print(".");
- C: x1 w K4 g& W, D0 M: X, ? - }# u8 `' @8 @' b2 y. G6 V
- Serial.println("");
. B' `) k/ x' f2 K7 D# f4 I1 { - Serial.println("WiFi connected");
5 E4 e( |% D6 z$ ]8 ]9 S! T - server.begin();
1 e0 H6 U( B1 M7 R/ b0 w - Serial.println("Server started @ ");
3 X+ y5 L+ M% O; o - Serial.println(WiFi.localIP());
2 R( {* \3 O% I7 z4 ^ - //打印出IP地址,后期可以制作显示器来外部硬件显示ip
& F6 ?9 \: t9 R [# ~ - Serial.println("To control GPIO, open your web browser.");5 M6 r' S; y: k
- Serial.println("To set GPIO 0 high, type:");6 R- k7 B) C; D! i3 z" c
- Serial.print(WiFi.localIP());
# x, [0 D N- W& c$ J6 u! F - Serial.println("/gpio/1");5 J8 y% n& F* L; [
- Serial.println("To set GPIO 0 low, type:");$ a6 E; U! t4 i
- Serial.print(WiFi.localIP());
) w9 V6 B; M! ?" ` - Serial.println("/gpio/0");/ m6 H. X4 o* f8 `
- Serial.println("To toggle GPIO 0, type:");. C8 p+ c. ]. |! P
- Serial.print(WiFi.localIP());
. T$ @9 ^. m; x - Serial.println("/gpio/4");
3 X0 M' _# H+ t8 W$ F - 3 x4 B/ v$ B ], A0 t, V
- // 初始化blinker' l( J0 L' S/ k( ~" m% i
- Blinker.begin(auth, ssid, pswd);
* ~' }6 \# x+ R' Q - BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数& q( z6 y% O4 {" Q2 C2 Q1 R. n/ v
- BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数
0 R5 u$ a0 M! h. t2 u - Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。6 `- N# x$ D: E( S
- M8 B( {3 @- Z/ b- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback: d3 N% _( m) q5 @' q
- }
- B- ~; W7 a1 h - void dataRead(const String & data)# r1 p% x" P, l
- {
, U6 j% }8 C8 D# D - BLINKER_LOG("Blinker readString: ", data);+ S& V8 ~" b$ Q7 ]( \; s
! G9 o; [! J. W: q p5 j3 s- Blinker.vibrate();
2 ~! t; _& @7 q1 Q/ _ -
) r% }. @2 a6 p7 [, y' m - uint32_t BlinkerTime = millis();/ [& C1 T4 }4 A* W" o8 B
-
3 b9 [/ u8 n2 w - Blinker.print("millis", BlinkerTime);: R2 r0 ?2 g$ O( S) o. e
- }
* A+ J: I1 i+ {: `$ e - void loop()8 K/ N1 k6 V' N( W9 y2 |0 e
- {0 [2 }7 F) c2 Q! F7 `5 ^% W; ~
- Blinker.run();
3 u: I! [% h+ c, } - if (digitalRead(key)==LOW)
% {" W8 x1 u& N7 p - {" D# B( z3 X# Q6 N L4 Y9 j
- Blinker.delay(200);
9 E4 Y1 d0 b; g( V) R - if (digitalRead(key)==LOW) ~. M+ s' W0 ^* l1 K: B
- {1 e$ ^) m3 ]; \$ w0 Z
- if (digitalRead(kg)==LOW)
. q! c+ |' |; Q( ^+ F' Z% T - {1 F2 g2 l2 ~- l F6 q
- # n1 o: c2 G3 K
- digitalWrite(kg, HIGH);0 s; q( s; p( [4 B1 ^
- digitalWrite(de, LOW);
* w! n+ W/ B1 ?. D - Button1.print("on");
+ o' Q+ R5 a1 h. F% h - Button1.color("#0000FF"); //设置app按键是浅蓝色
. h9 N- r" l/ E+ j5 q7 ] - Button1.text("开启中");
- i% r0 f$ e! c" W - }
4 K1 V3 b+ \& Y" u - else if (digitalRead(kg)==HIGH)2 l( E0 ^" T) M X! ^* Q0 _
- {
+ r' O5 w; ?" i' ? A, D - digitalWrite(kg, LOW);' y @4 k g5 V: o2 Z# V- a' o3 U
- digitalWrite(de, HIGH);
) J* Z8 T6 i( u' d/ ` - Button1.print("off");, `5 c. p8 s8 T7 }. E4 D
- Button1.color("#00FFFF"); //设置app按键是深蓝色; z4 U( V/ H( N* t/ h( E& ^+ a
- Button1.text("关闭中");1 U/ Y$ e2 j9 {6 k9 z
- }
" g3 ?1 _: B* d4 x$ o: ]6 | - }& C" J3 S. Z. t. _
- }
! L* w2 E, L3 k( Q - }
复制代码 & Q8 ^/ n# Z8 P: q
" T# ^! W/ y9 q3 X2 H7 F5 J9 o
我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html( [9 s6 Z( |: @. M5 }' L3 ~
! u7 r8 X+ Q. U* d把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。. K( q9 U3 g' i' x% |7 F: E. {; R
9 @0 a% _7 y6 M) y% t7 T8 g
! L2 h. z/ ^0 q9 ~, S |
|