从零开始的DIY智能家居 - 基于 ESP32 的智能光照传感器
文章目录
- 前言
- 硬件选择
- 代码解析
- 获取代码
- 设备控制命令:
- 设备和协议初始化流程:
- 配置设备信息
- 回调函数注册
- 数据获取与发送流程
- 总结
前言
上周出差有点急,结果家里灯没关,开了整整一周的时间(T▽T),整个人都裂开了,准备做一个能够远程控制灯的东西,让我以后出差能远程把家里灯关了。
第一步就是做这期的主题 - 智能光照传感器,因为我逛了一圈发现常见的能远程控灯的开关都只能单纯的开关灯的状态,并不知道当前灯的状态,小米智能灯泡又只能用他们自己的生态,我用不了。
于是我准备使用一个智能光照传感器来感知家里的灯有没有关。
硬件选择
板子依然用的安信可的 ESP32S ,别问,问就是便宜好用。STM完蛋去吧。
传感器用的 HB1750VI模块 ,这个模块使用 I2C 控制和通信(连接开发板:SDA->P21,SCL->P22)
服务器用的翼辉的 Spirit 1 边缘计算机
Spirit 1 这就是一个前后端部署在一起的服务器,然后我们手机和电脑就相当于一个远程桌面。
代码解析
获取代码
为了方便讲解逻辑,我会打乱代码的顺序可能还会进行裁剪,要是想直接拿代码跑的朋友可以直接去 灵感桌面的秘密宝库 获取代码,或者直接 clone:
https://gitee.com/inspiration-desktop/DEV-lib-arduino.git
下载或者 clone代码后这次用到的是这个三个文件夹:
cjson:我移植的 cjson 库,就是标准的 cjson 库,放到 arduino 安装目录下的 libraries 文件夹里,百度一下 cjson 的函数使用就行了。
libsddc:是我移植自官方的SDDC库和自己写的 SDK,也是放入 libraries 文件夹里就行。里面是 SDDC 协议的处理函数,我们不用管。
demo 文件夹里面就是我们各种传感器的 demo 代码了:
红圈的 HB1750VI_sddc_demo文件夹里面就是我们代码,点进去就能看见 HB1750VI_sddc_demo.ino 文件,双击文件会自动启动 arduino-IDE 打开代码。在工具 -> 端口 选择对应的 COM 口然后点击上传就可以把代码烧录到板子里:
具体 arduino 使用教程可以看我之前的文章 arduino开发指导 和 手把手带你 arduino 开发:基于ESP32S 的第一个应用-红外测温枪(带引脚图)
设备控制命令:
通过 Spirit 1 的应用程序或者嗅探器 向传感器设备发送的命令:
{"method": "get", // 这个命令可以从传感器主动获取一个光照强度数据"obj": ["LUX"]
}
设备和协议初始化流程:
基于官方 demo 写的不需要做什么修改,主要是设备初始化,管脚配置,和协议初始化部分。
/** 初始化传感器*/
void sensor_init()
{// 创建传感器任务,周期性获取光照传感器的数据并发送给 EdgerOSxTaskCreate(periodic_sensor_task, "periodic_sensor_task", ESP_TASK_STACK_SIZE, NULL, ESP_TASK_PRIO, NULL);
}void setup() {byte mac[6];Serial.begin(115200);Serial.setDebugOutput(true);Serial.println();// 初始化传感器sensor_init();// 清除一下按键状态机的状态button.reset();// 创建按键扫描线程,长按 IO0 按键,松开后 ESP32 将会进入 SmartConfig 模式sddc_printf("长按按键进入 Smartconfig...\n");button.attachLongPressStop(esp_io0_key_task);xTaskCreate(esp_tick_task, "button_tick", ESP_TASK_STACK_SIZE, NULL, ESP_TASK_PRIO, NULL);// 启动 WiFi 并且连接网络WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");}// 获取并打印 IP 地址Serial.println("");Serial.println("WiFi connected");Serial.print("'ip :");Serial.print(WiFi.localIP());Serial.println("' to connect"); // sddc协议初始化sddc_lib_main(&sys_cfg);// 获取并打印网卡 mac 地址WiFi.macAddress(mac);sddc_printf("MAC addr: %02x:%02x:%02x:%02x:%02x:%02x\n",mac[5], mac[4], mac[3], mac[2], mac[1], mac[0]);// 使用网卡 mac 地址设置设备唯一标识 UIDsddc_set_uid(G_sddc, mac);
}void loop() {// 运行 SDDC 协议循环while (1) {sddc_printf("SDDC running...\n");sddc_run(G_sddc);sddc_printf("SDDC quit!\n");}// 销毁 SDDC 协议sddc_destroy(G_sddc);
}
配置设备信息
这部分代码可以配置 WiFi 名字和 WiFi 密码,要使用的引脚,并且配置设备在 Spirit 1 上显示的信息:
#define ADDR 0b0100011#define SDDC_CFG_PORT 680U // SDDC 协议使用的端口号
#define PIN_INPUT 0 // 选择 IO0 进行控制
#define ESP_TASK_STACK_SIZE 4096
#define ESP_TASK_PRIO 25static const char* ssid = "EOS-000045"; // WiFi 名
static const char* password = "1234567890"; // WiFi 密码OneButton button(PIN_INPUT, true);/** 当前设备的信息定义*/
DEV_INFO dev_info = {.name = "光照传感器",.type = "sensor",.excl = SDDC_FALSE,.desc = "ESP-32S",.model = "1",.vendor = "灵感桌面",
};/** 系统注册对象汇聚*/
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[] = {// {"set_num_demo", demo}, // 字符串为输入命令,demo为命令处理函数
};/** 显示设备对象函数与处理方法注册*/
DIS_DEV_REGINFO dis_dev[] = {// {"set_dis_demo", demo}, // 字符串为输入命令,demo为命令处理函数
};/** IO设备对象设置函数与处理方法注册*/
IO_DEV_REGINFO io_dev[] = {// {"set_io_demo", demo}, // 字符串为输入命令,demo为命令处理函数
};/** 系统对象状态获取注册*/
DEV_STATE_GET dev_state_get_reg[] = {{"LUX", DEV_NUM_TYPE, single_get_sensor},
// {"demo", DEV_NUM_TYPE, num_get_demo}, // demo为输入命令,字符串为命令处理函数
// {"demo", DEV_IO_TYPE, io_get_demo},
// {"demo", DEV_DISPLAY_TYPE, dis_get_demo},
};
数据获取与发送流程
这里是我们自己编写的处理流程 ,可以根据你的需求自己更改,收到 set 或者 get 后根据前面的注册的函数,进入对应的处理函数。
设备会检测传感器输出,然后根据设置的上报间隔定时上报光照强度数据,还可以主动发送 get 命令主动查询传感器当前数据:
static int esp_sensor_task()
{ int val = 0;// 获取光照数据Wire.beginTransmission(ADDR);Wire.write(0b00000111);Wire.endTransmission();Wire.beginTransmission(ADDR);Wire.write(0b00100000);Wire.endTransmission();// typical read delay 120msdelay(120);Wire.requestFrom(ADDR, 2); // 2byte every timefor (val = 0; Wire.available() >= 1; ) {char c = Wire.read();val = (val << 8) + (c & 0xFF);}val = val / 1.2; return val;
}
/* * 单次获取数据*/
sddc_bool_t single_get_sensor(char *objvalue, int value_len)
{int value = esp_sensor_task();snprintf(objvalue, value_len, "%d", value);return SDDC_TRUE;
}
代码写完之后烧录进去就完事了,和之前完全一样,点一下保存,然后上传OK,具体可以看之前的文档,我就懒得再写一遍啦 (/ω\)
总结
智能光照传感器完成!现在能通过感知光照感知白天,黑夜,是否开关灯了!之后准备买一个随意贴来改造,让我出差也能远程关灯关设备!
本文仅个人学习使用,如有错误,欢迎指正, ( ੭ ˙ᗜ˙ )੭谢谢老板!
从零开始的DIY智能家居 - 基于 ESP32 的智能光照传感器相关推荐
- 从零开始的DIY智能家居 - 基于 ESP32 的智能水浊度传感器
文章目录 前言 硬件选择 代码解析 获取代码 设备控制命令: 设备和协议初始化流程: 配置设备信息 回调函数注册 数据获取与发送流程 总结 前言 家里有个鱼缸养了几条鱼来玩玩,但是换水的问题着实头疼, ...
- 从零开始的DIY智能家居 - 基于 ESP32 的土壤湿度传感器
文章目录 前言 硬件选择 代码解析 获取代码 设备控制命令: 设备和协议初始化流程: 配置设备信息 回调函数注册 数据获取与发送流程 总结 前言 自从上次做了那个 甲醛传感器 和 水浊度传感器 之后开 ...
- 基于java智能家居,基于JAVA的智能家居控制系统的设计(信息控制端的设计)-论文二稿...
基于JAVA的智能家居控制系统的设计(信息控制端的设计)-论文二稿 PINGDINGSHAN UNIVERSITY毕业论文 (设计 )题 目:基于 JAVA 的智能家居控制系 统的设计(信息控制端的设 ...
- android服务器智能家居,基于Android的智能家居系统
五.参考文献 [1]卜晓晓.基于Android和Wi-Fi的智能家居系统的设计与实现[D].镇江:江苏大学,2016. [2]闫哲,杜涛,左海利.智能家居控制系统的设计与实现[J],自动化技术与应用. ...
- 基于ESP32的智能家居控制系统-微信小程序
一. 课题研究意义.现状及应用分析 1.1课题研究意义及现状 目前,科学技术发展十分迅速,其渗透到各行各业以及生活的方方面面,室内设计和高科技结合便出现了"智能家居".所谓智能家居 ...
- 基于 ESP32 的智能家居系统设计
基于 ESP32 的智能家居系统设计 摘 要:智能家居科技是在电子信息技术和无线通信技术以及软件和信息技术方面进一步开发所形成的新兴科学技术,这项科技可以改善我们的生活条件,并可以使居家条件显得更为适 ...
- 基于ESP32的智能家庭健康系统
M5Stick-c ESP8266 项目背景及概述: 项目最初的想法来源于当下疫情局势,每个人都关心自己及家人的健康状况.因此本产品旨在应用于人们居家隔离或复工复产过程中,对个人身体情况的实时监测.同 ...
- 智能家居控制系统中的智能语音识别技术
作者:禅与计算机程序设计艺术 <智能家居控制系统中的智能语音识别技术> 引言 1.1. 背景介绍 随着科技的发展,智能家居系统越来越受到人们的青睐,人们通过智能家居系统可以实现远程控制.自 ...
- 物联网智能家居需要服务器吗,智能家居设备常见的两种配网/联网方式
你是否用过智能家居?你知道智能家居是怎么连上你家WIFI热点吗?你是否好奇APP是怎么和智能家居通话的?今天的这篇文章为你揭晓智能家居配网原理. 绝大多数智能家居都要求用户安装一个APP,通过APP完 ...
最新文章
- OpenCV形态学处理使用技巧与应用演示
- pytorch 筛选不齐
- libboost_filesystem.so: undefined reference to
- Android 查看App冷启动时间/热启动时间/页面打开时间
- win7上修改MySQL数据库密码
- NodeManager 启动一会儿挂掉
- 华为机试HJ2:计算某字母出现次数
- 《深入理解Java虚拟机》第6章 类文件结构
- 通过批处理来运行python程序
- mybatis的缓存基础
- 【时间序列预测】基于matlab鲸鱼算法优化LSTM时间序列预测【含Matlab源码 1687期】
- java http请求工具类全功能(get、put、delete、post、文件上传),使用easy-okhttp
- 今夜酒店特价:订得早,不如订得好
- 180724 安卓-SSLPinning及反制
- RT_Thread Studio入门系列4--STM32之SPI配置w25qxxx
- 专利申请要准备哪些资料
- C# Websocket连接(wss)
- J-框架-springCloud-Netfilx-day01
- Log4net自定义信息(变量或属性或字段)存入数据库
- 中国教育和科研计算机网络是,重大应用—热烈庆祝中国教育和科研计算机网CERNET建设20周年—中国教育和科研计算机网CERNET...
热门文章
- 【微信小程序】悬浮按钮
- Blender入门级使用
- 医院在线问诊源码 医院视频问诊源码 医院小程序源码
- 使用传统算法进行红色印章区域的提取
- PVZ系列七 | 音乐音效
- JAVA将十位时间戳格式化为日期Date类型
- RocketMQ两万字详解
- 2020,AI创业与投资进入“深水区”
- 解决MySQL报错:LOAD DATA LOCAL INFILE file request rejected due to restrictions on access.
- oracle bin 打头的表,关于WRI$和WRH$打头的表