|
|
本帖最后由 易记 于 2021-8-21 14:05 编辑 ) Q" X3 x2 g2 ?7 S5 w7 f( x
4 p0 }; r. j/ ]" }6 M( ~' k最近玩ESP8266,想做个天猫控制开关。6 m- G! o6 x$ r) y4 [5 s% ~8 {. j
但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。
- V/ h' ?0 O% A2 q还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。. N1 H3 Y2 ]$ y% l7 l3 W+ o
3 H% }, h' y; C! n9 ^5 j/ m7 J7 B+ C* N4 y6 E2 ?
" |) ?6 T j; h J- O. E问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。
; w- K# a* r2 }2 F
( X0 g- @) D7 A7 x
' c. z9 L6 m2 S, N0 Z& a( a, B
( m O" _- d" J' i L* u
$ N4 {% X! Z$ x9 m- H, X
7 A7 E4 J4 Y7 @
到手,当然是拆拆拆。
, R4 r% N/ s S) C$ O, S
" S. B; d! y) t: }: \5 T# f
2 v* t$ P1 G7 `: W s n, x/ R8 n8 S2 J: G" x/ l5 u% @1 V7 ] h+ G
联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。4 r) D: S+ @/ U4 ^% Z
4 H9 d0 [4 Y6 j7 w! k1 x
, s' p6 @) R! o7 O2 s+ t3 a0 v* ?; J0 k4 B% ?: y- n1 x
继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。
6 F7 {& l i' }
0 i8 Q5 h1 Y1 J' g3 p* _2 h) ~& P9 L" x' W1 C
! g$ Y! Z' T; F1 n
# d# F1 l$ {' C# m. v' b
电源芯片5 }0 C5 E6 e% r) B# K3 X
* e9 z8 G( I' ?4 f' P/ J3 T$ ^ Y
E& f, o1 h1 I( f" P1 {5 o% }1 G4 E5 |
有一个按钮,按钮有二个蓝色LED灯. B/ c6 A: l6 x: m: ]7 F& W& I; x7 V
2 i: o- l6 ~( R1 l7 j! }
( {7 x H( M4 p" ?
" y/ c& P# S4 {0 D+ r8 [8266
* u+ O+ R9 F5 {# \
" k( B2 D: t& b9 U7 U: C( V
" o# {, E3 [8 \0 ^2 `' O& t' ?
7 Q( Z% Y2 Y4 h$ \7 W" P- e& A% T; C5 Y# L' ]
- @$ _3 Q9 x$ q- v1 ]: H/ e接下来就是刷机了,版子上面都预留测试点。1 S: X# A, I5 S' q$ n0 _: y
接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。1 Q3 l5 d# i0 N' R
/ D3 U8 `8 k' F1 q# ~- @' x) n* O
注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。/ y* A1 B3 j( ^0 y, ~2 X
要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 |
8 J: _+ ^3 p' O4 K [. N' c
' k# I' F2 q: A# R7 s- H6 k7 A! f& C- q% C' O# f( K- ~
8 I) {9 G7 V* X
( I" w$ N$ \; \% L y3 B0 V
; m/ ^& S' U' s- I 5号脚位是继电器输出+ ^4 B/ n- G0 g9 o" ~
12号脚位是灯输出
0 X \. x1 c/ F5 l 4号脚位是按键2 e0 O/ O' \& | i, V. a* \
, U$ q# B x5 q. l; |0 ~
9 [) {+ b, f9 i. @) b' G8 B/ d0 }4 v1 j- B3 x
- u6 ]) F$ \/ I* e" `. n% O% P: M
卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库- U* ^8 I4 i5 N
- #define BLINKER_MIOT_LIGHT // 设置小爱灯类库6 g) [( n6 B d2 t# ~
- #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库
# y, b. I3 u3 u, k# b! X7 U - #define BLINKER_PRINT Serial //串口协议库' F" m- _* j3 N8 s
- #include <Blinker.h> //官方库
7 I- C0 w* c( X4 G$ q- b - #include <ESP8266WiFi.h> //官方库
5 D2 {3 v8 R( k) m - WiFiServer server(80); // 服务器端口号
/ p+ }3 Y9 n7 H! Q9 v
. o5 t. H% \( P& a$ P- char auth[] = "c4942fb1d5e4"; //设备key5 D O9 _* d d8 z- M2 P+ J
- char ssid[] = "wanboshi"; //路由器wifi ssid
7 G1 S) F k% p$ q; z - char pswd[] = "1365662999813586348220"; //路由器wifi 密码. [; H+ t* m2 Q
- 5 L/ S7 p" X& D1 {
- bool oState = false;+ h7 ?8 V. O" ~8 |5 ~
- 9 u/ j0 S# d/ z6 B8 e
- int kg=5;//继电器输出
: |& o l4 G) E( t - int de=12;//灯输出
6 N9 K, P) S7 r- }/ `! u- t7 t - int key=4 ;//按键# s7 C& Z6 O1 t0 `0 {( h
- //*******新建组件对象2 m3 J5 d, h+ L7 n" V2 l$ @
- # Q% j& n! r" u$ _* d3 b
- BlinkerButton Button1("btn-abc"); //设置app按键的键名
* s; S' e$ w) b* R6 {0 v" W - //*******app上按下按键即会执行该函数app里按键
6 e- ^1 D- ?% i% y - void button1_callback(const String & state); h. _; p1 [+ P3 X0 f3 s$ H6 ~) [
- {
& I/ g0 y) Y0 b* c5 p - if (digitalRead(kg)==LOW)/ c& k; R* i4 g+ j; P4 o
- {3 C& h! q: ]9 Q5 H7 U
- BLINKER_LOG("get button state: ", state);1 t! b' g! V/ B# T9 Q/ e
- digitalWrite(kg, HIGH);
: ]% z$ j5 m; S7 I( Q - digitalWrite(de, LOW);; J, a; q( J: s. e
- Button1.print("on");; x0 L7 P. y2 w+ W
- Button1.color("#0000FF"); //设置app按键是浅蓝色& T/ b5 ?. S5 d0 N) y( U- B8 g
- Button1.text("开启中");3 T% H6 B: M) z& R. W' V( o
- }8 e& @9 C& B- U5 V( [
- else if (digitalRead(kg)==HIGH)( E1 S5 w/ ]9 H/ H6 z
- {9 N! u# T3 n+ l& E; m: D1 p8 |7 s
- BLINKER_LOG("get button state: ", state);; I, g* L1 a5 f" ~; R! z8 t
- digitalWrite(kg, LOW);
$ M, Q7 Q( c9 F$ o* |% R. K - digitalWrite(de, HIGH);( A) p0 L6 H. M3 \; F' J3 M" m
- Button1.print("off");" Q- c: C" ?0 H, N6 z5 L, A4 u
- Button1.color("#00FFFF"); //设置app按键是深蓝色8 n; j" ?0 M8 I$ i) R
- Button1.text("关闭中");% M6 n7 @: k- g7 V, W
- }* h! c! y, Y7 C) l9 n4 R
- }
3 x+ ?3 g. J8 G7 n
9 u" W/ F9 v \5 ~- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++3 B7 D/ ]0 }- \% R4 A
' Y& V5 y1 u% a0 Y# H. @* D- //*******如果小爱有对设备进行操作就执行下面
6 p. D* R: ?6 D5 `& x - void miotPowerState(const String & state)5 J G" F/ S) x# v6 T& ?5 H: Q; O
- {! T, B, X6 h; q" {. s0 w0 G3 t4 L
- BLINKER_LOG("小爱语音操作!"); //串口打印% a$ ~ L7 H `/ J: y) @8 H# ^
- if (state == BLINKER_CMD_ON){, g! r$ m" s. m$ E6 n) L( ~
- c* x8 P+ w/ q! x) J( E
- digitalWrite(kg, HIGH);
4 y/ O1 M9 S( O7 s$ R; l - digitalWrite(de, LOW);
5 G9 `- d( n" L/ Y$ N8 @ - Button1.print("on");
/ W* E4 ^' R* J E2 `% d - Button1.color("#0000FF"); //设置app按键是浅蓝色
0 r9 l$ a- Q1 l, W; z - Button1.text("开启中");5 t: z7 T8 |' \- b! s" V8 q+ K
- BlinkerMIOT.powerState("on");7 B; g4 G% P; E3 L$ s9 w/ ^& [
- BlinkerMIOT.print();( h- q. ~5 {& i% T
- }
4 l1 j. R7 R" R! O5 x( \ - else if (state == BLINKER_CMD_OFF)$ W; i! Y% d7 u2 \
- {8 C! `( {) v% {0 @2 Z0 T; T0 P
-
" d# z7 m! p1 c# ] - digitalWrite(kg, LOW);
0 B( M! H9 p5 N- r! y# T1 M - digitalWrite(de, HIGH);# f6 S* l% c: A: M B& J
- Button1.print("off");
0 J, V! P6 p; V3 ]7 a0 i, e - Button1.color("#00FFFF"); //设置app按键是深蓝色
8 E/ L4 z8 ]6 L - Button1.text("关闭中");# m; ^6 y2 ^# Y% E
- BlinkerMIOT.powerState("off");
& c: Q) g7 |; n - BlinkerMIOT.print();
1 Z G1 T2 G, I! b) | - }
9 V. n; g. g- W8 j! @% W8 T+ g, } -
5 I& c- R- B+ h* Y" M6 P -
) |7 d( _5 H7 J* R - }# M# i! k0 O* P4 i) Z, e
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! [8 J/ A! f: k* k0 Q! H
- //*******如果天猫精灵有对设备进行操作就执行下面& w( a3 k( B$ D( y, N2 y
- void aligeniePowerState(const String & state)! n, k0 u3 [7 V2 [) {( v) z+ M
- {6 B) [# H. c( o% B
- BLINKER_LOG("need set power state: ", state);
( I I& Y6 ^$ Q6 P/ Y: P - if (state == BLINKER_CMD_ON)
' N+ E/ ^4 t& O0 _. Q- @) L - {
. V. O& O: J) f* a7 @ - 7 R; ^( X `7 X7 T
- digitalWrite(kg, HIGH);
2 }0 r) a& B! V - digitalWrite(de, LOW);0 t X: s5 P0 j6 T4 j' \! Q
- Button1.print("on");- {- G, t- _3 [9 T
- Button1.color("#0000FF"); //设置app按键是浅蓝色
* }$ Y) A1 i# Z+ f; Z, P# g - Button1.text("开启中");( S2 @+ M* z2 v T8 C- |" H: A
- BlinkerAliGenie.powerState("on");
# }5 \0 A% w8 B, H# Z* r2 ?4 N - BlinkerAliGenie.print();5 _# s6 w0 P% t* Q
- }; n+ a* E8 m0 M3 U' l; w
- else if (state == BLINKER_CMD_OFF)
% W. _& r0 Z: {, Y8 t; Z, s - {
4 }# O5 C1 y, x R" j4 f. e -
, n2 V- r: T" ~) T9 l - digitalWrite(kg, LOW);3 _" z( D7 d6 e7 G+ o
- digitalWrite(de, HIGH);
3 O) X% O$ E8 j8 x - Button1.print("off");) t0 }" Z6 P! K4 ^+ {' ~1 j
- Button1.color("#00FFFF"); //设置app按键是深蓝色
; ~* `2 N; U; l* ? - Button1.text("关闭中");2 Z7 J- @) O& w {) K* S1 }
- BlinkerAliGenie.powerState("off");- ]: I: Z- b/ Q: D$ {1 F7 L) b! I" \
- BlinkerAliGenie.print();$ k- i- h$ j' v Y! z! A2 U
- }
5 [* R, K5 b |' c1 m - , F3 }5 X" t+ r+ x5 Q7 ?9 n: c$ t) o
: |" A( x& l5 E1 w: C6 S" N0 |- }$ \$ B% U& R& K/ P% Y
- //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次9 V+ |' w9 o. k7 D
- void heartbeat()! \) V* H. f* f% U$ Q! ~' n
- {
& z* `/ P& _ d4 g5 f - BLINKER_LOG("状态同步!"); $ }/ Q2 Y% o$ q# t5 c. K
- if (digitalRead(kg)==HIGH)
6 z3 Q# s- [" i# G. a1 V - { ( g7 J! j9 Z+ X$ D) k* ?
- Button1.print("on");
- ~4 l& F) Q7 j4 Z - Button1.color("#0000FF"); //设置app按键是浅蓝色( t& E) f L& T3 m' i
- Button1.text("开启中");
) W3 ] I/ \3 C0 f6 m% E; r - }
* _- u. x7 Y+ q+ m/ e - else ' `8 V) T" z2 Z% H( ~+ X
- {2 T3 \% t W, G7 k
- Button1.print("off");+ _$ G1 }6 ?9 r# z
- Button1.color("#00FFFF"); //设置app按键是深蓝色: S6 _5 v. G' s+ ]2 ]
- Button1.text("关闭中");
6 Q6 y7 K0 K* o* g# x' P2 \8 g -
9 b+ S2 V8 {7 i! E7 A. F0 h% [ - }
8 _% m/ b1 h7 H! N9 I" }# M - }
/ a- z' v5 _- K1 Q! d+ N+ k - //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
" T% Q9 S1 P2 ^( B - void setup()) [/ X1 ?( L, n3 L( S5 e( N
- {0 m1 \0 p' k* A' f4 P
- // 初始化串口# E* j- D; @0 A3 ?4 p9 ]
- Serial.begin(115200);" A0 G$ l/ X! K& K
- delay(10);1 W6 p0 C; n8 u7 C$ P4 ^1 {
- BLINKER_DEBUG.stream(Serial);. x# ^& T* T8 l6 P1 p- G, R/ e
- // 初始化有LED的IO
9 P) R1 w% \7 T$ i2 l - pinMode(kg, OUTPUT); ! \7 E8 C% q+ U" r( V1 {. v( q
- digitalWrite(kg, LOW);//初始化继电器上电状态
0 W6 j1 E8 q) S) n6 Q - pinMode(de, OUTPUT); y! U2 g5 s" f b1 t7 M
- digitalWrite(de, HIGH);8 ~/ W0 V3 A/ U' E3 p* Q
- pinMode(key, INPUT); $ U! H/ U v# B
- Serial.println();+ ~ S: w7 I# ^4 b0 ?9 r
- Serial.print("Connecting to ");
' F0 x8 N- e( g \. D - Serial.println(ssid);
5 n6 _) J: i. W" D; d - WiFi.begin(ssid, pswd);, w( ]+ O {: [( p5 e7 ?1 `/ h
- while (WiFi.status() != WL_CONNECTED) {
9 T7 J. ?/ R% j; Z1 k4 ^ - delay(500);
" N: M# H8 I2 t- [ - Serial.print(".");" i. R7 d- A% ]: _
- }) n( l$ W! b& F
- Serial.println("");: g7 `- O2 i/ v$ e
- Serial.println("WiFi connected");
9 `0 B$ J, V5 _( L1 L( e - server.begin();
. G6 d' a9 O+ E$ w7 e - Serial.println("Server started @ ");
4 Y# }, O: ]8 ~* Q - Serial.println(WiFi.localIP());
# h/ [; J! E. v* A/ E9 s - //打印出IP地址,后期可以制作显示器来外部硬件显示ip
- ?. B; t7 ~- U! t - Serial.println("To control GPIO, open your web browser.");. I3 z4 t+ Q. E3 {4 b5 K) ]% g
- Serial.println("To set GPIO 0 high, type:");& b U: E2 }0 s, Q
- Serial.print(WiFi.localIP());
4 I w k, o4 x+ q - Serial.println("/gpio/1");1 O2 A' C+ M3 o
- Serial.println("To set GPIO 0 low, type:"); x% a: W h. K/ C) W4 q4 Z/ Q
- Serial.print(WiFi.localIP());
+ @; N$ B( o' u/ a+ X# k7 [ - Serial.println("/gpio/0");
* m" v/ V: }- ]; V - Serial.println("To toggle GPIO 0, type:");1 O S" Q6 d4 Y9 K! U5 V
- Serial.print(WiFi.localIP());
9 u* @* p4 B, w - Serial.println("/gpio/4");
* S. d- v5 m# Z6 h - & N% c6 M1 g2 E+ p0 {
- // 初始化blinker5 f) l; w3 T8 a; r) R1 g
- Blinker.begin(auth, ssid, pswd);
9 S z X0 C7 K1 g# w6 q2 h - BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数
" U. z( v/ ~) P - BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数
2 y8 x0 l! T3 t3 c$ q - Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。2 J7 k5 ]8 @& V8 c- {( u2 m
- 4 ^. K# c7 _! X% q3 o6 V
- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback
/ y5 b; G( P- B8 g5 Q! J& H - }
. B# E+ c- S/ Q7 ~' x - void dataRead(const String & data)
( {) \: h2 S+ s2 j - {
! a8 b% l' H6 W c( q8 f+ R4 S - BLINKER_LOG("Blinker readString: ", data);$ Y! s4 k, ?1 t! p) P
- * u( D: b8 W" U. M b
- Blinker.vibrate();+ p& i5 C6 D: _. c0 `% w3 z
- % E- E: u9 Z5 ^5 Z8 l! x0 |
- uint32_t BlinkerTime = millis();
/ u1 p: ?) B; m, Z - " h2 `' B; ~( U* U! s0 [
- Blinker.print("millis", BlinkerTime);
, D% R8 r+ m% U6 R' {3 h { - }! z# `5 P* ?8 O% b8 @; `
- void loop()- y" b' A# D8 N8 m' J9 `
- {
* ?- }" S! s1 B! G; p1 n8 I - Blinker.run();$ U+ Y5 _: }/ n+ x
- if (digitalRead(key)==LOW)
* ]5 E: t+ h: O$ Q - {" S% Y, \2 F: k4 f, V
- Blinker.delay(200);
' K6 T3 I0 F# y6 S, D3 d0 ]" U - if (digitalRead(key)==LOW)- o6 ^; s0 ]) q$ q& i, m
- {+ `# z; l6 r3 P7 e! `0 E
- if (digitalRead(kg)==LOW)4 }+ f* g8 M: v6 C7 `5 z8 h
- {
( [+ C0 [6 `7 J* i. Y" { U - 1 ~0 u( R {: W1 W
- digitalWrite(kg, HIGH);
. s# S/ I9 f( G) X8 M1 B W! W - digitalWrite(de, LOW);
; I0 T# T0 N1 `; r6 A* }0 E# z - Button1.print("on");1 o3 Y/ H) Y, K! {3 ?
- Button1.color("#0000FF"); //设置app按键是浅蓝色0 i) \7 R U; d Q" Z* m/ a
- Button1.text("开启中");
! r# I* b- L! _! A6 ^2 ~, W" u: R9 J - }: B) k: T1 u, j
- else if (digitalRead(kg)==HIGH)
" g+ N! t; \( t+ d4 c' D; |& N - {
# x. m! u9 }' S# _& W - digitalWrite(kg, LOW);0 b- }3 ^' `; w7 X
- digitalWrite(de, HIGH);$ ?+ g# r8 {4 `* [" H' |& F% C5 }- R( A
- Button1.print("off");2 D. G" N* u4 Z* u
- Button1.color("#00FFFF"); //设置app按键是深蓝色: |$ t/ k- W9 K" d
- Button1.text("关闭中");
. }+ r3 U" i9 j$ R - }6 w; p+ j2 @* t/ o) m v- `" F
- }3 n6 y! l( W6 i- v$ C2 N
- }
& S# ?* O4 H1 P5 ]4 f6 D - }
复制代码
' f8 I, Y8 e! ?- \7 h: i, H
, V5 d& r# F9 x6 {, g我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html
( `0 i4 u7 Q( o8 Z* q8 B5 T3 N( s
把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。
: ]# J" y: I! v$ Z7 c
3 z% m; g6 h) Q" d% X% B; t
! R+ Z2 x4 U, K5 H1 d5 j( F; A |
|