1896
气象站:从概念到实现
看了很多关于您的设备的开发文章,并希望谈论他们的经历。这件事发生在几年前,在4个年头单向的。现在,我会做很多不同的,但当时我刚刚开始学习电子,它是 - 我的第一个设备,所以无法判断严格。
我一直想要的东西多窗口或温度在大街上和房间里的液晶屏气象站外的普通温度计。所以,当我开始思考,以便开始发现微控制器的世界“做了什么”,答案发现了自己 - 一个气象站。自然,外部和室,湿度和压力的内部显示度。并与光 - 我一直喜欢的天气预测,Yandex的实施 - 一看后台有足够的了解,这将是温暖或寒冷,以及如何
所有其他的功能已经定义了一个有点头脑风暴。背光源的存在绝对是一个加号,但对于在夜间和黄昏?我决定安装红外线传感器,其反应的方法。在该方法的仪器在一个舒适的距离点亮,在其它时间的默认屏幕是关闭的。利用红外推到也实现控制单元上的红外通道 - 通过控制台(最初有大约干扰的担忧,但他们还没有得到证实)。它是天然的用于这种设备的可用性小时。
作为该系统的基础上被选择的Arduino,我刚刚开始学习。 Arduino的本身我现在(再)考虑为框架 - 主要软件,使您可以快速构建在必要的插件库连接必要的系统。是的,我们可以用纯C / C ++写的,但大多数普通的任务,它给了只有轻微的性能提升,对简单和易于装载草图的Arduino的背景下几乎看不见,以及与各种腺体的工作是广泛收集库。 (当然,也有特殊的挑战,但现在它不是关于他们的)。
在硬件实现中的相同,我更喜欢只在原型的,以“maketke”的阶段使用蓝色Arduino板,并且在器件的发展的末端通常设计一个单独的板与微控制器和一切。所以这是在那个时候。
元器件的选用我开始屏幕。很快发现了一个奇妙的显示屏,RGB背光 www.adafruit.com/products/398 ,这使得获取几乎任何颜色。它是建立在流行的HD44780芯片,并支持数量庞大的图书馆,包括LiquidCrystal在Arduino的。
我也询问了各个生产显示器的价格。最低价格为单色液晶复印件1份(如在一个典型的气象站)的价格当时是欧元1 000的订单,非商业项目中的一个副本我发现了一个价格标签是不切实际的。
作为一个红外传感器被选为夏普GP2Y0A02YK0F 。于我而言重要的特点是设施的检测范围,该传感器是等于1.5米,而许多其他传感器不超过30厘米,如图所示本身的开发,为小屏幕16×2米半。 - 真正的最佳距离<溴/>
作为该压力传感器被选为<一href="http://www.bosch-sensortec.com/en/homepage/products_3/environmental_sensors_1/bmp085_1/bmp085">Bosch BMP085 ,致力于 I2C ,湿度HH10D - 频率输出。我会告诉你,现在我在任何情况下都不能使用了后者,并希望I2C-唯一的选择,这样的HTU21D。
当外部温度传感器用于所有您最喜爱的 DS18B20 。其最大的优点是连接(断开连接和必要时)1总线的多个传感器,无需更改代码的能力。随着温度的数据我在我的第一个项目无线传输,我没有沟通,我有机会奠定电线不影响美观的多。
红外接收器拍摄最典型的如TSOP382。远程气象站遥控器是从一些DVR的。蜂鸣器(其藏有的细小发声) - 最常见的压电蜂鸣器
。
作为一个实时时钟,我选择 DS1307 ,也正在I2C,而且,我有一个小小的芯片闪存24AA256 64 KB,带有I2C接口。我把它添加到项目纯粹出于好奇 - 尝试与外部存储器的工作,写数据到它的天气条件。功率的项目 - 在外部,从电源。在入口站转换器/电压 LM7805 时,电源节点本身是非常相似的,在Arduino的使用(虽然不是克隆)。
我迭代开发,所以更易于调试,迎接新的领域。在第一阶段,用温度计DS18B20读出的数据,并显示在液晶屏上。接下来 - 温度值转换为RGB码为照明
。
在这里,我躺着等颜色特征。看似挺正常的24位彩色 - 使用脉冲宽度调制每三个LED灯(使用标准库),用256步骤进行色彩管理画面。不幸的是,波长颜色的R,G和显示器B和LED灯有很大的不同,正因为如此,平常的颜色,如#FFFF00,对我的液晶屏的背景下变得面目全非(“搁置”)。所以我不得不用三个滑块和颜色picker'om广播以串行的Arduino三个颜色分量编写C#程序。然后不得不记住数学的基础知识,并创建一个函数,转换摄氏度的温度在RGB色的规模。当然,我不再局限于黄蓝Yandex的规模,并用其他的颜色 - 他们协会的基础上
。
下一步是连接红外测距仪,温度和湿度传感器。如果前两个没有任何困难(除焊接BMP085在LCC8情况下),那么湿度传感器会带来很多问题。
的事情是,在相对湿度的合计值用的配方,所构成的输出方波传感器的频率的一个参数被计算出来。使用硬件定时器单片机进行频率测量。在328,遗憾的是,这些定时器只有三个,其中大部分已经参与在智美来照亮显示器。 (现在我不记得所有的细节,也许错过了一些东西)。
在这种情况下,有几个出口。如果我今天开发的设备,我肯定会只使用I2C传感器。另一种选择是使用一个更强大的微控制器。然后我选择了第三个选项 - 安装一个单独的微控制器,声音(高音)和一个背光显示屏工作(记住,这主要是一个教育项目,我很好奇,想尝试举办两个MC之间的合作)。它也通过温度的转换函数中的颜色,使它更容易为主要固件的MK几千字节(Atmega328在该程序的存储器大小仅32Kb的,我的固件最终接近此上限)。在MC之间的相互作用仍然组织了I2C。
此后,加入控制,时钟,快闪存储器。下一步是编写一个用户友好的菜单,增加了软件功能(如阻塞背光在当前状态下,大量的制度 - 在街上的时钟,滚动的所有参数),多个温度传感器与他们的添加/删除支持在线(是的,我知道这是最好不要做)。这是很平常的事情了PC - 和不寻常的一开始你收集设备时,没有模式更改数次提高了项目的功能...
远程使用它的一些专有协议。我没有进行逆向工程,我是每个按钮的很够十六进制表示,我从图书馆IRRemote好评。对于闪速存储器予选来记录的天气数据,每10分钟,在此记录的长度为16字节就足够了4个月。
负责与快闪记忆体工作的代码 B> LOGGER.h
&LT;代码级=&QUOT; CPP&QUOT;&GT; #ifndef的LOGGER_h的#define LOGGER_h的#include&LT; WProgram.h&GT;类记录器{市民:记录器(INT);无效storeRecord16(BYTE *缓冲区);无效getRecord16(unsigned int的地址,字节*缓冲区); INT的getAddress();无效setAddress(INT);私人:INT _FlashI2CAddress;无效_getAddress();无效_setAddress(); unsigned int类型_addr; }; #ENDIF&LT; /码&GT; PRE> LOGGER.cpp
&LT;代码级=&QUOT; CPP&QUOT;&GT;&#包括LT; WProgram.h&GT; &#包括LT; Wire.h&GT; #包括&QUOT; LOGGER.h&QUOT; / *存储器映射:0000 - MSB最后一份书面报告0001 - LSB最后一份书面报告... 0040 - 7FFF - 存储,* /记录器::记录器(INT A){_FlashI2CAddress =一; }虚空记录仪:: storeRecord16(BYTE *缓冲区){字节℃; //获取地址记录仪:: _的getAddress(); //增加地址的延迟(5); _addr + = 16;如果(_addr&GT; 0x7FF0)_addr = 64; //存储缓冲器Wire.beginTransmission(_FlashI2CAddress); Wire.send((字节)(_addr&GT;&GT; 8)及为0xFF); // MSB Wire.send((字节)(_addr&安培;为0xFF)); //为LSB(C = 0; C&LT; 16; C ++)Wire.send(缓冲[C]); Wire.endTransmission();延迟(20); //保存新的地址记录仪:: _ setAddress(); }虚空记录仪:: getRecord16(无符号整数的地址,字节*缓冲区){字节℃; //设置地址Wire.beginTransmission(_FlashI2CAddress); Wire.send((字节)(地址&gt;&GT; 8)及为0xFF); // MSB Wire.send((字节)(地址:安培;为0xFF)); // LSB Wire.endTransmission(); Wire.requestFrom(_FlashI2CAddress,16);为(C = 0; C&LT; 16; C ++),如果(Wire.available())缓冲器[C] = Wire.receive(); }虚空记录仪:: _的getAddress(){字节℃; Wire.beginTransmission(_FlashI2CAddress); Wire.send(0); Wire.send(0); Wire.endTransmission(); Wire.requestFrom(_FlashI2CAddress,2);为(C = 0; C&2; C ++),如果(Wire.available())_addr = _addr * 256 + Wire.receive(); }虚空记录仪:: _ setAddress(){Wire.beginTransmission(_FlashI2CAddress); Wire.send(0); //指针Wire.send(0); //指针Wire.send((字节)(_addr&GT;&GT; 8)及为0xFF); // MSB Wire.send((字节)(_addr&安培;为0xFF)); // LSB Wire.endTransmission(); }虚空记录仪:: setAddress(INT地址){_addr =地址;记录仪:: _ setAddress(); }诚信记录仪::的getAddress(){记录仪:: _的getAddress();返回_addr; }&中尉; /码&GT; PRE>
上传从菜单气象站(有点像老菜单,诺基亚或三星,但没有图形)串行端口一个团队产生的数据。
在此之后,功能齐全的气象站曾在的Arduino开发板的形式和地方一个星期。在这段时间中,检测发现了可能的挂起(由于密封失效室外温度传感器)。我重做传感器(我今天只拿一个工厂,例如, 等)的设计,也死锁的可能性要排除原则。此外,我认为49天后连续运行的溢出功能的米利斯() B>,其中,由于特定的算法,固件也将挂起。事情必须是可靠的!因此,在最后的触摸是系统看门狗定时器的激活,最终挂任何保证不会持续超过2秒+ 5秒重启(是的,在这个数字时代,连气象站需要时间来加载。
因此,该站已准备就绪,工作顺利。我相信,住在这个阶段错误的。该设备应该是舒适的,有一个完美的外观,使他们能够享受到舒适,告诉大家,不只是老乡怪才。
我开始了一趟最近的无线电商店和住房的选择。 20-30的各种实施例予他喜欢该图在本文开头 - 因为有可能方便地固定外部壳体测距仪,以便它没有太大的良好通风突出的最小期望的改变,(因而温度在室温更精确的读数)。今天,我想我会已下令对3D打印机的打印和这里的这种风格做了一些:
(很难找到类似的图片,但我不-modelirovanii 3D的优点,屏幕坐落在展台一切的顶部)。当然,没有电线 - 433MHz的传感器和Wi-Fi连接到PC
。
经过酝酿和配件为更好地都挺开发板上的转向。在它的第一个项目,我用鹰的制度。绘制电路板的轮廓,贴在她的元件和连接(是的,这个项目我是做了“错误”的方式 - 没有概念更确切地说,没有鹰计划),轻松示踪所有离婚。由于生产...
<大段引用>哈布雷很喜欢制造印刷电路板的主题,所以在这里我会做一个撤退。抢劫我所熟悉的,但我却无心/能力,使电路板,包括与化学(氯化铁仍然事情)接触。但是,如果大学有一个小试生产,其中以非常合理的价格(〜3元sq.dm.当时)可以生产几乎任何双边PP。技术 - 光致抗蚀剂开口 - 从0.6mm的,轨道的最小宽度 - 就像0.2毫米(绝对不是大了,现在我不记得了)。不幸的是,没有阻焊层,通孔的金属化的价格不应该等待,但是这一切都解决了。最后,对于原型(和打扮准备好一两天)和小规模生产可以不戴面具来完成(恕我直言,焊接和手工的意思是大)块引用>
。 然而,当我发出的命令,然后约过孔的金属化我都没有想到的。鹰安全地使用干细胞本身,而且成本只有层之间2-3站立连接。男子引渡注意到了这一点,并麻烦提供用来在孔中的元素(即,第一通孔的顶部和底部的焊盘焊接过帐后,它已经插入自身的干细胞)的过渡最薄的导线。我试图像这样,但结果和额外的工作量并不令人鼓舞。曾在禁区的位置,靠近所有通过PTH-元素创建peretrassirovat礼服。在这里,自动跟踪器带来的工作进行到底拒绝了,我只好用手抬高链的其余部分(欲望和时间来改变系统的设计是不存在)。萨米孔最终做同样的技术,但他们的电话号码,我最小。焊接再次下令装扮得更加容易。
下一步 - 工作用钻头,一把刀和一个文件,购买了纱窗的房屋安装一定的费用。一对夜晚 - 和装置主体顺利工作。然而,缺少的东西...
和前面板(特别是在其切割通过窗户后)没有足够的粘着剂。不干胶纸 - 对于这样的任务一件伟大的事情。发生了什么事 - 封面上的照片,不审判严格:)在此之后亮相的设备已经从根本上改变...
这是发展我的第一个设备的方式如何(简单地)看着我。幕后留下了大量的代码,产生在课程目标的许多不同的小决定。最主要的,我买了自己 - 这是开发经验,完整的“颠簸”的,了解操作的原则,再加上奖金是气象站本身。独特的和独一无二的。
附:我知道很多的决定,不是最佳的,但它是感谢他们(包括),我现在认识到,最好的,什么不是:)。附加的英语和几张照片奖金的功能图,并渲染板。
功能图:
渲染,真正的无板阻焊膜。在锂电池座中未示出,压电蜂鸣器,DIN连接器(功率,与PC的通信,传感器等)以及不同的小东西。此外,在真实设备的微控制器在插座。
模式的“大数字”,从远处可读性:
资料来源: habrahabr.ru/post/223829/