赠书 | 手把手教你自己动手打造一个智能恒温器
作者 | Yazeed Sabri
翻译 | 火火酱,责编 | 晋兆雨
出品 | AI科技大本营
头图 | 付费下载于视觉中国
*文末有赠书福利
为了能住得离公司近一点,我就搬进了一套没有温控系统的公寓。因为在芝加哥市区,这个价位的公寓大多都是没有温控系统的,所以我心想,既然大家都能住的话,那我一定也可以!呃... ...现在我承认,确实能住,但真的很不舒服。那么,下面就来讲一下我如何打造自己的智能恒温器的吧。
在开始详细讲解之前,大家可以看一下最终产品的视频:
(视频链接地址:https://youtu.be/3-etgQS_Go0)
限制条件
这套公寓并没有配备传统的温控器控制盘(带有字母和彩色的电线那种)。
它原本的控制装置相当简单,只有一个开关和三档风速键。温度控制钮完全不起作用,加热和制冷时间取决于整栋楼的统一控制。其实其温度会根据室外的环境温度而变化,但为了简单起见,我们先假设其出风温度是恒定的。
由于这栋楼本身比较老了,而且房间又是我租的,所以不能装带继电器的控制器,也不准备重新用Raspberry Pi编程做。因此,我需要打造一个能够和现有控制器进行交互的系统。
零件
因为我需要把它改造成一个智能恒温器,所以最后还是选择用Raspberry Pi。
由于开关对扭矩和精度都有要求,所以我选用了一对SG90伺服电机。
伺服电机能够实现180度范围内的精确运转
一开始,我使用的是DHT22温度传感器,但并不好用。该传感器的设计方式导致其容易发热,进而影响精度。最终,我选择了DS18B20传感器,它与Pi的接合更匹配、线更长、精度也更高。这个过程让我意识到,要从自身情况出发进行研究,而不是去复制粘贴YouTube上推送的第一个教程。
我从一开始就想要用乐高积木来搭建框架。与3D打印不同,用乐高搭建的框架可以随时进行修改,而且成本可以忽略不计。但是,乐高本身设计的尺寸和高度增量是固定不变的。因此,要想将其搭建得与Raspberry Pi及伺服电机完美契合并不容易。况且,我手边的乐高积木数量也有限。
乐高设计
我尝试了很多个版本,反复搭了很多次才最终坚固实用性和坚固性(美观只能排在最后面咯)。有限的积木数促使我对建筑技术进行创新。正如你在上方图片和下方相册链接中看到的,我借助轴实现了电机的自由滑动,使其机臂能够垂直于开关。在不过于依赖乐高搭建方式的基础上,电动机从各个方向都用半螺柱、轴和半钉牢牢地固定住了。
(相册链接地址:https://imgur.com/a/Tp7i25f)
系统设计
Spring Boot应用程序和Python脚本都在Raspberry Pi上运行
在故事开始之前,大家可以在以下链接中找到项目的完整代码库,欢迎查看并留下你的想法。
(链接地址:https://github.com/ysabri/smartStat)
首先,我编写了Python脚本来控制电机并探测温度传感器。因为网上有很多关于这些Raspberry Pi部件的教程,所以其实编写脚本并不算难。
在理顺了恒温器内在逻辑后,我编写一个Spring Boot应用程序,公开恒温器的API端点并存储它的逻辑,除了调用python脚本之外,其他的并不麻烦。下方链接中的文章虽然有点老了,但却很好地介绍了为什么用Java调用另一个进程会如此复杂。此后,我又将Google Home集成添加到了同一应用程序中,下文有对相关集成细节的介绍。
(文章链接:https://www.javaworld.com/article/2071275/when-runtime-exec---won-t.html)
自上而下依次是:Google Home请求履行端点、恒温器端点和Google Home身份验证端点。
恒温器逻辑
编写恒温器逻辑的过程让我受益匪浅,我窥探到了制作恒温器所涉及的大量设计决策和交易中的冰山一角。
用到的方法有点笨,但却十分简单:让公寓温度尽可能地接近我们所设定的温度。但这是不现实的,因为这会导致系统频繁地开关,所以系统需要一个容差窗口,允许温度在设定值上下有一或二华氏度的波动。如果操作得当的话,这将最大限度地减少开关机的次数,从而在不影响舒适度的前提下,尽可能延长系统的开机或关机时间。
在系统中引入该容差窗口的方法有两种:其一,我可以直接在检测温度上增加一到两度。或者,我也可以延长系统对温度传感器的轮询时间。当然,也可以两种方法双管齐下。
就我对自己的了解而言,我肯定会放弃第一种方法。那么要如何找到最佳的轮询时间呢?由于我家这个公寓的隔热性能很差,对外界的温度非常敏感,因此其所需的时间间隔变化也很大。而更复杂的是,在从正午到日落的这段时间中,光线十分充足,阳光往往会不遗余力地撒向这间公寓。因此,在经过几天的反复试验后,我最终将时间设置为20分钟——这似乎是一个不错的中间点。
该日志片段显示了每20分钟的温度波动情况
对了,在谈论限制条件时,我忽略了两个会对系统行为产生影响的因素:风速和流经管道的流体温度。这两个因素协同决定了系统的有效性。流体温度是我们无法控制的,因为这是由建筑本身根据外部温度环境来进行调整的。而三档可调风速是我们可以控制的。在不考虑管道温度的情况下,我发现将风速调高会使整个公寓的热量分布更均匀,因为系统加热的空气量更大。以此便可以推断,较低的风速或许会更适合较小的空间。
“理想”的温度传感器位置要远离通风口和阳光,并且处于墙体的中下部
为了将温度传感器放置在我认为理想的高度,我用室内温度计做了一些实验。一段时间后,我发现,传感器的位置并不重要,重要的是人体对温度的感知。相对于我们的体感而言,温控器所显示的度数并不重要。换句话说,与其要求温度设置时刻保持在70华氏度(约为21摄氏度),我们其实可以将温度设置为71华氏度甚至72华氏度,效果是一样的。
Google Home 集成
这一步比预期的要复杂。下图展示了信息从用户到谷歌助手(Google Assistant),最终到智能设备的全过程:
图片来源:智能家居(Smart Home)集成文档
谷歌的智能家居文档对其集成步骤概述如下:
1) 设置OAuth 2.0,进行授权和账户链接。
2) 在操作控制台(Action Console)中创建一个智能家居动作(action)。
3) 添加认证。
在谷歌,动作(action)就相当于亚马逊的Alexa技能。
在进行这些步骤的过程中,我失望地发现,无论我是否打算发布自己的智能家居动作,都必须完成所有的步骤。不能跳过OAuth和认证步骤,直接创建简单快速的测试。我不清楚其背后的原因是什么,但是到目前为止,在所有设置就绪的情况下,除了我之外,还没有人能够访问我的动作,除非我进行明确的邀请。
此外,执行步骤1和3意味着任何计划试验智能家居动作的人都必须拥有一个可公开访问的URL。我用ngrok解决了这个问题,这是一个非常棒的工具,可以将流量从公共URL传输到你的本地机器。因为ngrok的免费版在每次重启后都会使用新的随机URL,所以我买了它的基础付费版本,以便在其域上保留URL。如果需要的话,建议大家可以购买,因为这样一来就不必在重启后更改URL设置了。
最后,设置Google Cloud调用的动作履行端点要结合查看文档、示例和逆向工程。
写在最后
和其他项目一样,我在此次构建过程中也经历了一些起伏,但我对最终产品及其运行效果非常满意。
*本文仅代表作者个人观点,不代表AI科技大本营任何立场。
原文链接:
https://medium.com/swlh/how-i-built-a-smart-thermostat-8bd9510cf9de
本文由AI科技大本营翻译,转载请注明出处
#欢迎留言在评论区和我们讨论#
对于本文你有什么看法?
欢迎在评论区留言
我们将在 12 月 31 日精选出 3 条优质留言
赠送《Python人工智能开发从入门到精通》纸质书籍一本哦!
更多精彩推荐
为什么苹果M1芯片这么快?
仅剩一周!!CSDN年终大放血!人人有份的大奖你确定不来?
GitHub 超 20000 Star,最火开源视频库 FFmpeg 这 20 年!
都 2021 年了,Serverless 能取代微服务吗?
2020年中国AI算力报告发布:超大算法模型挑战之下,公共AI算力基建是关键
相关文章:

JVM 出了问题 EXCEPTION_ACCESS_VIOLATION
2019独角兽企业重金招聘Python工程师标准>>> # # An unexpected error has been detected by Java Runtime Environment: # # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc0x10002c08, pid5972, tid1404 # # Java VM: Java HotSpot(TM) Client VM (11.3-b02 mixe…

转换字符串中汉字为其拼音缩写(C#)
//将指定字符串中的汉字转换为拼音缩写,其中非汉字保留为原字符。 public string GetPinYin( string text){char pinyin;byte[] array;System.Text.StringBuilder sb new System.Text.StringBuilder(text.Length); foreach(char c in text) { pinyin c; …
weblogic线程阻塞性能调优(图解)
转自:http://blog.csdn.net/z69183787/article/details/12647539 声明:出现这个问题有程序方面、网络方面、weblogic设置方面等等原因,此文章主要讲述由于weblogic设置而导致的解决办法。 因为: 1.程序问题,需要项目自…

ASP.net实现无扩展名的URL重写。简单、方便、无需ISAPI
URL重写已经有很多的方法,但是多数都有一个缺点,就是不支持无扩展名的网页。微软提供的方法需要在根目录里面建立jyk的文件夹,然后再建立一个default.aspx的文件,如果您有100名会员的话,这是一个不可想象的事情。 另一…

IDC公布中国深度学习市场综合份额:百度超越Facebook位列第二
近日,权威数据调研机构IDC公布了2020年下半年深度学习框架平台市场份额报告。数据显示,在中国深度学习平台市场综合份额中,Google、百度、Facebook稳居前三,占据70%以上市场份额。其中,百度占比提升3.38%增速第一&…

OpenStack 和 Cloud Foundry
上周我参加了在亚特兰大举行的OpenStack峰会,这是一个非常好的机会去进一步了解Cloud Foundry 和OpenStack ecosystem之间的关系。 在OpenStack阵营里,在讨论PaaS时,“Could Foundry 是不是 OpenStack” ,这个看起来像是一个有争议…

防止IIS文件被下载方法
如何才能防止encry目录下的所有文件被非法下载呢?我们可以应用IIS中的应用程序映射结合ASP.NET中的IHttpHandler自定义权限,把IIS应用程序映射用于所有文件,并将控制权交给我们自己实现的IHttpHandler。 首先添加应用程序映射:打…

转 如何在IOS设备中去掉屏幕上的status bar
引入如何在IOS设备中去掉屏幕上的status bar,即:不显示设备上方的[网络、时间、电池??]条?操作方法一:在-info.list项目文件中,加上“Status bar is initially hidden”选项,并勾选…
倒计时7天!博客之星虚位以待,Macbook等你来拿
也许你陪伴了CSDN一年的时间刚刚写下自己的第二十篇的原创技术博文也许你是陪伴了CSDN近20年风雨的老码农更新了近千百篇的技术文章也许你还在坚持着“技术输出”也许你已经开始封笔也许你刚刚突破粉丝数达到了三位,四位数也许你刚刚申请的博客专家,终于…

UVA 10515 - Powers Et Al.(数论)
UVA 10515 - Powers Et Al. 题目链接 题意:求出m^n最后一位数 思路:因为m和n都非常大,直接算肯定是不行的,非常easy想到取最后一位来算,然后又非常easy想到最后一位不断乘自身肯定会形成周期。而且这个周期还挺短的&am…
视觉+Transformer最新论文出炉,华为联合北大、悉尼大学发表
作者 | CV君来源 | 我爱计算机视觉Transformer 技术最开始起源于自然语言处理领域,但今年5月份Facebook 的一篇文章将其应用于计算机视觉中的目标检测(DETR算法,目前已有78次引用)使其大放异彩,并迅速得到CV研究社区的关注。已有研究表明&…

易宝典文章——怎样管理Exchange Server 2013邮箱地址
对于一个用户邮箱,即邮箱收件人来讲,在创建时Exchange会为其按照Alias分配一个邮件地址,即主邮件地址,也称为“主SMTP地址”或“默认答复地址”。但是在用户日常使用中可能会出现需要多个邮件地址的情况,比如ÿ…

使用FileUpload控件上传图片并自动生成缩略图、自动生成带文字和图片的水印图
本文借助vs2005中自带的FileUpload控件实现图片文件的上传并生成缩略图。实现过程:选择图片上传成功后,取得已经存在服务器的文件生成缩略图,并且判断是否是图片类型的文件,这个的判断可以在程序中修改,本程序只是判断…

Java -- JDBC 学习--通过Statement进行数据库更新操作
通过 JDBC 向指定的数据表中插入一条记录. 1. Statement: 用于执行 SQL 语句的对象 1). 通过 Connection 的 createStatement() 方法来获取 2). 通过 executeUpdate(sql) 可以执行 SQL 语句. 3). 传入的 SQL 可以是 INSRET, UPDATE 或 DELETE. 但不能是 SELECT 2.…

身份证号码验证-支持新的带x身份证
//--身份证号码验证-支持新的带x身份证functionisIdCardNo(num) { varfactorArr newArray(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1); varerror; varvarArray newArray(); varintValue; varlngProduct 0; varintCheckDigit; varintStrLen num.length; v…
装上后这 14 个插件后,PyCharm 真的是无敌的存在
来源 | Python编程时光作者 | 写代码的明哥Key Promoter X如果让我给新手推荐一个 PyCharm 必装插件,那一定是 Key Promoter X 。它就相当于一个快捷键管理大师,它时刻地在:教导你,当下你的这个操作,应该使用哪个快捷…

批量实现面向对象的实例
<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>批量实现面向对象的实例</title> <script type"text/javascript"> window.onload function(){function Person(name,age){this.name name;this.…

读Zepto源码之操作DOM
2019独角兽企业重金招聘Python工程师标准>>> 这篇依然是跟 dom 相关的方法,侧重点是操作 dom 的方法。 读Zepto源码系列文章已经放到了github上,欢迎star: reading-zepto 源码版本 本文阅读的源码为 zepto1.2.0 .remove() remove: function()…

VSS的每日自动备份
小弟在项目中兼职担当配置管理员,备份VSS的重任当然也得我来扛着,不然兄弟们加班加点的劳动果实可能因为什么天灾人祸一不小心就挂了。以往备份VSS的频率是一月一次,近来受到上面的教导,备份频率较少,需要每日备份。难…
当 AI 闯入法律界,第一步是当律师的得力助手
来源 | HyperAI超神经责编 | 晋兆雨头图 | CSDN 下载自视觉中国长久以来,律师这一职业给大众的印象都是精英、雄辩、高薪,而这份工作背后的艰辛却很少被看到。除了出庭之外,律师们要花费大量时间与经历进行法律资料研究、合同文件审查等。为此…

Ubuntu下添加新分区并设置挂载点
Ubuntu下添加新分区并设置挂载点最近在做Android项目,可是解压根文件系统以后,就报警说硬盘不够。当初设置使用的大小为15G。不过扩展分区还是很方便的。当然首先你得设置添加使用的硬盘大小,这次我一下提高到了30G,看它还报警否。…

2016 只剩最后一个月 你的 技术债务 还清了吗?
一夜醒来,猛然发现,2016 已经只剩最后一个月了! 回忆过去的 330 多个日与夜,哪些互联网圈的大事让你瞠目结舌? 也许是 AlphaGo 在堪称人脑游戏巅峰的围棋领域屡战告捷; 也许是 Pokmon Go 称霸大洋彼岸&…
给图片加上带版权的水印
我们在网站上有些时候需要给图片加上带版权的水印,.net的Graphics类可以很轻松的实现这一点。效果图:(图片最上端的那行字便是我们加上的版权水印了)实现代码: /**//// <summary> /// 生成带版权水印的图片 …
重磅推出开发者计划、App Store,赛灵思普及自适应计算的一大步
得开发者得天下。尤其随着AI技术落地趋势加剧,其中大部分创新来自软件应用,市场对软件开发者有着极大需求。因此,无论是互联网公司还是传统的IT厂商都在尝试将开发者沉淀到自己的平台。 作为FPGA的开创者,赛灵思正在突破主要支持硬…

Web 开发人员必备的随机 JSON 数据生成工具
在 Web 开发中,经常会需要一些测试数据来测试接口或者功能时候正确。JSON Generator 就是这样一款生成随机 JSON 数据的在线工具,Web 开发人员必备,记得收藏和分享啊。 您可能感兴趣的相关文章Verlet-js:超炫的开源 JavaScript 物…

bootstrap解析-栅格系统
.container(布局容器) 屏幕宽1200px以上(col-lg) 1. 默认width为1170px 2. padding,lefet和right各为15px,所以内容width为1140px;屏幕宽992px以上(col-md) 1. 默认width为970px 2. padding,lefet和right各为15px,所以内容width为940px;屏幕宽768px以上(…

asp.net中窗口相关操作总结(javascript)
1.打开新窗口 这个简单:Response.Write("<script language javascript>window.open(url);</script>"); 2.关闭窗口 //关闭当前窗口,并提示用户时候关闭,yes关闭,no退出 Response.Write("<script language javascript>window.close();</sc…

200万注册开发者,13亿张全景图片,90%数据生产环节AI化,百度地图生态全景升级2.0
12月29日, 2020百度地图生态大会在京举办。据介绍,在AI技术加持下,百度地图实现了90%数据生产环节AI化,全新升级生态全景2.0。 百度集团副总裁、百度集团首席信息官(CIO)李莹出席大会并致辞,她表示:“在20…

Sqlite3数据库之第三方库FMDB学习心得
很早之前就接触Sqlite数据库,但是之前对数据库操作未使用任何第三方库,只是实现基本的增、删、改、查功能,自己对着一本iPhone开发入门级的书籍写了一个类,基本能实现上述四个功能。最近在开发一个软件,由于是一个本地应用,经过再三思量,最好…

您会让自己的小孩将来从事软件研发吗?
您会让自己的小孩将来从事软件研发吗?非常多程序猿,都已经30多岁了。过了而立之年,有了自己的老婆,自己温馨的小家庭,自己可爱的小孩。小孩也都是00后的。“您会让自己的孩子从事软件研发吗?”本来小孩的事…