×

基于网络的InqWeather气象站

消耗积分:0 | 格式:zip | 大小:0.20 MB | 2022-10-26

尚文清

分享资料个

描述

InqWeather是一个简单的基于网络的气象站。它是一个正在进行的项目的一部分,用于在我们当地的公共图书馆和社区学院教授介绍性 Arduino、物联网和基于 Web 的编程技术。

硬件

InqWeather硬件非常简单:

  • 1 个基于 ESP8266 的 NodeMCU 或 WeMos
  • 1 面包板
  • 1 BMP180 温度/压力传感器分线器,使用 I2C
  • 1 AHT10 温度/湿度传感器分线器,使用 I2C
  • 4 跳线
poYBAGNYfQ-AXdRqAAEKZoiqWwQ511.jpg
简单接线
 

InqWeather 接线

我们利用 I2C 作为多目标串行通信总线。换句话说,我们可以只使用 4 根电线来服务两个传感器。请注意 BMP180 和 AHT10 板的引脚 VIN、GND、SCL 和 SDA 如何位于相同的面包板行上。这样,仅使用我们处理器的两个数据引脚就可以查询两个传感器的数据。

  • 红线——NodeMCU 3V 引脚到传感器的 VIN
  • 黑线 – NodeMCU G 引脚到传感器的 GND
  • 黄线——NodeMCU D1 引脚到传感器的 SCL
  • 橙色线 - NodeMCU D2 引脚到传感器的 SDA

服务器端草图

新版本(5.0)有所增长。主要的源代码草图仍然是大约 200 行,完全注释。这些行中只有大约 30 行用于创建 Web 服务器。Sketch 的其余部分是传感器和项目特定计算的标准处理。该代码的一些功能包括:

  • InqPortal Web 服务器公开客户端 UI,提供客户端-服务器通信并大大减少与 InqWeather 交互所需的编码。您会注意到没有代码执行显式发送和接收。这一切都在透明地处理,因此开发人员可以只专注于手头的项目……一个气象站!
  • 展示一个持久的、已发布的变量 -高度= 用于将您所在位置的气压转换为气象服务报告的等效海平面压力的因子。同样在 5.0 版本中,我们添加了多个客户端可修改变量以支持自定义 Zambretti 天气预报算法。
  • 发布只读变量以传播当前温度、湿度、压力 Zambretti 结果。我们希望在测试和演示期间有一个更加动态的界面,所以这些变量每秒更新一次。
  • 发布只读变量以传播每分钟的温度、湿度和压力。这些是所有 1 秒读数的累积一分钟平均值。这些是应该用作气象站的。
  • 使用循环缓冲区存储 3 小时的压力读数。这些被用作 Zambretti 天气预报算法的主要输入之一。
  • 您甚至不必输入此内容。当您从 Arduino IDE 库管理器下载InqPortal库时, InqWeather就是示例之一。
  • 我们现在有第二个文件Zambretti.h来处理所有预测计算。

客户端应用程序

InqWeather具有三个不同的应用程序(网页)来显示结果。这些大多是装饰性的,可以很容易地更改为装饰性或功能……显然无需重新编译。下面显示了上传到InqWeather/InqPortal服务器的文件(Web 内容)列表。

pYYBAGNYfRKAXz0zAAErNLAX_kU914.png
InqWeather 客户端应用程序的 Web 内容
 

版本 1 – 纯数字

 
默认,数字显示 (index.html)

纯数字网页是默认网页——这意味着如果在浏览器的 URL 地址行之后没有定义 html 文件,它将被调用。这是实际使用index.html的标准 Web 服务器默认设置

  • 它显示两个温度,因为两个传感器都提供温度。(标签旁边的一小部分)通常,我们可能不会同时使用两者,但在课堂上,我们希望展示传感器制造的可变性。
  • 温度从服务器提供的°C 修改为客户端的°F。index.js源代码文件进行了更改如果您是°C 类型的人,请删除明显的等式,您将得到°C。这是一个重要的概念,我们拦截服务器提供的原始数据并根据客户端用户的上下文对其进行更改。在这个例子中,InqWeather 服务器的一个观察者可能更喜欢°C,而另一个°F。两者都可以有自己的方式,服务器不必为细节烦恼。

版本 2 – 模拟

pYYBAGNYfRiAD0thAAGDp4b3TIQ565.png
 

模拟版 ()

在这个版本中,我们想要演示使用现成的 JavaScript 库。在上课的时候,我们一时兴起把它从网上下载下来,在阅读了网站的文档大约十分钟后把它拍了下来。为他的图书馆MykhaIloStadnyk 大声疾呼……尤其是为他的国家。

版本 3 – 预测

poYBAGNYfRqAG0DwAAEXq-ZLeVo126.png
InqWeather 现在包括基于 Zambretti 的预测
 

InqWeather使用一个循环缓冲区来保存过去三个小时的压力读数。它现在使用这些值来提供 Zambretti 算法进行预测分析所需的重要信息。Zambretti 算法创建于 1915 年,远早于数字计算机,它利用大气压力和过去三个小时内的压力变化来得出 26 种不同天气预报 (AZ) 中的一种。InqWeather Sketch(服务器)将这个值发送到任何客户端,只要它发生变化。客户端应用程序(在本例中为changed.jsfile) 获取该值,查找天气描述并显示它。它还检查具有相同名称的图像(A.jpg、B.jpg... Z.jpg)并找到最接近的可用图像以显示为背景。

以编程方式,它的主要演示点是关注点分离。服务器提供 Zambretti 信函,但客户端可以以不同的方式显示结果。所有描述都可以从 1915 年的原始字符串更改为 21 世纪更相关的内容或任何语言。只需更改 changed.js 文件中的值并将其上传到 InqWeather 服务器。只需将图片命名为所需的条件,就可以更改背景(例如...在您的前门拍摄天气状况的图片)。在上面的例子中 N.jpg并将其上传到服务器。无需更改代码。客户端应用程序将检测可用图像并在适当时显示它。

100 小时测试结果

在测试的前 100 小时内, InqPortal管理员正在监视服务器。它能够配置历史记录仪以跟踪重要的系统性能指标以及您的任何数字输出。在这里,我们有 100 小时的数据显示 AHT10 和 BMP180 的温度以及湿度和海平面归一化气压。它还跟踪三个小时的压力变化。

pYYBAGNYfR6AZmDvAAdSnvf26Nk400.png
100 小时查询天气输出
 

期货

现在就是这样。InqWeather 是一个很棒的教学/学习项目。如果您对未来的补充有任何建议,请告诉我……特别是如果它们可以用作未来学生的教学时刻。


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

评论(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.lene-v.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:'基于网络的InqWeather气象站',//标题 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.lene-v.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);