使用基于MELT产品的LCD显示器的经验

这篇文章致力于一个激动人心的冒险任务,一年半前,我在为本文中介绍的气象站创建更新的外部传感器的过程中必须经历。 根据以前版本的操作经验,我确实希望创建一个带有控制显示的传感器,以便可以定期检查(并验证)站点中最易变的组件-风速传感器。 当我开始为此选择显示器时,冒险就开始了。出于多种原因,我进一步选择了本地MELT的产品。 但是在我继续描述非传统性方式的技术来应对我选择的这家公司的产品之前,有必要简要介绍一下我开始进行的所有宏伟现代化的主要原因。

在对该文章的评论中,我正确地指出了传感器的设计,即此类设备的轴应具有坚固的尖端,并置于同样坚固的基座上(请记住,“一块石头上有一块手表”)。 当然,我知道这一点,但后来我想不出一种方法来为光轴提供足够硬度的尖点,因此,相反,我采取了将黄铜(用于风向标)或硬脑膜(用于速度传感器)的尖端浸入软PTFE中的方法来最大程度地减少摩擦(参见指定文章中的.Draftsman)。 完全理解,这一决定是暂时的,短暂的,在不久的将来,有必要提出更实质性的建议。

然而,过去两个赛季的运行结果表明,这种解决方案非常适用于风向标,当然,风向标将氟塑料基底锯成黄铜轴,但这丝毫没有伤到他-在那里不需要最小的摩擦,反之亦然。 速度传感器的情况更糟,在该传感器中,不仅在底部锯了氟塑料,而且从软硬质硬铝去除了两毫米长的尖端。 结果,首先,起动的阈值被不可接受地增加,并且传感器必须现代化。 风速仪本身也经历了现代化,因为激光光盘是在阳光下分层制成的,并具有不整洁的外观(我之前也不知道光盘由两层组成)。

我希望在至少运行了一点之后,稍后再告诉您有关新传感器的更多信息,并且您可以确保不必立即修改任何内容(即,不早于夏季开始)。 现在,仅介绍有关测量电路变化的一些细节,因为它们与本文的主要主题有关。

关于传感器测量电路


与降低启动阈值有关,出现了一个问题,即测量来自速度传感器的低频需要花费大量时间(有关详细信息,请参见有关测量低频的方法的此出版物 )。 为了不限制人为启动的阈值,在这种情况下,我们应该测量从1-2赫兹开始的频率:考虑到传感器在一个圆上有16个孔(请参阅原始文章中的传感器照片),这大约相当于8-16圈一圈秒,明显低于任何启动阈值。 也就是说,等待下一个频率脉冲到来的超时时间至少应为1 s(请参见有关测量方法的指示文章),这从节能方面讲是有意义的:为了获得可接受的更新时间,同时设法对数据进行平均以避免在显示屏上出现抖动,我们必须每两秒钟唤醒一次控制器。 而且,如果其中一半会花时间等待脉冲,那么就不会节省能量-考虑到传感器的发光二极管一直都在工作,消耗了大约20 mA的电流。

括号中的一些细节
我在括号中指出,与此问题相关的是,我立即想起了八十年代初期甚至在各种控制器出现之前在我们设计局设计的当前电表。 在其中实现了真正的矢量平均:即,所有读数的记录都由速度传感器本身的转盘发出的信号来计时-类似于外部中断唤醒的模拟信号。 换句话说,如果没有电流,那么就不会进行记录,并且电路什么也不会消耗,只有实时时钟起作用。 以零浮力的叶轮形式制成的转盘启动的门槛是2-3厘米/秒,而仪表通过转动整个身体来指示方向。 德克在水中,密度是空气的700倍! 在总计数小时的平均时间内,这种风车至少会翻转一次,因为那里几乎没有空的测量值。 如前所述 ,对于气象站来说,数学上正确的平均方法是不合适的,因为在没有风的情况下它应该显示真实的东西。 因此,在这里我们不能没有人为限制的超时等待来自传感器的脉冲。

可以从两个方面对控制器的唤醒进行复杂的控制:通常是来自速度传感器的外部中断(也就是说,在等待来自传感器的脉冲时,控制器也进入省电模式),并且在无风的情况下,它被看门狗强制执行。 仅当将读取速度传感器的原理从光学电路更改为能耗较低的电路时(这仍然需要寻找-例如,霍尔传感器消耗5-10 mA的电流,这基本上比光学设计少),这才有意义。 但是由于我的传感器现在由太阳能电池供电,因此一切都得到了简化,这使我可以简单地放弃省电模式。

为了记录时钟,我没有打扰计时器或计数Arduino millis(),而只是在计时器555上设置了约1.5秒的原始外部频率发生器:


我们记得,传感器电路使用DIP封装中的“裸机” Atmega328控制器,该控制器通过Uno编程并安装在插座上; Arduino本身仅用于原型设计。 发生器输出连接到INT0中断引脚,微电路的引脚4(Uno板的引脚D2)。 正差中断(RISING)设置一个特定标志,根据该标志在主循环中进行下一个读数。 传感器的频率也可以通过中断方法进行测量(传感器的输出连接到INT1中断输入引脚4(D3),请参见同一篇文章的最后一种方法),因为最大的总等待时间是被测频率周期的两倍。 因此,如果超时时间为1秒,则最小测量频率为2 Hz(风速计在8秒内旋转一圈)。 在每个第四个周期中,将进行平均并将完成的数据发送到主模块,即,大约每6秒更新一次读数。

将整个故事与更新的传感器进行校准,并定期检查以查看摩擦是否增加,并将读数与手动风速计进行比较。 因此,当读数显示在一个地方(在房子里)并且外部传感器安装在一个完全不同的地方(花园凉亭上)时,非常不便。 出现了在传感器外壳中安装控制LCD的问题。 由于此处不需要美感,因此对它的信息要求很小:单行10个字符的显示就足够了。 但是几何要求非常严格:显示器必须适合现有情况下的宽度70毫米。 我必须说,由于我自然不喜欢LCD显示器(昏暗,对比度低,带有小写字母,令人反感的背光质量,并且稍后还会消耗很多),因此我几乎不知道零售范围。 因此,立即变得很明显,我需要在销售中大量搜索需要的显示器:标准的16x2 LCD显示器在商店中占主导地位,具有80 mm的板子,无法容纳在我的传感器中,所有其他类型的显示器甚至更大,无论从公司。 当然,自然界中的品种较小,但自然界中则较小,而不是国内零售。

解决方案:噢,融化!


最后,我一次发现了两个MELT,非常适合我的任务。 其中第一个是带有控制器的单行10字符MT-10S1,根据制造商的说法,“ 类似于日立的HD44780和三星的KS0066 ”。 它具有相当大的字符:高度超过8毫米,这实际上是更大尺寸的中文显示器的特征。 电路板的宽度为66毫米,投影屏(外部)的尺寸为62x19.5。 在这种情况下的消耗不会给我带来太大的麻烦(因为外部传感器由明显比所需功率更大的太阳能电池供电),但出于习惯,我看一下数据表中的一行,发现它也比平时小-0.7 mA(所有普通LCD) HD44780的模拟显示器上消耗的电流为1.2 mA及更高)。 像所有这些类型通常一样,堆上仍然有背光–相当差,同时消耗大量能量。



MT-10T7的第二个显示屏更加令人惊叹:完全相同的尺寸可容纳10个七段数字,高度高达13毫米。 一些怀疑是由非标准的,显然是一个自制的接口引起的(对于该接口,甚至在数据手册中也给出了用语言伪代码编程的示例)。 显示屏不包含实际控制器:有一组由组合逻辑控制的静态闩锁触发器。 但是由于这样的简单性,整个设计仅消耗30μA的电流,也就是说,它非常适合全天候使用电池供电的设备(传统显示器的功耗为1.4 mA,MT-10S1的功耗甚至为0.7 mA,远高于此类显示器所允许的功耗)。值的应用-自己计算出这种显示器能工作多长时间,即使不考虑设备的其余组件(例如,使用AAA电池(约1500 mAh))也是如此。



简而言之,给两个!

MT-10T7


数据表(在Arduino和纯汇编程序中)中描述的独立重现MT-10T7算法的尝试并未取得成功。 做错了事,我不明白,因为我遇到了这个出版物 ,作者(eshkinkot)举了一个写得很好并且执行得很好的示例来处理MT-10T7,此后一切立即生效。 如果有人感兴趣,那么这里是 eshkinkot 修改示例,并以在七位数字指示符上有效的所有有意义的符号作为补充,其中包括与数字不匹配的字母:






在这些图片中,通过将分频器设置为输出Vo-18 kOhm(至功率):10 kOhm(至地面),屏幕对比度会稍微失真,尽管没有它,“默认”对比度是可以接受的。

然后,我在指示的示例中添加了一个函数,该函数可在显示器上的三到四个小数位内显示任意数字-正或负,整数或浮点数,即字符总数可以达到五个:例如“ -12.7”。 由于七段代码中的点没有占据单独的熟悉度,因此要显示的最大位数为4。此函数的输入参数为:a)包含数字的ACSII表示的数组(char buf [5]),b)其中的实际字符数(ii从1到5)和c)放置数字的第一个(左)符号的位置(从0到9的位置)(有关沿途使用的功能和表示法,请参见eshkinkot所指示的出版物,或在示例中通过引用参见):

功能码
void writeASCIIdig_serial(char buf[5], byte ii, byte pos) //      { boolean dot; //     //  ,   pos: pos=pos+(4-ii); //  ,    : for (byte i=0; i <= ii; i++) if (buf[i]=='.') pos++; // : for (byte i=0; i <= ii; i++){ // .  ,    : if (buf[i+1]=='.') dot=true; else dot=false; switch (buf[i]) { //decoder ASCII -> 7-  case '0': writeSymbol(pos, DIGIT_ZERO, dot); break; case '1': writeSymbol(pos, DIGIT_ONE, dot); break; case '2': writeSymbol(pos, DIGIT_TWO, dot); break; case '3': writeSymbol(pos, DIGIT_THREE, dot); break; case '4': writeSymbol(pos, DIGIT_FOUR, dot); break; case '5': writeSymbol(pos, DIGIT_FIVE, dot); break; case '6': writeSymbol(pos, DIGIT_SIX, dot); break; case '7': writeSymbol(pos, DIGIT_SEVEN, dot); break; case '8': writeSymbol(pos, DIGIT_EIGHT, dot); break; case '9': writeSymbol(pos, DIGIT_NINE, dot); break; case '-': writeSymbol(pos, SYMBOL_MINUS, dot); break; } //end decoder if (buf[i]!='.') pos++; //  ,  +1  }//end for i } 


用于控制数值输出的MT-10T7模块比普通的行矩阵显示更为方便:它具有大的数字,并且小数点不需单独熟悉,因此,您可以在同一位置再容纳一个字符。 但是出于我的目的,如果有可能输出字母(否则方向将必须以罗盘度数显示,这有点不寻常)会更方便。 因此,对于这种情况,我把目光投向了尺寸相同的单行矩阵MT-10S1,尽管存在许多缺点,但仍转移到了最终设计中。 同时,他已经有了MT-10T7缺少的背光灯(为此必须立即购买MT-10T8),我决定在这种情况下它的存在不会造成伤害。

MT-10S1


MT-10S1显示屏的字母小了一半半,但尺寸还不错。 此外,他的屏幕在尺寸上十分经济:没有10位输入对应项,但在Winstar WH1601L(字符高度甚至更短的地方)中,整毫米距离板子和屏幕的总长度不止一个符号。 好吧,控制器的消耗几乎减少了一半(与相同的WH1601L相比)。 实际上,优势到此为止,然后开始“特征”。

如前所述,该模块具有与日立HD44780兼容的控制器。 也就是说,他应该在没有过度压力的情况下与他心爱的液晶一起工作。 而且,“默认”编码页面与HD44780及其许多类似物的英西里尔语页面一致,也就是说,MT-10S1可以与Liquid Rus一起使用而没有任何问题,无需任何代码页即可进行切换。 他确实做到了所有这一切,但有细微差别。

第一个警告-在单行版本中,开发人员显然保存在寄存器中,每个寄存器的内存中只有一个字符串的8个字符(地址00h-07h)(其余两个字符已经在另一个寄存器中(40h-41h))。 也就是说,事实上的显示是两行,实际上两行实际上都位于一行中。 仔细检查后发现,WH1601也是如此(只有第二个寄存器为全8位)。 为何如此不方便这样做是完全不清楚的,在普通的16x2显示寄存器中只有16位,并且这种截断几乎不会使产品更便宜,相反,由于需要生产不同版本的控制器(如果它们不同,我不确定)。 我以为它与MT-10S1的消耗量比平时少,但是同一WH1601的消耗量为1.2-1.4 mA,也就是说,它与高级同类产品没有什么不同。

好吧,似乎还可以-在Liquid Rus中,找到了setDRAMModel()函数和相应的常数LCD_DRAM_WH1601。 对于这种模式,库具有明显的地址转换:

 if (ac>7 && ac<0x14) command(LCD_SETDDRAMADDR | (0x40+ac-8)); 

但是我不知道它如何在其他单行显示器上工作,并且MT-10S1完全拒绝在此模式下工作-屏幕仍然只是空白。 由于我们正在讨论寻址问题,因此您将无法在库顶部使用简单的自编写功能来解决此问题,但我没有在库中四处寻找问题的原因-我已经有超过六种经过液晶校正的选项,我不想生产它们,并且进一步。

MT-10S1显示必须声明为两行:lcd.begin(16,2); (而不是16,您可以替换10或12,因为一行中的实际字符数仍然是8,所以不会有任何变化)。 尝试将其初始化为单行(第二个位置为1)将导致失败-背景会变黑。 多位数字只能在8个字符内显示,对于更长的行,超过8个的极端字符将消失。 因此,9和10个字符要么仅适合显示辅助数量(例如,计量单位),要么需要将行号分成单独的数字,并且当超出第8个字符时,将光标位置更改为第二行的第一个字符。

对于患者您可以在此处下载此显示的试验草图(引线连接-在草图文本中或在下图中)。 顺便说一下,此处的对比度(在工厂数据集中没有单词,并且Vo输出被指定为NC)在此处按常规方式进行了调整,但您实际上并不需要这样做:在没有背光的情况下,背景似乎有点暗,但是当您尝试通过将分频器连接到Vo输出来使其变亮时打开背光灯时,对比度明显下降。

与控制器接口


在检查完所有功能后,就出现了有关如何将所有这些连接到传感器控制器的问题。 当然,传感器控制器尚无足够的免费结论来提供控制权,但我并不是真的想用大型控制器来围堵城市-当系统的结构为模块化且显示屏不干扰早先已调试的基本算法时,这样做会更加方便。 仍然可以使用任何串行接口。

这乞求基于PCF8574(或其许多类似物)的I 2 C解决方案,特别是因为该芯片本身只是一个欺骗性的移位寄存器,因此在工作期间消耗数十μA的电流,而在静止状态下消耗的电流小于10μA。 它们与MT-10T7组成了极佳的配对,可用于创建带有指示器的低功耗设备,而MELT甚至可以为这种情况提供现成的选择: MT-10T11的总功耗为30μA。

但是对于MT-10S1并没有这样方便的解决方案-出于某种原因,仅提供20x4配置的版本,并在MELT线路显示器中以PCF8574的类似形式提供了附加功能( UPD:在注释中,他们建议也有16x4的MT-16S2H配置具有相同的接口,尽管,他的尺寸超出了我所需的尺寸)。 由于MT-10S1显示器的第二个令人不愉快的特点是其非标准的引脚排列,因此在这种情况下, 本文所述类型的成品模块不方便使用。 结论是相同的(尽管如此,HD44780更确切地说是其国内的同类产品KB1013VG6),但是它们的位置完全不符合标准。 为了感兴趣,我检查了进口的16x1和MELT两行/四行产品-它们都具有标准的输出顺序,而MT-10S1由于某种原因在此背景下脱颖而出。 因此,您必须自行做出决定。

结果,我简单地将相同的ATmega328控制器放到显示器上,以相同的方式通过UNO进行编程,然后将其插入单独的板上的插槽中,该板上仅配备了启动所需的附件:带导体的石英,电源和RC电路重置输出(请参阅原始文章中的传感器电路,其中控制器以类似方式连接)。

谈到重置链
顺便说一下,关于复位电路:我在几个kOhms的电阻上有一个小至1μF的电容器,也就是说,接通电源时的延迟时间为几毫秒。 几根 该手册告诉我们,就整个Mega系列而言,这里根本不需要外部链,应该由内部电路来进行正确的启动,而且速度要快得多。 但是从我早已被遗忘的AVR Classic系列产品开始,我就一直习惯在控制器的引脚1上放置外部RC链以延迟启动,这种情况从已经被人们遗忘的AVR Classic系列开始就一直存在。在这种情况下,如果电源电压的增加速度不够快,控制器可能无法正确启动。 在Mega掉电检测器系列中,它可能无法很好地工作。 在紧急情况下,仍然值得安装外部电源监控器,但是在这里RC链不会造成任何伤害,但是在电源故障的情况下可以提供帮助。 顺便说一句,Arduino板的开发人员对此很清楚,因为例如在Uno板上有相同的10 kOhm / 100 nF链。

而且,上帝本人下令通过常规的串行接口将两个相同的AVR控制器对接,该串行接口除了编程过程外,在该项目的其他任何地方都没有使用,并且已经可以使用。 顺便说一下,在没有MT-10T11的情况下,这种解决方案的价格与基于PCF8574的组件的价格没有区别,并且可以在节能方面与MT-10T7的变体竞争。

总的来说,带有控制器的MT-10S1模块的电路如下(在图中,在Arduino开发板结论之后的括号中给出了ATmega328结论的名称):



在控制器中,我应用了省电模式(是的,是的,在这里确实不是必需的,但是为什么将芯片一直保持不必要的状态?)。 此外,唤醒是在来自555芯片上与主控制器时钟相同的方波发生器的信号上发生的,只是这次是在下降沿(FALLING),以便将测量和数据传输功能稍微分开。

大自然的奥秘
与自然有关的一个谜团,我无法解决。 众所周知,Mega只能通过外部异步中断退出深度睡眠,因为时钟已关闭并且同步中断无法发生。 因此,整个28针AVR控制器家族都来自ATmega8(48/88/168/328),因此只有低级中断INT0和INT1(以及PCINT中断,但在Arduino中不使用)。 在Atmel材料和Arduino网站上,所有官方建议都与此相关。 arduino.cc网站上的示例明确指出:“ 除了IDLE睡眠模式以外,所有其他模式都只能使用LOW 。” 毫无疑问,例如,Monk 在他的书中更详细地重复了同一件事:“ 请注意,选择了LOW中断类型。 这是此示例中可以使用的唯一中断类型。 RISING,FALLING和CHANGE类型将不起作用 。”

低电平中断非常不方便使用,因为一旦发生中断,输出处于最低电平,就会一次又一次地发生中断,必须采取特殊措施来消除不必要的触发。 因此,在论坛上四处寻找解决这个问题的各种方法时,我突然遇到了两个代码示例,其中明确使用RISING或FALLING类型的INT0入睡。 当然,我将其归因于作者的文盲。 但是,当偶然发现以下短语时:“ 尽管您可以使用任何其他类型的中断(RISING,FALLING,CHANGE)-它们都会使处理器退出睡眠状态 ”,但我还是决定尽管有敌人,但还是要进行现场实验,这样做很有益用手。

而且,令我惊讶的是,一切正常。 省电模式-SLEEP_MODE_PWR_DOWN; 由于无用,在这里我没有采取措施通过禁用所有其他功能来进一步降低功耗,但是时钟发生器仍然关闭。 但是,控制器会在下降沿定期唤醒,请求数据,将其显示在显示屏上,然后再次进入睡眠状态。 为了保证实验的纯洁性,我从UNO板上卸下了MK,然后将其与连接的石英一起插入我的插座中,然后一切仍然可以正常工作。 从功耗上可以看出:正常模式下几乎为17 mA,打开省电模式时为0.9-1 mA(其中0.7 mA应归因于显示屏)。

毫不奇怪,我阅读了Atmel的数据表,浏览了Evstifeev的书(及其翻译),甚至看了Atmel关于Classic系列的旧手册,然后花了半天的时间至少对发生的事情进行了一些解释(俄语和俄语)。 (英文))在两个著名的搜索引擎中,但是哪怕找不到提示。 除非它在Atmel的《应用笔记》中有用,否则它在那里是否发布了与数据表相反的内容令人怀疑。如果知道的人知道我的误解,我将非常高兴。
UPD:实时汇编程序检查(ATmega8)显示完全符合数据手册,即,仅电平中断有效。 想到的唯一解释是,Arduino以某种方式将PCINT中断连接到常规中断。 通过研究Arduino系统库的文本来澄清这种情况的尝试没有产生任何效果-魔鬼会摔断他的腿。

通过UART从传感器控制器到显示控制器的数据传输以对话框的形式进行组织。 醒来后,每第4次中断,显示控制器就会依次请求数据:

 . . . . . if (flag==1) { //   4-  ~6  Serial.print('T'); //   while(!Serial.available()); //  T iit = Serial.readBytes(buft,5); //  5  , //  ii    Serial.print('H'); //   while(!Serial.available()); //  iihh=Serial.readBytes(bufhh,5); //  5  , //  ii    Serial.print('S'); //   while(!Serial.available()); //  iiss=Serial.readBytes(bufss,5); //  5  , //  ii    Serial.print('D'); //   while(!Serial.available()); //  iid=Serial.readBytes(bufd,5); //  5  , //  ii    flag=0; //   } . . . . . 

这里buft,bufhh,bufss和bufd是数组(不是字符串!),由五个字节组成,以相应数字的ASCII分解形式包含温度,湿度,速度和方向数据。 为了不接受太多,setup'e指定了接收的缩写超时:

 . . . . . Serial.begin(9600); Serial.setTimeout(10); //   10  . . . . . 

显示起来更方便:首先,您立即获得了接收到的号码的长度;其次,Serial.print()函数从传感器控制器的侧面发送了ASCII字符串,并且在发送之间的10毫秒内设置了暂停时间:

 . . . . . //     : if (Serial.available()>0) //  { char ch=Serial.read(); if (ch=='T') { Serial.print(temperature,1); delay(10);} if (ch=='H') { Serial.print(humidity,0); delay(10);} if (ch=='S') { float wFrq=(3+0.8*f)/10; //   / if (wFrq>0.3) Serial.print(wFrq,1); else Serial.print(0.0,1); delay(10);} if (ch=='D') { // Serial.println(wind_G); Serial.println(wind_Avr); delay(10); }//end ch }//end serial . . . . . 

此处以m / s为单位的速度计算与工作站主模块中的速度计算相同(起始阈值随机设置为0.3 m / s),并且还必须根据校准结果进行更改。

如果您尝试使用通常的Serial.read()接受数据,然后在具有lcd.print(t,1)之类的函数的显示器上显示接收结果,其中t是以度为单位的温度,例如等于12.7,则MT-10S1会对此做出响应该命令将输出“ 49.5”。 猜了,还是建议? 这是序列“ 49 50 46 55”中的前三个字符,即数字“ 12.7”的ASCII扩展。 因此,更容易立即接受一个字符数组并直接显示已发送的尽可能多的字符(count是一个在每次中断时增加一个的计数器):

 . . . . if (count%8==0){ // 8   lcd.clear(); if (buft[0]!='-') lcd.print("+"); for (byte i = 0; i < iit; i++) lcd.print(buft[i]); //  lcd.setCursor(6, 0); for (byte i = 0; i < iihh; i++) lcd.print(bufhh[i]); //  lcd.setCursor(0, 1); lcd.print("%"); } if ((count+4)%8==0){ //  4  lcd.clear(); lcd.setCursor(0, 0); for (byte i = 0; i < iiss; i++) lcd.print(bufss[i]); //  lcd.setCursor(5, 0); dir_dd(bufd); //  } . . . . . 

最后一行需要解密。 事实是方向数据是以0-15码发送的(在实现矢量平均时仍会从格雷码传输到该方向数据)。 对于七段显示器MT-10T7,它们被转换为罗盘度:

 . . . . . dd=atoi(bufd); //   dd=dd*22.5; //   itoa(dd,bufd,10); //    . . . . . 

在这里,我们可以直接用俄语字母书写,就像在气象站的主要模块中一样(实际上是因为选择了该显示):

 . . . . . void dir_dd(char dd[]) {switch(atoi(dd)) { case 0: {lcd.print(""); break;} case 1: {lcd.print("C"); break;} case 2: {lcd.print("C"); break;} case 3: {lcd.print("C"); break;} case 4: {lcd.print(""); break;} case 5: {lcd.print(""); break;} case 6: {lcd.print(""); break;} case 7: {lcd.print(""); break;} case 8: {lcd.print(""); break;} case 9: {lcd.print(""); break;} case 10: {lcd.print(""); break;} case 11: {lcd.print(""); break;} case 12: {lcd.print(""); break;} case 13: {lcd.print("C"); break;} case 14: {lcd.print("C"); break;} case 15: {lcd.print("C"); break;} }//end switch }//end dir . . . . . 

外表


图为连接的控制器在工作状态下的显示屏外观:



修改后的传感器组件如下所示:



背光参数是上图中指示的参数。 由于使用12 V电源时,MELT模块中背光灯两端的电压降为4.5 V,因此背光灯电流为50 mA(此模块的最大值为60 mA)。

外壳已进行最大程度的密封,以避免内部进入潮湿的空气(显示屏的黑框来自细电缆的橡胶护套)。 右边的白板是SHT-75湿度温度传感器的外壳,从外壳中取出(传感器本身位于其后方)。 上面的黄线是433 MHz发射机天线。 左侧是连接速度和方向传感器的连接器。

这就是气象站主模块显示屏上的读数的样子(右侧带有白色天线的黑色模块是433 MHz接收器):

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


All Articles