本科二年级时通过一个比赛接触到arduino,怀着对arduino的热爱买了arduino套件,奈何想的多做的少,arduino套件买来后一直在吃灰;大学毕业后一直有一个打造智慧家居的想法,恰好工作后业余时间较多,于是借助吃灰的arduino套件,再购买其他材料对卧室进行了改造。
通过手机blinke的APP可以查看卧室温度与湿度、控制卧室吊灯、台灯、窗帘的的开关;通过小爱音箱可以控制卧室吊灯、台灯、窗帘、空调的开关。
注:空调开关利用小爱音箱自带的模块,未进行编程开发。
1.伺服舵机
2. L298N电机驱动模块
3. 12V2A直流电源适配器
4. WiFiduino物联网开发板
5. 减速电机
6. 面包板
7. 导线若干
8.DHT11温湿度模块
9.电位器
10. 帘配件—卷拉式手拉升降拉链拉珠头拉绳卷轴制头
11. 有小爱同学的设备(小米音箱、小米手机)
1.将WiFiduino的VCC接口与GND接口通过导线外接到面包板的+、-位置。
2.DHT11模块的VCC接口连接面包板的+,GND接口连接面包板的-,DATA接口连接WiFiduino的D8接口。
3.继电器的VCC接口连接面包板的+,GND接口连接面包板的-,IN接口连接WiFiduino的D4接口。
4.L298N模块的ENA连接面包板的+,IN1、IN2分别连接WiFiduino的D2、D3接口。
5.伺服舵机红色线黄色连接面包板的+、棕色线连接面包板的-,黄色线连接到WiFiduino的D7接口。
6.继电器输出连接在台灯的一条导线上,作为台灯的开关;
7.12V2A的直流电源输出接在L289N的输入端,L289N的OUT1、OUT2连接减速电机的输入端。
注意事项:确保小爱音箱与WiFiduino连接至同一无线网络
详细的环境搭建步骤就不再赘述了,网上教程非常多, 如果困难可以加我探讨。
此步骤主要完成:
arduino 软件安装
esp8266 库安装
blinker 库安装
注意:小编购买的小爱同学有红外发射功能,所以未编写对空调控制的代码。
#define BLINKER_WIFI
#define BLINKER_PRINT Serial
#define BLINKER_MIOT_SENSOR //小爱同学定义为传感器设备
#define BLINKER_MIOT_MULTI_OUTLET //设置为小爱多个插座的模式
#include //引入blinker模块
#include //引入舵机模块
#include //引入温湿度模块
//0.WIFI与关键值配置
char auth[] = "bd48bafdbef2";//点灯科技关键值
char ssid[] = "赚赚赚"; //要连入WIFI的名称
char pswd[] = "3.1415926535";//要连入WIFI的密码
//1.接口定义
#define CURT_1 D2 //定义窗帘接口1
#define CURT_2 D3 //定义窗帘接口2
#define TABLE_L D4 //定义台灯接口
#define DHTPIN D8 //定义温湿度传感器接口
#define ROOM_L D7 //定义卧室灯舵机接口
#define DHTTYPE DHT11 //定义温湿度传感器接口类型为DHT11
//2.舵机与传感器配置
Servo lamp_servo;//定义灯舵机
DHT dht(DHTPIN, DHTTYPE);//温湿度采集函数
float humi_read = 0, temp_read = 0;
//3.点灯科技按键配置
BlinkerSlider RAN_CUR("窗帘");//定义窗帘滑块
BlinkerButton BTN_TABLE_L("台灯");//定义台灯滑块
BlinkerButton BTN_ROOM_L("卧室灯");//定义卧室灯开关按键
BlinkerNumber HUMI("湿度");//定义湿度度数据显示
BlinkerNumber TEMP("温度");//定义温度度数据显示
//4.点灯科技按键反馈函数
//4.1窗帘反馈馈函数
void RAN_CUR_callback(int32_t value_CUR)
{
BLINKER_LOG("get slider value: ", value_CUR);
if ((0<=value_CUR)&(value_CUR<=33)){//减速电机正转、上拉窗帘
digitalWrite(CURT_1,HIGH);
digitalWrite(CURT_2,LOW);
}
else if((34<=value_CUR)&(value_CUR<=67)){
digitalWrite(CURT_1,LOW);
digitalWrite(CURT_2,LOW);
}
else//减速电机反转、下拉窗帘
{
digitalWrite(CURT_1,LOW);
digitalWrite(CURT_2,HIGH);
}
}
//4.2卧室灯反馈函数
void BTN_ROOM_L_callback(const String & state_ROOM_L)
{ BTN_ROOM_L.text("卧室灯");//按键名字
BLINKER_LOG("get button state: ", state_ROOM_L);
if (state_ROOM_L== BLINKER_CMD_ON) {//开关按键 打开
lamp_servo.write(40);
BTN_ROOM_L.color("#00FF00");//按键颜色
BTN_ROOM_L.print("on");
}
else if(state_ROOM_L== BLINKER_CMD_OFF)
{
lamp_servo.write(130);
BTN_ROOM_L.color("#000000");//按键颜色
BTN_ROOM_L.print("off");
}
else
BLINKER_LOG("get button state: ", state_ROOM_L);
}
//4.3台灯反馈函数
void BTN_TABLE_L_callback(const String & state_TABLE_L)
{
BTN_TABLE_L.text("台灯");//按键名
BLINKER_LOG("get button state: ", state_TABLE_L);//获取按键状态
if (state_TABLE_L == "on") {//开关按键 打开
digitalWrite(TABLE_L, HIGH);
BTN_TABLE_L.color("#00FF00");//按键颜色为绿色
BTN_TABLE_L.print("on");
}
else {
digitalWrite(TABLE_L, LOW);
BTN_TABLE_L.color("#000000");//按键颜色为黑色
BTN_TABLE_L.print("off");
}
}
//4.4用于温湿度的心跳包
void heartbeat()
{
//反馈湿度数据
HUMI.print(humi_read);
HUMI.unit("%");//设置温度单位
HUMI.color("#fddb10");
//反馈温度数据
TEMP.print(temp_read);
TEMP.unit("°");//设置湿度单位
TEMP.color("#fddb01");
}
//5.小爱同学语音输出模块
char i;
bool ostate[5]={false};
//5.1小爱同学语音输出反馈模块
void miotPowerState(const String & state, uint8_t num)
{
BLINKER_LOG("need set outlet: ", num, ", power state: ", state);
i = 0; //初始化
if (num == 0) {
i = 0;
}
else if (num == 1) {
i = 1;
}
else if (num == 2) {
i = 2;
}
else if (num == 3) {
i = 3;
}
else if (num == 4) {
i = 4;
}
else if (num == 5) {
i = 5;
}
if (state == BLINKER_CMD_ON) {
switch (i) {
case 0://窗帘反馈
digitalWrite(CURT_1, LOW);
digitalWrite(CURT_2, HIGH);
delay(20000);
digitalWrite(CURT_1, LOW);
digitalWrite(CURT_2, LOW);
BlinkerMIOT.powerState("on", num);
BlinkerMIOT.print();
ostate[num] = true;
break;
case 1://台灯反馈函数
digitalWrite(TABLE_L, HIGH);
digitalWrite(i, !digitalRead(TABLE_L));
BlinkerMIOT.powerState("on", num);
BlinkerMIOT.print();
ostate[num] = true;
break;
case 2://卧室灯反馈函数
lamp_servo.write(40);
BlinkerMIOT.powerState("on", num);
BlinkerMIOT.print();
ostate[num] = true;
break;
case 3:
break;
case 4:
break;
default:
BlinkerMIOT.powerState("on", num);
BlinkerMIOT.print();
ostate[num] = true;
}
}
else if (state == BLINKER_CMD_OFF) {
switch (i) {
case 0://窗帘反馈
digitalWrite(CURT_1, HIGH);
digitalWrite(CURT_2, LOW);
delay(8000);
digitalWrite(CURT_1, LOW);
digitalWrite(CURT_2, LOW);
BlinkerMIOT.powerState("off", num);
BlinkerMIOT.print();
ostate[num] = false;
break;
case 1://台灯反馈函数
digitalWrite(TABLE_L, LOW);
digitalWrite(i, !digitalRead(TABLE_L));
BlinkerMIOT.powerState("off", num);
BlinkerMIOT.print();
ostate[num] = false;
break;
case 2://卧室灯反馈函数
lamp_servo.write(130);
BlinkerMIOT.powerState("0ff", num);
BlinkerMIOT.print();
ostate[num] = false;
break;
case 3:
break;
case 4:
break;
default:
BlinkerMIOT.powerState("off", num);
BlinkerMIOT.print();
ostate[num] = false;
}
}
}
//5.2小爱状态监测模块模块
void miotQuery(int32_t queryCode, uint8_t num){
BLINKER_LOG("AliGenie Query outlet: ", num, ", codes: ", queryCode);
switch (queryCode){
case BLINKER_CMD_QUERY_ALL_NUMBER :
BLINKER_LOG("MIOT Query All");
BlinkerMIOT.powerState(ostate[num] ? "on" : "off", num);
BlinkerMIOT.print();
break;
case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
BLINKER_LOG("MIOT Query Power State");
BlinkerMIOT.powerState(ostate[num] ? "on" : "off", num);
BlinkerMIOT.print();
break;
default :
BlinkerMIOT.powerState(ostate[num] ? "on" : "off", num);
BlinkerMIOT.print();
break;
}
}
void setup(){
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
Blinker.begin(auth, ssid, pswd);
//窗帘接口赋值与初始化
pinMode(CURT_1, OUTPUT);
pinMode(CURT_2, OUTPUT);
digitalWrite(CURT_1, LOW);
digitalWrite(CURT_2, LOW);
//台灯接口口赋值与初始化
pinMode(TABLE_L, OUTPUT);
digitalWrite(TABLE_L, LOW);
//卧室灯舵机接口赋值与初始化
lamp_servo.attach(ROOM_L);
lamp_servo.write(90);
//blinke按键赋值模块
RAN_CUR.attach(RAN_CUR_callback);//添加窗帘模块
BTN_TABLE_L.attach(BTN_TABLE_L_callback);//添加台灯模块
BTN_ROOM_L.attach(BTN_ROOM_L_callback);//添加卧室灯模块
Blinker.attachHeartbeat(heartbeat);//添加温湿度模块心跳包
dht.begin();
//语音控制模块
BlinkerMIOT.attachPowerState(miotPowerState);
BlinkerMIOT.attachQuery(miotQuery);
}
void loop(){
Blinker.run();
humi_read = dht.readHumidity();//读取湿度
temp_read = dht.readTemperature();//读取温度
Blinker.delay(10);
}
参考文章:小爱同学+blinker+esp8266实现千里点灯
此步骤主要完成:
下载blinker APP
安装并添加按钮
通过以上两步给blinker界面添加温度、湿度显示的数据模块,添加台灯、卧室灯的开关按键,添加窗帘滑块。添加按钮后的界面如下图所示。
下载米家APP,注册账户,之后按如下图操作。
下载小米音箱APP,注册账户,之后按如下图操作。
=------------------------------------------------------------------------------------------------------------------------------------=
=------------------------------------------------------------------------------------------------------------------------------------=
=------------------------------------------------------------------------------------------------------------------------------------=
本文仅仅简单介绍了使用WiFiduino、小爱同学、blinker进行智慧卧室改造的过程。Arduino还有许多其他强大的功能,希望大家一起学习。