# 基于ESP-12F的智能插座测试板
#### **功能描述**
通过ESP8266接入互联网,实现远程控制,可连接米家实现小爱同学语音控制(百度小度和天猫精灵由于没有设备无法测试,理论上同时可支持三大精灵)。板上有ch340下载电路,设计有自动下载电路,方便烧录调试。
## 设计过程
### 一、元件选型
1.主控选择ESP-12F,支持SOC可以节省PCB空间,降低电路复杂程度,同时ESP8266支持arduino开发,可大大降低编程难度,安可信的ESP-12F(ESP8266的模块)也十分廉价,所以选用ESP-12F。
2.下载部分采用CH340C,兼容性好,外围电路简单,成本低。
3.继电器驱动采用安森美的感性负载驱动NUD3124.
### 二、PCB设计(略)
没什么好说的,注意*强电弱电的隔离,天线的布局*。
### 三、开发环境
采用arduino IDE开发,使用[点灯科技](https://diandeng.tech/doc)(blinker)的库,arduino[环境搭建](https://www.arduino.cn/thread-76029-1-1.html "arduino环境搭建")
[blinker库文件](https://github.com/blinker-iot/blinker-library/archive/master.zip "blinker库文件")
Windows:将下载好的blinker库解压到 我的电脑>文档>Arduino>libraries 文件夹中
Mac OS:将下载好的blinker库解压到 文稿>Arduino>libraries 文件夹中
环境搭建好后选择NodeMCU,如图
![image.png](//image.lceda.cn/pullimage/Yy6xYTQv5Z2IZtqFZqJKpNjlyx44WLsgPUSKpeWr.png)
#### NodeMCU引脚定义
D0~D8: 数字输入引脚。
PWM: 所有数字I/O都可用于PWM输出
串口: Serial(TX-D10/RX0-D9)可用于和计算机或其他设备通信,Serial1(TX1-D4)只有输出端口,可用向其他设备发送数据。
SPI: MISO\MOSI\SCK引脚可用于SPI通信。
IIC: 实际上D0~D8都可以用作IIC通信。
A0: 只能做模拟输入使用,输入电压范围为0~3.3V,8-bit精度。
L: 位于8266模块上的LED,该LED连接到D2引脚,可以使用宏LED_BUILTIN编程控制
可以使用Dx或引脚对应的GPIO编号控制引脚,如
`a=digitalRead(D1)`
`a=digitalRead(5)`
**不建议使用的引脚**
**程序烧写时,会使用到TXD0\RXD0\GPIO0 三个引脚,如需使用,请烧写完成后,再连接外设使用。**
**esp8266模块内部使用了一些IO,如S1\S2\S3\SC\SO\SK\GPIO15,编程时请不要调用,否则可能造成程序运行错误。**
IO模式设置:INPUT(输入模式),OUTPUT(输出模式),INPUT_PULLUP(上拉输入模式)
![4456352-8938615d16aa9d71.webp.jpg](//image.lceda.cn/pullimage/wAK21C73PcSQyYerr1SOkoQxUWXhlEexUONq1DUN.jpeg)
### 四、程序
``` arduino
#define BLINKER_WIFI //官方wifi协议库
#define BLINKER_MIOT_OUTLET //设置小爱插座类库
#define BLINKER_ALIGENIE_OUTLET //设置天猫插座类库
#define BLINKER_DUEROS_OUTLET //设置小度插座类库
#define BLINKER_PRINT Serial //串口协议库
#define BLINKER_ESP_SMARTCONFIG //SmartConfig配网
#include
#define LED_BUILTIN D4 //LED
#define RELAY_PIN 4 //继电器
const int buttonPin = D1; //按键
int lastButtonState = 0;
// 新建组件对象
BlinkerButton Button1("btn-abc"); //设置app按键的键名
char auth[] = "f3fd6e961589"; //Your Device Secret Key
//char ssid[] = "CU_buce"; //你的Wi-Fi网络的SSID或名称(SmartConfig自动配网时可忽略)
//char pswd[] = "zj.629858"; //您的WiFi网络WPA密码或WEP密钥(SmartConfig自动配网时可忽略)
bool oState = false;
// app上按下按键即会执行该函数
void button1_callback(const String & state)
{
BLINKER_LOG("get button state: ", state); //串口打印
if (state=="on") { //如果state是on状态
digitalWrite(LED_BUILTIN, LOW); //LED开
digitalWrite(RELAY_PIN, LOW); //继电器开
Button1.color("#00BB00"); //设置app按键是绿色
// 反馈开关状态
Button1.print("on");
oState = true;
} else if(state=="off"){
digitalWrite(LED_BUILTIN, HIGH); //LED关
digitalWrite(RELAY_PIN, HIGH); //继电器关
Button1.color("#FF0000"); //设置app按键是红色
// 反馈开关状态
Button1.print("off");
oState = false;
}
}
//*******如果小爱有对设备进行操作就执行下面
void miotPowerState(const String & state)
{
BLINKER_LOG("need set power state: ", state);
if (state == BLINKER_CMD_ON) {
digitalWrite(LED_BUILTIN, LOW);
digitalWrite(RELAY_PIN, LOW);
Button1.color("#00BB00"); //设置app按键是绿色
BlinkerMIOT.powerState("on");
BlinkerMIOT.print();
Button1.print("on");
oState = true;
}
else if (state == BLINKER_CMD_OFF) {
digitalWrite(LED_BUILTIN, HIGH);
digitalWrite(RELAY_PIN, HIGH);
Button1.color("#FF0000"); //设置app按键是红色
BlinkerMIOT.powerState("off");
BlinkerMIOT.print();
Button1.print("off");
oState = false;
}
}
void miotQuery(int32_t queryCode)
{
BLINKER_LOG("MIOT Query codes: ", queryCode);
switch (queryCode)
{
case BLINKER_CMD_QUERY_ALL_NUMBER :
BLINKER_LOG("MIOT Query All");
BlinkerMIOT.powerState(oState ? "on" : "off");
BlinkerMIOT.print();
break;
case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
BLINKER_LOG("MIOT Query Power State");
BlinkerMIOT.powerState(oState ? "on" : "off");
BlinkerMIOT.print();
break;
default :
BlinkerMIOT.powerState(oState ? "on" : "off");
BlinkerMIOT.print();
break;
}
}
//*******如果天猫精灵有对设备进行操作就执行下面
void aligeniePowerState(const String & state)
{
BLINKER_LOG("need set power state: ", state);
if (state == BLINKER_CMD_ON) {
digitalWrite(LED_BUILTIN, LOW);
digitalWrite(RELAY_PIN, LOW);
Button1.color("#00BB00"); //设置app按键是绿色
BlinkerAliGenie.powerState("on");
BlinkerAliGenie.print();
Button1.print("on");
oState = true;
}
else if (state == BLINKER_CMD_OFF) {
digitalWrite(LED_BUILTIN, HIGH);
digitalWrite(RELAY_PIN, HIGH);
Button1.color("#FF0000"); //设置app按键是红色
BlinkerAliGenie.powerState("off");
BlinkerAliGenie.print();
Button1.print("off");
oState = false;
}
}
void aligenieQuery(int32_t queryCode)
{
BLINKER_LOG("AliGenie Query codes: ", queryCode);
switch (queryCode)
{
case BLINKER_CMD_QUERY_ALL_NUMBER :
BLINKER_LOG("AliGenie Query All");
BlinkerAliGenie.powerState(oState ? "on" : "off");
BlinkerAliGenie.print();
break;
case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
BLINKER_LOG("AliGenie Query Power State");
BlinkerAliGenie.powerState(oState ? "on" : "off");
BlinkerAliGenie.print();
break;
default :
BlinkerAliGenie.powerState(oState ? "on" : "off");
BlinkerAliGenie.print();
break;
}
}
//*******如果小度有对设备进行操作就执行下面
void duerPowerState(const String & state)
{
BLINKER_LOG("need set power state: ", state);
if (state == BLINKER_CMD_ON) {
digitalWrite(LED_BUILTIN, LOW);
digitalWrite(RELAY_PIN, LOW);
Button1.color("#00BB00"); //设置app按键是绿色
BlinkerDuerOS.powerState("on");
BlinkerDuerOS.print();
Button1.print("on");
oState = true;
}
else if (state == BLINKER_CMD_OFF) {
digitalWrite(LED_BUILTIN, HIGH);
digitalWrite(RELAY_PIN, HIGH);
Button1.color("#FF0000"); //设置app按键是红色
BlinkerDuerOS.powerState("off");
BlinkerDuerOS.print();
Button1.print("off");
oState = false;
}
}
void duerQuery(int32_t queryCode)
{
BLINKER_LOG("DuerOS Query codes: ", queryCode);
switch (queryCode)
{
case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
BLINKER_LOG("DuerOS Query power state");
BlinkerDuerOS.powerState(oState ? "on" : "off");
BlinkerDuerOS.print();
break;
case BLINKER_CMD_QUERY_TIME_NUMBER :
BLINKER_LOG("DuerOS Query time");
BlinkerDuerOS.time(millis());
BlinkerDuerOS.print();
break;
default :
BlinkerDuerOS.powerState(oState ? "on" : "off");
BlinkerDuerOS.print();
break;
}
}
//如果本地开关有动作执行下面手动模式
void KeyDetection(void){
if((digitalRead(buttonPin)==LOW)&&lastButtonState==0){
Blinker.delay(15); //延时15ms消抖
if((digitalRead(buttonPin)==LOW)){ //确定按键按下
digitalWrite(LED_BUILTIN, oState);
digitalWrite(RELAY_PIN,oState);
Button1.color(oState ? "#FF0000" : "#00BB00");
Button1.print(oState ? "off" : "on");
oState = !oState;
lastButtonState = !lastButtonState;
}
}else if(digitalRead(buttonPin)==HIGH&&lastButtonState==1){
lastButtonState = !lastButtonState;
}
}
// 心跳包函数
void heartbeat() {
if (digitalRead(RELAY_PIN)==LOW) {
// 反馈开关状态
Button1.print("on");
Button1.color("#00BB00"); //设置app按键是绿色
oState = true;
} else if(digitalRead(RELAY_PIN)==HIGH){
// 反馈开关状态
Button1.print("off");
Button1.color("#FF0000"); //设置app按键是红色
oState = false;
}
}
void setup()
{
Serial.begin(115200); //初始化串口
BLINKER_DEBUG.stream(Serial); //输出调试信息
pinMode(LED_BUILTIN, OUTPUT); //初始化有LED的IO
digitalWrite(LED_BUILTIN, HIGH); //默认上电时关
pinMode(buttonPin, INPUT_PULLUP); //初始化按键IO为内部上拉
pinMode(RELAY_PIN, OUTPUT); //初始化继电器IO
digitalWrite(RELAY_PIN, HIGH); //默认上电时关
Blinker.begin(auth); //初始化bliker
Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback
BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数
BlinkerMIOT.attachQuery(miotQuery); //小爱语音操作回调函数
BlinkerAliGenie.attachPowerState(aligeniePowerState);//天猫语音操作注册函数
BlinkerAliGenie.attachQuery(aligenieQuery); //天猫语音操作回调函数
BlinkerDuerOS.attachPowerState(duerPowerState); //小度语音操作注册函数
BlinkerDuerOS.attachQuery(duerQuery); //小度语音操作回调函数
Blinker.attachHeartbeat(heartbeat);//app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。
}
void loop()
{
Blinker.run();
KeyDetection();
}
```
### 五、一键配网
程序采用的SmartConfig配网,可使用安信可微信配网(AIRKISS)、乐鑫(ESPTOUCH)配网等。
接入米家需要在米家-我的-其他平台设备-添加,绑定点灯科技账号即可
### 六、使用演示
程序内置了三大精灵(小爱同学,天猫精灵,百度小度)的语音控制,由于我只有小爱同学,所以另外两个未作测试,如果测试另外两个出现问题,可以反馈给我。
ID |
Name |
Designator |
Footprint |
Quantity |
1 |
MINI-USB_JX |
P1 |
MICRO-USB-SMD_5P-P0.65-H-F_C10418 |
1 |
2 |
WJ500V-5.08-2P-14-00A |
P2 |
CONN-TH_2P-P5.00_WJ500V-5.08-2P |
1 |
3 |
CH340C |
U7 |
SOP-16_L10.0-W3.9-P1.27-LS6.0-BL |
1 |
4 |
HDR-F-2.54_1x5 |
H1 |
HDR-F-2.54_1X5 |
1 |
5 |
NUD3124LT1G |
U3 |
SOT-23-3_L2.9-W1.3-P1.90-LS2.4-BR |
1 |
6 |
HK4100F |
K2 |
RELAY-TH_HK4100F-XXX-XXXX |
1 |
7 |
MF-PSMF075X-2 |
F1 |
0805 |
1 |
8 |
100nF |
C5,C6,C7,C8,C1,C9,C4 |
C0603 |
7 |
9 |
10uF |
C2 |
CAP-SMD_L3.2-W1.6-R-RD |
1 |
10 |
AMS1117-3.3 |
U4 |
SOT-223-3_L6.5-W3.4-P2.30-LS7.0-BR |
1 |
11 |
TS-1088R-02026 |
KEY1,RST |
SW-SMD_L3.9-W3.0-P4.45 |
2 |
12 |
19-217/BHC-ZL1M2RY/3T |
POWER |
LED0603-R-RD |
1 |
13 |
SS8050 |
Q2,Q1 |
SOT-23-3_L2.9-W1.3-P1.90-LS2.4-BR |
2 |
14 |
22uF |
C3,C10 |
C0603 |
2 |
15 |
10K |
R2,R1,R3,R4,R5,R8,R9,R10 |
R0603 |
8 |
16 |
ESP-12F(ESP8266MOD) |
U1 |
WIFIM-SMD_ESP-12F-ESP8266MOD |
1 |
17 |
300 |
R6,R7 |
R0603 |
2 |
18 |
SN74LVC1G04DBVR |
U2 |
SOT-23-5_L3.0-W1.7-P0.95-LS2.8-BR |
1 |
19 |
A2005WV-2P |
BOOT |
HDR-TH_2P-P2.00-V |
1 |
20 |
5.1K |
R12,R11 |
R0603 |
2 |
21 |
固定孔 |
U11,U10,U9,U5 |
固定孔 |
4 |
展开
13
45
收藏到专辑