风速和风向测量站

普通的家用品牌或自制气象站测量两个温度-湿度(在房间和街道上),大气压,并且还带有带有日历的时钟。 但是,实际的气象站还有更多的东西-太阳辐射传感器,降水量计以及所有这些,通常仅出于专业需要而已,一个例外。 风参数(速度,最重要的是风向)的测量仪对于乡间别墅是非常有用的补充。 而且,即使在Ali Baba上,品牌的风传感器也相当昂贵,因此考虑自制解决方案是很有意义的。

我必须马上说,如果我事先知道多少手动工作和花在实验上的钱会浇灌我的想法,也许我不会开始。 但是好奇心胜过了,本文的读者有机会避免我不得不绊倒的那些陷阱。

测量风速 (风速测定法 ),有数百种方法,其中主要是:

-热线,
-机械-用螺旋桨(更确切地说是叶轮 )或卧式杯形叶轮(经典杯型风速计 ),在这种情况下,速度的测量等于测量螺旋桨或叶轮所在轴的速度。
-以及超声波,结合了速度和方向测量。
为了减少方法的方向
-提到的超声波;
-机械风向标,可通过电子方式消除旋转角度。 测量旋转角度的方法也有很多:光学的,电阻的,磁性的,电感的,机械的。 顺便说一下,可以简单地将电子罗盘安装到风向标轴上-这是可靠且简单的方法(对于“膝盖高”重复)是从随机旋转的轴传输读数的方法。 因此,我们进一步选择了传统的光学方法。

如果您独立重复这些方法中的任何一种,则应牢记最低能耗和全天候(也许是全年?)的要求。 不能将风传感器放置在树荫下的屋顶下-相反,它应尽可能远离所有干扰因素,并且“对所有风开放”。 理想的放置位置是房屋屋顶的脊,或者最糟的是远离其他建筑物和树木的谷仓或凉亭。 此类要求需要自主电源,并且显然需要无线数据通道。 这些要求负责设计的某些“钟声”,如下所述。

关于最低功耗
顺便问一下,最小功耗是多少? 基于普通的AA型家用电池,理想情况下,平均电路消耗应不超过1-2 mA。 自己动手:AA大小适中的碱性元素的容量约为2.5-3 Ah;也就是说,具有指定消耗量的电路将在其中工作1500-2500小时或2-3个月。 从原则上讲,这还是有一点,但相对可以接受-您别无选择:破产或使用比更换电池需要更频繁充电的电池。 因此,在制定这样的方案时,我们必须抓住一切麻烦:强制性节能模式,仔细考虑电路和程序中的动作顺序。 此外,我们将看到在最终设计中,我仍然没有达到必要的要求,不得不使用电池电源。


关于我如何尝试重现最现代和最先进的方法(超声波)的认知故事,但以失败告终,我将再讲一些时间。 所有其他方法都涉及速度和方向的单独测量,因此我不得不围挡两个传感器。 研究了理论上的热线风速仪后,我意识到我们将无法获得现成的业余水平的敏感元件(它们在西方市场上都可以买到!),但是我自己发明了它-参与常规的研发并浪费了时间和金钱。 因此,经过深思熟虑,我决定对这两种传感器进行统一设计:基于转速的光学测量的杯型风速计和基于编码盘(编码器)的具有电子旋转角度的风向标。

传感器设计


机械传感器的优点是在那里不需要研发,原理简单明了,结果的质量仅取决于经过深思熟虑的设计的执行精度。

因此,从理论上讲,实际上,这导致了一堆机械工作,由于手边没有车铣床,因此必须在侧面订购一些机械工作。 我必须马上说,我从未后悔我从一开始就依靠资本方法,而且从未开始使用即兴材料制作建筑。

对于风向标和风速计,需要以下零件,这些零件必须从车工和铣床操作员那里订购(两个传感器的数量和材料都立即标出):

图片
我们注意到,轴必须在车床上打开:实际上,不可能使一个点的位置恰好位于膝盖的中心。 尖端完全沿着旋转轴放置的位置是成功的决定因素。 此外,轴必须完全笔直,不允许有偏差。

机械风向传感器-电子风向标


风向标(以及下面的速度传感器)的基础是一个由D-16硬铝制成的U形支架,如左上图所示。 将一块氟塑料压入下部凹槽,在其中依次用2毫米和3毫米的钻头制成阶梯状凹槽。 一根带有尖锐末端的轴插入该凹口(用于风向标-由黄铜制成)。 它从上方自由穿过8毫米的孔。 在此孔上方,M2螺钉将一块4mm厚的相同氟塑料矩形件固定在支架上,使其与孔重叠。 在氟塑料上精确地沿6毫米的直径钻孔(精确地沿孔的主轴线-参见下面的装配图)。 上,下玻璃体起滑动轴承的作用。
图片
可以抛光与光塑料发生摩擦的位置的轴,并可以通过与氟塑料中的孔相对应来减小摩擦面积。 ( 请参阅UPD下09/13/18和06/05/19上有关此主题的信息 )。 对于风向标,这并不是特别的作用-某些“抑制”对他来说甚至是有用的,对于风速计,您将不得不尝试最小化摩擦和惯性。

现在大约要消除旋转角度。 在我们的案例中,经典的格雷编码器具有16个位置,如下图所示:
图片
磁盘大小的选择是基于发射器/接收器对之间可靠的光学隔离。 通过这种配置,宽度为5毫米的插槽也间隔5毫米,而光学对的间隔恰好为10毫米。 根据120毫米的圆盘直径,精确计算出安装了风向标的支架的尺寸。 当然,所有这些都可以减少(特别是如果您选择直径尽可能小的LED和光电探测器),但是考虑到了编码器制造的复杂性:事实证明铣床并没有完成如此细腻的工作,因此必须使用锉刀手动切割。 然后,尺寸越大,结果越可靠,麻烦也就越少。

上面的装配图显示了磁盘在轴上的安装。 用M2螺钉将仔细居中的圆盘固定在己内轮毂上。 将套筒放置在轴上,以使顶部的间隙最小(1-2毫米)-从而使轴在正常位置自由旋转,并且在旋转过程中,尖端不会从下面的套筒中掉出来。 光电探测器和发射器块安装在磁盘顶部和底部的支架上,更具体地说,是它们的设计。

整个结构放置在150×150×90 mm的塑料(ABS或聚碳酸酯)外壳中。 组装后(没有盖和风向标),方向传感器如下:

图片

请注意,选择的向北方向带有箭头标记,将传感器安装到位时需要注意该方向。

在轴的顶部,附有实际的风向标。 它是基于相同的黄铜轴制成的,在钝面的切口上焊接了黄铜柄。 在尖头处,将M6螺纹切成一定长度,并借助螺母将由铅铸成的圆形配重负载固定在其上:

图片

负载经过精心设计,以使重心恰好位于紧固位置(沿着螺纹移动,可以实现完美的平衡)。 叶片使用不锈钢螺钉M3固定在轴上,该螺钉穿过叶片轴线上的孔并拧入切入旋转轴的螺纹中(固定螺钉在上图中可见)。 为了精确定位,旋转轴的顶部有一个半圆形的凹槽,风标的轴位于其中。

DIY风速传感器-DIY杯风速计


如您所知,为统一起见,速度传感器的基础与风向标的选择相同。 但是这里的设计要求有些不同:为了降低启动阈值,风速仪应尽可能轻。 因此,尤其是其轴由硬铝制成,带孔的圆盘(用于测量速度)直径减小:

图片

如果四位格雷编码器需要四个光耦合器,则速度传感器只有一个。 在圆盘的圆周上等距离地钻了16个孔,因此圆盘每秒旋转一圈等于光耦合器产生的频率的16赫兹(可能的孔更多,可能的更少-唯一的问题是能量转换和向发射器节能的规模)。

自制的传感器仍然会变得很粗糙(启动阈值不小于每秒半米),但是只有彻底改变设计才能减小它:例如,代替螺旋杯转盘,放一个螺旋桨。 在杯式旋转器中,决定扭矩的流动阻力的差异相对较小-只能通过满足进气流的表面形状不同来实现(因此,杯形应尽可能简化-理想的是半个鸡蛋或一个球)。 螺旋桨具有更大的扭矩,可以使其重量更小,最后,制造本身也更简单。 但是,螺旋桨必须沿气流方向安装-例如,将螺旋桨放在同一风向标末端

问题是:如何传输围绕垂直轴随机旋转的传感器的读数? 我无法解决,从专业杯的构造仍很普遍的事实来看,这绝不是半开球就可以决定的(我们不考虑手动风速计-它们是根据手动气流定向的)。

我的杯型风速计是基于激光光盘制作的。 照片中显示了顶视图和底视图:

图片
图片

杯子是用Agusha婴儿水下面的瓶子底部制成的。 底部被整齐地切掉,所有三个-在相同的距离处,以使它们具有相等的重量,在中心局部加热(完全不加热整个物体-它将不可逆转地弯曲!),并且木柄的背面向外弯曲以使其更加流线型。 您将重复一遍-储存5或6件较大的瓶子,您可能可以在同一个杯子中制造3个或更多或更少。 在制成的杯子中,在其侧面进行切割,并借助防水胶密封剂将它们沿圆盘的周边相对于彼此以120°固定。 圆盘严格围绕轴居中(我是借助嵌套金属垫圈完成的),并使用M2螺丝将其安装在己内轮毂上。

传感器的一般设计和安装


如前所述,两个传感器都放置在150×150×90 mm的塑料盒中。 外壳材料的选择必须谨慎处理:ABS或聚碳酸酯具有足够的耐候性,但是聚苯乙烯,有机玻璃,尤其是聚乙烯在这里不适用(并且很难涂漆以防日晒)。 如果无法购买公司包装盒,则最好用铝箔玻璃纤维焊接外壳,然后再上漆以保护其免受腐蚀并保持美观。

在盖子的正好在轴向出口处开一个8-10毫米的孔,在该孔中,从喷头上用建筑密封胶或胶水从喷头上切下的塑料锥与相同的密封胶粘合在一起:

图片

要使锥体沿轴居中,请使用夹具将一块木头固定在盖子的底部,在其上标记出确切的中心,然后用12毫米的羽毛钻钻得更深一点,在孔周围做一个环形凹槽。 圆锥体必须精确地进入那里,然后才能涂上胶水。 可以使用M6螺钉和螺母将其固定在垂直位置进行固化。

速度传感器本身像伞一样,用圆锥形覆盖轴,以防止水进入人体。 对于风向标,有必要在圆锥体上额外放置一个套管,该套管将通过直接水流封闭轴和圆锥体之间的间隙(请参见下面传感器的总体视图照片)。

来自光耦合器的电线被布线到单独的D-SUB型连接器(请参见上面的方向传感器的照片)。 电缆的对应部分穿过外壳底部的矩形孔插入。 然后,该孔被带有用于电缆的插槽的盖所覆盖,以防止连接器掉落。 硬铝支架被拧到外壳的底部以固定到位。 它们的配置取决于传感器的位置。

组装后,两个传感器的外观如下:

图片

在这里,它们显示已安装到位-在凉亭的山脊上。 请注意,用于固定盖的螺钉的凹槽已通过生胶塞保护而防水。 传感器严格水平安装,我不得不使用油毡衬里。

电子零件


整个气象站由两个模块组成:一个远程单元(既为风传感器提供服务,又从外部温度湿度传感器获取读数),以及带有显示屏的主模块。 远程装置配备有无线发射器,用于发送安装在其内部的数据(天线从侧面伸出)。 主模块从远程单元接收数据(为了便于定位,接收器被放置在单独单元中的电缆上),还从内部温度-湿度传感器获取读数并将所有这些显示在显示器上。 主机的一个单独组件是带有日历的时钟,为方便工作站的常规设置,该时钟由单独的Arduino Mini控制器提供服务并具有自己的显示。

风传感器的远程模块和测量电路


作为光发射器,选择了IR-LED AL-107B。 这些老式的LED当然不是同类产品中最好的,但它们具有直径为2.4 mm的微型外壳,并且每个脉冲能够传输高达600 mA的电流。 顺便说一下,在测试过程中,事实证明,此LED的样品(1980年,红色)的效率(在光电探测器的可靠操作范围内表示)是在Chip-Dip中购买的现代副本(它们具有透明的)的大约两倍。黄绿色的身体)。 尽管到底是不是在开玩笑,但1980年的水晶不太可能比现在好。 但是,在一种设计和另一种设计中,物质的散射角可能不同。

约20 mA的恒定电流(电源为5伏的电阻150欧姆)流过速度传感器中的LED,方向传感器中约65 mA的脉冲电流(占空比为2的电流)通过方向传感器传递了相同的150欧姆的电流(电源为12伏)。 在这种情况下,通过方向传感器的一个LED的平均电流在大约四个通道中约为33 mA,约为130 mA。

作为光电探测器,选择直径为3 mm的情况下的L-32P3C光电晶体管。 信号来自5 V电源上的1.5或2kΩ电阻上加载的集电极,这些参数经过选择,以便在光发射器和接收器之间约20 mm的距离处,可以立即接收5伏电平的全尺寸逻辑信号,而无需额外的放大。 根据上面所述的最低能耗要求,此处出现的电流对您来说似乎不成比例,但您会看到,它们在每个测量周期中最多出现几毫秒,因此总功耗仍然很小。

安装接收器和发射器的基础是电缆通道的各个部分(在上方的传感器照片中可见),该部分经过切割以形成“耳”,以便安装在底座的支架上。 对于这些废料中的每一种,从内部将一块塑料板粘贴到锁定盖上,宽度等于通道的宽度。 , , , . (. ), . , . , , , , . , , , .

:

图片

, 12-14 , . . , , -, . , A0 , . , 13 ( 19 DIP) — , , , 33 .

«» Atmega328 DIP-, Uno . Arduino-, , , «-» ( ). , , , -, , -, . , ( :), , .

, . .

WDT, . WDT . , , , . - — , .

( , , -):

#include <VirtualWire.h> #include <avr/wdt.h> #include <avr/sleep.h> . . . . . #define ledPin 13 //  (PB5  19 ATmega) #define IR_Pin 10 //  IRLU (PB2  16 Atmega) #define in_3p 9 //   3 #define in_2p 8 //   2 #define in_1p 7 //   1 #define in_0p 6 //   0 #define IR_PINF 5 //(PD5,11)   -  #define IN_PINF 4 //(PD4,6)    volatile unsigned long ttime = 0; //   float ff[4]; //      char msg[25]; //  byte count=0;// int batt[4]; //   byte wDir[4]; //   byte wind_Gray=0; //    

以下过程用于启动睡眠模式和WDT(每4秒唤醒一次):

 //      void system_sleep() { ADCSRA &= ~(1 << ADEN); //. cbi(ADCSRA,ADEN);   set_sleep_mode(SLEEP_MODE_PWR_DOWN); //   sleep_mode(); //   sleep_disable(); //      watchdog ADCSRA |= (1 << ADEN); /. sbi(ADCSRA,ADEN);   } //**************************************************************** // ii: 0=16ms, 1=32ms,2=64ms,3=128ms,4=250ms,5=500ms // 6=1 sec,7=2 sec, 8=4 sec, 9= 8sec void setup_watchdog(int ii) { byte bb; if (ii > 9 ) ii=9; bb=ii & 7; if (ii > 7) bb|= (1<<5); // bb -   bb|= (1<<WDCE); MCUSR &= ~(1<<WDRF); //   WDTCSR |= (1<<WDCE) | (1<<WDE); //      WDTCSR = bb; WDTCSR |= (1<<WDIE); // WDT } //**************************************************************** //     ISR(WDT_vect) { wdt_reset(); } 

速度传感器给出光通道的中断频率,数量级为几十赫兹。 经过一段时间后,测量该值更经济,更快捷(这是作者出版物“ 评估Arduino上的低频测量方法的主题”)。 在此,通过修改后的pulseInLong()函数选择方法,该函数不会将测量结果绑定到特定的控制器输出(periodInLong()函数的文本可在出版物中找到)。

在setup()函数中,声明了输出方向,初始化了433 MHz发送器库和看门狗定时器(IN_PINF的行基本上是多余的,并插入了内存):

 void setup() { pinMode(IR_PINF, OUTPUT); //  pinMode(IN_PINF, INPUT); //     pinMode(13, OUTPUT); // vw_setup(1200); //   VirtualWire vw_set_tx_pin(2); //D2, PD2(4)   VirtualWire // Serial.begin(9600); // Serial-     setup_watchdog(8); //WDT  4 c wdt_reset(); } 

最后,在程序的主循环中,我们首先在每次唤醒时(每4秒一次)读取电压并计算风速传感器的频率:

 void loop() { wdt_reset(); //  digitalWrite(ledPin, HIGH); //    batt[count]=analogRead(0); //      /*===  ==== */ digitalWrite(IR_PINF, HIGH); // -   float f=0; //   ttime=periodInLong(IN_PINF, LOW, 250000); // 0,25  // Serial.println(ttime); //    if (ttime!=0) {//    f = 1000000/float(ttime);} //      digitalWrite(IR_PINF, LOW); // - ff[count]=f; //     . . . . . 

如您所见,IR LED的燃烧时间(我记得要消耗20 mA)在没有传感器盘旋转的情况下将是最长的,在这种情况下约为0.25秒。 因此,最小的测量频率将为4 Hz(16孔每秒磁盘旋转的四分之一)。 正如在传感器校准过程中发现的那样(见下文),这大约相当于风速0.2 m / s。我们强调这是风速的最小可测量值,但不是分辨率,也不是启动阈值(将会更高)。 如果有一个频率(即传感器旋转时),则测量时间(以及相应的LED燃烧时间即电流消耗)将成比例减少,并且分辨率将提高。

以下是每第四次唤醒(即每16秒)执行的过程。 从我们传输的四个累加值中得出的速度传感器的频率值不是平均值,而是最大值-如经验所示,这是一个更具参考价值的值。 为了方便和统一起见,每个值(无论其类型如何)在传输前都转换为4个小数位的正整数。 count变量由count变量监视:

 // 16        //  4- : if (count==3){ f=0; //  for (byte i=0; i<4; i++) if (f<ff[i]) f=ff[i]; //    int fi=(int(f*10)+1000); //  4 .    int volt=0; //  for (byte i=0; i<4; i++) volt=volt+batt[i]; volt=volt/4+100; //   100  = 3 . volt=volt*10; // 4 .  . . . . . 

接下来是格雷码方向的定义。 在这里,为了减少消耗,而不是一直固定在IR LED上,而是通过使用音频()功能的关键场效应晶体管同时向所有四个通道提供5 kHz的频率。 当读取按下的按钮的读数时,使用类似于防反弹的方法来检测每个放电(in_0p-in_3p输出)处是否存在频率。 首先,在周期中,我们等待看输出是否有高电平,然后在100μs之后对其进行检查。 100μs是5 kHz频率的一半周期,也就是说,如果至少从第二次开始就有一个频率,我们将再次跌至高电平(以防万一,重复四次),这意味着它肯定在那里。 我们对代码的四个位分别重复此过程:

 /* ===== Wind Gray ==== */ //: tone(IR_Pin,5000);// 5    boolean yes = false; byte i=0; while(!yes){ // 3 i++; boolean state1 = (digitalRead(in_3p)&HIGH); delayMicroseconds(100); //   100  yes=(state1 & !digitalRead(in_3p)); if (i>4) break; //   } if (yes) wDir[3]=1; else wDir[3]=0; yes = false; i=0; while(!yes){ // 2 i++; boolean state1 = (digitalRead(in_2p)&HIGH); delayMicroseconds(100); //   100  yes=(state1 & !digitalRead(in_2p)); if (i>4) break; //   } if (yes) wDir[2]=1; else wDir[2]=0; yes = false; i=0; while(!yes){ // 1 i++; boolean state1 = (digitalRead(in_1p)&HIGH); delayMicroseconds(100); //   100  yes=(state1 & !digitalRead(in_1p)); if (i>4) break; //   } if (yes) wDir[1]=1; else wDir[1]=0; yes = false; i=0; while(!yes){ // 0 i++; boolean state1 = (digitalRead(in_0p)&HIGH); delayMicroseconds(100); //   100  yes=(state1 & !digitalRead(in_0p)); if (i>4) break; //   } if (yes) wDir[0]=1; else wDir[0]=0; noTone(IR_Pin); //  //     : wind_Gray=wDir[0]+wDir[1]*2+wDir[2]*4+wDir[3]*8; //   .  int wind_G=wind_Gray*10+1000; //  4- .  . . . . . 

一个过程的最大持续时间将是在接收器没有频率的情况下,等于4×100 = 400微秒。 4个方向LED的最大燃烧时间将是没有接收器点亮时的时间,即4×400 = 1.6毫秒。 顺便说一句,该算法将以完全相同的方式工作,如果将周期恒定的高电平施加到LED而不是周期为100μs倍数的频率,则很简单。 如果有曲折而不是恒定的水平,我们只需将食物节省一半即可。 如果通过单独的线路(分别通过带有其自己的键晶体管的控制器的单独输出)启动每个IR LED,我们仍然可以节省,但同时电路,接线和控制都很复杂,并且每16秒2 ms的电流为130 mA -这一点,你看。

最后是无线数据传输 。 要将数据从传感器安装站点传输到气象站记分牌,选择了最简单,最便宜和最可靠的方法: 一对433 MHz频率的发送器/接收器 。 我同意该方法并不是最方便的方法(由于设备被设计为传输位序列而不是整个字节,因此您必须对在必要的格式之间转换数据保持精打细算),而且我敢肯定,很多人都想就其可靠性与我争论。 对最后一个异议的答案很简单:“您只是不知道怎么做!”

秘密在于,它通常仍在433 MHz信道上进行各种数据交换的描述的幕后花絮:由于这些设备是纯模拟设备,因此必须非常干净地清洁接收器的电源,避免任何多余的脉动。 在任何情况下,都不应通过内部5伏Arduino稳定器为接收器供电! 在接收器的端子附近直接安装一个单独的低功率稳定器(LM2931,LM2950或类似产品),在输入和输出端使用正确的滤波电路,从根本上增加了传输范围和可靠性。

在这种情况下,发射器直接使用12 V的电池电压工作,接收器和发射器均配备了标准的自制天线,其形式为长17厘米的金属丝(我记得天线用的金属丝仅适合单芯,并且必须将天线相互平行放置)。毫无疑问,一个24字节的信息包(考虑了湿度和温度)毫无疑问地以1200位/秒的速度通过15英亩(约40-50米)的花园地对角传输,然后通过三个日志 房间内的墙壁(例如,很难接收到蜂窝信号而不是到处接收)。 对于任何标准的2.4 GHz方法(例如蓝牙,Zig-Bee甚至业余Wi-Fi),实际上都无法达到的条件,尽管事实上此处的发射器功耗是8 mA,只有在实际传输时,其余时间才消耗便士。 发射器在结构上放置在远程单元内部,天线从侧面水平伸出。

我们将所有数据合并到一个包中(在一个实际站中,将添加温度和湿度),该包由统一的4字节部分组成,并带有“ DAT”签名,然后将其发送到发送器并完成所有周期:

 /*=====Transmitter=====*/ String strMsg="DAT"; // -  strMsg+=volt; //  4  strMsg+=wind_G; // wind 4  strMsg+=fi; //  4  strMsg.toCharArray(msg,16); //    // Serial.println(msg); //  vw_send((uint8_t *)msg, strlen(msg)); //   vw_wait_tx(); //    - ! delay(50); //+      count=0; //  }//end count==3 else count++; digitalWrite(ledPin, LOW); //   system_sleep(); // —   } //end loop 

如果您拒绝以统一的4字节代码(例如,对于格雷码,当然一个字节就足够)表示各种类型的每个值的要求,则可以减少数据包的大小。 但是为了通用化,我保留了所有内容。

远程单元的电源和设计功能 。 远程单元的消耗以这种方式计算:

-每20秒20毫安(发射极)+〜20毫安(带有辅助电路的控制器)大约0.25 s-平均40/16 = 2.5毫安;
-每16秒2毫秒-130毫安(发射极)+〜20毫安(带有辅助电路的控制器)-平均150/16/50≈0.2毫安;

在从温度-湿度传感器获取数据以及变送器工作时进行控制器功耗计算之后,我们可以安全地将平均功耗提高到4 mA(请注意,峰值约为150 mA)。 电池(顺便提一下,最多需要8块电池才能为发射器提供最大电压!)必须经常更换,所以想法是用12伏电池为螺丝刀为远程装置供电-我只有两个。 它们的容量甚至少于相应的AA电池数量-仅1.3 A•小时,但没有人愿意随时更换它们,保持一秒钟的充电时间。 在指示的4 mA消耗下,1300 mA•小时的容量足以维持约两周的时间,这并不太麻烦。

请注意,新充电的电池电压可能高达14伏。 在这种情况下,安装了12伏输入稳定器-为了防止变送器电源过电压,并且不会使主5伏稳定器过载。

装在合适塑料盒中的便携式装置位于车顶下方,电池的电源线以及与风传感器的连接均通过连接器连接到该装置。 主要困难在于,该电路对空气湿度极为敏感:在阴雨天气中,变送器在几个小时后开始出现故障,频率测量结果显示出完全混乱,电池电压测量结果显示“火星天气”。

因此,在调试算法并检查所有连接之后,必须仔细密封外壳。 外壳入口处的所有连接器均用密封剂密封,适用于所有伸出的螺钉头,天线输出和电源线。 身体的关节涂有橡皮泥(考虑到必须将它们分开),并另外用胶带将其粘在顶部。 最好用环氧树脂轻轻地加固内部使用过的连接器:例如,远程模块图上显示的DB-15本身并不紧,潮湿的空气会慢慢泄漏到金属框架和塑料底座之间。

但是,所有这些措施本身只会产生短期效果-即使没有吸入冷的潮湿空气,当外壳外部的温度下降时,来自房间的干燥空气也很容易变成潮湿的空气(记住这种现象称为“露点”)。

为避免这种情况,有必要将装有干燥剂-硅胶的墨盒或袋子留在箱子内(有时将装有袋子的袋子放在鞋盒中或在某些装有电子设备的包装中)。 如果来源不明的硅胶已保存了很长时间,则必须在140-150度的电烤箱中将其煅烧数小时。 如果箱子密封良好,则必须比每个夏季开始时更频繁地更换干燥剂。

主模块


在主模块中,所有值均被接受,解密(如有必要),根据校准方程式进行转换并显示。

接收器放置在站的主模块外部,并放置在带有耳朵的小盒子中,用于安装。 天线通过盖子上的开口拉出,外壳上的所有开口均用生橡胶密封。 接收器触点连接到非常可靠的RS-4型家用连接器,在接收器侧,它通过一条双屏蔽AV电缆连接:

图片

沿电缆线芯之一拾取信号,另一方面,从模块电源适配器以原始9伏特的形式提供电源。 LM-2950-5.0型稳定器与滤波电容器一起安装在盒子中,接收器放在单独的围巾上。

进行了一些实验来增加电缆的长度(以防万一,突然无法穿过墙壁吗?),结果表明在长达6米的长度内,什么都没有改变。

仅有四个OLED显示器:两个黄色提供气象数据,两个绿色时钟和一个日历。 照片中显示了它们的位置:

图片

请注意,在每个组中,一个显示是文本,第二个显示是图形,并以字形图片的形式人工创建了字体。 在这里,我们将不讨论在显示器上显示信息的问题,以免增加文章和示例的本已广泛使用的文字:由于存在必须单独显示的字形图片(通常通过使用case运算符简单列出选项),​​因此输出程序可能是非常笨重。 有关如何处理此类显示的信息,请参见作者的出版物“ Winstar Displays的图形和文本模式 ”,其中包括用于输出风数据的显示示例。

电路图。 时钟及其显示由单独的Arduino Mini控制器维修,以简化设置,在此我们不再对其进行拆卸。 Arduino Nano的组件连接图如下所示:Arduino Nano用于控制天气数据的接收和输出:

图片

在这里,与远程模块不同,显示了天气传感器的连接-气压计和内部温度湿度传感器。 注意电源线-显示器由单独的5 V稳定器LM1085型供电。 用时钟为时钟显示器供电是很自然的,但是在这种情况下,时钟控制器也必须由相同的电压供电,并通过5 V输出而不是Vin供电(对于Mini Pro,后者称为RAW)。 如果您通过RAW引脚以与Nano-9伏相同的方式为手表控制器供电,则其内部稳定器将与外部5伏冲突,当然,最强者将在这场战斗中获胜,即LM1085和Mini将完全没有电。 另外,为避免各种麻烦,在对Nano尤其是Mini进行编程之前(即,在连接USB电缆之前),应断开外部适配器的连接。

在LM1085稳定器上,当连接了所有四个显示器时,将分配大约一瓦的​​功率,因此应将其安装在距离铝或铜角约5-10 cm2的小型散热器上。

接收和数据处理。 在这里,我仅复制和评论与风数据有关的程序片段,并在下面谈论其他传感器。

要在433 MHz信道上接收消息,许多来源中描述的标准方法都适用。 我们连接库并声明变量:

 #include <VirtualWire.h> . . . . . int volt; //      float batt; //  —   byte wDir; //    uint16_t t_time = 0; //   char str[5]; //   uint8_t buf[VW_MAX_MESSAGE_LEN]; //    uint8_t buflen = VW_MAX_MESSAGE_LEN; // max    . . . . . 

一个独特之处与buflen缓冲区的大小有关:在程序开始时仅声明一次其值(VW_MAX_MESSAGE_LEN)是不够的。 由于此变量通过引用出现在接收函数中(请参见下文),因此默认消息大小必须在每个周期中进行更新。 否则,由于接收到损坏的消息,每次您都将缩短buflen值,直到您开始获取各种废话而不是数据为止。 在示例中,这两个变量通常在loop()循环中本地声明,因为缓冲区大小会自动更新,因此在这里我们将在每个循环的开始简单地重复分配所需的值。

setup :

 void setup() { delay (500); //    pinMode(16,INPUT_PULLUP); //   vw_setup(1200); //   VirtualWire vw_set_rx_pin(17); //A3   VirtualWire . . . . . 

, - , t_time, . (, 48 — ), , - :

 void loop() { vw_rx_start(); //   buflen = VW_MAX_MESSAGE_LEN; //     if ((int(millis()) - t_time) > 48000) // t_time    48  { <   > }//end    if (vw_have_message()) { //  if (vw_get_message(buf, &buflen)) //    { vw_rx_stop(); //    t_time = millis(); // t_time for (byte i=0;i<3;i++) //     str[i]= buf[i]; str[3]='\0'; if((str[0]=='D')&&(str[1]=='A')&&(str[2]=='T')) { //  // : for (byte i=3;i<7;i++) //     str[i-11]= buf[i]; //     volt=atoi(str); //    volt=(volt/10)-100; //   4-  batt=float(volt)/55.5; //       //      for (byte i=7;i<11;i++) //     str[i-15]= buf[i]; //     int w_Dir=atoi(str); //    w_Dir=(w_Dir-1000)/10; //    wDir=lowByte(w_Dir); //  -   <      case> . . . . . 

55.5 — , .

, : , . , . , - — , («», «», «», «», «» ..), . , .

, , :

 . . . . . for (byte i=19;i<23;i++) //     str[i-19]= buf[i]; //     int wFrq=atoi(str); //    wFrq = (wFrq-1000)/10; //   4-  wFrq=10+0.5*wFrq;//      <    > }//end if str=DAT }//end vw_get_message } //end vw_have_message(); . . . . . 

10+0.5*wFrq — . 10 / ( 1.0 ) , 0,5 — ( /). 10 /, , 1 /, . . — , - V F: V = V + K×F , , V ( ).

, , . , — . 1 — , ( ) - :

 . . . . . if (digitalRead(16)==LOW){ //  <   ,   -> }//  delay(500); }// loop 

, , , , . , , , 10 , , .

. SHT-75 — , « » ( ).

.

SHT-75 -: , . ATmega328 , , . , 20-130 ( ) SHT-75 , , .

SHT-75 , , 433 . 4- .

DHT-22 — , , (, , DHT-11, , ). DHT-22 ( SHT-75 !), SHT-75. .

, DHT-22 — . , . , , , ( ) , RST Oregon , ( ) - .

, — (MEMS) BMP180 . LPS331AP : , I2C-. , , — 10-12 1 .. . ( ) , .

— , . , .

UPD 30.06.17. . :


电瓶
+ 2,5 . .
, . 3 ( ), :
«3 24 6 = 12
3 24 3 = 24 »
暂无评论。
. , .

UPD 13.09.18. . — , 16 ( ), , . . 8 ( ).
(, , , ). ( , , ). , . , - , , , . , : , , .

UPD 05.06.19.
( ). - - . , . . , 3 . 70-80 ., - . 3 , D=2 . , , .
( ). , , 0,3-0,5 /. ( ) 0,3 /, , , .

, .

Source: https://habr.com/ru/post/zh-CN404385/


All Articles