|
|
本帖最后由 易记 于 2021-8-21 14:05 编辑 $ U% z3 i! f/ _
5 }9 t* q7 k) s1 U, q& Z+ p8 U2 j/ s最近玩ESP8266,想做个天猫控制开关。! |- u8 {4 S) n" {2 d' l/ q
但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。; C; b0 `9 b. S5 A
还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。
2 B# `5 S8 }: k2 x
1 Z' u! @. C. w6 s) X3 j
& L( a2 Z9 Q% @6 ]' g4 @
/ p" J" Z0 J$ O+ N# e问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。- e/ w/ z d4 O* R
4 k. {, b4 e1 A$ |! H
^; @+ l8 e% y4 V F/ K3 Y/ I, U
8 Y2 O' R5 X4 G9 J2 g
6 L! K3 d! d4 }, S O; v" ^% B
( ]. {5 b) U7 p3 {6 ^# R到手,当然是拆拆拆。! F' y7 T" S" U' E9 r V
/ e: s& E# o- W
, y+ j9 |3 X0 n* [$ h
" ^: R7 D5 O3 U) U3 W
联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。8 n; ?( B1 i0 \
; L% V1 _+ S2 w- Q& x B X
' }/ P7 z) g+ r0 ~- r* n$ q* L* V
" C0 N8 _" R7 d! g Z0 ?9 U
继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。& _+ {3 e" t& X+ e- u" G a2 W
) y* N: Q/ i3 x! ?8 A5 ?
. o% J$ t7 F8 ?# s/ v- }8 r
9 }- m( V% @" z6 Z' t/ `' Q" s. W
电源芯片
1 \9 e" J p7 `& g1 t) B9 I
% n3 ~9 q$ A1 e( C% W+ |
; @1 W+ ^. r1 _* I6 A/ i
. a; H: c! o& r6 J0 T8 }# a有一个按钮,按钮有二个蓝色LED灯6 d/ M$ Q; N1 z, t% G. k
6 G+ i8 j6 h4 }) t+ `! g J
' Q7 p/ x. [' Z e, ?
# V0 E% @, |. o- D& N R8266
3 `7 w( s5 `; N( s' b2 r/ J
% _0 i+ D3 H, P8 {
$ |, k' M+ k% U
" P3 j) A% J5 z: V
; H: [! }+ |8 d8 M; H$ l$ Z! n1 p- W1 ^- d' s
接下来就是刷机了,版子上面都预留测试点。
3 U6 h5 ~' T8 x3 ?6 H# v1 a0 k接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。
. V* J, X |2 V# {5 l
4 o5 l. v. f" U* W3 k
注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。0 f. ^4 f, c: y" u7 j
要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 |
5 ~ X8 Z2 _3 n# g' L
$ N4 d/ {, p. b: c& ^- B, t1 i0 N. E! |! P( L7 M3 a
1 i" g) r6 j. t' I- M
( d) [7 F7 s3 ~# L+ P8 j9 h7 ~7 q4 s8 O$ x
5号脚位是继电器输出
$ n g5 D8 U8 b& K! H7 u; T2 [4 k3 D 12号脚位是灯输出
' [+ _, m2 `" v: b# V 4号脚位是按键- x) S7 [2 }) O1 M. m
3 }/ A. O& i( q2 c! \4 y' c" V$ j
- S: T9 a1 Y# J) o/ h, N4 @, y0 O/ y* \+ \
, L# S$ {6 E4 |1 W' b
卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库0 w- |7 M# }, B0 j4 M
- #define BLINKER_MIOT_LIGHT // 设置小爱灯类库
6 x1 o' L9 ^' ]4 `- ^* y - #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库
2 s. E$ d! _+ ? - #define BLINKER_PRINT Serial //串口协议库
, ]( m5 m: o9 P3 t - #include <Blinker.h> //官方库
$ h" k6 d. Q/ h' L: f; ?# V. Z - #include <ESP8266WiFi.h> //官方库
: K( {, x8 w1 Q9 d Q4 }# j5 X# k - WiFiServer server(80); // 服务器端口号+ Y! D6 v4 _7 g* ]
1 V q- x; I. e" C* `: q, z/ b- char auth[] = "c4942fb1d5e4"; //设备key. R' S) W. K k$ d$ r0 K
- char ssid[] = "wanboshi"; //路由器wifi ssid
8 p( G' F" x$ e3 {4 k! @. Z/ g - char pswd[] = "1365662999813586348220"; //路由器wifi 密码% L) h. A' d( [2 ~9 w, i, n
- , j. y; m( [7 F$ i8 t; g& G( N$ Q2 O
- bool oState = false;! F+ J+ D& m' J5 e9 T
* [* A: ^ M6 L0 M8 W0 w+ g; }- int kg=5;//继电器输出
4 L; R4 @2 Q" k" x: p/ Y - int de=12;//灯输出
3 b" X6 D8 o8 z - int key=4 ;//按键! R2 t; ?0 s( q" o; f) v4 v& q
- //*******新建组件对象
+ N6 D3 B: T, [' x& [4 X
8 d% P/ q2 e( ]! g4 v6 T- BlinkerButton Button1("btn-abc"); //设置app按键的键名; {( B* }8 R. I0 L' ]
- //*******app上按下按键即会执行该函数app里按键
0 B/ D3 v8 L% ]& y - void button1_callback(const String & state)
) E& X6 {8 O, g. P% B - {
8 c7 Y/ T: L; F - if (digitalRead(kg)==LOW)
+ U* b0 D4 _! P3 s D# G$ A. C - {
# z4 G' N. k: M8 B9 O - BLINKER_LOG("get button state: ", state);3 p% ?- L Q l9 p, ~/ L
- digitalWrite(kg, HIGH);; S9 e' M, C5 o2 t) N
- digitalWrite(de, LOW);
% T( z- a. H" {$ q - Button1.print("on");
' `+ R" z0 g- p; h4 L3 Y% E - Button1.color("#0000FF"); //设置app按键是浅蓝色
9 {* V8 q, r& K4 S2 [2 U! A - Button1.text("开启中");
) ~6 y0 s( I; C* W) T/ I6 u ^ - }7 |" }1 F7 J5 b
- else if (digitalRead(kg)==HIGH)0 r0 T* G1 q6 C$ e8 G* k2 Z
- {
! w$ r f* B5 C. S: g0 V - BLINKER_LOG("get button state: ", state);
4 c% b/ g1 b- f7 r. D9 k - digitalWrite(kg, LOW);
! v& w: ~- n( R; X4 F - digitalWrite(de, HIGH);$ N* O' m0 ^/ k$ y+ |8 O$ S& h1 H
- Button1.print("off");
5 G# ]& x! _$ w5 M; H3 H+ [ V - Button1.color("#00FFFF"); //设置app按键是深蓝色
2 Y5 k" B- A8 r! _ - Button1.text("关闭中");" u! |# c) t7 Z! a
- }1 f2 I. x& r: H# b: a8 A6 l8 M& n
- }
( X& ?4 |( o5 Z' S3 k: L - 8 r& b: N4 u& ^9 D" p6 b4 T
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- o3 t* [& S( M8 t - . m9 d! }$ i* C
- //*******如果小爱有对设备进行操作就执行下面
* j7 B- c/ J L7 w% h) H/ { - void miotPowerState(const String & state) t2 L9 F. \% S4 {9 d* K
- {
' G. ~5 U0 c- i# p: u* A4 i - BLINKER_LOG("小爱语音操作!"); //串口打印
& U# t8 u: O9 R7 C0 b( G - if (state == BLINKER_CMD_ON){; v3 K- y( `" ~$ l
- 2 P! @! S) ~$ }2 n# Z
- digitalWrite(kg, HIGH);
8 [! w0 @3 z% G( y* y, a - digitalWrite(de, LOW);
+ K# B: I% v) G, w* B a3 q - Button1.print("on");
& ]8 {1 a* e( \4 e - Button1.color("#0000FF"); //设置app按键是浅蓝色
- `- G2 _; P& @- x - Button1.text("开启中");* |8 W8 a/ v$ f+ I3 L, L' l
- BlinkerMIOT.powerState("on");; Z5 p5 g& E' {* d9 U) q! }4 Q1 w
- BlinkerMIOT.print(); ?( t9 ?! R/ a/ q) ~% }
- }
" E) P0 H! G; U2 {" ~, o8 d) s - else if (state == BLINKER_CMD_OFF)
( d% U' J0 b8 j$ q - {
- L( X6 B2 c7 T - 3 [9 b3 S+ n; F+ y r* ~
- digitalWrite(kg, LOW);
9 o' B& e) Y, }+ I3 S9 \0 t; z7 p - digitalWrite(de, HIGH);7 F' h5 |# ~4 i( v3 u1 M
- Button1.print("off");
3 G4 ]1 N" k4 C - Button1.color("#00FFFF"); //设置app按键是深蓝色1 t$ Z7 K' I7 S4 E, s" s
- Button1.text("关闭中");* ?# t1 Z. s. }8 a
- BlinkerMIOT.powerState("off");
3 _* g+ K# l" Y8 J - BlinkerMIOT.print();
& r n, [' O% S/ I | - }
: L0 ?4 [, m! A - 7 V. s# q( K* C, y5 z, \( @2 A
- T/ Y9 I, Z- y, {2 G8 k# {
- }) B. W6 Z1 T* ?7 N% X: i6 e1 C! o2 I
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
8 ?3 \; Y( ~/ |4 ~ - //*******如果天猫精灵有对设备进行操作就执行下面
/ w" H% W- S `2 r5 {& G - void aligeniePowerState(const String & state)
! c8 W7 D6 e5 \, X - {" J/ w% M* ?% {# W0 [( g
- BLINKER_LOG("need set power state: ", state);% F) m$ p* D$ c
- if (state == BLINKER_CMD_ON)
5 M$ K' D8 }9 u - {
) n0 u5 Y X& J: Y$ Q8 I( w -
6 o& i: E0 r8 V/ ]9 P( R - digitalWrite(kg, HIGH);* ~* S6 a2 u: E! T I }5 J3 A3 c- ?
- digitalWrite(de, LOW);
3 m) w3 \% b% t$ T( N0 g - Button1.print("on");# M3 L( E4 T# T5 n4 x4 M
- Button1.color("#0000FF"); //设置app按键是浅蓝色4 Z( m C( y% H* ` F
- Button1.text("开启中");
' y, b- x. ]+ t' B% ` - BlinkerAliGenie.powerState("on");1 \; ^/ ]) @* f0 R' O5 P8 f
- BlinkerAliGenie.print();
$ `$ `1 J# l0 L0 @3 }9 R - }4 L6 Y' s9 L; R
- else if (state == BLINKER_CMD_OFF)
3 y/ s: X5 e% F% z: O - {
1 D7 L! `% e7 v- N* D -
9 P" }+ [7 g- M. d# G7 @+ R; Q/ J$ Z - digitalWrite(kg, LOW);. M4 n2 V: r$ {0 B
- digitalWrite(de, HIGH);
' J' Z6 G% F$ V7 |2 [% @ - Button1.print("off"); m- J* z/ o! w7 Y
- Button1.color("#00FFFF"); //设置app按键是深蓝色
7 f" N8 c3 g( R/ b - Button1.text("关闭中");
# N5 Z* B- k0 m1 B6 h+ {; R - BlinkerAliGenie.powerState("off");8 s; E& ?8 M8 b4 ]1 X( B
- BlinkerAliGenie.print();1 x' a+ m8 b0 ?- L% [, ?3 \- R, v
- }
u, D: X: v$ T( Z. Y8 n - ' {& v- f7 Q$ u$ e, T( ~
- 4 a* `, c( C% U
- }' @6 `9 N. o! v7 E4 U4 v+ O6 N S
- //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次$ p& p( p5 {/ ~
- void heartbeat()" C' Y/ x' @# X+ J' B
- {
) z R f8 g5 p - BLINKER_LOG("状态同步!");
! O/ a$ }6 j- `9 e - if (digitalRead(kg)==HIGH)
. k" u. T X, e4 L9 q" M5 j& e - {
2 I2 T$ x1 r# F( e; t4 j - Button1.print("on");
/ h0 ~$ j# z" p) a e - Button1.color("#0000FF"); //设置app按键是浅蓝色$ m4 m3 z2 h( ]" o" a
- Button1.text("开启中");
4 a0 z$ a! ^; G2 a - }5 a; o5 O& m3 @9 f; p' m3 o: x
- else * X) \' a; E& j2 R
- {
. l6 w" \% [( U( [/ ~7 Q. P9 ^ - Button1.print("off");/ n9 J/ v5 g' L y4 z% d
- Button1.color("#00FFFF"); //设置app按键是深蓝色2 ?( r9 j) B( O0 K" v
- Button1.text("关闭中");! W$ {# P: e7 r8 N8 ]# ], T& d
-
6 w/ j. B0 }, a - }# [+ D+ j& G: ]; ^9 x* }, `
- }
. z) l, U- c$ D) d {, D- n - //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4 F- q/ ^/ D& ]0 z; y# Q2 B - void setup()
8 r- J8 a2 W6 F - {. [" V& c2 x& C( g; e
- // 初始化串口$ l O: V: }/ q- \+ b- V6 j( r* K
- Serial.begin(115200);5 A# J0 s' g: j( X, E& f/ U
- delay(10); a4 C$ `) k( s- C. D! ?# a- p9 G( }4 ~
- BLINKER_DEBUG.stream(Serial);
0 d4 J; ~6 E$ V% C - // 初始化有LED的IO2 m+ _; h6 r3 V! y4 |* v7 Y
- pinMode(kg, OUTPUT); ! ]! p9 w/ m6 A9 C1 H
- digitalWrite(kg, LOW);//初始化继电器上电状态 7 c1 T9 W& S0 m1 C* o, O
- pinMode(de, OUTPUT);
5 g, U( p! O. ` L - digitalWrite(de, HIGH);
% d3 x8 k+ m* c a& w2 o* L - pinMode(key, INPUT); 9 F# f2 I! {9 Z2 p$ @$ R3 o9 _
- Serial.println();! O0 C8 M3 s% H+ {; T( T8 w& ~& D
- Serial.print("Connecting to ");
- L4 g! g7 X3 C* S) m" s - Serial.println(ssid);. A. W R" \9 d( V% \
- WiFi.begin(ssid, pswd);
$ o; Y- N9 {: X5 Y3 ?: G - while (WiFi.status() != WL_CONNECTED) {& q0 n' V! z5 \9 w4 l6 T
- delay(500);5 D) h$ E. H, D1 j2 _
- Serial.print(".");
! E( v5 Y' h# _' ` - }
9 u" E; T0 U$ A$ v4 H - Serial.println("");' O# K& q; _. n z' y
- Serial.println("WiFi connected");
4 m. P, Y/ @1 z$ P7 o! ]9 R - server.begin();
# t3 v: D+ u9 m5 p - Serial.println("Server started @ ");5 B2 m0 w) D P K) d/ ~
- Serial.println(WiFi.localIP());
% K+ u3 M6 r3 ]; r- J: o0 t! h - //打印出IP地址,后期可以制作显示器来外部硬件显示ip# O. C- q+ A6 {. N- l# |
- Serial.println("To control GPIO, open your web browser.");8 S% t0 o) X1 D+ U2 g
- Serial.println("To set GPIO 0 high, type:");* X1 r* z2 A* p
- Serial.print(WiFi.localIP());) J/ |# m1 b3 @1 D/ o" o
- Serial.println("/gpio/1");
2 L' k9 H/ c/ k! ^ - Serial.println("To set GPIO 0 low, type:");1 Y0 E) m) W& x! [! J) \4 N
- Serial.print(WiFi.localIP());
1 s$ D9 P; M! V# q3 U. o; X: j - Serial.println("/gpio/0");: x4 Y8 U7 t( b& ?4 b j1 C
- Serial.println("To toggle GPIO 0, type:");& t6 G! O& D6 J$ {; I' }
- Serial.print(WiFi.localIP());/ \, A' \( ?" \ V3 {2 a; z
- Serial.println("/gpio/4");( @) e5 v' A- R8 d( u* u" ]
- 6 s# E+ c' ~; j. o$ Q
- // 初始化blinker
- r2 M" ? J: V8 p - Blinker.begin(auth, ssid, pswd);
: y9 [% j6 N4 h# P' f7 C( R - BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数
+ [5 Z. Y( `4 g3 h9 j - BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数! D2 {3 D. w' m5 A A* a7 g. l0 d
- Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。
+ v# r! S M0 x! T - : y: |; B; d. r3 E9 a/ H
- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback1 t3 }, U0 r ]3 s" a7 `
- }
5 t5 z* ]7 b$ E3 L4 O$ g- Y - void dataRead(const String & data)
6 W' t2 } `) p4 l+ R0 R& s - {
0 H, p- T! W( A& D/ i - BLINKER_LOG("Blinker readString: ", data);. [3 ]' a9 o: r$ l8 @) R
- ) }; E n' Q1 F! |
- Blinker.vibrate();8 |; l2 z. e, v/ a6 A! H ~8 ]$ Z
- 5 L3 I1 Q* e- ^* e5 N' H# r
- uint32_t BlinkerTime = millis();1 w" e! N; h3 [% \1 L
-
4 s% S1 O* U" ^( \ - Blinker.print("millis", BlinkerTime);/ `% D8 t7 _0 I, X, r7 i) y
- }
1 {( V S- J: X - void loop()
z* R7 H' w& I P: B1 c- j9 R6 h. G - {* r. _. k; g3 a7 e) y) y( X
- Blinker.run();4 X5 Z' p6 s* j# c. t0 p& Q$ r
- if (digitalRead(key)==LOW)
6 M6 o/ C, H( C* k9 P - {: R; J+ [$ z7 x$ t" A. O
- Blinker.delay(200); s& R- E S( k* e: i; b! h
- if (digitalRead(key)==LOW)/ k4 I3 ]+ E8 f1 Q, _, v
- {
* o9 M* P2 {0 ]9 F- D - if (digitalRead(kg)==LOW): s, R- @$ V) b* E: Y N
- {
: y C8 A3 i$ R) U+ a" V -
, |0 q, H( d# `1 d - digitalWrite(kg, HIGH);4 I; E1 p0 l. E$ D- E3 {+ n6 y* m
- digitalWrite(de, LOW);8 R- O$ N/ `% P# d3 G8 l
- Button1.print("on");
& r! `" ]) Q( i% ^" \: P0 q+ a' e - Button1.color("#0000FF"); //设置app按键是浅蓝色
2 ?6 u9 s9 ~+ E - Button1.text("开启中");
5 A8 ~2 R5 Y/ N: a0 s# j" d* I - }3 e: V( c- _/ r8 v* l3 E
- else if (digitalRead(kg)==HIGH)
% }7 E5 ^( W# u* n" ~ - {1 J( g' e8 W% y. i- R" Y
- digitalWrite(kg, LOW);
' ?# y- Y v% X. Z - digitalWrite(de, HIGH);6 K2 y0 A( K/ V0 {
- Button1.print("off");
3 _3 t/ y" K( _0 W! d0 R# | - Button1.color("#00FFFF"); //设置app按键是深蓝色& x1 E# f4 J+ Q
- Button1.text("关闭中");* U- G9 z- {0 I
- }* I7 H" L- ?# T
- }
/ H+ Y9 _; i# ~ - }* E5 r3 x$ }; @5 m0 M; g( k
- }
复制代码
3 [; g9 v6 k# @ l3 B8 _
" u! K* o" M2 m" i. k我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html
0 H! x8 Q* `5 B- S) R' \% I* Q" D
: ]/ ] j2 F' U" @8 W1 g, m6 m H' O( [把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。
/ {) o9 o' h3 y8 a8 W
1 O" I c: W; d8 t
$ J' E8 h- m Y) T# I' @ |
|