前言

做完智慧浇水器之后对这种可以节省时间和精力的场景总有一种谜之向往(懒鬼是这样的),这次我准备做一个可以自动开窗的装置,结合之前的甲醛检测传感器就可以实现甲醛含量过高自动开窗通风,之后还可以把燃气检测、烟雾检测、一氧化碳检测、空气质量检测的各种气体传感器也接入进来,这个场景的覆盖面以及实用性也拉满了,有朋友要是还有想法可以在这个场景中接入哪些部件也可以留言给我,之后我都接入进来(快给我留言吧!求求你们了,让我室友给大伙磕头了!)。

硬件选择

板子依然选择超级好用,无敌便宜,资料齐全,生态完善之安信可 ESP32S

电动开窗器的选择呢,因为我家是常见的滑动平移的窗户,淘宝上大多都是推拉的,找了半天挑了一家最便宜的进行改造 ,别问,问就是穷!(T▽T)

接线有些复杂,因为这个开窗器的方向是由电流方向控制的,我就用了手边的一个三路继电器做了个电流反转的功能,接线具体如下:

ESP32S-5V --- 继电器-Vcc

ESP32S-GND --- 继电器-GND

ESP32S-P25 --- 继电器-1路控制端

ESP32S-P26 --- 继电器-2路控制端

ESP32S-P27 --- 继电器-3路控制端

+24V 输出 --- 继电器1路中间节点

-24V 输出 --- 继电器3路中间节点

继电器1路常开节点 --- 继电器2路中间节点

继电器2路常闭节点 --- 继电器3路常开节点

继电器2路常开节点 --- 继电器3路常闭节点

继电器3路常闭节点 --- 开窗器的 +24V 输入

继电器3路常开节点 --- 开窗器的 - 24V 输入

代码解析

获取代码

为了方便讲解逻辑,我会打乱代码的顺序可能还会进行裁剪,要是想直接拿代码跑的朋友可以直接去 灵感桌面的秘密宝库 获取代码,或者直接 clone:

https://gitee.com/inspiration-desktop/DEV-lib-arduino.git

下载或者 clone代码后这次用到的是这个三个文件夹:



cjson:我移植的 cjson 库,就是标准的 cjson 库,放到 arduino 安装目录下的 libraries 文件夹里,百度一下 cjson 的函数使用就行了。

libsddc:是我移植自官方的SDDC库和自己写的 SDK,也是放入 libraries 文件夹里就行。里面是 SDDC 协议的处理函数,我们不用管。

demo 文件夹里面就是我们各种传感器的 demo 代码了:

红圈的 windows_sddc_sdk_demo 文件夹里面就是我们代码,点进去就能看见 windows_sddc_sdk_demo.ino 文件,双击文件会自动启动 arduino-IDE 打开代码。在工具 -> 端口 选择对应的 COM 口然后点击上传就可以把代码烧录到板子里:

具体 arduino 使用教程可以看我之前的文章 arduino开发指导手把手带你 arduino 开发:基于ESP32S 的第一个应用-红外测温枪(带引脚图)

设备控制命令:

通过 Spirit 1 的应用程序或者嗅探器 向传感器设备发送的命令:

获取窗户当前位置百分比

{
"method": "get",
"obj": ["window_percent"]
}

向左移动

{
"method": "set",
"window": "left"
}

向右移动

{
"method": "set",
"window": "right"
}

停止移动

{
"method": "set",
"window": "OFF"
}

配置设备信息

这部分代码可以配置 WiFi 名字和 WiFi 密码,要使用的引脚,并且配置设备在 Spirit 1 上显示的信息:

#define SDDC_CFG_PORT             680U             // SDDC 协议使用的端口号
#define PIN_INPUT 0 // 选择 IO0 进行控制
#define ESP_TASK_STACK_SIZE 4096
#define ESP_TASK_PRIO 25 #define WINDOW_STATE_RIGHT 1
#define WINDOW_STATE_LEFT 0
#define WINDOW_ON 1
#define WINDOW_OFF 0
#define WINDOW_PERCENT "window_percent" static int window_state = 0;
static int window_direction = 0;
static double window_percent = 0;
static sddc_t *g_sddc;
static const char* ssid = "EOS-Tenda"; // WiFi 名
static const char* password = "1234567890"; // WiFi 密码 static const int window2_pin = 25; // 电机方向的控制引脚
static const int window1_pin = 26; // 电机方向的控制引脚
static const int off_pin = 27; // 电机启停的控制引脚 /*
* 当前设备的信息定义
*/
DEV_INFO dev_info = {
.name = "智能开窗器",
.type = "device.window",
.excl = SDDC_FALSE,
.desc = "ESP-32S",
.model = "IDWINDOW01B",
.vendor = "inspiration-desktop",
}; /*
* 系统注册对象汇聚
*/
SDDC_CONFIG_INFO sys_cfg = {
.token = "1234567890", // 设备密码
.devinfo = &dev_info,
.io_dev_reg = io_dev,
.io_dev_reg_num = ARRAY_SIZE(io_dev),
.num_dev_reg = num_dev,
.num_dev_reg_num = ARRAY_SIZE(num_dev),
.state_get_reg = dev_state_get_reg,
.state_get_reg_num = ARRAY_SIZE(dev_state_get_reg),
.dis_dev_reg = dis_dev,
.dis_dev_num = ARRAY_SIZE(dis_dev),
};

回调函数注册

这是收到命令后回调函数注册的位置,在这里注册的函数才能被 SDK 正确的调用,执行正确的动作。

具体 SDK 的解析可以参考 同人逼死官方系列!基于sddc 协议的SDK框架 sddc_sdk_lib 解析同人逼死官方系列!从 DDC 嗅探器到 sddc_sdk_lib 的数据解析

/*
* 数字量设备对象函数与处理方法注册
*/
NUM_DEV_REGINFO num_dev[] = {
{"window_percent",window_percent_set},
}; /*
* 显示设备对象函数与处理方法注册
*/
DIS_DEV_REGINFO dis_dev[] = {
}; /*
* IO设备对象设置函数与处理方法注册
*/
IO_DEV_REGINFO io_dev[] = {
{"window",window_set},
}; /*
* 系统对象状态获取注册
*/
DEV_STATE_GET dev_state_get_reg[] = {
{"window", DEV_IO_TYPE, window_get},
{"window_percent", DEV_NUM_TYPE, window_percent_get},
};

数据获取与发送流程

这里是我们自己编写的处理流程 ,可以根据你的需求自己更改,收到 set 或者 get 后根据前面的注册的函数,进入对应的处理函数。

static void dev_report_state()
{
cJSON * root = cJSON_CreateObject();
cJSON * array = cJSON_CreateArray();
cJSON_AddItemToArray(array, cJSON_CreateString(WINDOW_PERCENT));
cJSON_AddItemToObject(root, "obj", array);
object_report(root);
} static void window_percent_task(void *arg) {
while(1) {
if (window_state) {
if (window_direction == 1 && window_percent < 100) {
window_percent++;
} else if (window_direction == 0 && window_percent > 0) {
window_percent--;
}
if (window_percent == 0 || window_percent == 100) {
printf("停止移动!\n");
digitalWrite(off_pin, LOW);
window_state = WINDOW_OFF;
}
dev_report_state();
}
delay(250);
}
} sddc_bool_t window_percent_set(const uint64_t value)
{
window_percent = value;
return SDDC_TRUE;
} /*
* 开窗控制函数
*/
sddc_bool_t window_set(const char* value)
{
if (!strcmp(value,"left") && window_percent > 0) {
digitalWrite(off_pin, LOW);
digitalWrite(window1_pin, HIGH);
digitalWrite(window2_pin, HIGH);
window_direction = WINDOW_STATE_LEFT;
window_state = WINDOW_ON;
if (digitalRead(window1_pin) == 1 && digitalRead(window2_pin) == 1) {
digitalWrite(off_pin, HIGH);
printf("向左移动!\n");
} else {
printf("短路警告!!!\n");
digitalWrite(off_pin, LOW);
}
} else if (!strcmp(value,"right") && window_percent < 100) {
digitalWrite(off_pin, LOW);
digitalWrite(window1_pin, LOW);
digitalWrite(window2_pin, LOW);
window_direction = WINDOW_STATE_RIGHT;
window_state = WINDOW_ON;
if (digitalRead(window1_pin) == 0 && digitalRead(window2_pin) == 0) {
digitalWrite(off_pin, HIGH);
printf("向右移动!\n");
} else {
printf("短路警告!!!\n");
digitalWrite(off_pin, LOW);
}
} else if (!strcmp(value,"OFF")) {
printf("停止移动!\n");
digitalWrite(off_pin, LOW);
window_state = WINDOW_OFF;
} else if (!strcmp(value,"init")) {
printf("init!\n");
}
return SDDC_TRUE;
}

代码写完之后烧录进去就完事了,和之前完全一样,点一下保存,然后上传OK,具体可以看之前的文档,我就懒得再写一遍啦 (/ω\)

验证

打开之前写的 DDC 协议嗅探器进行下测试,没毛病,之后再写个应用,完美!

总结

这个智能开窗器改完还是蛮有成就感的(主要是那个接线太炸裂了〒▽〒),之后会写个应用来把这个场景完善的表现出来,大家敬请期待吧,有什么好的想法和建议也可以给我评论留言呦!

本文仅个人学习使用,如有错误,欢迎指正, ( ੭ ˙ᗜ˙ )੭谢谢老板!

从零开始 DIY 智能家居 - 智能开窗器的更多相关文章

  1. 硬纪元AI峰会前瞻:如何才能做好智能家居?用户体验最重要

    用户体验不到位,市场就不能说真的发展起来. 可以明显的感觉到,随着人工智能.物联网等技术的发展和应用,我们的生活正在发生翻天覆地的变化,其中感觉最为明显的就是智能家居. 据前瞻产业研究院的数据统计,我 ...

  2. 从零开始的DIY智能家居 - 基于 ESP32 的土壤湿度传感器

    前言 自从上次做了那个 甲醛传感器 和 水浊度传感器 之后开始尝到智能家居的甜头了,这两东西有没有用我不知道,但是没事的时候掏出手机瞄两眼,看着就让人很安心( ̄︶ ̄). 于是懒惰的我开始琢磨把给植物浇 ...

  3. DIY智能家居——零基础入门篇

    概要 本文主要根据笔者从零开始接触硬件,以小白视角开启IoT探索,根据相关资料DIY一个温湿度传感器.后经过探索发现新大陆--Home Assistant&Homebridge,最终实现了一个 ...

  4. Diy智能家居-1.基于esp8266的语音控制系统(开篇)

    目录Diy智能家居-1.基于esp8266的语音控制系统(开篇) https://blog.csdn.net/arno1988/article/details/82628589 Diy智能家居-2.基 ...

  5. 智能家居DIY

    近期智能家居比較火,将房子简单改造下,也算体验智能家居. 本文解说的是用无线的方式,长处是:不用改造现有线路,直接安装模块就可以实现想要的功能,花的钱也较少,共六百左右 =============== ...

  6. IOS 视频直播/智能家居(一行行敲代码,从零开始)lesson:1整体架构

    本文转载至 http://blog.csdn.net/u014011807/article/details/47144027 前段时间由于工作需要做了一个视频直播/智能家居类的应用.算是对iOS音视频 ...

  7. 智能家居入门DIY——【一、ESP8266之软串口HTTP请求】

    前段时间做了一个激光雕刻,玩的不亦乐乎.对Arduino大感兴趣,于是又入手一块20大洋版,配上买学习套件时的诸多零件——红外发射管.一体化红外接收头.DHT11温湿度传感器.ESP8266等,以及某 ...

  8. Home Assistant + 树莓派:强大的智能家居系统 · 安装篇

    Home Assistant + 树莓派:强大的智能家居系统 · 安装篇 转载:Home Assistant + 树莓派:强大的智能家居系统 · 安装篇 目录 1. 初始安装 3. Homebridg ...

  9. 智能家居系统 Home Assistant 系列 --介绍篇

    一. HomeAssistant 是什么? HomeAssistant是构建智慧空间的神器.是一个成熟完整的基于 Python 的智能家居系统,设备支持度高,支持自动化(Automation).群组化 ...

随机推荐

  1. Linux上合理设置网卡的MTU值

    MTU:是网络的最大传输单元,通信术语:最大传输单元(Maximum Transmission Unit,MTU)是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位).最大传输单元这个 ...

  2. matlab函数randperm()

    randperm()会返回一个行向量. 1,randperm(n) 输出一个1×n的矩阵,元素值为1~n的整数,每个元素只出现一次,元素的顺序是随机的. 2,randperm(n,k) 输出一个1×k ...

  3. Tars | 第2篇 TarsJava SpingBoot启动与负载均衡源码初探

    目录 前言 1. Tars客户端启动 @EnableTarsServer 2. Communicator通信器 3. 客户端的负载均衡调用器LoadBalance 最后 前言 通过源码分析可以得出这样 ...

  4. 面试官:MySQL的幻读是怎么被解决的?

    大家好,我是小林. 我之前写过一篇数据库事务的文章「 事务.事务隔离级别和MVCC」,这篇我说过什么是幻读. 在这里插入图片描述 然后前几天有位读者跟我说,我这个幻读例子不是已经被「可重复读」隔离级别 ...

  5. CodeForce-813B The Golden Age(数学+枚举)

    The Golden Age CodeForces - 813B 题目大意:如果一个数t=x^a+y^b(a,b都是大于等于0的整数)那就是一个unlucky数字.给你x,y,l,r(2 ≤ x, y ...

  6. CodeForce-785B Anton and Classes(简单贪心)

    Anton and Classes Anton likes to play chess. Also he likes to do programming. No wonder that he deci ...

  7. Android仿QQ空间发表动态

    效果展示图: 功能描述:用户点击+会进入发表动态的界面,发表成功后跳转到个人首页. 后续完善:增加个人头像的上传,对界面进行优化,增加点赞和评论的功能. 主要采用listview对内容进行展示,对sq ...

  8. ✔PHP文件包含漏洞全面总结

    我的另一篇博客总结的不够全面,但依然有借鉴价值:https://www.cnblogs.com/Zeker62/p/15192610.html 目录 文件包含的定义 文件包含漏洞常见函数 文件包含漏洞 ...

  9. Java基础系列(20)- while循环

    循环结构 while循环 do-循环 for循环 在java5中引入了一种主要用于数组的增强型for循环 while循环 while是最基本的循环,它的结构为 while(布尔表达式){ //循环内容 ...

  10. Django边学边记—模板

    功能 产生html,且不仅仅是一个html 包含: 静态内容:html,css,js 动态内容:模板语言 使用 一般使用 Django中提供的简写函数render调用模板 render(request ...