前言

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

硬件选择

板子依然选择超级好用,无敌便宜,资料齐全,生态完善之安信可 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. 分布式必备理论基础:CAP和BASE

    大家好,我是老三,今天是没有刷题的一天,心情愉悦,给大家分享两个简单的知识点:分布式理论中的CAP和BASE. CAP理论 什么是CAP CAP原则又称CAP定理,指的是在一个分布式系统中,Consi ...

  2. expression动态构成

    http://blog.csdn.net/tastelife/article/details/7340205 http://blog.csdn.net/tastelife/article/detail ...

  3. systemctl --now参数

    1.我们安装一个httpd服务来测试一下 --now参数 yum install httpd 2.查看一下当前服务状态  可以看到服务没有启动 而且服务没有自启 [root@master1 ~]# s ...

  4. File Upload(文件上传)

    一句话木马 <?php @eval($_POST['key']); ?> /*eval(phpcode) eval() 函数把字符串按照 PHP 代码来计算. 该字符串必须是合法的 PHP ...

  5. nginx proxy_next_upstream 与openresty balancer.set_more_tries的使用

    背景 我们这边网关服务使用的 kong,前段时间上线一个服务,这个服务它报错了,产生了502的错误码,追查这个报错的时候发现了网关服务的两个可疑的地方,第一个疑点是我们在Kong上配置的 Retrie ...

  6. KMP算法解决字符串匹配问题

    要解决的问题 假设字符串str长度为N,字符串match长度为M,M <= N, 想确定str中是否有某个子串是等于match的.返回和match匹配的字符串的首字母在str的位置,如果不匹配, ...

  7. Docker系列(7)- 常用命令(3) | 容器命令

    容器命令 说明: 有了镜像才可以创建容器:下载一个centos镜像进行练习,相当于在Linux里面再见一个Linux虚拟机 [root@localhost ~]# docker pull centos ...

  8. Jmeter系列(34)- Jmeter优化常识

    Jmeter UI页面是调试脚本的,运行脚本使用命令行运行:Windows使用batch,Linux使用shell Jmeter减少使用各类监听控件,吃内存.CPU:用后置处理去拿log文件,生成图表 ...

  9. 定要过python二级 第一套

    1.和强类型语言相对应的是弱类型语言,Python.JavaScript.PHP 等脚本语言一般都是弱类型的.弱类型语言有两个特点: 变量无须声明就可以直接赋值,对一个不存在的变量赋值就相当于定义了一 ...

  10. CF25E-Test【AC自动机,bfs】

    正题 题目链接:https://www.luogu.com.cn/problem/CF25E 题目大意 给出三个串,然后求一个最短的串包含这三个串. \(1\leq |s_1|,|s_2|,|s_3| ...