物联网系列④——基于ESP8266与点灯科技平台的加湿器设计(接入小爱同学)
- 一、设计目标
- 二、电路设计
- 三、思路介绍
- 四、ESP8266代码
一、设计目标
- 使用点灯科技平台接入物联网,可通过手机点灯APP控制加湿器的开关
- 接入小爱同学,通过语音控制加湿器的开关
- 通过外接TTL串口下载模块给ESP8266程序烧写,通过跳线帽手动拉低GPIO0电平,手动RST
- 供电使用LM1117 5V转3V设计,可选择使用Mico USB和DC 5.5*2.5mm接口进行5V供电
- 引脚使用通用设计,方便外设扩展
- LED指示灯指示系统运行状态
二、电路设计
在上一个版本电路的基础上进行优化,为节省成本去除CH340下载电路,板子喷黑色油漆提高科技感,输出引脚采用一般外设模块较为通用引脚设计,提高电路板通用性。
三个电路板通过铜柱共地并固定,通过一根黑色5V电源线进行板间供电,组成塔式结构,外观充满科技感。不同层数的电路板执行不同的功能,第一层为点灯科技+小爱对加湿器开关控制。第二层为点灯科技+小爱控制WS2812B灯带。第三层为ESP8266作为网络服务器,感兴趣的小伙伴可以去看看!
三、思路介绍
关于加湿器模块是本人于某宝以10元左右的价格购入的,该模块本身是通过USB供电并通过模块自身的按键进行开关的。所以我们要通过ESP8266去控制它开关便需要对该模块进行改造。最简单的方法便是通过GPIO口来替代加湿器模块上的按键实现远程控制加湿器模块的开关,并从电路板上将5V电源线和地线接入加湿器模块的供电端即可实现物联网电路板对加湿器供电。经过测试,该加湿器模块的控制机制为按键输入引脚检测到低电平后一段时间内,要检测到高电平,才能识别为开关。关于哪个引脚是按键输入引脚,通过万用表对加湿器按键引脚进行测量即可得知。懂得这个机制以后就容易多了,我们让ESP8266的D1连接到加湿器模块的按键输入引脚,D1默认为输出高电平,我们先将D1电平拉低,延迟一段时间以后,再将电平拉高,这时候会发现加湿器开启了。同理,该方法也可以使开启时的加湿器模块关闭,所以为了防止将原本处于开启状态的加湿器误关或将原本处于关闭状态的加湿器误开,需对当前加湿器运行状态进行判断,否则会产生bug。感兴趣的小伙伴可以买入加湿器模块然后跟着我的解决思路去改造尝试。
四、ESP8266代码
#define BLINKER_PRINT Serial
#define BLINKER_WIFI
#define BLINKER_MIOT_OUTLET
#include <Blinker.h>
char auth[] = "*********";//设备号
char ssid[] = "*********";//无线账号
char pswd[] = "*********";//无线密码
// 新建组件对象
BlinkerButton Button1("HUM_Button");
int count = 0;//加湿器计数器
int count1 = 0;//led翻转计数器
int HUM_OPEN=0;//加湿器标志位
int HUM_State=0;//加湿器开关状态标志位,0关,1开
#define HUM_Button D1
#define LED1 16
#define LED2 14
// 按下按键即会执行该函数
void button1_callback(const String & state) {
BLINKER_LOG("get button state: ", state);
digitalWrite(LED2, !digitalRead(LED2));
HUM_OPEN=1;//标志位开启
if(digitalRead(LED2)==0)
{
Button1.print("off");
}
else
{
Button1.print("on");
}
}
// 如果未绑定的组件被触发,则会执行其中内容
void dataRead(const String & data)
{
BLINKER_LOG("Blinker readString: ", data);
}
//小爱同学处理函数
void miotPowerState(const String & state)
{
BLINKER_LOG("need set power state: ", state);
if (state == BLINKER_CMD_ON) {
BlinkerMIOT.powerState("on");
BlinkerMIOT.print();
if(HUM_State==0)//处于关闭状态开启
{
digitalWrite(LED2, HIGH);
HUM_OPEN=1;
HUM_State=1;//开启
}
}
else if (state == BLINKER_CMD_OFF) {
BlinkerMIOT.powerState("off");
BlinkerMIOT.print();
if(HUM_State==1)//处于开启状态关闭
{
digitalWrite(LED2, LOW);
HUM_OPEN=1;
HUM_State=0;//关闭
}
}
}
void setup() {
// 初始化串口
Serial.begin(115200);
#if defined(BLINKER_PRINT)
BLINKER_DEBUG.stream(BLINKER_PRINT);
#endif
// 初始化有LED的IO
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
pinMode(LED1, OUTPUT);
digitalWrite(LED1, HIGH);
pinMode(LED2, OUTPUT);
digitalWrite(LED2, LOW);
//初始化加湿器引脚
pinMode(HUM_Button, OUTPUT);
digitalWrite(HUM_Button, HIGH);//上电关闭
// 初始化blinker
Blinker.begin(auth, ssid, pswd);
Blinker.attachData(dataRead);
Button1.attach(button1_callback);//按键
//小爱回调函数
BlinkerMIOT.attachPowerState(miotPowerState);
}
void loop() {
Blinker.run();
count1++;//led翻转计数器
if(HUM_OPEN==1)
{
digitalWrite(HUM_Button, LOW);
count++;
if(count==30)
{
digitalWrite(HUM_Button, HIGH);
count=0;
HUM_OPEN=0;
}
}
if(count1==100)
{
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
digitalWrite(LED1, !digitalRead(LED1));
count1=0;
}
}
不足之处还望各位大佬不吝赐教!