|
本帖最后由 易记 于 2021-8-21 14:05 编辑 - a W3 s' t* T8 b; X) V% l+ E2 g6 U
$ ]: O9 @) p% u( b: X最近玩ESP8266,想做个天猫控制开关。
# O$ L5 P1 y2 Z3 m7 {( V但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。7 i* ~/ P" _9 W4 Z; x7 |
还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。. u: x! W; w' K3 X
) B% h& R8 H$ s+ P) d& \0 ?
3 W4 N* C7 P3 k3 U
2 l' q6 T% O5 G0 O7 [问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。
9 y4 ~- V7 P. x( ?0 @% ^: N
0 D9 G1 b" X, |+ K& {- m& C ]6 f, d
+ U. ]6 Y9 ^/ J# W/ C
) X7 I6 w% o% D4 Z* t7 B
) J) w; b* q4 p0 t) H+ f) P" F; |
( H- r! r6 _: a到手,当然是拆拆拆。
5 ^+ K* x( `3 |: A: ?9 f
) J7 Q2 g T3 ~) {+ \" A
" j/ ~" M6 B& x! P& l9 Y2 s' [
+ q* p6 m6 j( n4 { z* x' V联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。. k% j! O+ t* M9 x* D
3 S; D4 Y; s! t3 K' _% x
1 h0 [6 H7 r& r- _1 R8 w2 M
9 T2 l# f u z2 k/ h, X) j5 o继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。
! z( D5 B8 n: _
) p, E/ q' `7 U4 x. v; |1 E$ U0 |. f4 a
( u' J+ S8 _4 a" }
3 V4 {3 ]6 @7 g7 P电源芯片3 r0 \+ j6 E: T2 p0 ^
& @# v7 @9 }0 S; R
+ N( \( g$ f9 g1 ~% Y) e
1 K; @, t& c4 W有一个按钮,按钮有二个蓝色LED灯! ?. C0 s l9 _! o0 [9 P
" e$ M: V2 A- V/ i& b A+ N7 [
; K# W) c+ z7 {7 K# D/ I% {- ^: B' A) o8 r7 w
8266+ L$ c$ ~, n3 d. |0 I/ g5 k
/ ]5 q) i; K7 |4 T& ^5 Z7 B/ R4 k/ k8 k
: y5 m! L, n% P0 m( \* Y i/ T
! T' c- d7 K$ Q: E, C3 ~
: E' \& X0 f8 F" s接下来就是刷机了,版子上面都预留测试点。
) x- n4 d" [! k, @接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。
/ L. E% \; R8 K. n1 I1 ~8 Z
, m# b, f' `9 Z/ A9 ^
注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。: \& ?& X% ?2 h1 j; c+ g& Y4 ~
要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 |
0 |9 N5 n+ l9 A
1 g5 Q. w& Z6 Z( Q1 F8 Q# H8 q# P, W' o9 p4 {( b
4 M, \0 l9 A6 D+ F6 Y% I
6 w, v) E$ g1 e7 W7 z4 t9 x% M- k, k. ~- z m/ U
5号脚位是继电器输出
4 ] S. F _% S; b8 g- o9 x 12号脚位是灯输出7 M) k* C" N F8 E5 p
4号脚位是按键, X& F/ F# X0 G# k) }
, d9 X, L ^0 L+ p' ^9 R j# ^2 v0 P+ E! j; `- D
: U; ?7 h5 \4 [- Q/ {8 e8 D3 P: Q& B) P4 C7 ?5 `- y
卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库
) f8 h/ o" ]9 m- K* t5 V - #define BLINKER_MIOT_LIGHT // 设置小爱灯类库
3 t5 _! L a) {# o* N1 l5 C - #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库" V- s% n. `( a4 ~! b- R' ~: _
- #define BLINKER_PRINT Serial //串口协议库* ]) x+ @3 [ j7 s% l# f
- #include <Blinker.h> //官方库
6 k+ r& V8 @! q) R/ k! R( q, S - #include <ESP8266WiFi.h> //官方库$ G- X+ U. v6 Y) ]2 O/ |
- WiFiServer server(80); // 服务器端口号
7 Z5 ^& T6 p; Z" |
1 h; n+ e( p6 D. w- char auth[] = "c4942fb1d5e4"; //设备key0 l9 T* t( c6 w/ C/ E8 z7 Q8 Q6 Q
- char ssid[] = "wanboshi"; //路由器wifi ssid
, f y* L, g& M! g$ \( ~- k5 F - char pswd[] = "1365662999813586348220"; //路由器wifi 密码1 e& M `% y( K
% Z; Y) m# K( U/ Y. x% F0 I, X- bool oState = false;5 U1 @; E9 @' c: X. L. u1 ]: Z
N" b+ L: G! @( v/ ] Q+ s6 m3 R1 _- int kg=5;//继电器输出
% j+ z& z# {( @0 \ - int de=12;//灯输出
2 [! \ U3 _6 W7 E - int key=4 ;//按键
1 b) n$ x+ H Z& n. \$ y. u8 O, S - //*******新建组件对象$ ^" m7 a. h$ W7 ]4 c* A
- 8 ^% Q* ~3 @: M- J
- BlinkerButton Button1("btn-abc"); //设置app按键的键名* p% f0 d2 Q( c! ]7 U2 Y
- //*******app上按下按键即会执行该函数app里按键
* l7 t5 p; s& \' ?: t$ l - void button1_callback(const String & state)7 x% x9 j6 J% E2 ~4 y* A
- {0 A& ^0 ~' w. B+ y5 l+ T
- if (digitalRead(kg)==LOW)% v; w* r! c4 Z2 K5 v
- {. ~( M8 m( B+ e
- BLINKER_LOG("get button state: ", state);, V, Y) C: u- N+ t. W- u
- digitalWrite(kg, HIGH);
% P1 v; N6 j( J, ^6 E" A - digitalWrite(de, LOW);$ c7 ^9 ]0 r" ?3 D6 v5 J$ `+ e
- Button1.print("on");% w- @( f! h- [ x
- Button1.color("#0000FF"); //设置app按键是浅蓝色
1 d6 f7 r1 b U; E - Button1.text("开启中");4 {/ [: C( k: J& v5 K
- }; b5 r: N* K$ _- s/ a
- else if (digitalRead(kg)==HIGH)
3 G+ @/ c% a9 _+ p5 V4 n - { ]& p0 n# o/ K, s8 F7 l
- BLINKER_LOG("get button state: ", state);0 n/ f3 ] n3 S; o9 p- a. D' y
- digitalWrite(kg, LOW);
8 T5 ^) p% h8 Q2 m - digitalWrite(de, HIGH);
: X) r/ J: O4 f- ?- L5 P - Button1.print("off");
]/ a# N. m1 y8 w2 A0 t - Button1.color("#00FFFF"); //设置app按键是深蓝色$ N2 C6 B2 B7 n R V1 r
- Button1.text("关闭中");
, p6 [; F4 j8 H6 _ - }5 P& ?5 L0 i4 D
- }
) Z3 C7 m/ d+ s# @9 p
( R3 F, H2 {6 [, |, v( @- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++, [8 V* @" L9 j" w- T0 f
7 c, h4 J# D# \! t, z+ c3 e) _- //*******如果小爱有对设备进行操作就执行下面
# l1 u$ c% e7 J: g - void miotPowerState(const String & state)
( @* J7 F5 O. l( c" u9 N" W/ ^ - {
$ s* b! \7 |4 m" o - BLINKER_LOG("小爱语音操作!"); //串口打印8 j7 E5 V$ E: ~
- if (state == BLINKER_CMD_ON){: M) B) V+ Y7 N- V
- 2 O) C6 `% q5 H" |: k
- digitalWrite(kg, HIGH);6 w8 s7 X" E: M8 r/ _# _
- digitalWrite(de, LOW);
4 [/ o% Q$ U7 O: [; ]7 e - Button1.print("on");
' ~) L4 r. x" ?$ L* s3 |( V3 y' ^5 G - Button1.color("#0000FF"); //设置app按键是浅蓝色
# |1 T( u9 `9 t' `" A/ b - Button1.text("开启中");8 M9 |9 ~2 T+ X1 y( G3 n
- BlinkerMIOT.powerState("on");
( h4 @( g2 Z- x' e A - BlinkerMIOT.print();9 Q% E- j+ F2 T& j' @+ _+ j5 p( f! a
- }
$ J5 r' k+ R. r/ K, r& h - else if (state == BLINKER_CMD_OFF)8 @/ Y2 N, U) w, M# o" e
- {# T' V/ P' L; i$ C2 ^( m* p
-
/ x- s% N" |4 K5 j3 y" t4 ]( k4 c - digitalWrite(kg, LOW);/ G3 J$ e1 j" t' C' U
- digitalWrite(de, HIGH);$ |; ]0 g, `( H
- Button1.print("off");
J- J/ h q8 _) a* k1 d- c9 M' X - Button1.color("#00FFFF"); //设置app按键是深蓝色
$ G p$ Z) S0 z% N - Button1.text("关闭中");
, @3 @1 i6 R* u' k - BlinkerMIOT.powerState("off");
- r$ P/ \1 R" u ^# L - BlinkerMIOT.print();
. \2 _/ ]# d. l, z! Y. Y' } - }# _+ W# G) v9 Y q
-
. A; M' b) N6 P - 7 L( l+ z! z) B" Z
- }
, u. Y! j* _8 a8 t1 A; p0 \ - //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++, Y- D/ e# o% t6 ^' l8 U) r+ U
- //*******如果天猫精灵有对设备进行操作就执行下面
. g: m9 o; B# Z7 @9 c - void aligeniePowerState(const String & state)
0 c) v" C+ K/ d; D3 v - {, [; X8 A% v/ t1 ]# g& W
- BLINKER_LOG("need set power state: ", state);! \6 c6 x7 J* a9 P9 V& n
- if (state == BLINKER_CMD_ON)7 X, t" A2 {) I& A/ g1 m) E
- {: w' Z: l& J/ Z6 w, h9 m
- 2 y& G/ p" p3 `6 q# d( u# D
- digitalWrite(kg, HIGH);
4 o8 t* _" M% Q2 ?% g - digitalWrite(de, LOW);
4 q% c0 T! o5 L, A6 b& V/ i$ ] - Button1.print("on");
0 E" L1 e: m3 ~5 I- G - Button1.color("#0000FF"); //设置app按键是浅蓝色) ^; A2 W* m |4 {
- Button1.text("开启中");
: _/ q- e& Y9 ^* n4 {+ p" R1 f - BlinkerAliGenie.powerState("on");
. Z& p5 J! h0 D4 Z; [7 n# c - BlinkerAliGenie.print();5 y6 v8 ^) P0 T" q# B8 K" x( e( N
- }
( q F0 T; {- J, [1 e" H- O - else if (state == BLINKER_CMD_OFF)
' ~! y4 k( M( Y# K1 G* m' g! A: ^ - {& O) }' b: a8 ~; H$ c, ^
-
, R& B2 m7 J; @ - digitalWrite(kg, LOW);
# S$ }9 s- z8 J% }! ~ - digitalWrite(de, HIGH);
+ r: n( k3 \) @" }2 M: x4 ~* { - Button1.print("off");& R) i8 a# ~3 E# Q0 ~9 v- k1 P/ L% a
- Button1.color("#00FFFF"); //设置app按键是深蓝色
' n0 R% A+ q1 L. H3 u - Button1.text("关闭中");3 U* k5 [8 f( U' C$ U# K, M
- BlinkerAliGenie.powerState("off");$ ^1 E7 t2 X2 @$ V! v7 n
- BlinkerAliGenie.print();
7 r N2 h0 M! T - }; Y P8 z3 Q* j7 w% H, X8 ~( j
-
8 I% N1 Y! m. B; v - ( O3 B2 d; N5 ^6 n8 |0 d
- }
4 A; _+ D: c: h+ @" F - //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次
$ q) R6 E( m8 |: b8 |5 I - void heartbeat()/ w+ n2 r& n/ r, e4 ]" J$ w/ i8 U7 q* O
- {
" ?5 z. k' W# {1 a; f - BLINKER_LOG("状态同步!");
. W- R! o' G" t4 F+ W0 q) V& a - if (digitalRead(kg)==HIGH)
9 h0 r- q" j1 ~! j9 Y - {
0 j) h' ~: u0 D& x" ^9 f - Button1.print("on"); `$ G3 \+ X z+ P% E5 T
- Button1.color("#0000FF"); //设置app按键是浅蓝色
3 ]! w! \) P( e% s - Button1.text("开启中");1 v% ?9 \9 R: z+ \" { N
- }
. B7 h! p6 X" g1 X - else
) m1 A3 r$ x, C, G - {6 g( Q! j$ b; b
- Button1.print("off");8 ]4 q5 o$ z+ ^; ]9 O: j: r* l
- Button1.color("#00FFFF"); //设置app按键是深蓝色
( z$ F) U, Y$ H4 l3 R$ c, Y - Button1.text("关闭中");% S8 W% Y& H2 I+ [% C5 ?, L: F
- n" d* }( }$ O6 u: u& q% x+ H1 N
- }( P) g; ^* U- X0 M6 Y) Z5 d
- }: f& m; t; ^- n
- //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
" f/ W' y. U( J# E5 T/ J - void setup(), |3 V) A' N% l0 A, o4 @
- {; ^- k2 N( Y' h( U5 I
- // 初始化串口
/ s- K. z8 N, {- S - Serial.begin(115200);
9 s& t, M' ^" @& {' B - delay(10);
2 O. b7 a& ?- e: H7 a - BLINKER_DEBUG.stream(Serial);
4 J& x7 o. h) l% Y+ C9 V - // 初始化有LED的IO8 r3 z% q9 o" k6 k
- pinMode(kg, OUTPUT);
8 |' z4 V/ x8 J+ j+ N% G }- P - digitalWrite(kg, LOW);//初始化继电器上电状态 5 v; c' k9 h2 O* A" s
- pinMode(de, OUTPUT);6 J( f3 o( U: l- m1 Y9 i
- digitalWrite(de, HIGH);
/ A, Z$ h( v$ O - pinMode(key, INPUT); ( Z/ |. H5 Q/ Z0 h7 [1 c1 U7 h
- Serial.println();
2 c3 T5 D3 A, P, R6 q - Serial.print("Connecting to ");
) b9 K. R m" f - Serial.println(ssid);* b# E- \ T" ]% @- J O
- WiFi.begin(ssid, pswd);4 {# G8 D0 x3 {/ ^& d
- while (WiFi.status() != WL_CONNECTED) {
- v9 ^ S i- W6 @) \ z& Y E- \) r2 g - delay(500); ~* B; |$ ^3 C
- Serial.print(".");0 Y$ T5 u" q& U( F
- }
8 D- G. |0 ^! R4 l0 g% A - Serial.println("");7 y7 J% Q- y" t B R
- Serial.println("WiFi connected");
( o+ @7 U* \8 R5 B - server.begin();
, i/ T( C; i! P/ O! A - Serial.println("Server started @ ");7 _5 B+ K. E- q3 I- o
- Serial.println(WiFi.localIP());# \: b3 ]1 E z5 v0 Q- {/ U# P
- //打印出IP地址,后期可以制作显示器来外部硬件显示ip
, `/ w$ m3 B5 E# g/ z- }" G3 Z - Serial.println("To control GPIO, open your web browser.");' T/ r9 _) T$ ?0 l' Z& @
- Serial.println("To set GPIO 0 high, type:");
% M( z; ]( }3 B4 K- N - Serial.print(WiFi.localIP());
7 B( n$ z& A \6 L) A( ^ - Serial.println("/gpio/1");
* T6 v3 U- R3 F. p! e5 u - Serial.println("To set GPIO 0 low, type:");
4 i& u; y+ Z& }+ o+ e5 b - Serial.print(WiFi.localIP());
% d$ r9 @7 a. y5 G/ m - Serial.println("/gpio/0");
% ^- ~" ^' t& T: r2 L - Serial.println("To toggle GPIO 0, type:");
/ I# ^ o. u; I- o - Serial.print(WiFi.localIP());- z0 \; T+ N& r7 j) N
- Serial.println("/gpio/4");
) O0 P) W* f5 s9 W" e2 d+ Q - 6 W' n& C* C& X" B* G9 B- z# F
- // 初始化blinker6 r/ \; S) g) H' [2 y9 j
- Blinker.begin(auth, ssid, pswd);
% \ Y( k+ j$ W( T5 q - BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数
$ N# d0 b/ B/ Q$ ~' Z m - BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数
# L' R% j+ ]; F/ H - Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。- @5 G8 a0 t/ `& j/ E8 R
6 |% q, v. c4 h& `6 ~' c- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback
+ e1 J5 q* R9 T# S2 ^; N" }; u - }
8 k6 o8 F A, l% }1 k2 h, g5 y9 I - void dataRead(const String & data)
( r% \. r9 |2 j9 p* _ - {
5 {+ }) c. H( j% z* R1 k3 ^5 T% V - BLINKER_LOG("Blinker readString: ", data);2 u7 ^) {! {$ `& J( Q9 m8 I: ?
% B1 q) n# {) v3 |8 f- Blinker.vibrate();7 N0 i: ^2 b- |9 x. b
- / P# [5 n$ A j% l: }; g+ a
- uint32_t BlinkerTime = millis();3 R/ N0 q* E7 @& [
-
+ E- j6 m% k; e" P' a+ U4 G9 N - Blinker.print("millis", BlinkerTime);8 _& b+ @" J) P1 i3 I
- }
' o: S# r" }3 v6 \ - void loop(). ]$ k3 l, n, w6 Z# T
- {0 O+ \1 ?7 ~$ } `
- Blinker.run();, Q$ r. q H$ i9 {
- if (digitalRead(key)==LOW)* T) M: H o9 ?; w
- {% a/ X3 O' k/ [5 T$ H& n; T4 h
- Blinker.delay(200);
# e5 t: G- ]- c$ } [$ t9 J - if (digitalRead(key)==LOW)
% F- y- f" i# ?$ z# \ - {
5 y- w' t7 s b$ q* n' m# E4 y - if (digitalRead(kg)==LOW)
* f7 u9 l {7 C: l - {' Y/ F& x7 G5 x# \1 d0 R |
-
) C- a8 b" |& G- [. _ - digitalWrite(kg, HIGH);, w4 }8 O1 o) Q- x1 S2 l
- digitalWrite(de, LOW);
9 ^$ c2 H/ w0 ^ - Button1.print("on");
( o7 \. {) z: \/ s - Button1.color("#0000FF"); //设置app按键是浅蓝色* x/ H4 w. y& }) u' S" `9 K7 q
- Button1.text("开启中");
& ^$ z/ {3 Y3 r- F1 [3 m - }; l( V+ x/ n/ Q7 j
- else if (digitalRead(kg)==HIGH)
, F j, k, U1 G - {
+ |- Y9 u2 v% J6 S; U# |# a - digitalWrite(kg, LOW);) Q* j1 o' e& |" b7 a$ ]
- digitalWrite(de, HIGH);
6 Y9 X1 x; B; a1 e - Button1.print("off");
/ b& b4 q: ^1 [! P2 g - Button1.color("#00FFFF"); //设置app按键是深蓝色6 J N# U2 f4 I7 K! p, T- D6 |
- Button1.text("关闭中");8 ^& u0 m" P; H( m4 P3 ]
- }
# f; Y) T; H: n7 R' x; d: E2 l& V - }. E$ Q) H6 T" W# n c2 q$ \
- }9 s- F/ h! E6 ~
- }
复制代码 7 P! }( |$ @( J. r
2 C$ p; C% y h J
我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html
) l6 t# U3 D. ` h" W- f/ p+ _: H6 h( n: p( E4 k
把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。
V7 f# ]% T5 y3 D. s' e9 N
: V9 g0 b0 P$ x: O
, c8 l8 V k) m4 X, Y; h |
|