×

Lane Tech PCL亚马逊Alexa PC启动和加热器启动

消耗积分:0 | 格式:zip | 大小:0.30 MB | 2023-02-03

张涛

分享资料个

描述

理念

我的办公桌在我地下室的凸窗旁边,因为我的房子真的很旧,那里的绝缘和温度一直很奇怪,而且总是很冷。出于这个确切的原因,我的办公桌旁边有一个空间加热器。我想创造一种更好的方式来调节和控制我的办公桌设置,包括我的 PC 和空间加热器。我选定了一个项目,该项目可以让我使用家里的 Amazon Alexa Echo Dots 自动执行此过程,并使用 Alexa 应用程序远程触发它。我希望能够告诉 Alexa 我在家,她会通过启动一切来自动执行此过程。我也希望有一些细微差别,所以我想我可以添加另一个组件来调节加热器,它是以温度传感器的形式出现的。

温度感应器

我首先开始设置温度传感器,因为我知道这将是项目的关键组成部分。

tempsensor_XIkUswMOjq.jpg?auto=compress%2Cformat&w=740&h=555&fit=max
 

我使用了 PietteTech 库并为温度传感器创建了一个测试。传感器的完整测试代码可以在代码部分找到:DHT22 温度传感器测试。

我遇到了一个问题,如果检查得太频繁,传感器偶尔会偶尔读取一个荒谬的值,比如 -2 度,所以我知道我必须在以后考虑这个问题。

image_K9YMy6zF40.png?auto=compress%2Cformat&w=740&h=555&fit=max
偶尔的温度数据
 

我的解决方案是保留一个单独的值,该值仅在有效值时更新

if(currentTime - prevTime > 30000){
        int result = DHT.acquireAndWait(2000);
        serverTemp = DHT.getFahrenheit();
        if(serverTemp>0){
            accurateTemp = serverTemp;
        }    
        Particle.publish("servertemperature", String::format("%.1f", serverTemp));
        Particle.publish("accuratetemperature", String::format("%.1f", accurateTemp));
        prevTime = currentTime;
    }

IFTTT 亚马逊 Alexa 触发器

下一步是将我的 Amazon Alexa 连接到 Webhook post 请求服务,以便与 Particle Argon 交互。我选择了 IFTTT,并将我的亚马逊账户连接到它并设置了小程序。

image_AzATDhCH5p.png?auto=compress%2Cformat&w=740&h=555&fit=max
 

为了连接 IFTTT 集成,我使用粒子云和 Spark.function Particle.publish来调用使用粒子令牌的函数,然后将 Webhook 发布请求附加到 IFTTT 触发器以及我的代码中的函数。

局域网唤醒电脑

然后我需要找到一种方法来远程启动我的电脑。我知道这可以使用 Wake On Lan 功能实现,但我必须让它与 Particle 环境一起工作。幸运的是,我找到了这个项目来帮助我入门。然后我研究了代码并将其压缩为仅对我来说是必要的功能。此代码采用给定的原始 MAC 地址,将其转换为字节,然后通过指定的 MAC 地址将唤醒数据包发送到 PC。完整的测试代码可以在代码部分找到:局域网唤醒测试。

其他注意事项:

出于测试目的,我在另一台计算机上安装并使用了Homebrew ,以便安装 wakeonlan 命令并测试独立于粒子环境的功能。

我还需要调整我的 BIOS 和设置以允许 Wake On Lan 正常运行,并根据我的主板制造商的说明做了这三件事:

1. 在 BIOS 电源管理菜单中将“EUP 2013”​​设置为禁用。2. 在唤醒事件设置中启用“通过 PCI 或 PCI-E 设备恢复”。3. 在 Windows 设备管理器中,进入“网络适配器”->“电源管理”选项卡,勾选【允许此设备唤醒计算机】复选框。

加热器功能

我控制加热器的第一个想法是使用智能插座或继电器来控制加热器的插座电源并将其连接到 Alexa。然而,这不是一个选择,因为我的加热器有一个数字而非手动电源开关。这意味着切断插座电源然后恢复它不会正确打开和关闭加热器。相反,我决定使用红外信号来控制加热器,因为它有一个红外 LED 遥控器作为控制选项,因此我可以以某种方式复制信号以供我使用。

image_50349057_vnhFQqjLuu.JPG?auto=compress%2Cformat&w=740&h=555&fit=max
我的空间加热器和红外遥控器
 

在决定使用红外通信后,我设置了一个系统来测试接收和发送红外信号,并使用 Arduino 兼容遥控器进行测试。

image_67513857_GT9FKv1BBq.JPG?auto=compress%2Cformat&w=740&h=555&fit=max
红外发射 LED 和红外接收器
 
arduinoremote_W1sdtAxqOe.jpg?auto=compress%2Cformat&w=740&h=555&fit=max
远程测试
 

使用这个遥控器和我的 IR 发送和接收节点,我能够成功地复制从遥控器接收到的 IR 信号。IR 传输具有特定的编码参数集,这些参数在大多数情况下都很常见,可用于轻松复制信号。这个特定的遥控器使用了 NEC 最常见的编码。完整的测试代码可以在代码部分找到:IR 发射测试、IR 接收测试和 IR 发射和接收测试。

当我试图复制我个人遥控器的信号时,问题就出现了。

image_FURRv1Q1v1.png?auto=compress%2Cformat&w=740&h=555&fit=max
从加热器遥控器接收到的信号
 

这些信号的复制要复杂得多。我不能只是说我要发送一个 NEC 代码并给它一个简单的十六进制值来发送。只能发送十六进制值,因为编码类型已知。经过大量研究后,我确定我必须改为从遥控器发送原始信号,没有任何简化值,因为 Lasko 公司的遥控器没有我可以使用的任何公共编码类型。我家楼上有一个不同版本的 Lasko 加热器,证实了我的怀疑,因为那个遥控器也有一个未知的编码。然后我记录了来自遥控器的不同原始信号,这些信号控制了我需要的加热器的所有功能。

unsigned int oncodePower[143] = {1250,415,1250,415,423,1250,1247,448,1223,427,422,1256,423,1258,422,1257,423,1257,421,1257,423,1256,1248,7026,1250,416,1254,412,422,1250,1248,406,1264,427,422,1260,421,1257,423,1257,422,1256,423,1258,422,1256,1249,7066,1251,399,1267,416,421,1249,1250,419,1252,427,422,1260,420,1258,421,1258,423,1257,422,1256,436,1242,1250,7032,1250,416,1250,418,421,1249,1250,420,1250,428,422,1258,423,1256,421,1259,422,1258,422,1257,422,1255,1249,7028,1250,417,1250,416,421,1249,1250,418,1253,425,428,1254,422,1257,423,1257,422,1258,421,1260,419,1257,1248,7028,1248,416,1251,417,420,1250,1251,418,1251,427,422,1259,422,1257,423,1256,423,1267,412,1258,426,1252,1250};
unsigned int oncodeSwitch[119] = {1250,411,1255,411,425,1244,1253,414,1255,421,427,1254,427,1252,428,1250,426,1253,1251,423,427,1253,426,7849,1253,411,1254,417,421,1245,1253,415,1255,422,427,1255,424,1254,426,1252,429,1247,1256,422,427,1253,428,7891,1253,410,1255,410,426,1247,1254,414,1254,423,427,1255,426,1255,424,1255,426,1249,1256,422,428,1251,429,7857,1253,411,1255,411,427,1244,1255,414,1256,419,429,1254,428,1251,428,1255,424,1251,1254,421,428,1253,428,7851,1255,410,1256,410,427,1245,1253,414,1257,422,428,1253,427,1252,429,1253,424,1251,1254,422,427,1254,426};
unsigned int oncodeOsc[143] = {1247,415,1250,417,422,1249,1249,420,1250,427,423,1257,424,1257,423,1257,1249,427,422,1259,422,1258,423,7804,1250,416,1250,416,422,1251,1250,420,1250,435,415,1260,423,1260,421,1256,1252,438,412,1260,422,1258,424,7857,1250,416,1251,416,424,1252,1249,420,1251,438,413,1259,423,1259,423,1256,1252,429,421,1260,424,1260,422,7818,1248,433,1237,417,422,1251,1251,422,1250,428,422,1258,426,1257,426,1256,1251,429,422,1262,421,1261,422,7810,1249,418,1250,418,421,1251,1253,420,1252,427,423,1260,424,1259,423,1259,1250,427,423,1262,422,1261,421,7812,1250,414,1255,415,422,1252,1252,419,1252,427,423,1262,423,1261,422,1258,1252,427,422,1262,422,1258,425};

我重新连接了温度传感器并将我的红外设备整合到一个面包板上进行测试。

image_67191809_rEtmgF0AYi.JPG?auto=compress%2Cformat&w=740&h=555&fit=max
组装好的面包板
 

加热器温度相互作用

由于我的加热器有两种不同的设置,我使用温度传感器来确定当我启动我的电脑时是否需要加热器(低于 72 度)。

int wakeHost(String param) {
    String MACaddress = "00:d8:61:aa:73:7a";
    Particle.publish("test","got to wake host");

    char szMacAddress[80];
    MACaddress.toCharArray(szMacAddress,80);
    Particle.publish("test", szMacAddress);
    if(accurateTemp < 72.0){
        deskStart = TRUE;
    }
    checkHIGHTemp = TRUE;
    return wake(szMacAddress);
}

传感器还会检查温度是否过高(超过 67 度),然后将其切换到低温模式。

if(highTempOverride || (checkHIGHTemp && accurateTemp > 67.0)){
        irsend.sendRaw(oncodeSwitch,119,38);
        checkHIGHTemp = FALSE;
        highTempOverride = FALSE;
        Particle.publish("test","sentTEMPIR");
    }

最终产品

image_50394113_OOKKHRNqd0.JPG?auto=compress%2Cformat&w=740&h=555&fit=max
最终面包板
 
 
 
 
 
 

 


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'Lane Tech PCL亚马逊Alexa PC启动和加热器启动',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);