从零开始 DIY 智能家居 - 智能开窗器
前言
做完智慧浇水器之后对这种可以节省时间和精力的场景总有一种谜之向往(懒鬼是这样的),这次我准备做一个可以自动开窗的装置,结合之前的甲醛检测传感器就可以实现甲醛含量过高自动开窗通风,之后还可以把燃气检测、烟雾检测、一氧化碳检测、空气质量检测的各种气体传感器也接入进来,这个场景的覆盖面以及实用性也拉满了,有朋友要是还有想法可以在这个场景中接入哪些部件也可以留言给我,之后我都接入进来(快给我留言吧!求求你们了,让我室友给大伙磕头了!)。
硬件选择
板子依然选择超级好用,无敌便宜,资料齐全,生态完善之安信可 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 智能家居 - 智能开窗器的更多相关文章
- 硬纪元AI峰会前瞻:如何才能做好智能家居?用户体验最重要
用户体验不到位,市场就不能说真的发展起来. 可以明显的感觉到,随着人工智能.物联网等技术的发展和应用,我们的生活正在发生翻天覆地的变化,其中感觉最为明显的就是智能家居. 据前瞻产业研究院的数据统计,我 ...
- 从零开始的DIY智能家居 - 基于 ESP32 的土壤湿度传感器
前言 自从上次做了那个 甲醛传感器 和 水浊度传感器 之后开始尝到智能家居的甜头了,这两东西有没有用我不知道,但是没事的时候掏出手机瞄两眼,看着就让人很安心( ̄︶ ̄). 于是懒惰的我开始琢磨把给植物浇 ...
- DIY智能家居——零基础入门篇
概要 本文主要根据笔者从零开始接触硬件,以小白视角开启IoT探索,根据相关资料DIY一个温湿度传感器.后经过探索发现新大陆--Home Assistant&Homebridge,最终实现了一个 ...
- Diy智能家居-1.基于esp8266的语音控制系统(开篇)
目录Diy智能家居-1.基于esp8266的语音控制系统(开篇) https://blog.csdn.net/arno1988/article/details/82628589 Diy智能家居-2.基 ...
- 智能家居DIY
近期智能家居比較火,将房子简单改造下,也算体验智能家居. 本文解说的是用无线的方式,长处是:不用改造现有线路,直接安装模块就可以实现想要的功能,花的钱也较少,共六百左右 =============== ...
- IOS 视频直播/智能家居(一行行敲代码,从零开始)lesson:1整体架构
本文转载至 http://blog.csdn.net/u014011807/article/details/47144027 前段时间由于工作需要做了一个视频直播/智能家居类的应用.算是对iOS音视频 ...
- 智能家居入门DIY——【一、ESP8266之软串口HTTP请求】
前段时间做了一个激光雕刻,玩的不亦乐乎.对Arduino大感兴趣,于是又入手一块20大洋版,配上买学习套件时的诸多零件——红外发射管.一体化红外接收头.DHT11温湿度传感器.ESP8266等,以及某 ...
- Home Assistant + 树莓派:强大的智能家居系统 · 安装篇
Home Assistant + 树莓派:强大的智能家居系统 · 安装篇 转载:Home Assistant + 树莓派:强大的智能家居系统 · 安装篇 目录 1. 初始安装 3. Homebridg ...
- 智能家居系统 Home Assistant 系列 --介绍篇
一. HomeAssistant 是什么? HomeAssistant是构建智慧空间的神器.是一个成熟完整的基于 Python 的智能家居系统,设备支持度高,支持自动化(Automation).群组化 ...
随机推荐
- ORACLE 12C Identity Column(身份列) 实现自增长字段
Oracle 12c提供的Identity Column特性简化了自增字段的定义. 声明自增字段通常有3种常见的用法,以下三种方式都支持INSERT语句中省略自增字段的插入,但有些许差别. 1. GE ...
- 自制C++游戏 迷宫
1 #include<bits/stdc++.h> 2 #include<conio.h> 3 using namespace std; 4 char mg[17][17]={ ...
- 基于Typora的Latex代码书写并移植到word中
如何使用Markdown编译器 编辑Latex公式 并嵌入word内 前言:对于科研党来讲,在论文中数学公式的展示是必不可少的一环,但是如果不使用公式的格式去敲,那么公式就会过于难看,会大大降低你 ...
- 【PHP数据结构】在学数据结构和算法的时候我们究竟学的是啥?
一说到数据结构与算法,大家都会避之不及.这本来是一门专业基础课,但是大部分人都并没有学好,更不用说我这种半路出家的码农了.说实话,还是很羡慕科班出身的程序员,因为你们在日常工作或者面试中,只需要复习一 ...
- 5ucms 调用当前文章的评论,以及评论列表
<div class="center_"> <h2>共有 {field:comments} 位网友发表了评论</h2> <ul class ...
- php无限分类 构建树形结构
<?php class Classification { const PARENT_ID = 'parentid'; const ID = 'id'; const CHILDREN = 'chi ...
- windows 根据 端口号 找到进程ID PID
List process by port number netstat -ano | findstr 8080 Proto Local Address Foreign Address State PI ...
- 鸿蒙内核源码分析(信号消费篇) | 谁让CPU连续四次换栈运行 | 百篇博客分析OpenHarmony源码 | v49.04
百篇博客系列篇.本篇为: v49.xx 鸿蒙内核源码分析(信号消费篇) | 谁让CPU连续四次换栈运行 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁 ...
- MFC读写.txt文件时进度条显示实时进度
整体实现方式:先获得文件长度,然后用每次读取的长度,计算出完成的百分比,用百分比的值设置进度条. 一.MFC进度条 Progress Control 相关函数 1. create() --创建Prog ...
- 01Prism WPF 入门实战 - 项目准备
1.概要 这一系列将进行Prism+WPF技术的实战讲解.实战项目内容选型为Email邮件收发的客户端(WeMail),项目结构简单方便大家理解. 相关技术:C#.WPF.Prism 软件开发环境:V ...