|
本帖最后由 易记 于 2021-8-21 14:05 编辑 5 y0 U8 C( U& [1 D, L' r0 o, ]- n+ d
! c9 o# V! y7 E' {
最近玩ESP8266,想做个天猫控制开关。
- X$ n- P5 c1 o# g* i$ z0 s但是我很懒,一个个配元件嫌麻烦,于是想着能不能淘到便宜的带电源板的模块,多倒是蛮多,一般都要20多块钱。
% i* _* T/ x! O+ ~还是闲钱上逛一下看,找到一个联想的国外版8266智能插座,价格才8.5元一个。有一点不足,就是只有三孔,要是五孔的就好了。老板说五孔杂牌价格一样也有货,晚两天发布。6 ?2 d; ]' G B* n- {
! R: q) N1 x2 L7 C( j' G. c) [/ E/ i( \- T, @! |, ^
/ v' h, G; A' B: }% H# R) L) c
问了一下店主,买20个一盒才包邮,想着20个还是有点多,买了5个,连运费47.5元。
- ]. S' X e& r+ F _& Z) V7 }% S Z9 X, [; g) f+ D
$ F9 K7 J( }2 U5 s; p6 {) W* K
3 v7 a5 J( C2 }3 P; y7 q. k
7 {3 ]9 X/ P9 Y+ j( J. y& [) P2 T/ W a+ t5 M
到手,当然是拆拆拆。1 R. |( U. A% a1 L" [
3 r5 V% A0 o) H: x& }. y3 C
) J2 T* g# ~3 @9 h G
( k+ d6 ~: c8 l联想的做工,还是感觉不错的,光这个继电器应该也要个7-8块钱。
7 a. w D6 a& Y* i2 g' O# `
n4 w8 t# ?/ n8 n+ T d- K5 W1 S4 ?' k7 v$ S1 `
# `' t; A. F& l' U3 I继电器是两组常开,感觉要是接电灯双控开关是不是有点麻烦的,不过用于插座是很安全,要断二条线都断开。
5 {# K$ ]; @; y' [( H8 \% ]
1 `! Z; P; H* ]7 P: b7 f3 f Q- `8 u" }4 a% [' E
: {! @5 ~2 e: l# H8 ]2 c6 q( L
6 q4 A$ X y k+ ?; e) e
电源芯片+ P7 h4 B! Y6 p7 F5 j
' `* [" q l8 Z9 U0 Y0 O9 p+ i \' A; i
, x3 z9 @* e. r7 K5 X# b! g有一个按钮,按钮有二个蓝色LED灯
: T( j) q- p. {7 e9 b* Z
5 C) H" R4 t) E- m. B! B
5 E- s/ D7 q4 T
7 |& V6 t) m9 a Q8 b2 n' L
8266, {( r" ~; s0 Z. F* B# L
- o3 k: v1 D+ @! l
- b6 r! n# @+ A# Q5 g6 _
" @/ D; |& H4 T S" E. Z4 ^( t& H
" u6 ?) G7 j6 s6 p4 t$ I
7 ~% l; T/ v* O' p! h6 ~接下来就是刷机了,版子上面都预留测试点。" H4 N3 i+ S2 @6 x! ?8 Q, l% J5 z6 s
接线比较容易,上面都有标示,GND,3.3V,TXD-RX,RXD-TX,还有一个就是IO0接地后刷机。
* i1 _# j( m) t, q" c7 q# K
/ R4 i+ P9 F# u+ c7 j7 }& J
注意RX这个点,就是3.3V边上的这个点,焊盘设计的就点问题,电烙铁热一点或是焊的刷机线过粗的话,容易掉焊盘。
6 R# s/ S# z' J要是掉了就只有一个过孔了,要是焊不上,只能再拆开接在另一面,所以为了避免不必要的麻烦,请注意一下。 |
5 }: D6 E" T& M5 U; J) R6 [/ w# ]6 ^
J4 w; Z7 Z+ n) e4 d2 d/ n5 z0 C% }8 r: F+ E
! L! }) d, p* S9 y2 X
( }/ l5 g' {! w5 m; d. V 5号脚位是继电器输出+ e. t4 O" w( V
12号脚位是灯输出
3 C" G2 U3 u& M: y3 b$ v( K 4号脚位是按键
% z7 [, {: k2 p' v4 d N
) t* G) ~# ^8 }
8 t9 ~/ ]! ]0 Q' }' @8 t
- U0 N; A8 V, z5 L1 ~
8 \1 G+ j7 y2 Q& m! G卖家有发一个源码,如下- #define BLINKER_WIFI //官方wifi协议库
3 d9 W4 [- Q% b# m2 m; Z# P3 X - #define BLINKER_MIOT_LIGHT // 设置小爱灯类库
/ L8 T4 y3 B7 \8 Q$ a P* Y - #define BLINKER_ALIGENIE_LIGHT // 设置天猫灯类库9 X! c+ o; T& ?& o* e6 Z
- #define BLINKER_PRINT Serial //串口协议库
4 n0 o Y& B6 B. v/ c o. [ - #include <Blinker.h> //官方库5 h$ n) m3 t9 n( t
- #include <ESP8266WiFi.h> //官方库
8 V7 c( Q; z5 }& Z* G - WiFiServer server(80); // 服务器端口号
3 \! ^! f& r* G: d- @ - * J6 ?1 U: z& l0 P& D, U
- char auth[] = "c4942fb1d5e4"; //设备key
5 Q6 d Y8 {6 O$ r: \% P; r - char ssid[] = "wanboshi"; //路由器wifi ssid) _/ \4 O5 D! b7 B3 u7 ]
- char pswd[] = "1365662999813586348220"; //路由器wifi 密码+ }( Z; y; E, A' C+ t
- $ j) h, M8 y$ \3 I
- bool oState = false;( s4 X" H) _. g. m
6 @. T+ Y; F( S- int kg=5;//继电器输出9 w1 |0 S+ B; ` b5 M2 a
- int de=12;//灯输出! {, L8 T+ a/ i! ^- \
- int key=4 ;//按键
3 z6 d7 Y% S; E2 f - //*******新建组件对象. `; {! T( L/ n3 v+ i$ f; Z
2 K$ z+ `3 [6 `) B/ q# a- BlinkerButton Button1("btn-abc"); //设置app按键的键名
5 r$ l. z( f9 d$ r% X7 S% s- r - //*******app上按下按键即会执行该函数app里按键: _ s6 r# E; t1 {5 @' B
- void button1_callback(const String & state)/ |, L2 H! `/ r7 i: w
- {* k, t' X! ?5 M i/ G5 }- o$ s
- if (digitalRead(kg)==LOW)4 P' K4 P# V" r1 Y
- {
. e. l# f4 Z% J' I4 ^" G. @ - BLINKER_LOG("get button state: ", state);5 ~+ }5 G0 o1 f$ C5 s/ r3 F
- digitalWrite(kg, HIGH);$ w6 {$ w$ C/ Y& F o, K8 B
- digitalWrite(de, LOW);
# d1 v3 o0 ?! s# v: ~$ ] - Button1.print("on");. d. O$ f; i x! Z' f
- Button1.color("#0000FF"); //设置app按键是浅蓝色( A V7 k/ x3 N, y; U
- Button1.text("开启中");
! p8 o8 M" Z+ b7 s7 L: K! x0 N - }
- \3 W$ s0 ^$ h8 c) P9 v( j9 h - else if (digitalRead(kg)==HIGH)4 Q) q a( n4 R4 V! i6 T4 I
- {- \4 p3 q- e) O7 w
- BLINKER_LOG("get button state: ", state);9 I5 Q Y& M& ^) Q1 U+ U- ]7 p
- digitalWrite(kg, LOW);5 ?" C0 l) h% ?* Q/ J
- digitalWrite(de, HIGH); p! \# u& B9 `- B4 t
- Button1.print("off");; U. C, I$ R7 W" a0 l; o
- Button1.color("#00FFFF"); //设置app按键是深蓝色) N4 |. u# X" g C; F
- Button1.text("关闭中");$ z0 p/ ^4 f w" `8 @
- }( R( K/ b( q! |
- }: o: V. Y7 q* ~$ l( ^
8 j' w% T( K- t. U# D: V- T- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 g# O0 \/ v7 x( O6 R$ b
4 [: P! h. n" f' H6 |# v9 F- //*******如果小爱有对设备进行操作就执行下面- I# @# M, E! p! D
- void miotPowerState(const String & state). v" |! Z& v1 C. L7 L
- {
( v, T7 Q- Q2 D |0 U' |3 `1 s6 @ - BLINKER_LOG("小爱语音操作!"); //串口打印
, X! ^3 ?8 w$ v4 w. U - if (state == BLINKER_CMD_ON){& R# R' X0 X c* r. ?
- 6 Y: T/ {# c' |3 O# h
- digitalWrite(kg, HIGH);
( d, \% ^! X& g% V - digitalWrite(de, LOW); F$ } k" u& y" q
- Button1.print("on");
% D, b! F2 c3 Z- q: I8 }0 y - Button1.color("#0000FF"); //设置app按键是浅蓝色
% r( h+ c( w9 s) u6 f& q# G) c" F - Button1.text("开启中");
* k" ?' ]9 O f; ?0 F+ C, }3 T - BlinkerMIOT.powerState("on");7 G* Z4 y8 o% i* m5 Q9 J
- BlinkerMIOT.print();
0 \& L' J ^! Y1 O1 i) K: F - }4 U5 x1 f! W' ~ W6 q! m- ~
- else if (state == BLINKER_CMD_OFF)$ ?" |" M/ F! O9 w+ ?) Z
- {
$ c6 f9 u* m4 }4 W% i* O, e - 6 i: v7 C6 d% ?1 [! o3 ]3 F/ \
- digitalWrite(kg, LOW);8 Q& }, T- g8 j( n
- digitalWrite(de, HIGH);7 ^( U6 v- Q8 A& a
- Button1.print("off");
7 o0 F) \! d2 p- e9 u( {1 _ - Button1.color("#00FFFF"); //设置app按键是深蓝色6 B( O [8 M6 U
- Button1.text("关闭中");4 r" N+ s- c$ u1 u% ~
- BlinkerMIOT.powerState("off");1 b* |. G `% W6 B
- BlinkerMIOT.print();) _# d' M9 X; D+ q" d! H$ c1 l$ q
- }
" A9 b+ u- ?( y$ T& V - ; S) u1 [- p0 v6 g
-
# p' O6 i, J0 y$ h4 J - }4 @+ z4 I0 Z( Q/ d: ?* s1 f; ^
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Z1 O* S, D0 l5 D$ d) A B. g - //*******如果天猫精灵有对设备进行操作就执行下面( [, ~" _; n0 D) K7 t1 K8 L0 O
- void aligeniePowerState(const String & state)
# m4 [9 t: T2 }5 A2 f - {
6 o* D T; d& N* g- X- V% a$ X - BLINKER_LOG("need set power state: ", state);* ?1 y4 {0 t9 I) H
- if (state == BLINKER_CMD_ON)( m; O T5 C# M+ s- M
- {
9 s7 i% }% s# Z/ T) ] -
( I1 S! c7 | n$ }$ G8 a. { - digitalWrite(kg, HIGH);
3 u6 e$ \2 K4 x K$ J' r - digitalWrite(de, LOW);
+ B1 a+ G/ k$ S/ f- X% ^0 n - Button1.print("on");
7 p2 z: H! g3 ^ D - Button1.color("#0000FF"); //设置app按键是浅蓝色) R* \# S- { s5 h" p
- Button1.text("开启中");- o6 t% ~* r* F5 {. M' `
- BlinkerAliGenie.powerState("on");7 M6 {& [, ]' c5 x! p
- BlinkerAliGenie.print();
) Z# @" C H* u. G - }# _4 ~- h' c3 i
- else if (state == BLINKER_CMD_OFF)
2 o! w7 ~. Z% S D# |) O - {
' @0 N; Z9 d/ J8 h! M. }$ D -
W$ g h& y4 h' j - digitalWrite(kg, LOW);
0 {) F6 a- l* [" E7 t1 N7 ?3 c - digitalWrite(de, HIGH);
4 Z( y5 v: v8 s1 {3 s9 F0 z - Button1.print("off");$ j" h% y! i; C S' o) h' N
- Button1.color("#00FFFF"); //设置app按键是深蓝色
' [3 K6 X6 L: s - Button1.text("关闭中");
( k! ]! X- H; |9 z5 I - BlinkerAliGenie.powerState("off");' ?3 W9 N f. V$ D
- BlinkerAliGenie.print();
2 [6 h" K4 t. S1 p; R! W - }, E1 n. z5 Y1 M% ?, S' o" G4 V8 V1 r# Z
-
; }/ {7 z2 n, v
! n" d4 ?% f- y; s2 [! O- }
4 _% f' k5 C! s: x# J - //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次
8 d8 z$ w+ C+ O$ ~" |3 m - void heartbeat()
; P4 n3 x0 E% ]* d% h - {
" t- C8 U: @" Z. D2 n0 n - BLINKER_LOG("状态同步!");
: a: f6 V) E( t0 w - if (digitalRead(kg)==HIGH) * f5 s1 }& z9 L" P+ | Z
- {
7 M6 V$ w3 d/ e, R. d - Button1.print("on");
/ ?7 z2 ~% H [$ K% ], f( r; O" A - Button1.color("#0000FF"); //设置app按键是浅蓝色
3 s2 E: L2 r; W. h - Button1.text("开启中");
; M5 D2 {( I5 n9 t+ x - }
8 _2 Q7 H w7 g: i; a - else 1 y, G6 V T. _1 a& n* A' u
- {, U6 ~ m) Q; s' x" b
- Button1.print("off");
( }. n9 X7 m( B# V3 U/ ]4 i - Button1.color("#00FFFF"); //设置app按键是深蓝色
3 f! R# }3 a1 o* Y# G8 u6 N - Button1.text("关闭中");$ p' i4 [7 {9 G$ `, S
- - S. l4 Y; w4 k+ i
- }
7 w& @ g& @2 S - }
# x! J- J7 u/ @, s& A$ e" Y - //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- i3 m. g5 {- d* U
- void setup()/ y* _5 b0 @' Q
- { e$ _# v0 T4 R4 C+ [, r0 k) T, I
- // 初始化串口+ e4 `3 k* [1 U' G5 W
- Serial.begin(115200);
5 W+ J \% \6 k+ h& y) j- b! H - delay(10);
& `$ l; |& U; r& @ @, |4 r+ a - BLINKER_DEBUG.stream(Serial);
/ r2 q! L* @: X* P& e. F! T8 O - // 初始化有LED的IO1 k! X& |+ \; i2 ]) h
- pinMode(kg, OUTPUT); , G7 b2 L4 Z7 A9 I2 v+ V
- digitalWrite(kg, LOW);//初始化继电器上电状态 9 n p: g' I% V* Q+ o" C& R
- pinMode(de, OUTPUT);! |1 c' B0 K$ D1 x5 a# x$ X) p; b$ N9 [
- digitalWrite(de, HIGH);4 ]# n$ r" s3 p* m" |% v- K
- pinMode(key, INPUT);
) a& A, o" b; Q6 R T - Serial.println();
' }' N% g1 J. U' F - Serial.print("Connecting to ");6 \3 z T* C1 w8 U7 }( _4 m2 r4 b
- Serial.println(ssid);4 |- U2 O) k- ^. f
- WiFi.begin(ssid, pswd);
4 }) V0 T( K- [& `( K - while (WiFi.status() != WL_CONNECTED) {9 U. d: L4 ^# Q3 e
- delay(500);
3 a2 d* |) N* J" Q: e5 n - Serial.print(".");
6 D) u: X- _) }' t! H - }3 ^! L* i$ [' ^* k; c5 L# S
- Serial.println("");4 e# }; j$ n9 K$ t$ F
- Serial.println("WiFi connected");1 _* n0 F$ V& r. K A
- server.begin();! {" E) V# V* W2 ?: G7 `
- Serial.println("Server started @ ");
{4 Y8 X) V/ s8 Y' j - Serial.println(WiFi.localIP());
1 F9 b W0 r p5 Z a$ d - //打印出IP地址,后期可以制作显示器来外部硬件显示ip$ Y5 G' i) ~# k) p7 n& z
- Serial.println("To control GPIO, open your web browser.");4 R& N6 {/ G+ N1 @, z
- Serial.println("To set GPIO 0 high, type:"); Y# t2 O) U! a) }9 Z5 D: c; d
- Serial.print(WiFi.localIP());
! l5 I& E+ D+ s, { - Serial.println("/gpio/1");: R0 [4 p, D/ z
- Serial.println("To set GPIO 0 low, type:");
, e( e& x9 G7 w; B$ t - Serial.print(WiFi.localIP());/ P4 b t4 @5 m) b+ Q
- Serial.println("/gpio/0");
# b& P' l% t' k - Serial.println("To toggle GPIO 0, type:");0 d/ i9 ^% _0 P6 U% b
- Serial.print(WiFi.localIP());
+ T$ x* c; _+ @) G/ B( C/ } - Serial.println("/gpio/4");
4 M6 R3 p7 ^! A# w% n Q5 ? - 6 a' b) {5 j) B3 F4 [
- // 初始化blinker) d: o3 ~ E5 T/ i7 i# p% D
- Blinker.begin(auth, ssid, pswd);% ~0 b. k9 }* z& I$ u. J! E `
- BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数* P! @8 V8 k2 f7 N8 Y1 Y
- BlinkerAliGenie.attachPowerState(aligeniePowerState); //天猫语音操作注册函数# g7 ]: I1 R2 O
- Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。/ ^9 q8 i- d( m% U6 p; J
2 I( h# e3 @* W ]# a9 P* e2 L+ u- Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback# O0 a% i. P5 m+ c* W4 P
- }
$ p- }) D1 N& F. o, P - void dataRead(const String & data)
4 s* p% w4 @% X Q6 N - {
, Y0 n# r9 G! ?( F: u7 x - BLINKER_LOG("Blinker readString: ", data); n6 P3 Y; I1 Z5 z+ M
- * N9 R* O( X2 N& x, r8 _$ a
- Blinker.vibrate();" X# q. \5 K; I9 z8 q
- 3 _! Q/ a# ^% M1 |) E; a' E
- uint32_t BlinkerTime = millis();
0 V+ E; t" {* w6 c% I7 a$ Q0 U3 H -
* P- f2 N/ t/ Q% x4 ~ - Blinker.print("millis", BlinkerTime);3 a5 |+ I$ o2 i, s* s
- }
8 S+ Q& Z8 i. J5 I# j - void loop()
* F& m7 D) @6 M, W) U/ Q6 ? - {8 K% O- E- X5 c3 X/ j. n, [
- Blinker.run();
" V& |+ m' O) ~2 _# Z - if (digitalRead(key)==LOW)0 P; w4 s9 @" V/ e2 B
- {
/ n! k5 Q. s+ h) p& T- j( Q - Blinker.delay(200);0 A4 U7 W8 x! ?& K+ T5 M& j
- if (digitalRead(key)==LOW)
4 K: Q$ X1 \6 r - {
( O* m# W; ]' C' x - if (digitalRead(kg)==LOW)
% L% x3 }4 e2 E0 G - {
6 |& Y/ f' C/ A5 i - 7 h7 r' u0 N/ R# W, `
- digitalWrite(kg, HIGH);5 k& C3 M9 ^7 B: Q6 @; n
- digitalWrite(de, LOW);5 L2 g& s! A2 }# }
- Button1.print("on");
) q9 d, ~' K) K, y- f; \ - Button1.color("#0000FF"); //设置app按键是浅蓝色
+ Z7 D5 p4 w+ W1 r5 z# W - Button1.text("开启中");! e4 _& v+ e0 A1 j8 @0 L* K
- }
/ |- y- Q" d' M' S: k* D$ C# n - else if (digitalRead(kg)==HIGH)
; `4 ~* t/ N3 v1 I! w$ }* ~; ? - {. |( H6 t/ ^9 @% d6 C5 A) B" V
- digitalWrite(kg, LOW);/ f4 m7 P, y* B2 [
- digitalWrite(de, HIGH);9 Y5 V$ B @ z
- Button1.print("off");( }; Y3 C8 i0 w* X, L- C/ f) G* P- y
- Button1.color("#00FFFF"); //设置app按键是深蓝色
2 X Q' g5 B; o/ S# u& Q3 b2 W - Button1.text("关闭中");+ h. A& H7 r$ Q; d! J. V
- }
' c) N2 m7 z+ B2 @1 V( Q8 g - }+ o( h* V5 j! v- @3 q% l( [ x% ]- n
- }* s1 x* P2 t6 x3 Z
- }
复制代码
c6 U! C) _- n. ]- z1 W& D9 J
- y" c! Q( d8 T) l) T我没有用卖家给的码,我自己写了一个,参考我前面的文章 《最简单的8266天猫精灵控制开关,点灯、Mixly可视模块化编程 》https://bbs.nasdiyer.com/thread-18755-1-1.html
, y# N) {2 y( v3 y, D2 J. R" _) E, B
2 w/ m$ b: Z9 e+ F- j _把上面的2改成5,把高低电平对调一下就可以使用天猫精灵来控制你的这个插座了。我是把我的第一个插座放在了我的落地电风扇中了,当我慵懒的在沙发上刷着手机时候感觉有一点点热,我只要呼唤“天猫精灵,打开风扇”,就可以了。
, S" F& L8 _/ S" w( h
# T5 s) l- h7 m* M! R! m
: H. [- N& T6 F. w- m/ [, q4 k |
|