|
|
本帖最后由 易记 于 2021-8-21 14:05 编辑
* o v6 Z0 i7 q3 f$ i
1 ^6 w v2 \9 D+ H最近玩ESP8266,想做个天猫控制开关。) u: x3 Q, L: H# V
但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。
4 a- x: U5 `4 W% h还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。( F5 A5 m6 {% W z
) F( J8 u1 p, d' G4 ~! [. }+ d
3 R- J) Y, L7 ]% U5 W
, Q2 ]0 p5 ~; O, ?% [0 Z8 l
问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。6 _+ o) X( \& G% P7 o
6 i) }1 o6 b4 P R
4 M8 G; a8 O, x
7 ?! r- E* A# k9 ^4 {
. U" V) ~% X! y5 c/ l; c$ k
, o1 m6 ^* e3 d/ v到手,当然是拆拆拆。
( F- n& z$ W- V5 o* a' |! Z' o
- s8 @. e+ L5 w
1 \% `( M3 O n5 N
/ I* e3 @2 ~# z联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。, X2 _3 s' r+ C8 I. `
5 y$ W" H- y, L& V# k/ l- t7 E) L' b
+ Z3 k) H: O8 {2 e% c继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。
! E1 B. Y- v& |3 ?4 Z* j
& u* i: D w9 P; v- v; f: H5 A# H* p+ U U- Y
' k- p3 k. r, T5 T- r$ l( C3 ?8 `4 I
; Z J" @3 o5 y电源芯片0 O. d2 S" W# d$ M; S
7 |$ E2 k; L( P# H$ N7 {
5 \3 n3 u2 j0 M3 ^) ?4 F- j$ u* \; G
5 h0 h% W% `5 j* l' i% }. ?3 i8 K有一个按钮,按钮有二个蓝色LED灯) Y4 ^/ b8 |# t3 a8 _
3 g9 F# k. G5 q& [
a$ q& p) I( D" g( \# N9 h |
+ Q1 W& z4 N p* [& s6 t3 _# D- u8266
Z8 i3 t% s! A+ z- C! n/ G0 G$ T
" V- G3 b; y1 N4 N. {* r1 |# V
M: Q& T- M9 |& x/ Z3 s( ]: D7 _" ?4 P8 z! g
A* ^+ m# O' T8 ^, }
( h. c |( w( n接下来就是刷机了,版子上面都预留测试点。
1 I7 o7 @. m/ q6 A9 r接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。( M- k: G* w$ j% M
5 X- A* e8 L L+ w注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。. @& E9 R7 U6 V8 e% u* x
要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 |
- a% n8 |. |1 R0 v& b3 _% \: V8 G3 q3 u0 a
! w6 u5 ?! E: J3 }2 ^1 c. V
+ j) R9 p! Q* R# y, O$ n! u2 b) M; _$ N! b
* C: z$ s$ t) U$ ? |+ u9 C
5号脚位是继电器输出
3 u9 |4 G4 q5 b" Q. B+ X 12号脚位是灯输出5 L: }' r$ H* F
4号脚位是按键
" H. ~6 r1 d$ V: R8 B% q
4 B% u# D; S5 ?% f+ T; H6 C$ J* ^" }/ T6 o3 `
9 {6 c0 H& x( o7 }7 _' R1 ?9 O
% g' E& D l) ~) i5 H; F, A卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库
/ Z# }; g$ _9 b$ D4 X - #define BLINKER_MIOT_LIGHT // 设置小爱灯类库
2 B k; Q5 @! A$ P8 [9 Z6 I - #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库: w3 B, i# k9 a* B9 y) f
- #define BLINKER_PRINT Serial //串口协议库. D. w: B) T/ ^! R0 K% u% D: T
- #include <Blinker.h> //官方库) ~) y) ~; w- w5 {' g: @1 U% p
- #include <ESP8266WiFi.h> //官方库3 M; I* X0 l! t) Y" W1 ]* e2 x
- WiFiServer server(80); // 服务器端口号! M0 u a/ y- K) w: ?8 a
* G" m, e- U8 F- p7 Z- char auth[] = "c4942fb1d5e4"; //设备key
8 c4 Z( Z6 t! ?2 m" u! r4 d - char ssid[] = "wanboshi"; //路由器wifi ssid
0 B# a* u$ i* g: N0 f) l3 q - char pswd[] = "1365662999813586348220"; //路由器wifi 密码5 a2 s0 g* p% p% Z5 F p/ O
9 Z5 V, Y. q( I( ~" b) b9 t- bool oState = false;
7 Y, A1 @# w8 F+ V7 | - ' N& F7 U# Z5 ?1 D5 q' U
- int kg=5;//继电器输出; i* ^: h* v$ t" I
- int de=12;//灯输出
8 O7 }" M! I+ G- Z9 A! B - int key=4 ;//按键' [* f5 ?2 W/ I9 T9 t0 g2 J
- //*******新建组件对象
, c% \ ]% D, b" [5 t
, [7 \4 R- B6 a* Z- BlinkerButton Button1("btn-abc"); //设置app按键的键名9 f2 {# p! I9 K. d
- //*******app上按下按键即会执行该函数app里按键
2 D+ q( ~ m# a% c - void button1_callback(const String & state)
! {; @# k. {6 W7 G: _! ~ - {
/ u0 d+ `5 W K1 _ C3 L" @$ ^/ } - if (digitalRead(kg)==LOW)
* _) h0 `9 v- R7 v X, E - {
; C8 n! B' d* D0 w$ _8 i* r* U - BLINKER_LOG("get button state: ", state);
2 M, A3 O( G+ t! A' A7 }/ { - digitalWrite(kg, HIGH);# R, t Z, `8 ^$ v/ I! o8 B
- digitalWrite(de, LOW);
" g( s6 j( {7 e# u3 w7 i - Button1.print("on");# V3 X+ |3 L7 _
- Button1.color("#0000FF"); //设置app按键是浅蓝色1 }5 I8 A' [7 l1 M& r3 J
- Button1.text("开启中");- l3 Z7 L+ G- a1 t# T
- }# M! n6 e6 v6 M0 p$ I( P- K; s
- else if (digitalRead(kg)==HIGH)# a& S2 k( G! H% [1 `! i! }! p
- {
3 T+ { l8 y+ w+ E - BLINKER_LOG("get button state: ", state);# r$ U: K2 w8 B8 z% L" n
- digitalWrite(kg, LOW);
' {) w+ M7 T" `5 g1 z3 d9 {2 M - digitalWrite(de, HIGH);
- C1 Y S+ U$ ]) h E8 @ - Button1.print("off");
# {/ E; Y0 }( A, p - Button1.color("#00FFFF"); //设置app按键是深蓝色
% N. x5 A8 B0 D$ o - Button1.text("关闭中");& }, Z# d6 S. s& O2 g
- }
& u x% w5 G l - }
8 P. {* q3 w/ ~% o - ; @' g ]9 N3 }- M( y1 ]
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
9 H. \! ?8 M* x c
* n4 L( p" ^$ _4 O! l$ M/ X$ |- //*******如果小爱有对设备进行操作就执行下面
# x \$ ~, B# x/ N& C: [+ F - void miotPowerState(const String & state)
1 u/ f8 E$ B d' W1 d4 H - {
+ P3 x+ J$ b6 q6 Y# U - BLINKER_LOG("小爱语音操作!"); //串口打印& @0 p# s3 T0 X9 m9 n, R
- if (state == BLINKER_CMD_ON){
" [( h$ b) k" }. w8 j - % V; T8 D" _. U/ j1 E
- digitalWrite(kg, HIGH);! b+ { ? e5 s3 o6 H
- digitalWrite(de, LOW);# A% y O. m, g6 |* Z3 `
- Button1.print("on");
+ w( K$ C5 A# l! @7 t - Button1.color("#0000FF"); //设置app按键是浅蓝色
% [! g0 W% t+ r. I1 @) e - Button1.text("开启中");
: F! W5 g+ `, R* l3 A1 L - BlinkerMIOT.powerState("on");9 F* ~2 A7 h9 Y9 t9 N7 b
- BlinkerMIOT.print();
% R+ Q% a6 R# n - }0 W5 f1 g, n. y
- else if (state == BLINKER_CMD_OFF)! {- s( T0 c6 m% h+ N: A) w& z
- {0 c# \: ^6 u' }
- 9 D8 h" r) P, g' w, ~
- digitalWrite(kg, LOW);* G( u1 Z* K4 p$ ?6 R
- digitalWrite(de, HIGH);! } h. J5 G- l0 o
- Button1.print("off");
' D# q9 n9 S' \6 Q7 }4 G; B - Button1.color("#00FFFF"); //设置app按键是深蓝色, H+ K s& r4 s" o
- Button1.text("关闭中");* Y/ O+ O* q$ o9 q% ~; N9 ^
- BlinkerMIOT.powerState("off");
6 s3 ?, }( w0 \& m2 _ - BlinkerMIOT.print();
1 f9 s, p' f& D8 G - }
# j" ]' k1 U) e* K -
1 R2 G$ S+ b& f7 y! x! X6 W# p* U - ' I, N& |9 y) g1 m5 A8 B# p5 e
- }3 D! x$ U+ M7 o5 y
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5 J$ V! z$ f( b+ A' ~% l; ? - //*******如果天猫精灵有对设备进行操作就执行下面
( ?7 H9 }: x4 P/ ^* } - void aligeniePowerState(const String & state)
, v; u8 w! M0 P" J! ^ - {8 ]; v& U: x7 l, d% d, ]
- BLINKER_LOG("need set power state: ", state);% e# N* W3 E- @7 E, S+ [
- if (state == BLINKER_CMD_ON)7 [6 L. o [. Z6 @2 c& ]1 S
- {
, @, q f, T6 R! m7 u" D: @; c -
O+ j# n& U/ a& i2 k! m - digitalWrite(kg, HIGH);
, R; L! P& u1 N - digitalWrite(de, LOW);
2 G# T* j) f9 l, h! `1 l - Button1.print("on");
. R' c! ^8 [5 P& h& ?( O - Button1.color("#0000FF"); //设置app按键是浅蓝色0 ?# d! W& M7 w8 c: ^; B; u
- Button1.text("开启中");) ]4 U9 r' @5 y, |$ ?$ }' x6 m
- BlinkerAliGenie.powerState("on");
$ [; `& Z+ _* J& F7 A; k: J/ F( o - BlinkerAliGenie.print();+ W2 P/ v$ j! y
- }/ ^! h1 b0 }) B- H8 k; _
- else if (state == BLINKER_CMD_OFF)- b8 O+ H. }8 C7 N) D4 k. q
- {& z3 q: H/ G: d
- 6 u1 N, M) I5 \4 s+ y' X4 ^' \5 J
- digitalWrite(kg, LOW);
i- H- |8 m$ W; {* ^$ B - digitalWrite(de, HIGH);
+ K0 B: @$ N( ~ - Button1.print("off");
$ ^1 u" c$ j5 B( v4 g! S) N - Button1.color("#00FFFF"); //设置app按键是深蓝色
- S9 w2 x/ `3 M U. x - Button1.text("关闭中");. w+ V$ f, I- E- I% e) ^% A& e
- BlinkerAliGenie.powerState("off");, F$ |* k$ M7 l$ `2 x( [2 k8 |
- BlinkerAliGenie.print();, d1 x e4 w9 w
- }
x4 z. }" x) r. o: e2 T. u -
& T3 U+ V, g1 n: S5 H - & G+ W% T3 S d, F
- }
- [1 ]% S. l3 X( s+ @; I( a, S6 P: u k - //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次
) m& h5 g3 \4 l3 n6 q5 _$ c9 w - void heartbeat()9 @# N! M- k# h, {
- {" Y1 ?' O7 D* M" B# I& w
- BLINKER_LOG("状态同步!"); 1 X/ c4 }' q! I3 I8 e
- if (digitalRead(kg)==HIGH)
4 C/ d: a% q/ h% |3 R3 I8 M/ { - { ' _7 d3 L3 M" S. p# X
- Button1.print("on");
2 C- |! a* \6 P. U' R2 N - Button1.color("#0000FF"); //设置app按键是浅蓝色
6 ~6 D) [2 A8 \8 ~/ @ - Button1.text("开启中");8 T5 Y$ ]3 F- u+ Y- R s7 R
- }( ~2 O9 C' N' P/ z9 D7 f9 U
- else
; H a" g* Q: s - {( n1 X, l2 I5 c3 Y# q) f8 V
- Button1.print("off");
4 T% ^; B% H% V0 C* l - Button1.color("#00FFFF"); //设置app按键是深蓝色
, t; `! y! j$ X8 u* ~ - Button1.text("关闭中");
* F- E/ [* c M$ v - # b) f0 V7 A6 o8 c& D
- }. i. p* i6 k- S* p# _
- }
3 l7 ~+ z" O" x4 p, }9 h. z; \" ? - //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++2 C. L0 Z9 l, o4 J* c
- void setup(), g$ G$ C0 P! ?& W+ f
- {
8 U1 x. o9 M! A6 } - // 初始化串口
0 g, U3 X5 K+ G8 E: b2 @; C - Serial.begin(115200);7 s0 g, i& d4 s1 `9 E) F' W
- delay(10);
1 ^7 i6 M' M5 d; } - BLINKER_DEBUG.stream(Serial);: Z1 I) r3 {4 S5 q3 Z4 X/ ^
- // 初始化有LED的IO
' t p6 q# ?6 l& ?+ Y% w: A! e - pinMode(kg, OUTPUT); 4 a( ]# Q& l: v( I0 P2 `7 ]
- digitalWrite(kg, LOW);//初始化继电器上电状态
6 D5 `! u7 _9 Y- {2 o* T/ j* c - pinMode(de, OUTPUT);
/ ?* e# p2 M& K - digitalWrite(de, HIGH);
1 ]0 A0 u' P+ { - pinMode(key, INPUT);
. f9 ?& b: D) {8 S/ Z - Serial.println();* D) P4 k f! _! n; z# F9 P( L) M: `
- Serial.print("Connecting to ");$ }4 G; `, i" F8 m9 L$ ~: N3 p
- Serial.println(ssid);: ?5 r# A3 I$ M. T& T' t
- WiFi.begin(ssid, pswd);
# n( Y0 u5 z5 C! u! u9 V - while (WiFi.status() != WL_CONNECTED) {
$ G$ [% w8 h3 `! T/ C6 G$ w - delay(500);
* o2 p+ N) m) h3 S8 u1 { - Serial.print(".");7 x. _- `8 X3 c8 O) E! m
- }
" b! P4 N) F3 T1 e) l0 @ - Serial.println("");) ?# K1 {* U4 w# E7 J& b6 F
- Serial.println("WiFi connected");
; o4 S$ D5 Z/ d - server.begin();. M d5 a7 L4 Y2 S
- Serial.println("Server started @ ");: p E; y- T' j' e: E
- Serial.println(WiFi.localIP());
4 F8 p4 S, @9 A' h) u0 O - //打印出IP地址,后期可以制作显示器来外部硬件显示ip/ S; C. p' Y+ W; _4 i
- Serial.println("To control GPIO, open your web browser.");
6 P8 S1 w4 T @9 W b - Serial.println("To set GPIO 0 high, type:");; g) L6 G4 j0 v# ]4 H! A% Q4 g
- Serial.print(WiFi.localIP());
) J! T2 y7 G( N \6 N# |* s - Serial.println("/gpio/1");
- T% A' [( G! m - Serial.println("To set GPIO 0 low, type:");# |3 M j& O/ ~7 m y
- Serial.print(WiFi.localIP());7 h! A' p* I5 q& e7 l
- Serial.println("/gpio/0");3 Q1 r! E" T9 ]" K. O
- Serial.println("To toggle GPIO 0, type:");" g0 j; ^# @$ F2 K& Q) R& c
- Serial.print(WiFi.localIP());
: c# |9 d- q& |) b) I6 V - Serial.println("/gpio/4");
! v a1 X' |8 B2 M4 _: g* r- \
) E' m0 F8 f6 X1 ~ c; I* V- // 初始化blinker
& r# ~. j& k0 a% d! i - Blinker.begin(auth, ssid, pswd);
9 t7 L) }% H8 n' _ - BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数
5 h F' p, A# \5 B% v - BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数
5 B5 m p# s! P% y - Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。
% B% h X% X/ E, f% c* C5 U" p
, r: h; i j4 S- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback
; B& F5 q$ X9 Z. E3 t! c4 M - }3 \: B; K h% i4 U. x4 O
- void dataRead(const String & data)
- }* I9 O. Y/ m- N G - {
7 Q6 F2 t( v' p1 ]& g) b, p - BLINKER_LOG("Blinker readString: ", data);
& r8 L7 h! }/ D* x, y
/ M% Z) ^ c# W; Z' j5 j- Blinker.vibrate();4 o6 M; I. l" e! q% T
- , P9 w. m7 c( ]' h' l- z
- uint32_t BlinkerTime = millis();
& F9 `# Z4 O- b" F5 Z( y! P# ? -
) W8 e/ X* ?9 f! n - Blinker.print("millis", BlinkerTime);
- L$ D% d k6 I, ?* d( l - }
' w- T( g; K |: ]" O+ T - void loop()" V0 s: ?, z6 |
- {4 I4 f! J. U& K5 G; j
- Blinker.run();
3 |* w7 |+ I0 v/ t* q - if (digitalRead(key)==LOW)* f: T" |" v1 Q* W
- {" N z- N: w& T" j/ F9 i- a! ~
- Blinker.delay(200);
! i' k$ K9 b, G - if (digitalRead(key)==LOW)
" n. I8 G3 b# M7 e" J9 y2 L" J - {
. o+ ]3 ]( A1 E8 A; t - if (digitalRead(kg)==LOW)
& X* A; x) T4 P7 G - {# S2 Y! a9 I k$ d. S2 f1 P$ Z# V
-
/ e b& Q0 H9 _( x% M - digitalWrite(kg, HIGH);" j5 u2 W6 L1 q+ v, A% O
- digitalWrite(de, LOW);1 D. t; z7 g+ I% m7 S/ N- a6 c8 F
- Button1.print("on");7 x4 i X1 x3 w6 F8 U
- Button1.color("#0000FF"); //设置app按键是浅蓝色( _2 g+ e% q6 k. r! h
- Button1.text("开启中");' n" J0 C$ o: j% A5 l
- }' \3 X$ w! x/ g( ]( e
- else if (digitalRead(kg)==HIGH)
4 }+ t6 T: j0 w9 l7 K - {% _* b; g5 ^( b- G7 ^) l5 h
- digitalWrite(kg, LOW);, i; u0 M- v/ }
- digitalWrite(de, HIGH);' v5 t3 z: C- J- r; M' f
- Button1.print("off");
; {; F% k6 v9 U& ~& b - Button1.color("#00FFFF"); //设置app按键是深蓝色
7 k8 V" R5 W, ^* \; z1 a - Button1.text("关闭中");
1 k* y0 j0 D' P0 c - }
* {/ R, h& ?/ t' m p9 w# e! [ - }8 b1 c1 G5 Q1 {* {- l3 ]) l
- }% L2 c6 }3 R$ X/ D* q$ Q; c* N
- }
复制代码 5 d. E# p! u: l- D9 K4 B
; C* M$ Z8 Z) L" E* S我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html
: h; n* z% S7 |7 u
- b2 u# g7 K6 J R! Q; H把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。
4 ~( }& N2 ]; L) Z. t' U$ d7 ?1 S$ `& s8 C$ @, ^
, ]2 u: H) ?( F( f: J' J |
|