×

艾达动力气象站

消耗积分:0 | 格式:zip | 大小:0.41 MB | 2022-12-15

其实znvm

分享资料个

描述

几个世纪以来,感知风和天气对人类来说一直很重要。雅典人在公元前一世纪建造了八面风之塔,以纪念八位风神。风之塔至今仍矗立在雅典古老的集市或市场中。

多年来,许多重大的天气事件影响了人类。我们知道这些,因为它们的影响已成为历史的一部分。由于历史的大部分内容是对一系列战争和战斗的回忆,有趣的是,早期著名的关于天气重要性的提法来自中国哲学家孙祖,他说:“知己知彼, 胜利是有保证的。知地而知天,方能全胜。”

在很久以后的历史中,我们知道拿破仑在 1812 年入侵俄罗斯受到阻碍,因为该季节的降雪和寒冷天气比他和他的将军们计划的要早。这与俄罗斯民兵的袭击相结合,帮助击败了法国人,法国人带着 500,00 名士兵入侵,只剩下 20,000 名幸存者。一百三十年后,当希特勒对苏联的入侵再次被严寒的冬季天气部分挫败时,这种情况再次发生。

在 20 世纪,恶劣的天气条件带来了大规模的人口迁移,包括 1930 年代美国的沙尘暴、整个世纪亚洲的多次干旱以及非洲萨赫勒地区的三个重要干旱时期。造成许多人死亡和影响的个别事件包括 1952 年伦敦的大烟雾事件,该事件在 12 月的五天内造成 4,000 人死亡,美国东海岸的许多飓风影响,以及几场值得注意的暴风雪。人对环境的影响也可以从天气中看到,在最近的事件中,当乌克兰切尔诺贝利的反应堆事故释放出放射性粒子时,被苏联以外的传感器检测到,并使用复杂的天气传感器和气象模型追溯到切尔诺贝利。以类似的方式,当地气象仪器被用来帮助估计 1991 年海湾战争期间油井大火产生的烟雾和煤烟的影响。

今天,风和其他天气变量同样受到关注,并且可能对我们现代高科技生活方式产生更大的影响。天气影响广泛的人类活动,包括农业、交通和休闲时间。通常,这些影响涉及气体和微粒在大气中的移动。现代天气监测系统和网络旨在以具有成本效益的方式进行必要的测量,以跟踪这些运动。这要求将监测系统的总生命周期成本降至最低,而做到这一点的一种方法是尽量减少或消除对天气监测系统的维护。使用固态系统来测量天气,包括风速和风向,对于最大限度地减少设备维修和成本至关重要。传统的天气监测系统由单独的传感器组成,用于测量一个气象变量,每个传感器都连接到数据收集设备或记录器。现代技术允许将多个传感器组合成一个集成气象站,该气象站可以永久位于一个站点或运输到需要局部天气的站点。

因此,利用 Ada 的所有强大功能以及一系列 BM1383AGLV 压力-温度传感器,我们将构建一个具有各种应用的本地化气象站。

硬件

1. 树莓派 3B+

众所周知,树莓派是一系列小型单板机,树莓派 3B+ 是该家族的最新版本之一。我选择它是因为它操作快速且易于处理,而且 Ada 内置了对 Raspberry Pi 的支持。

pYYBAGOX_ZuAUEtjAAJZcgto0JQ043.jpg
 

但 RPI 的主要问题之一是它无法从其 GPIO 读取模拟输入。为了克服这个问题,我选择了一个支持 I2C 的传感器,这样我就可以轻松地访问来自传感器的数据。

2.BM1383AGLV

BM1383AGLV 是一种压阻式压力传感器。它对芯片内部的MEMS进行温度补偿,因此很容易获得压力信息。它由温度和压力传感器组成,并提供 I2C 接口。它可以读取从 300hPa 到 1100hPa 的压力和从 -40°C 到 +85°C 的温度。

pYYBAGOX_Z-ARAnTAADpQ_O3-RE914.png
 

硬件设置

硬件连接示意图如下。将 SDA 引脚连接到 GPIO2,将 SCL 引脚连接到 GPIO3。DRDY 引脚是可选的。如果您在代码中使用它,请将其拉​​至 1。

poYBAGOX_a2AL1WQAAFrUPPq1NU397.png
架构
 

 

poYBAGOX_bGAPSGnAAIkO5dxm7A631.jpg
 

 

pYYBAGOX_b-ASwm_AAGA6VFdbkY459.jpg
 

软件

1. GNAT

GNAT 是 Ada 编程语言的免费软件编译器,它是 GNU 编译器集合的一部分。它支持所有版本的语言,即 Ada 2012、Ada 2005、Ada 95 和 Ada 83。

要在 Raspberry Pi 中安装 GNAT 编译器,请在终端中输入以下命令。

sudo apt-get install gnat

2. ADA 代码

选择传感器后,我继续搜索任何提供 I2C 支持的 Ada 库,但我很失望,因为我找不到。所以我决定从头开始为 BM1383AGLV 构建一个库。

我使用了一些 bash 命令与 I2C 模块进行通信,并且能够从模块中读取数据。

i2c检测

我使用此命令搜索连接的 I2C 模块

pYYBAGOX_deAWa4aAAGfrO4kh8s841.png
i2c检测
 

i2cget

我使用这个命令来读取存储在传感器中的数据。

poYBAGOX_d6AKzCQAAGlWnbdeFc000.png
i2cget
 

所以我开始寻找一个可以执行 bash 命令的 Ada 模块,我找到了Interfaces.C模块。

使用这段代码,我能够在终端中执行命令

function System (Cmd : String) return Integer is
function C_System (S : Interfaces.C.char_array) return Integer;
pragma Import (C, C_System, "system");
begin
return C_System (Interfaces.C.To_C (Cmd));
end System;

然后我开始将命令合并到 Ada 代码中。i2c.adb 文件读取为

with Interfaces.C;
with Ada.Strings.Fixed;
with GNAT.Expect;
package body i2c is
R,V1: Integer;
W1: String:="i2cset -y -a 1 0x5d 0x12 0x01";
W2: String:="i2cset -y -a 1 0x5d 0x13 0x01";
W3: String:="i2cset -y -a 1 0x5d 0x14 0x9";
R1: String:="i2cget -y -a 1 0x5d 0x19";
R2: String:="i2cget -y -a 1 0x5d 0x1A";
R3: String:="i2cget -y -a 1 0x5d 0x1B";
R4: String:="i2cget -y -a 1 0x5d 0x1C";
procedure write is
function System (Cmd : String) return Integer is
function C_System (S : Interfaces.C.char_array) return Integer;
pragma Import (C, C_System, "system");
begin
return C_System (Interfaces.C.To_C (Cmd));
end System;
pragma Inline (System);
begin
R := System (W1);
DELAY 0.5;
R := System (W2);
R := System (W3);
end write;
procedure read  is
function System (Cmd : String) return Integer is
function C_System (S : Interfaces.C.char_array) return Integer;
pragma Import (C, C_System, "system");
begin
return C_System (Interfaces.C.To_C (Cmd));
end System;
pragma Inline (System);
Com: String:="sudo chmod +x i2c.sh && ./i2c.sh";
begin
V1 := System (Com);
end read;
end i2c;

在职的

现在是检查工作的时候了。下载代码并执行以下命令以查看它们是否正常工作。

gprbuild -d aws.gpr -XPrivate_Warnings=FALSE -XModule=MOD_RPI aws.adb

然后你可以在 bin 文件夹中找到一个可执行文件。使用以下命令执行它

sudo ./aws

它会给你这样的结果

pYYBAGOX_eWAEN5sAAHKNLf2Fww518.png
 

未来会怎样?

我们现在开发了一个本地化的气象站,能够不时监测天气变量。将这些变量结合到现有的机器学习模型中,我们将能够更准确地预测未来几天的天气。

有关更多文档和详细信息,请访问GitHub 存储库


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

评论(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:'艾达动力气象站',//标题 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);