亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

Arduino Barometer

组件和用品

Arduino Nano R3
× 1
Arduino UNO
在 vero 板上使用的 Atmel 328
× 1

关于这个项目

使用 Arduino UNO 和 Nano 在使用 3 个步进电机的 12" (300m) 模拟显示器上显示气压。

有现代和经典两种表盘设计可供选择。

以 hPa(百帕斯卡)为单位的气压显示在大主表盘上,每 10 分钟更新一次。

有2个二级刻度盘,一个显示最近6小时的压力变化,另一个显示最近3小时的压力变化。

3 小时表盘的分辨率提高了 0.5 hPa,因为它用于天气预报。所有三个显示屏上都有 LED 显示何时使用扩展范围,还有 LED 显示 3 小时显示屏上的天气预报。

机箱内部有两个 20x4 LCD 屏幕,显示每个微处理器的信息。

主气压显示和 6 小时显示由 RTC 控制。此时钟还为 3 小时显示提供 1 小时脉冲。

第 1 步:与传统模拟气压计的比较

大多数模拟气压计图片。 2 只是使用气压作为预测天气的指示,您必须记住设置可移动指针并注意设置时间以查看气压变化。

天气简单地写在表盘周围并从指针读取。预测要复杂一些,因为您必须使用第二个指针并记录 3 小时内的任何变化。您必须记住当前压力和上升/下降压力的组合才能获得预测。

我的气压计连续监测 3 小时和 6 小时的压力变化,并在 2 个单独的表盘上显示这些读数。

图 1 显示了我的气压计的天气预报范围。

图 3 显示了天气预报 LED 的特写。天气预报基于最近 3 小时的气压变化。

第 2 步:预测风暴的晴雨表演示

这段延时动画展示了气压计指针和预测 LED 如何对即将到来的风暴做出反应。

第 3 步:扩展范围拨号

所有三个表盘都有扩展的范围。这允许在正常天气下在表盘上显示更大的分辨率。在极端天气条件下,刻度盘会切换到扩展范围。

动画图1。显示在扩展范围运行时 LED 如何点亮。当读数为 +5 及以上时,红色 LED 会显示。然后,您将阅读红色刻度字体。当读数为 -5 及以下时,绿色 LED 显示。然后,您将阅读绿色刻度字体。如果读数超出扩展范围,例如在此刻度盘上高于 +9 或 -9,则两个 LED 都会亮起以显示这一点 - 请参阅下一节。

扩展范围内的压力读数 图 2 如果压力读数超出扩展范围 + 或 -,则两个 LED 都会亮起以警告您出现了极端读数或变化。刻度盘实际上仍会显示读数,例如,如果读数为 -10,则在 3 小时刻度盘上,刻度盘将指向 0,同时两个 LED 均亮起。如果 3 小时读数为 -11,则表盘将指向 -1,两个 LED 均亮起。你只需在读数上加 10。

在下面的动画中,3 小时压差从 0 开始,压差正在下降。在 -5 hPa 时,绿色 LED 灯亮,表示正在使用负扩展范围。压力变化不断下降,直到达到 -10hPa。这现在超出了扩展范围,因此红色 LED 也会亮起。然后压力再次下降到 -11hPa 并且两个 LED 保持点亮。压力变化开始下降到 -10 hPa,而且这仍然在扩展范围内,因此两个 LED 都保持点亮。一旦压力变化降至 -10 以下,红色 LED 将熄灭,表示再次使用扩展范围。

在检查了英国的极端天气后,我将扩展范围设置到表盘中,虽然我预计会使用 3 小时和 6 小时扩展范围,但我认为扩展范围不会用于主气压计显示器。

图 3 在 2020 年 1 月对气压计进行原型设计时,在英格兰南部,我的主气压计进入扩展范围,红色 1050 上的指针和红色高范围 LED 亮起,创下了 1050hPa 的创纪录高读数。

第 4 步:LCD 信息显示

3小时

图 1 &2 此显示屏显示 3 小时读数和 3 小时表盘上的信息。它还根据当前和过去 3 小时的读数显示天气预报。

6小时

图片。 3 &4 此显示屏显示主气压计表盘读数以及 6 小时读数。

第 5 步:预测天气

我的气压计上的天气预报使用 8 个 LED。

使用当前气压和过去 3 小时内的变化率,通过 LED 预测天气。

动画 1 显示了预测 LED 组合的各种组合。

我访问了许多天气网站,并收集了以下有关使用气压计预测天气的信息。

使用气压计预测天气

更具体地说,可以以这种方式解释以 hPa 为单位的气压计:

如果读数超过 1022 hPa

气压上升或稳定意味着天气持续晴朗。气压缓慢下降意味着天气晴朗。气压快速下降意味着多云和温暖的天气。

如果它落在 1009-1022 hPa 之间

气压上升或稳定意味着目前的状况将持续。气压缓慢下降意味着天气变化不大。气压快速下降意味着可能会下雨,如果天气足够冷,则会下雪。

如果读数低于 1009 hPa

气压上升或稳定表示天气晴朗且凉爽。气压缓慢下降表示有雨气压迅速下降表示风暴即将来临。

使用我的气压计上方的信息应用以下逻辑来预测天气。

逻辑按以下顺序应用,结果 LED 点亮。

图2 气压<1009 hPa

气压上升或稳定表示天气晴朗和凉爽

气压 <1009.00 和 3 小时变化>=0

图 3 气压 <1009 hPa

气压缓慢下降预示下雨

气压 <1009.00 和 3 小时变化 <0 和 3 小时变化>=-1.5

图 4 气压 <1009 hPa

压力迅速下降表明风暴即将来临。

气压 <1009.00 和 3 小时变化 <-1.5

图 5 气压在 1009 到 1022 hPa 之间

压力上升或稳定意味着现状将继续。

气压缓慢下降意味着天气变化不大。

气压>=1009.00 和气压 <=1022.00 和 3 小时变化>=-1.5 和 3 小时变化 <=1.5

图 6 气压在 1009 到 1022 hPa 之间

气压快速上升意味着天气转晴

气压>=1009.00 和气压 <=1022.00 和 3 小时变化> 1.5

图 7 气压在 1009 到 1022 hPa 之间

压力迅速下降意味着可能会下雨,如果足够冷,则可能会下雪。

气压>=1009.00 和气压 <=1022.00 和 3 小时变化 <-1.5

图8 1022 hPa以上气压

气压上升或稳定意味着天气干燥。

气压> 1022.00 和 3 小时变化>=0

图9 1022 hPa以上气压

气压缓慢下降意味着天气晴朗。

气压> 1022.00 和 3 小时变化 <0 和 3 小时变化>=-1.5

图10 1022 hPa以上气压

压力快速下降意味着变化

气压> 1022.00 &&3 小时变化 <-1.5

第 6 步:气压计启动

初次通电时,执行 LED 测试。

完成后,指针将进入准备校准的初始设置。

第 7 步:初始启动设置 RTC

图 1 在初次通电时,需要使用 Vero 板上的控件设置气压计。

实时时钟

图 2 RTC 需要设置为正确的时间。我将其设置为 UTC 并且不打扰更改为夏令时。在调整时间之前,请记下本例中的“Disp”值 -5。这是 6 小时针的值,稍后将在设置中使用。将“选择设置启用”开关滑动到打开位置。显示不会改变。

图3 顺时针缓慢转动“选择设置”旋钮,主液晶显示第2行会发生变化。

当显示屏显示“RTC Hour Retard”时停止 如果您想延迟 RTC 时间,请按红色的“更改设置”按钮。单击一次将使小时数倒退。多次点击将减少按下的点击次数,但需要一秒钟时间来更新 RTC。

图4 进一步转动“选择设置”旋钮将显示“RTC Hour Advance”

如果您想提前 RTC 时间,请按红色的“更改设置”按钮。单击一下即可向前推进小时数。多次点击会增加按下的点击次数,但需要一秒钟来更新 RTC。

图5 进一步转动“Select Setting”旋钮将显示“RTC Min Retard”

如果您想延迟 RTC 分钟,请按红色的“更改设置”按钮。单击一次将使分钟倒退。多次点击将减少按下的点击次数,但需要一秒钟时间来更新 RTC。

图6 进一步转动“选择设置”旋钮将显示“RTC Min Advance”

如果您想提高 RTC 分钟数,请按红色的“更改设置”按钮。单击一次将向前推进分钟。多次点击将增加按下的点击次数,但需要一秒钟时间来更新 RTC。

图7 完成RTC设置或任何其他设置后,将“Select Setting”旋钮完全逆时针旋转,直到显示屏显示“Off”

将“选择设置启用”开关滑动到关闭位置。

笔记。可以随时通过按下黑色的“重置为 30 秒”按钮将秒同步到 30 秒。现在,如果关闭电源,RTC 将记住时间。

第 8 步:初始启动设置 6 小时针

设置 6 时针

图1 RTC设置好后,需要设置气压计和6小时气压指针。

将“选择设置启用”开关滑动到打开位置。显示不会改变。

顺时针缓慢转动“选择设置”旋钮,直到显示“6Hr Baro Inch Retard”。

在第一次通电时,6 小时针需要校准到最接近的数字。

如果最近的数字在手的后面,请按红色的“更改设置”按钮。单击一下,手就会一步一步地向后移动。按住按钮将反复向后移动手。一旦手正好在一个数字上,松开按钮。

图2 如果手前最接近的数字或如果您使用上述方法使手英寸延迟太多,请顺时针转动“选择设置”旋钮,直到显示“6Hr Baro Inch Advn”。

按下红色的“更改设置”按钮。单击一下,手就会一步一步地向前移动。按住按钮会反复向前移动手。一旦手正好在一个数字上,松开按钮。

图 3 一旦 6 时针精确设置在一个数字上,时针需要设置为正确的值。

在调整 RTC 之前,您记下了这个数字 -5。

图4 如果6小时显示指针太先进。

顺时针转动“选择设置”旋钮,直到显示“6Hr Baro Retard”。按下并松开红色的“更改设置”按钮。此窗台将 6 时针向后移动 1 整个单位。当 6 小时针到达您指定的数字时停止。

图5 如果6小时显示指针迟钝。

顺时针转动“选择设置”旋钮,直到显示“6Hr Baro Advance”。按下并松开红色的“更改设置”按钮。此窗台将 6 小时针向前推进 1 个单位。当 6 小时针到达您指定的数字时停止。

图 6 注意 6 小时显示需要 8 小时才能正确显示,因为它需要在这段时间内将读数存储在内存中。

如果您需要 6 小时显示从启动开始运行,您可以在加载之前始终将先前的气压读数添加到代码中。

该代码将小时数转换为 H 数字,如上所示 H =6。在代码行 128 H6 中,将当前小时读数置于小时 6 下,将小时 7 中的前一个读数置于小时 0 之前的读数等

int hour0 =1015;

整数小时1 =1016

;int hour2 =1015;

int hour3 =1016;

整数小时4 =1016

;int hour5 =1016;

int hour6 =1012;

int hour7 =1013;

您应该可以从互联网上获取本地读数。

我从我的气象站设置了一个页面,这样我就可以在构建气压计时检查这个。

单击此链接可查看英国肯利萨里的每小时变化。

第 9 步:初始启动设置主气压计指针

设置主气压计指针

图 1 现在 6 小时显示是正确的,主气压计指针需要设置为主 LCD 上第 3 行向下的圆形海平面压力。

在第一次通电时,主气压计指针需要校准到最接近的数字。顺时针转动“选择设置”旋钮,直到显示“Baro Inch Retard”。

如果最近的数字在手的后面,请按红色的“更改设置”按钮。单击一次,手将逐步向后移动。按住按钮将反复向后移动手。一旦手正好在一个数字上,松开按钮。

图2 如果手前最接近的数字或如果您使用上述方法使手英寸延迟太多,请顺时针转动“选择设置”旋钮,直到显示“Baro Inch Advn”。

按红色的“更改设置”按钮。

单击一下,手就会一步一步地向前移动。按住按钮会反复向前移动手。当手正好在一个数字上时,松开按钮。

图3 如果主气压计指针太先进。

顺时针转动“选择设置”旋钮,直到显示“Barometer Retard”。

按下并松开红色的“更改设置”按钮。

这将使主气压计指针向后移动 1 个单位。当时针达到您指示的圆形海平面压力时停止。

图 4 如果主气压计指针与您指示的圆形海平面压力相比滞后。

顺时针转动“选择设置”旋钮,直到显示“气压计前进”。

按下并松开红色的“更改设置”按钮。

这将使主气压计指针向前移动 1 整个单位。当指针达到您指示的圆形海平面压力时停止。

第 10 步:初始启动设置 3 小时针

设置 3 小时针。

Oic.1 3 时针的调节是通过 Vero 板上的绿色、白色、蓝色和黄色四个按钮来调节的。

初次通电时,需要将 3 小时针校准到最接近的单位或半个单位。

图2 如果最接近单位值的3 小时针在3 小时针之前,请按黄色“慢速”按钮将指针向后微动。按住按钮会反复向后移动手。

如果最接近单位值的 3 小时针落后于 3 小时针,请按蓝色“慢速前进”按钮向前移动指针。按住按钮会反复向前移动手。

一旦 3 小时指针正好位于一个单位/半个单位上,3 小时 LCD 显示屏上的指针就可以设置为“D”值。

如果指针在数值“D”之前,按白色的“3Hr Step Bwd”按钮将 3 小时针向后移动半个单位。

如果指针小于“D”值,请按绿色的“3Hr Step Fwd”按钮将 3 小时指针向前移动半个单位。

请注意,3 小时显示需要 4 小时才能正确显示,因为它需要在这段时间内将读数存储在内存中。

如果您需要预测和 3 小时显示从启动开始运行,您可以在加载之前将先前的气压读数添加到代码中。

第124行3小时显示代码

浮动时间 0 是当前小时

浮动时间1是前一小时等

浮动小时0 =1036.00;

浮动小时 1 =1036.00;

浮动小时 2 =1036.00;

浮动小时3 =1036.00;

浮动小时4 =1036.00;

您应该可以从互联网上获取本地读数。

第 11 步:模块/组件

模块

该项目尽可能使用预构建模块来节省构建和设计时间。

微处理器

该项目使用 2 个微处理器,一个 Atmega 328(UNO) pic.1 和一个 Arduino Nano pic.2。我已经使用了这种组合,因为我已经从另一个项目中构建了 328,并且由于 Vero 板上的空间有限,还添加了 Nano。

电源

气压计使用大约 65mA,随着每个电机每 10 分钟到 1 小时步进几分之一秒,这会增加一点

AMS117 图3

本项目模块为3.3v,用于给BMP180模块供电。

AMS1117 系列可调和固定电压调节器旨在提供高达 1A 的输出电流并在低至 1V 的输入至输出差分电压下工作。该器件的压差保证最大为 1.3V,在负载电流较低时降低。片上微调将参考电压调整为 1.5%。电流限制的设置是为了最大限度地减少稳压器和电源电路在过载条件下的压力。本项目模块为3.3v,用于给BMP180模块供电。

LM2596 Buck DC to DC Converter 3.0-40V to 1.5-35V pic.4此模块将12v输入转换为5v

BMP180 压力传感器模块 2 关闭图 5 BMP180 Breakout 是一款带有 I2C(“Wire”)接口的气压传感器。气压传感器测量周围空气的绝对压力。该压力随天气和海拔高度而变化。根据您解读数据的方式,您可以监测天气变化、测量高度或任何其他需要准确压力读数的任务。

将 +、-、CL 和 DA 引脚连接到您的 Arduino。

CL去SCL,DA去SDA。

重要提示:仅将电源引脚(+ 和 -)连接到 3.3V 电源。较大的电压会永久损坏部件。请注意,由于 I2C 使用开漏驱动器,因此将 I2C 引脚(DA 和 CL)连接到 5V 微处理器上的 I2C 端口是安全的。

RTC 实时时钟图 6

该brometer使用DS3231 AT24C32 I2C精密实时时钟模块。

该模块主要用于计时,但也可在 LCD 显示屏上提供时间戳。时间设置为 UTC,夏季不变。该模块随附锂离子充电电池,见上图。我使用的是不可充电电池,因此已从模块中移除电阻器 R5,详情请参阅 RTC 修改部分。

步进电机 3 关闭 气压计使用 3 个 Nema 17 步进电机 1A,13N.cm 保持扭矩,4 导程,1.8° 我使用 1.8° 电机,因为步距正好适合 360° 200 次。如果需要,您可以使用 Nema 8 电机,但不要使用 28BYJ-48-5V 电机,因为它们没有所需的 1.8° 步距角。

需要 1.8° 步距角,因为它可以为我的气压计刻度盘精确地划分为 360°。

LCD 显示 2 关闭

我使用了 2 个 20x4 LCD 显示器,一个用于气压计、时钟和 6 小时显示,另一个用于 3 小时显示和预测。

第 12 步:模块/组件 A4988 步进电机驱动器

A4988微步进双极步进电机驱动器3关

重要请仔细阅读本节

我的气压计设置为 1/16 步旋转,代码相应调整。

A4988 微步进双极步进电机驱动器图 1 带和图 2 不带散热器

这款用于 Allegro 的 A4988 微步双极步进电机驱动器的分线板具有可调节的电流限制、过流和过热保护以及五种不同的微步分辨率(低至 1/16 步)。

它的工作电压为 8 V 至 35 V,每相可提供高达约 1 A 的电流,无需散热片或强制气流(如果有足够的额外冷却,每个线圈的额定电流为 2 A)。

以下是驱动器的一些主要功能: 简单的步进和方向控制界面 五种不同的步进分辨率:全步进、半步进、四分之一步进、八分之一和十六分 可调电流控制让您设置最大电流输出带有电位计,可让您使用高于步进电机额定电压的电压来实现更高的步进率 智能斩波控制,可自动选择正确的电流衰减模式(快速衰减或缓慢衰减) 过温热关断、欠压锁定和交叉电流保护 对地短路和负载短路保护

电源连接 驱动器需要一个逻辑电源电压 (3 – 5.5 V) 连接在 VDD 和 GND 引脚之间,以及一个电机电源电压 (8 – 35 V) 连接在 VMOT 和 GND 之间。这些电源应该在靠近电路板的地方有合适的去耦电容器,并且它们应该能够提供预期的电流(电机电源的峰值高达 4 A)。

警告:该载板使用低 ESR 陶瓷电容器,这使其容易受到破坏性 LC 电压尖峰的影响,尤其是在使用长度超过几英寸的电源线时。在适当的条件下,这些尖峰电压可能超过 A4988 的 35 V 最大额定电压,并永久损坏电路板,即使电机电源电压低至 12 V。一种保护驱动器免受损坏的方法这种尖峰是在电机电源 (VMOT) 和接地之间靠近电路板的地方放置一个大的(至少 47 µF)电解电容器。

电机连接

如果连接正确,A4988 可以驱动四线、六线和八线步进电机。 警告:在驱动器通电时连接或断开步进电机会损坏驱动器。 (更一般地说,在通电的情况下重新布线是自找麻烦。)

Step (and microstep) size

see table pic. 3Stepper motors typically have a step size specification (e.g. 1.8° or 200 steps per revolution), which applies to full steps. A microstepping driver such as the A4988 allows higher resolutions by allowing intermediate step locations, which are achieved by energizing the coils with intermediate current levels. For instance, driving a motor in quarter-step mode will give the 200-step-per-revolution motor 800 microsteps per revolution by using four different current levels.

The resolution (step size) selector inputs (MS1, MS2, and MS3) enable selection from the five step resolutions according to the table below. MS1 and MS3 have internal 100kΩ pull-down resistors and MS2 has an internal 50kΩ pull-down resistor, so leaving these three microstep selection pins disconnected results in full-step mode. For the microstep modes to function correctly, the current limit must be set low enough (see below) so that current limiting gets engaged. Otherwise, the intermediate current levels will not be correctly maintained, and the motor will skip microsteps.

Control inputs

pics 4 &5Each pulse to the STEP input corresponds to one microstep of the stepper motor in the direction selected by the DIR pin. Note that the STEP and DIR pins are not pulled to any particular voltage internally, so you should not leave either of these pins floating in your application.

If you just want rotation in a single direction, you can tie DIR directly to VCC or GND. The chip has three different inputs for controlling its many power states:RST, SLP, and EN. For details about these power states, see the datasheet.

Please note that the RST pin is floating; if you are not using the pin, you can connect it to the adjacent SLP pin on the PCB to bring it high and enable the board.

Current LImiting Before connecting the motor we should adjust the current limiting of the driver so that we are sure that the current is within the current limits of the motor. We can do that by adjusting the reference voltage using the potentiometer on the module to set the VRef.

See details on the video link pic. 6

Manufacturers Drawing sheet pic.7

Step 13:Construction Prototyping

The circuit was prototyped using a hardboard dial with holes drilled for the motor spindles and LEDs.

Various dial designs were then printed on normal paper and Sellotaped over the top. The LED wiring loom was made with the LEDs in position on the temporary dial.

If you are using the round dial design this will allow you to check if the board etc will be mounted on the dial or in the back box.

Step 14:Construction RTC Modification

The module comes supplied with a Lithium-Ion rechargeable battery see diagram pic. 2.

I use a non rechargeable battery (I am not happy with the circuit design with a lithium-iron battery and associated fire risk) of the so have removed resistor R5 from the module as below. This stops any charge current to the battery.

Pic.3 shows the module without the resistor (just break it off) and pic.4 the modified circuit.

Step 15:Construction Mounting Modules &Boards

On the modern square dial design all the modules and boards are mounted on the dial. The classic round dial desgn will need some parts mounted in the back box as there is less space on the dial.

Motors are hot melt glued to wooden mounting blocks pic.1&2. The wooded blocks are cut fron a sheet of plywood pic.3. The mounting blocks depths are set to allow the correct protrusion of the spindles through the dial. I have hot melt glued the blocls to the dial.

The Vero Boards and LCD displays are also screwed to wooden blocks which have been glued to the dial using impact adhesive.

Pic.4 shows the front view with a transparent dial showing mounting locations.

图片。 5 shows the same but the rear view.

Pic.6 shows the wooden mounting blocks locations and layout.

Pic.7 shows the modules and motors mounted on the blocks.

Step 16:Construction LED Fixing

The 3mm LEDs are mounted so they just show above the surface of the dial pic.1.

3mm holes are drilled and hot melt glue holds them in place.

To get a uniform depth I made a jig using a washer and piece of card glued to it pic.2.When fixing the LEDs the jig is pressed against the dial with the depth of the washer setting the protrusion of the LED through the dial.

Step 17:Construction Classic Style English Dial Clock Case

The classic 12" Dial Clock case can be purchased from Ebay as "case only" pic.1.

Various styles are available this one is oak and has a dial surround that hinges away from the back box pic.2.

This makes for a very easy build as all the hard work has been done. The dial is mounted by 3 small wood screws hidden behind the brass dial bezel.

This dial surround has been stripped and bleached to bring out the original light colour of the wood pic.3.The dial was removed as it had a winding hole off center.

A new dial was cut from a sheet of alluminium pic.4.

Pic.5 side view of the Barometer showing the back box.

Pic.6 shows my regulator clock case with original curved back box, hinged dial bezel and pegged dial surround.

Many of these clock cases were held in place by four wooden pegs. If your case is constructed like this add a pair of hinges to one side and use the remaining two pegs to lock the dial surround in place.

Step 18:Construction Modern Case

Picture Frame Version

I have used two identical picture frames mounted back to back. These frames are 30cm x 30cm approx. 12"x12" pic.1.

pic.2 Frames are joined back to back.

pic.3 This gives a double depth frame.

pic.4 Rear side view showing wired boards and modules.

pic.5 The dial viewed through the rear frame.

pic.6 Rear half of the frame with all wiring in place.

pic.7 The front of the dial now shows through the front half of the frame. Wooden bevels hide the space behind the front half of the frame.

Step 19:Construction Modern Case Backbox

Back Box

Pic.1 The barometer is housed in a back box that is smaller than the dial frame on all side apart from the top. The fram overlap helps hide the back box and adds a shadow effect to the case on the wall.

Pic.2 The back box is 50mm deep and is simply constructed of glued and screwed wood.

Pic.3 Rear view of back box in position behind rear dial frame showing the frame overlap.

Pic.4 The screw holes are filled then a coat of matt black is applied to the back box.

Pic.5 Back box with rear picture frame in place this holds the dial.Note the rear frame is placed upside down.

Pic.6 A spacer is cut the same size and depth as the recess of the picture frame.

Pic.7 The spacer is set under the dial.

Pic.8 This will raise the dial level with the top edge of the rear frame.

Pic.9 Back box with front picture frame in place on top of the rear frame.This frame holds the glass.

Step 20:Construction Modern Case Wall Mounting

Mounting the Barometer

Pic.1 To allow access to the rear of the Barometer I have mounted it on a pair of GTV 270° inset hinges. The hinges are mounted on a block of wood fixed to the wall and allow the barometer to be swung out for access. The hinges also have a quick release function if the Barometer needs to be taken down for maintenance at any time. The hinge pivot is set back which also allows the top of the case to clear the wall when hinged out.

Pic.2 The hinges are mounted on wooden blocks screwed to the wall.

Pic.3 I have screwed and glued an extra piece of timber to the left hand side where the hinges will mount.This will add strength as all the weight of the clock will be on this side when the clock case is open. Two aluminium plates will cover the hinge holes.

Pic.4 Hinge blocks in place. Note these are bolted through the case rather than screwed.

Pic.5 Back Box mounted on the wall. The fixing screws also hold the hinge to the wooden mounting blocks The wooden baton on the right is also fixed to the wall and supports the top right hand corner of the back box. It also serves as a fixing point for the wall mount locking pins that holds the back box shut against the wall.

Pic.6 The back box is shown open with the wooden mounting blocks and batons fixed to the wall. The hole in the front edge of the baton aligns with a hole in the side of the back box. A steel pin is inserted here to lock the barometer shut against the wall.

Pic.7 Back box open allowing access to the LCD displays and setting switches.

Pic.8 Steel Locking Pin This is a small cabinet knob with a length of treaded bar screwed into the thread.

Pic.9 &10 The locking pin when pushed fully in lock the barometer against the wall. When pulled out the barometer is able to swing out to allow access to the control switched and LCD displays.

Pic.11 Detail of Locking Pin and location of right side dial fixing bolt. I have glued a washer in place over the hole as an escutcheon plate.

Step 21:Construction Modern Case Dial Mounting

The dial and all the boards etc are removable for maintenance and is held to the backbox by 2 bolts.

Mounting the Dial in the Back Box

The dial holds the combined weight of all the stepper motors, boards and modules and is stiffened by impact gluing two strips of unequal aluminium angle to it's rear surface.Two blocks of wood are then glued to these bars and small screws then hold these wooden blocks through the side of the back box. A further thin strip of wood is glued to the dial below the LCD mounting block. This is not screwed to the case but sits on the back box to support the dial.

Pic.1 Strengthening bar of alluminium unequal angle.

Pic.2 Strengthening bar locations.

Pic.3 Glued wooden fixing/support blocks for dial fixing bolts left and right and glued dial support lower.

Pic.4 Shows contact/fixing points between the back box and dial. Back box in black with dial fixings/support in wood.

Pic.5 Rear view showing mounting block and bar locations.

Pic.6 Dial with Back Box Removed showing mounting blocks and strengthening bars glued to the rear of the dial.

The dial spacer allows the dial to sit flush with the top of the rear picture frame.

Pic.7 Right side of clock showing dial fixing bolt location.

Pic.8 A mount is constructed from 4 thin strips of wood and is placed in the recess of the front picture frame. This fills the gap between the picture frame and dial, holds the Perspex sheet in place and also adds a photo mount effect to the dial.

Pic.9 Mount in place behind the front picture frame.

Step 22:Contruction Dial

Pic.1 The dial is made from 1.5mm thick alluminium sheet and comes covered with a protective plastic film.

Pic.2 From your cad program print out the dial on A3 paper and include center marks for all the LED and stepper motor shaft holes.This will be your drill template.Lay the paper of the alluminium dial blank and tape the edges to stop it moving.Center punch all the holes through the paper.

Pic.3 Remove the paper template and drill out the holes 3mm for the LEDs and 3 larger holes for your stepper motor spindle.

Start with a small pilot hole and increase the drill size in 3 stages. If you are using a round dial mark it out on the projective film with a market pen and cut it out at this stage.

Pic.4 The protective plastic film can now be removed. Rub down the dial back and front to remove any burrs and to provide a key for the paint.

Pic.5 Spray a coat of acrylic primer and then your choice of top coat - I have used antique white.

I then give a final coat of matt clear acrylic. Leave to dry over night.

I have included a high res pic of the dial pic.6. Contact me if you need it in another format. My CAD format is TurboCad.

Step 23:Construction Dial Decal

Apply the water slide decal transfer.

I use Water Slide Decal paper from BIGBITE Studio They have some good tutorials on their site. https://www.bigbitestudio.co.uk/tutorials/water-decal-tutorials/

Pic.1 Water slide decals are printed out on an inkjet printer soaked in water then slid into place. They give a very detailed print and once given a coat of varnish are tough.

Don't forget to order transparent transfers so the dial colour can be seen through the transfer.Follow the instructions with the pack as they do vary.

Pic.2 On my transfers I print out the dial on transfer paper let it dry and then cut it out to just under the size of the dial. I then give it a coat of acrylic varnish.

I set my printer as follows:Plain Paper, Photo &High Speed Off This stops my printer from over inking the paper When the varnish is dry the transfer is soaked in water until the transparent transfer comes away from the white backing sheet.

Pic.3 Move the soaked transfer over the dial.

Pic.4 Slide the transfer into position.

Pic.5 Gently pull the white backing paper backward while holding the transfer down.

Make sure the crosses line up with the center of all the holes.

Pic.6 Get rid of any air bubbles.

Pic.7 Then leave it to dry before adding a coat of matt varnish.

After the coat of varnish break through the layer of transfer over the holes using the back of a drill bit jus smaller than the holes. Then give a final coat of varnish to seal the edges around the holes.

Step 24:Construction Hands

Hands are a very personnal choice and there are many diffent styles to choose from. The hardest part is finding hands that match each other. I found a perfect set of small hands but was unable to find a matching longhand for the main barometer. In the end I made my own from 3 donor hands.

All my hands were quartz second hands so I hand to file the mounting spindle off the back for mounting on the stepper motor spindle.

On some stepper motors the spindle can be drilled out to take the hand spindle but my spindles were too hard to drill.

Pic.1 my completed hands.

Pic.2 The long barometer hand was constructed from 3 different hands

Pic.3 To get the lower spade balance part of the hand I used a spade hand.

Pic.4 First I cut off the top using sharp scissors.

Pic.5 The top was then trimmed by cutting the point off.

Pic.6 The remaining part was then filed away to match the shape of the 2 smaller hands.

Pic.7 The completed balance for the hand.

Pic.8 To make the front pointer and center I cut the end off one off my donor hands.

Pic.9 To make the rear balance shaft I cut a section out of the 3rd donor hand.

Pic.10 Left the 3 parts of the new hand. Middle shows the overlap of the balance shaft to allow for bonding. Right pic shows the balance shaft bonded with impact adhesive to the underside of the balance and center shaft.

To fix the hands to the stepper motor spindle I did not want to use impact adhesive as the hands are fragile and would be damaged if I hand to remove them. In the end I went for a tiny bit of Blu Tack on each hand. Blu Tack is putty like and is non setting but seems to hold very well!

Step 25:Construction Schematic

The main shematic is shown in Pic. 1 with the power supply in Pic.2.

You will also need a regulated plug in 12v supply adaptor of around 1amp.

Note I have fitted switches on the LCD displays to turn the backlight LEDs On and Off. This is optional but as the displays are not visible for 99.99% of the time it will save power.

Note larger schematics can be found on my web site here

Step 26:Construction Vero Board

Vero Board Layouts

Pic.1 Vero Board with all modules removed.

Pic.2 Vero Board with modules in place.

Pic.3 Vero Board rear view (flipped down from top).

Pic.4 LED Vero Board

This board is used as a connection point for the dial LEDs. This allows the dial to be disconnected from the main board if required for maintenance.

Pic.5 The LED Vero Board connects to the main board with Dupont sockets and male Dupont cable

Pic.6 Vero Board wiring in progress.

Pic.7 Vero Boards and module location on the rear of the dial.

Step 27:Code

代码

There are 2 parts to the code 1 for the Main Barometer Code and 6 hour display and 1 for the 3 hour display and weather forecast.

Step 28:Time-Lapse Video

Time-Lapse Video showing rain radar and the Barometer predicting rain and a storm.

This is a 4K video so you should be able to see full details of the dial and forecast LEDs.

代码

  • BarometerA4988_23.ino
  • BarometerA4988_3hour__21.ino
BarometerA4988_23.inoArduino
Main file for Barometer and 6 hour display
/* Example sketch to control a 28BYJ-48 stepper motor with ULN2003 driver board, AccelStepper and Arduino UNO:number of steps/revolutions. More info:https://www.makerguides.com v4 moved step 6 hour pressure step from void getpressure 1523 to main loop check every hour 365v5 remove unwamted step elementsv6 convert to diff display on 6 hr motorv8 modified hour change formula 1486v9 sleepv10 chnged high/low for EN control v11 chenge calc for hour change 1380v12 added calcCurrentDisp (); to calc current time from line 1384v13 removed 30 sec syncv14 air pressure extremes LEDsv15 add hour diff hour calc etc to row 1 when not on settingsv16 adding 16th stepsv17 errorv18 change min pulse to hour pulse on the hour + 1minv19 check enable and sleepsv20 added DAC to NANO so pins changed on 328 to match (analogue and digital swapped A6 D3 - deleted v20 also changed Low range hi range to both light above 19 or -19v21 same as 20 with serial print removedv23 notes added LCD display info added to startup */#include  //SFE_BMP180 pressure sensor#include #include #include // ######## You will need to create an SFE_BMP180 object, here called "pressure":SFE_BMP180 pressure;#define ALTITUDE 118.0 // Altitude of Kenley Surrey in meters// also used to adjust/sync/calibrate to nearby weather station/3 hour display//#########//**********************// set the LCD address to 0x27 for a 20 chars 4 line display// Set the pins on the I2C chip us ed for LCD connections:// addr, en,rw,rs,d4,d5,d6,d7,bl,blpolLiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address#define DS3231_I2C_ADDRESS 0x68// Convert normal decimal numbers to binary coded decimalbyte decToBcd(byte val){ return( (val/10*16) + (val%10) );}// Convert binary coded decimal to normal decimal numbersbyte bcdToDec(byte val){ return( (val/16*10) + (val%16) );}// Include the AccelStepper library:#include // Define stepper motor connections and motor interface type. Motor interface type must be set to 1 when using a driver:#define dirPin 8#define stepPin 9#define dirPin2 10#define stepPin2 11#define motorInterfaceType 1// Create a new instance of the AccelStepper class:AccelStepper stepper =AccelStepper(motorInterfaceType, stepPin, dirPin);//barometer motorAccelStepper stepper2 =AccelStepper(motorInterfaceType, stepPin2, dirPin2);// 6 hour motorfloat seaPressure =0;float pressureNow =0;float pressurePrevious =0;float pressureDiff =0;int checkStop =0;int pressureRndDiff =0;int pressureRndNow =0;int pressureRndPrevious =0;int adjustOn =4; // allows adjustment of barometer// int test =0; // test mode 0 off 1 is onchar status; double T,P,a;//int h =0;//int m =0;//int j =0;int stepcount =0;int time =0;int resetmins =1;int secondNow =0;int secondPrevious=0;int minuteNow =0;int minutePrevious=0;int hourNow =0;int hourPrevious=0;int hourNow1=0;int hourPrevious1=0;int initial =0;int initial1 =0;int initial3 =0;int highPressureLED =3;int lowPressureLED =5;int hour6LowLED =15;int hour6HighLED =16;int manSync =12; // resets seconds to 30 secondsint changeSetting =2;int syncStop =0;int sync30Stop =0;int stepoffHour =0;int stepoffHourbkw =0;int stepoffMin =0;int stepoffMinbwd =0;int stepoffRTCminfwd =0;int stepoffRTCminbwd =0;int stepoffRTChourfwd =0;int stepoffRTChourbwd =0;int settingreadPin =A3; //Pin for sensing analogue value from potint settingVal =0; // Analogue value 0-1023int LCDstop =0; // stops settings on LCD display refreshing until they changeint hourPulse =13; //min pulse for seconds display was 14int adjustLock =0; // turns off adjust lockint hourcalc =0; // number from 0 to 7 representing the 8 hours of stored pressure readings int hourDiff =0; // used to check if 6hour previous motor should be stepped.int hourChange =0; // the amount of 6 hour to stepint currentDisplay =0; //current 6hour change readingint hour0 =1013; // you can set last 8 hours pressure here or leave at 0 and theint hour1 =1014; // readings will catch up over the next 8 hoursint hour2 =1015;int hour3 =1016;int hour4 =1016;int hour5 =1016;int hour6 =1012;int hour7 =1013;int sleep1 =6;int sleep2 =7;// check air pressure here https://www.meteoplug.com/cgi-bin/meteochart.cgi?draw=a3aeaaa1acbdf9f1fcfed4fedbc2c094c0d6d6d1d2c5edcebbfee9ffeff1fbf9//int Disp3hrIn =A3;//int Disp3hrVal =0;void setup() { pinMode(adjustOn, INPUT); pinMode(hourPulse, OUTPUT); pinMode(highPressureLED, OUTPUT); pinMode(lowPressureLED, OUTPUT); pinMode(hour6LowLED, OUTPUT); pinMode(hour6HighLED, OUTPUT); pinMode(manSync, INPUT); pinMode(sleep1, OUTPUT); pinMode(sleep2, OUTPUT); pinMode(settingreadPin, INPUT); // Set the maximum steps per second:stepper.setMaxSpeed(1000); stepper2.setMaxSpeed(1000); lcd.begin(20,4); // initialize the lcd for 20 chars 4 lines, turn on backlight lcd.backlight(); // backlight on not needed as man controlled lcd.setCursor(0,0); //Start at character 0 on line 0 lcd.print("Barometer A988"); //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ lcd.setCursor(0,1); //Start at character 0 on line 1 lcd.print(" Version 23"); //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ { Wire.begin(); Serial.begin(9600); // set the initial time here:// DS3231 seconds, minutes, hours, day, date, month, year // setDS3231time(10,42,9,5,18,12,19);//delay(2000);lcd.clear();}Serial.println("REBOOT");// serial removed // Initialize the sensor (it is important to get calibration values stored on the device). if (pressure.begin()) Serial.println("BMP180 init success");// serial removed else { // Oops, something went wrong, this is usually a connection problem, // see the comments at the top of this sketch for the proper connections. Serial.println("BMP180 init fail\n\n");// serial removed while(1); // Pause forever. } //LED TestdigitalWrite(hour6HighLED, HIGH);delay (500);digitalWrite(hour6HighLED, LOW);digitalWrite(hour6LowLED, HIGH);delay (500);digitalWrite(hour6LowLED, LOW);digitalWrite(highPressureLED, HIGH);delay (500);digitalWrite(highPressureLED, LOW);digitalWrite(lowPressureLED, HIGH);delay (500);digitalWrite(lowPressureLED, LOW);delay (500);lcd.clear();getPressure ();// gets all pressure readings// Disp readings on startup so hands can be set lcd.setCursor(0,1);液晶打印(“”); lcd.setCursor(0,1); lcd.print("H"); lcd.print(hourcalc); lcd.setCursor(2,1);液晶打印(“”); lcd.setCursor(2,1); lcd.print("Old"); lcd.print(currentDisplay); lcd.setCursor(13,1);液晶打印(“”); lcd.setCursor(13,1); lcd.print("Disp"); lcd.print(hourDiff); //disable motors on startupdigitalWrite(sleep1, HIGH);digitalWrite(sleep2, HIGH);stepper.disableOutputs();stepper2.disableOutputs();// test =1; // test set to 0 off 1 on}void loop() { if( digitalRead(adjustOn) ==HIGH || adjustLock ==1)// only alow settings when change settings switch is ON{ //digitalWrite(sleep1, LOW);//enable on //digitalWrite(sleep2, LOW);//enable on only enable outputs for 2 mins Settings(); //set what function the setiing switches have adjustLock =1; //hold on adjustment if( digitalRead(adjustOn) ==LOW){//digitalWrite(sleep1, HIGH);//disable on//digitalWrite(sleep2, HIGH);//enable on only enable outputs for 2 minsadjustLock =0; //hold on adjustment } }// only allow settings change when setting switch is on // displayTime(); // display the real-time clock data on the Serial Monitor, byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; // retrieve data from DS3231 readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //enable air pressure readings if (minute ==9 || minute ==19 || minute ==29 || minute ==39 || minute ==49 || minute ==59 &&second ==59) { checkStop =0;// resets checkstop to allow air pressure readings every 10 mins }//check air pressure every 10 mins if (checkStop ==0) { if ( minute ==0 || minute ==10 || minute ==20 || minute ==30 || minute ==40 || minute ==50 ) { //digitalWrite(sleep1, LOW);//enable on -only enable outputs for 1 min // only sleep1 needs activation getPressure ();// gets all pressure readings checkStop =1;// stops multiple readings of air pressure }// else //digitalWrite(sleep1, HIGH);//enable off // Serial.print("Sleep 1 HIGH (off) "); // Serial.println(hourChange); } //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@if(digitalRead(manSync)==HIGH)// resets seconds to 30{ setDS3231time(30, minute, hour, dayOfWeek, dayOfMonth, month, year); //Set seconds to 30 on RTC } // counts seconds secondNow =second; if(secondNow!=secondPrevious || initial) { lcd.setCursor(0,0); lcd.print("UTC "); if(hour<10) { lcd.print(0); } lcd.print(hour); lcd.print(":"); if(minute<10) { lcd.print(0); } lcd.print(minute); lcd.print(":"); if(second<10) { lcd.print(0); } lcd.print(second);液晶打印(“”); // Serial.print("-1*0 ");// Serial.println(-1*0); initial =0; secondPrevious =secondNow; } // count minutes minuteNow =minute; if(minuteNow!=minutePrevious || initial) //settingVal <690 stops clock motors operating when setting RTC { initial =0; minutePrevious =minuteNow; // digitalWrite(minPulse,HIGH);//1 min pulse for seconds display sync syncStop =0;// clock will not sync again untill a new minute has started. // digitalWrite(minPulse,LOW);//1 min pulse for seconds display sync } // counts hours + 1min for hourPulse at 15 seconds past the hour this allows barometer and 6 hour dial to step first if ( minute ==0 &&second ==15) // send hour pulse 15 seconds past the hour to 3 hour circuit allows other motors to stop { digitalWrite(hourPulse,HIGH); digitalWrite(highPressureLED,HIGH); // Serial.println("hourPulse Hi "); } else if (minute !=1 || second !=0) { digitalWrite(hourPulse,LOW);digitalWrite(highPressureLED,LOW); }// counts hours hourNow =hour; if ((minute ==59 &&second> 50) || (minute ==0 &&second <10) )// allows change on the hour only {// digitalWrite(sleep2, LOW);// enable 6hr motor if(hourNow!=hourPrevious || initial) //settingVal <690 stops clock motors operating when setting RTC { initial =0; hourPrevious =hourNow;//print hour stores every hour // serial removed /* Serial.print("hour0 "); Serial.println(hour0); Serial.print("hour1 "); Serial.println(hour1); Serial.print("hour2 "); Serial.println(hour2); Serial.print("hour3 "); Serial.println(hour3); Serial.print("hour4 "); Serial.println(hour4); Serial.print("hour5 "); Serial.println(hour5); Serial.print("hour6 "); Serial.println(hour6); Serial.print("hour7 "); Serial.println(hour7); */ //##############################################################################//step 6 hour motorif (hourChange> 0 &&hourChange <40) // 6 hour motor will not step if diff> 10 { stephourFwd(); //Serial.print("Step 6 hour Forward ");// serial removed // Serial.println(hourChange);// serial removed hourChange =0; } else if (hourChange <0 &&hourChange> -40) // else if (hourDiff ==-1 || test ==1) { stephourBwd(); // Serial.print("Step 6 Hour Backward ");// serial removed // Serial.println(hourChange);// serial removed hourChange =0; } // hourChange =0; //############################################################################## } // digitalWrite(sleep2, HIGH);// disable 6hr motor// add LCD stop if(second==0) { // lcd.setCursor(0,1); //lcd.print(" "); lcd.setCursor(0,1);液晶打印(“”); lcd.setCursor(0,1); lcd.print("H"); lcd.print(hourcalc); lcd.setCursor(2,1);液晶打印(“”); lcd.setCursor(2,1); lcd.print("Old"); lcd.print(currentDisplay); lcd.setCursor(13,1);液晶打印(“”); lcd.setCursor(13,1); lcd.print("Disp"); lcd.print(hourDiff); } } } // Set Clock/Motors###################################################################################################//gets advance retard settings from potvoid Settings(){ settingVal =analogRead(settingreadPin); // read the value from the pot if ( settingVal>=0 &&settingVal <85 ) { setMinsfwd(); } if ( settingVal>=85 &&settingVal <170 ) { setMinsbwd(); } if ( settingVal>=170 &&settingVal <255 ) { setMinsslowfwd(); } if ( settingVal>=255 &&settingVal <340 ) { setMinsslowbkd(); } if ( settingVal>=340 &&settingVal <425 ) { setHoursfwd(); } if ( settingVal>=425 &&settingVal <510 ) { setHoursbwd(); } if ( settingVal>=510 &&settingVal <595 ) { setHoursslowfwd(); } if ( settingVal>=595 &&settingVal <690 ) { setHourslowbkd(); } if ( settingVal>=690 &&settingVal <765 ) { setRTCfwdmin(); } if ( settingVal>=765 &&settingVal <850 ) { setRTCbwdmin(); } if ( settingVal>=850 &&settingVal <900 ) { setRTCfwd(); } if ( settingVal>=900 &&settingVal <970 ) { setRTCbwd(); }if ( settingVal>=970 &&settingVal <1025 ) { } if ( settingVal>=0 &&settingVal <85 &&LCDstop==0)// LCDstop prevents the LCD from freshing until another item is selected { lcd.setCursor(0,1);液晶打印(“”); lcd.setCursor(0,1); lcd.print("Barometer Advance"); LCDstop=1; } if ( settingVal>=85 &&settingVal <170 &&LCDstop==1) { lcd.setCursor(0,1);液晶打印(“”); lcd.setCursor(0,1); lcd.print("Barometer Retard"); LCDstop=0; } if ( settingVal>=170 &&settingVal <255 &&LCDstop==0 ) { lcd.setCursor(0,1);液晶打印(“”); lcd.setCursor(0,1); lcd.print("Baro Inch Advance"); LCDstop=1; } if ( settingVal>=255 &&settingVal <340 &&LCDstop==1 ) { lcd.setCursor(0,1);液晶打印(“”); lcd.setCursor(0,1); lcd.print("Baro Inch Retard"); LCDstop=0; } if ( settingVal>=340 &&settingVal <425 &&LCDstop==0 ) { lcd.setCursor(0,1);液晶打印(“”); lcd.setCursor(0,1); lcd.print("6Hr Baro Advance"); LCDstop=1; } if ( settingVal>=425 &&settingVal <510 &&LCDstop==1 ) { lcd.setCursor(0,1);液晶打印(“”); lcd.setCursor(0,1); lcd.print("6Hr Baro Retard"); LCDstop=0; } if ( settingVal>=510 &&settingVal <595 &&LCDstop==0 ) { lcd.setCursor(0,1);液晶打印(“”); lcd.setCursor(0,1); lcd.print("6Hr Baro Inch Advn"); LCDstop=1; } if ( settingVal>=595 &&settingVal <690 &&LCDstop==1 ) { lcd.setCursor(0,1);液晶打印(“”); lcd.setCursor(0,1); lcd.print("6Hr Baro Inch Retard"); LCDstop=0; } if ( settingVal>=690 &&settingVal <765 &&LCDstop==0) { lcd.setCursor(0,1);液晶打印(“”); lcd.setCursor(0,1); lcd.print("RTC Min Advance"); LCDstop=1; } if ( settingVal>=765 &&settingVal <850 &&LCDstop==1 ) { lcd.setCursor(0,1);液晶打印(“”); lcd.setCursor(0,1); lcd.print("RTC Min Retard"); LCDstop=0; } if ( settingVal>=850 &&settingVal <900 &&LCDstop==0 ) { lcd.setCursor(0,1);液晶打印(“”); lcd.setCursor(0,1); lcd.print("RTC Hour Advance"); LCDstop=1; } if ( settingVal>=900 &&settingVal <970 &&LCDstop==1 ) { lcd.setCursor(0,1);液晶打印(“”); lcd.setCursor(0,1); lcd.print("RTC Hour Retard"); LCDstop=0; } if ( settingVal>=970 &&settingVal <1025 &&LCDstop==0 ) { lcd.setCursor(0,1);液晶打印(“”); lcd.setCursor(0,1); lcd.print("OFF"); LCDstop=1; } }// END of Loop// set RTC min forward 1 min per press ##################################################################################void setRTCfwdmin(){ if( digitalRead(changeSetting) ==HIGH &&stepoffRTCminfwd ==0 ) { byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; // retrieve data from DS3231 readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); minute =minute+1; if (minute ==60) { minute =0; } setDS3231time(second, minute, hour, dayOfWeek, dayOfMonth, month, year); //Set seconds to 30 on RTC stepoffRTCminfwd =1; } if( digitalRead(changeSetting) ==LOW ) { stepoffRTCminfwd =0; }}//##################################################################################// set RTC min backward 1 min per press ##################################################################################void setRTCbwdmin(){ if( digitalRead(changeSetting) ==HIGH &&stepoffRTCminbwd ==0 ) { byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; // retrieve data from DS3231 readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); minute =minute-1; if (minute <1) { minute =59; } setDS3231time(second, minute, hour, dayOfWeek, dayOfMonth, month, year); //Set seconds to 30 on RTC stepoffRTCminbwd =1; } if( digitalRead(changeSetting) ==LOW ) { stepoffRTCminbwd =0; }}//##################################################################################//###################################################################################################// set RTC hour forward 1 hour per press ##################################################################################void setRTCfwd(){ if( digitalRead(changeSetting) ==HIGH &&stepoffRTChourfwd ==0 ) { byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; // retrieve data from DS3231 readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); hour =hour+1; setDS3231time(second, minute, hour, dayOfWeek, dayOfMonth, month, year); //Set seconds to 30 on RTC stepoffRTChourfwd =1; } if( digitalRead(changeSetting) ==LOW ) { stepoffRTChourfwd =0; }}//##################################################################################// set RTC hour backward 1 hour per press ##################################################################################void setRTCbwd(){ if( digitalRead(changeSetting) ==HIGH &&stepoffRTChourbwd ==0 ) { byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; // retrieve data from DS3231 readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); hour =hour-1; setDS3231time(second, minute, hour, dayOfWeek, dayOfMonth, month, year); //Set seconds to 30 on RTC stepoffRTChourbwd =1; } if( digitalRead(changeSetting) ==LOW ) { stepoffRTChourbwd =0; }}//##################################################################################// set Minutes Motor forward 1 min per press ##################################################################################void setMinsfwd(){ //digitalWrite(sleep1, LOW); //stepper.enableOutputs();// step minutes 1 min per press if( digitalRead(changeSetting) ==HIGH &&stepoffMin ==0 ) { //Serial.println("Step Forward Man");// serial removed stepoffMin =1; stepminsFwd(); } if( digitalRead(changeSetting) ==LOW ) { stepoffMin =0; }//digitalWrite(sleep1, HIGH); //stepper.disableOutputs();}//##################################################################################// set Minutes Motor backward 1 min per press ##################################################################################void setMinsbwd(){ //digitalWrite(sleep1, LOW); // stepper.enableOutputs(); if( digitalRead(changeSetting) ==HIGH &&stepoffMinbwd ==0 ) { // Serial.println("Step Backward Man");// serial removed stepoffMinbwd =1; stepminsBwd(); } if( digitalRead(changeSetting) ==LOW ) { stepoffMinbwd =0; }//digitalWrite(sleep1, HIGH); // stepper.disableOutputs();}//##################################################################################// step minutes slow forward const press ##################################################################################void setMinsslowfwd(){ stepper.enableOutputs(); digitalWrite(sleep1, LOW); if( digitalRead(changeSetting) ==HIGH ) { // Serial.println("Step Baro Inch Forward Man");// serial removed stepper.setCurrentPosition(0); // Run the motor forward at 500 steps/second until the motor reaches 4096 steps (1 revolution):while (stepper.currentPosition() !=1) { //was 52 52x60 =3120 stepper.setSpeed(50); stepper.runSpeed(); } /* digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, LOW);*/ } digitalWrite(sleep1, HIGH); stepper.disableOutputs();}//##################################################################################// step minutes slow backward const press ##################################################################################void setMinsslowbkd(){ stepper.enableOutputs(); digitalWrite(sleep1, LOW); if( digitalRead(changeSetting) ==HIGH ) { // Serial.println("Step Baro Inch Backward Man");// serial removed stepper.setCurrentPosition(0); // Run the motor forward at 500 steps/second until the motor reaches 4096 steps (1 revolution):while (stepper.currentPosition() !=-1) { //was 52 52x60 =3120 stepper.setSpeed(-50); stepper.runSpeed(); } /* digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, LOW);*/ } digitalWrite(sleep1, HIGH); stepper.disableOutputs();}//##################################################################################// set Hour Motor forward 1 hour per press ##################################################################################void setHoursfwd(){ // stepper2.enableOutputs(); // digitalWrite(sleep2, LOW); // step hours 1 hour per press if( digitalRead(changeSetting) ==HIGH &&stepoffHour ==0 ) { // Serial.println("Step 6hr Forward Man");// serial removed stepoffHour =1; stephourmanFwd(); } // stepper2.disableOutputs(); // digitalWrite(sleep2, HIGH);if( digitalRead(changeSetting) ==LOW ) { stepoffHour =0; }...This file has been truncated, please download it to see its full contents.
BarometerA4988_3hour__21.inoArduino
File for 3 hour display and forecasting
/* Example sketch to control a 28BYJ-48 stepper motor with ULN2003 driver board, AccelStepper and Arduino UNO:number of steps/revolutions. More info:https://www.makerguides.com v4 added presure extreme LEDsv5 add forcast LEDs and calcv6 sorted enable and sleep orderv7 remove adjust on and test replace it with Clearing and threatening LEDs PIN 12 and 13 v8 add dac driver-deletedv9 added LCDv10 added weather forecast usingLEDs v12 LEds test addedv13 add 1 dp point to 3 hour displayv14 void 1026 add slow set buttonsv18 voided v19last reading not included in number of stepsv20 change led test orderv20a serial.print removed indicated by // serial removedv21 as 20a identical to v20 that includes serial print*/#include  //SFE_BMP180 pressure sensor#include #include // ######## You will need to create an SFE_BMP180 object, here called "pressure":SFE_BMP180 pressure;#define ALTITUDE 125.0 // Altitude of Kenley Surrey in meters//#########//**********************// set the LCD address to 0x27 for a 20 chars 4 line display// Set the pins on the I2C chip used for LCD connections:// addr, en,r w,rs,d4,d5,d6,d7,bl,blpolLiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address//#define DS3231_I2C_ADDRESS 0x68// Convert normal decimal numbers to binary coded decimalbyte decToBcd(byte val){ return( (val/10*16) + (val%10) );}// Convert binary coded decimal to normal decimal numbersbyte bcdToDec(byte val){ return( (val/16*10) + (val%16) );}// Include the AccelStepper library:#include // Define stepper motor connections and motor interface type. Motor interface type must be set to 1 when using a driver:#define dirPin 11#define stepPin 10#define motorInterfaceType 1// Create a new instance of the AccelStepper class:AccelStepper stepper =AccelStepper(motorInterfaceType, stepPin, dirPin);float seaPressure =0;float pressureNow =0;float pressurePrevious =0;float pressureDiff =0;int checkStop =0;//int pressureRndDiff =0;int pressureRndNow =0;int pressureRndPrevious =0;int adjustOn =12; // allows adjustment of barometer// int test =0; // test mode 0 off 1 is onchar status; double T,P,a;//int h =0;//int m =0;//int j =0;int stepcount =0;//int time =0;//int resetmins =1;//int secondNow =0;//int secondPrevious=0;//int minuteNow =0;//int minutePrevious=0;//int hourNow =0;//int hourPrevious=0;int initial =0;int initial1 =0;int initial3 =0;//int sync30 =3;//30sec sync on pin18//int syncLED =15;//int manSync =12;//int adjustOn =12;//int syncStop =0;//int sync30Stop =0;int stepoffHour =0;int stepoffHourbkw =0;int stepoffMin =0;int stepoffMinbwd =0;//int stepoffRTCminfwd =0;//int stepoffRTCminbwd =0;//int stepoffRTChourfwd =0;//int stepoffRTChourbwd =0;//int settingreadPin =A3; //Pin for sensing analogue value from pot//int settingVal =0; // Analogue value 0-1023int LCDstop =0; // stops settings on LCD display refreshing until they changeint hourPulse =3; //hour pulse from main Barometer Arduinoint adjustLock =0; // turns off adjust lockint hourcalc =0;float hourDiff =0.50; // used to check if 3hour previous motor should be stepped.float hourChange =0.00; // the amount of 3 hour to step float valueint hourStep =0; //the amount of 3 hour to stepint hourStepdigit1 =0; // gets the 1st digit from hourstepint hourStepdigit2 =0; // gets the 2nd digit from hourstepint stepTotal =0; // tptal amount of steps for 3 hour motorint hourChangeNeg =0;// if hour change is -ve this stores the value to chenge stepTotal laterfloat currentDisplay =0.50; //current 3hour change readingfloat hour0 =1036.00; // you can set last 3 hours pressure here or leave at 0 and thefloat hour1 =1036.00; // readings will catch up over the next 4 hoursfloat hour2 =1036.00;float hour3 =1036.00;float hour4 =1036.00;//check readings https://www.meteoplug.com/cgi-bin/meteochart.cgi?draw=a3aeaaa1acbdf9f1fcfed4fedbc2c094c0d6d6d1d2c5edcebbfee9ffeff1fbf9int sleep =9;int hourPulseOff =0;//int testinput =17;int testpulse =0;int hourPlus1min =0;int stepFwd1 =14;int manstepFwd1 =0;int maninchFwdBwd =A7;int stepBwd1 =15;int manstepBwd1 =0;int hour3LowLED =5;// Green low range LEDint hour3HighLED =4;//Red high range LEDint ledStormy =8;int ledRain =7;int ledChange =6;int ledFair =2;int ledDry =13;int ledClear =12;int ledThreat =17;int ledNoChange =16;//Testint n =0;int n1 =0;int n2 =0;void setup() { pinMode(ledStormy, OUTPUT); pinMode(ledRain, OUTPUT); pinMode(ledChange, OUTPUT); pinMode(ledFair, OUTPUT); pinMode(ledDry, OUTPUT); pinMode(ledClear, OUTPUT); pinMode(ledThreat, OUTPUT); pinMode(ledNoChange, OUTPUT); pinMode(stepFwd1, INPUT); pinMode(stepBwd1, INPUT); // pinMode(adjustOn, INPUT); pinMode(hourPulse, INPUT); pinMode(hour3LowLED, OUTPUT); pinMode(hour3HighLED, OUTPUT); pinMode(sleep, OUTPUT); // pinMode(settingreadPin, INPUT); // Set the maximum steps per second:stepper.setMaxSpeed(1000); lcd.begin(20,4); // initialize the lcd for 20 chars 4 lines, turn on backlight lcd.backlight(); // backlight on not needed as controlled by 7 MAX2719 lcd.setCursor(0,0); //Start at character 0 on line 0 lcd.print("Barometer A988 3 Hr"); //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ lcd.setCursor(0,1); //Start at character 0 on line 0 lcd.print(" Version 20"); //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ { // Wire.begin(); Serial.begin(9600); delay(2000);lcd.setCursor(0,2); //Start at character 0 on line 0 lcd.print("##### LED TEST #####"); //@@@@@@@@}//#############################################################Serial.println("REBOOT v08");//############################################################ // Initialize the sensor (it is important to get calibration values stored on the device). if (pressure.begin()) Serial.println("BMP180 init success"); else { // Oops, something went wrong, this is usually a connection problem, // see the comments at the top of this sketch for the proper connections. Serial.println("BMP180 init fail\n\n"); while(1); // Pause forever. }// test =1; // test set to 0 off 1 on//LED Testdelay (2000);digitalWrite(ledThreat, HIGH);delay (500);digitalWrite(ledThreat, LOW);digitalWrite(ledNoChange, HIGH);delay (500);digitalWrite(ledNoChange, LOW);digitalWrite(ledClear, HIGH);delay (500);digitalWrite(ledClear, LOW);digitalWrite(ledStormy, HIGH);delay (500);digitalWrite(ledStormy, LOW);digitalWrite(ledRain, HIGH);delay (500);digitalWrite(ledRain, LOW);digitalWrite(ledChange, HIGH);delay (500);digitalWrite(ledChange, LOW);digitalWrite(ledFair, HIGH);delay (500);digitalWrite(ledFair, LOW);digitalWrite(ledDry, HIGH);delay (500);digitalWrite(ledDry, LOW);digitalWrite(hour3HighLED, HIGH);delay (500);digitalWrite(hour3HighLED, LOW);digitalWrite(hour3LowLED, HIGH);delay (500);digitalWrite(hour3LowLED, LOW);液晶显示器(); getPressure ();// gets all pressure readings showLCD(); // load display to LCD getForecast(); //get forcast and set LEDs for weather //disable motors on startupdigitalWrite(sleep, HIGH);stepper.disableOutputs(); }void loop() { hourPlus1min =(digitalRead(hourPulse));//checks for pulse at 1min past the hour from the barometer if (hourPlus1min ==HIGH &&hourPulseOff ==0 || initial1 ) { initial1 =0; hourcalc++; if (hourcalc> 4) { hourcalc =0; } //Serial.print("hourcalc ");// serial removed // Serial.println(hourcalc);// serial removed getPressure ();// gets all pressure readings getForecast(); //get forcast and set LEDs for weather showLCD(); // load display to LCD hourPulseOff =1; //turns off } else if (hourPlus1min ==LOW) { hourPulseOff =0; } adjustLock =0; //hold on adjustment// Step forward/back man~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // step hours 1 hour per press manstepFwd1 =digitalRead(stepFwd1); if( manstepFwd1 ==HIGH &&stepoffHour ==0 ) { stepoffHour =1; stephourmanFwd(); } manstepFwd1 =digitalRead(stepFwd1);if( manstepFwd1 ==LOW ) { stepoffHour =0; } // step hours 1 hour per press manstepBwd1 =digitalRead(stepBwd1); if( manstepBwd1 ==HIGH &&stepoffHour ==0 ) { stepoffHour =1; stephourmanBwd(); } manstepBwd1 =digitalRead(stepBwd1); if( manstepBwd1 ==LOW) { stepoffHour =0; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //Inch 3hr forward/backwardsmaninchFwdBwd=analogRead(A7);if (maninchFwdBwd>800 ){// Serial.print(" maninchFwdBwd=");// serial removed // Serial.println(maninchFwdBwd);// serial removed maninchFwd(); } else if (maninchFwdBwd <200) { // Serial.print(" maninchFwdBwd=");// serial removed// Serial.println(maninchFwdBwd);// serial removed maninchBwd(); } //##############################################################################//step 3 hour motorif (hourChange> 0 &&hourChange <20) // 3 hour motor will not step if diff> 40 { stephourFwd(); // Serial.print("Step 3 hour Forward ");// serial removed // Serial.println(hourChange);// serial removed hourChange =0; } else if(hourChange <0 &&hourChange> -20) { stephourBwd(); // Serial.print("Step 3 Hour Backward ");// serial removed // Serial.println(hourChange);// serial removed hourChange =0; } //############################################################################## } //##################################################################################// set Hour Motor backward 1 hour per press ##################################################################################void setHoursbwd(){ // digitalWrite(sleep, LOW);// stepper.enableOutputs(); // step hours 1 hour per press if( digitalRead(adjustOn) ==HIGH &&stepoffHourbkw ==0 ) { // Serial.println("Step 3hr Backward Man"); stepoffHourbkw =1; stephourmanBwd(); }// stepper.disableOutputs();// digitalWrite(sleep, HIGH);if( digitalRead(adjustOn) ==LOW ) { stepoffHourbkw =0; }// End step hours 1 hour per press}//##################################################################################// step hours slow forward const press ##################################################################################void maninchFwd(){ stepper.enableOutputs(); digitalWrite(sleep, LOW); if( digitalRead(adjustOn) ==HIGH ) { // Serial.println("Step 3hr Inch Forward Man");// serial removed stepper.setCurrentPosition(0); // Run the motor forward at 500 steps/second until the motor reaches 8 steps (1 revolution):while (stepper.currentPosition() !=1) { //was 52 52x60 =3120 stepper.setSpeed(10); stepper.runSpeed(); } } digitalWrite(sleep, HIGH);stepper.disableOutputs();}//##################################################################################// step hours slow backward const press ##################################################################################void maninchBwd(){ stepper.enableOutputs(); digitalWrite(sleep, LOW); if( digitalRead(adjustOn) ==HIGH ) { // Serial.println("Step 3hr Inch backward Man");// serial removed stepper.setCurrentPosition(0); // Run the motor forward at 500 steps/second until the motor reaches 8 steps (1 revolution):while (stepper.currentPosition() !=-1) { //was 52 52x60 =3120 stepper.setSpeed(-10); stepper.runSpeed(); } } digitalWrite(sleep, HIGH);stepper.disableOutputs();}//################################################################################## //Hour Motor #####################################################################################################void stephourFwd() // steps hour hand forward 1 hour{ stepper.enableOutputs(); // Serial.println("Step 3 hrs forward auto");// serial removed digitalWrite(sleep, LOW); stepper.setCurrentPosition(0); // Run the motor forward at 500 steps/second until the motor reaches 4096 steps (1 revolution):while (stepper.currentPosition() !=hourChange*160) { //hourDiff gives the nuber of steps to take stepper.setSpeed(400); stepper.runSpeed(); } digitalWrite(sleep, HIGH); stepper.disableOutputs(); }//###############################################################################################################//Hour Motor #####################################################################################################void stephourBwd() // steps hour hand backward 1 hour{ stepper.enableOutputs(); //Serial.println("Step 3hrs backward auto");// serial removed digitalWrite(sleep, LOW); stepper.setCurrentPosition(0);while ( stepper.currentPosition() !=hourChange*160) { stepper.setSpeed(-400); stepper.runSpeed(); }digitalWrite(sleep, HIGH); stepper.disableOutputs(); }//###############################################################################################################//Hour Motor Man Step forward#####################################################################################################void stephourmanFwd() // steps hour hand forward 1 hour{ stepper.enableOutputs(); digitalWrite(sleep, LOW); //Serial.println("Step 3hr forward man");// serial removed stepper.setCurrentPosition(0); // Run the motor forward at 500 steps/second until the motor reaches 4096 steps (1 revolution):while ( stepper.currentPosition() !=160) { stepper.setSpeed(400); stepper.runSpeed(); } digitalWrite(sleep, HIGH); stepper.disableOutputs(); }//###############################################################################################################//Hour Motor Man Step back ward #####################################################################################################void stephourmanBwd() // steps hour hand backward 1 hour{ stepper.enableOutputs(); digitalWrite(sleep, LOW); // Serial.println("Step 3hr backward man");// serial removed stepper.setCurrentPosition(0);while ( stepper.currentPosition() !=-160) { stepper.setSpeed(-400); stepper.runSpeed(); }digitalWrite(sleep, HIGH); stepper.disableOutputs(); }//###############################################################################################################void getPressure ()//get all pressure readings checked every 10 mins eg 0 10 20 etc{ if (checkStop ==0){ // If you want sea-level-compensated pressure, as used in weather reports, // you will need to know the altitude at which your measurements are taken. // We're using a constant called ALTITUDE in this sketch:// Serial.println(); // Serial.print("provided altitude:"); // Serial.print(ALTITUDE,0);// Serial.print(" meters, "); // Serial.print(ALTITUDE*3.28084,0);// Serial.println(" feet"); // If you want to measure altitude, and not pressure, you will instead need // to provide a known baseline pressure. This is shown at the end of the sketch. // You must first get a temperature measurement to perform a pressure reading. // Start a temperature measurement:// If request is successful, the number of ms to wait is returned. // If request is unsuccessful, 0 is returned. status =pressure.startTemperature(); if (status !=0) { // Wait for the measurement to complete:delay(status); // Retrieve the completed temperature measurement:// Note that the measurement is stored in the variable T. // Function returns 1 if successful, 0 if failure. status =pressure.getTemperature(T); if (status !=0) { // Print out the measurement:// Serial.print("temperature:"); // Serial.print(T,2); // Serial.print(" deg C, "); // Serial.print((9.0/5.0)*T+32.0,2); // Serial.println(" deg F"); // Start a pressure measurement:// The parameter is the oversampling setting, from 0 to 3 (highest res, longest wait). // If request is successful, the number of ms to wait is returned. // If request is unsuccessful, 0 is returned. status =pressure.startPressure(3); if (status !=0) { // Wait for the measurement to complete:delay(status); // Retrieve the completed pressure measurement:// Note that the measurement is stored in the variable P. // Note also that the function requires the previous temperature measurement (T). // (If temperature is stable, you can do one temperature measurement for a number of pressure measurements.) // Function returns 1 if successful, 0 if failure. status =pressure.getPressure(P,T); if (status !=0) { // Print out the measurement:// Serial.print("absolute pressure:"); // Serial.print(P,2); // Serial.print(" mb, "); // Serial.print(P*0.0295333727,2); // Serial.println(" inHg"); // The pressure sensor returns abolute pressure, which varies with altitude. // To remove the effects of altitude, use the sealevel function and your current altitude. // This number is commonly used in weather reports. // Parameters:P =absolute pressure in mb, ALTITUDE =current altitude in m. // Result:p0 =sea-level compensated pressure in mb seaPressure =pressure.sealevel(P,ALTITUDE); // we're at 160 meters (Kenley, Surrey UK) // serial removed /* Serial.print("relative (sea-level) pressure:"); Serial.print(seaPressure,2); Serial.print(" mb, "); Serial.print(seaPressure*0.0295333727,2); Serial.println(" inHg"); */ // On the other hand, if you want to determine your altitude from the pressure reading, // use the altitude function along with a baseline pressure (sea-level or other). // Parameters:P =absolute pressure in mb, p0 =baseline pressure in mb. // Result:a =altitude in m. a =pressure.altitude(P,seaPressure); // Serial.print("computed altitude:"); // Serial.print(a,0); // Serial.print(" meters, "); // Serial.print(a*3.28084,0); // Serial.println(" feet"); } else Serial.println("error retrieving pressure measurement\n"); } else Serial.println("error starting pressure measurement\n"); } else Serial.println("error retrieving temperature measurement\n"); } else Serial.println("error starting temperature measurement\n");}//Serial.print("hourscalc "); // Serial.println(hourcalc);if (hourcalc ==0){ hour0 =seaPressure;//was rnd sea pressure currentDisplay =hourDiff; // the last display reading becomes the old reading called currentDisplay hourDiff =hour0 - hour3; // this is the air pressure difference from now to the reading 3 hours ago and wil be displayed onthe 3 hour dial calcCurrentDisp (); // calculates 3 hour Air pressure display }else if (hourcalc ==1){ hour1 =seaPressure; currentDisplay =hourDiff; hourDiff =hour1 - hour4; calcCurrentDisp (); }else if (hourcalc ==2 ){ hour2 =seaPressure; currentDisplay =hourDiff;hourDiff =hour2 - hour0; calcCurrentDisp (); }else if (hourcalc ==3 ){ hour3 =seaPressure; currentDisplay =hourDiff; hourDiff =hour3 - hour1; calcCurrentDisp (); }else if (hourcalc ==4 ){ hour4 =seaPressure; currentDisplay =hourDiff; hourDiff =hour4 - hour2; calcCurrentDisp (); }//show 3 hour pressure scale hi/low LEDsif(hourDiff> 9 || hourDiff <-9) // if 3 hour pressure is outside of extended range both hi and low range leds light{digitalWrite( hour3HighLED, HIGH); digitalWrite( hour3LowLED, HIGH);}else if(hourDiff>=4.80) { digitalWrite( hour3HighLED, HIGH); digitalWrite( hour3LowLED, LOW); } else if (hourDiff <=-4.80) { digitalWrite( hour3LowLED, HIGH); digitalWrite( hour3HighLED, LOW); } else if ( hourDiff <4.80 &&hourDiff>-4.80 ) { digitalWrite( hour3LowLED, LOW); digitalWrite( hour3HighLED, LOW); } // Serial.print("currentDisplay (old) ");// serial removed // Serial.println(currentDisplay);// serial removed// Serial.print("3 hour display to show ");// serial removed// Serial.println(hourDiff);// serial removed//Serial.print("RND seaPressure ");//Serial.println(round(seaPressure));//get pressure change and show change over 1 hour on LCD bottom row pressureNow =seaPressure; if ( pressureNow !=pressurePrevious || initial ) { initial =0; pressureDiff =pressureNow - pressurePrevious; //Print pressure and diff on LCD lcd.setCursor(0,3); if (pressurePrevious ==0.00) { pressurePrevious =pressureNow;// shows previous pressure at startup } if(pressurePrevious<1000) { lcd.print(0); } lcd.print(pressurePrevious);// shows previous pressure until 1hPa change lcd.print("hPa "); // pressurePrevious =pressureNow; lcd.setCursor(12,3); lcd.print(" ");//blank section lcd.setCursor(12,3); lcd.print(pressureDiff); // show rounded pressure reading on display updayes every hour lcd.setCursor(0,2);液晶打印(“”); // show rounded pressure on lcd lcd.setCursor(0,2); if(pressureNow<1000) { lcd.print(0); } lcd.print(round(pressureNow)); } pressureRndPrevious =pressureRndNow; pressurePrevious =pressureNow;//resets pressure change//################################################################################# } //####################################################################// show forecast on LEDs/* Predicting the Weather With the BarometerMore specifically, a barometer with readings in hPa can be interpreted in this manner:If the reading is over 1022 hPa Rising or steady pressure means continued fair weather.Slowly falling pressure means fair weather.Rapidly falling pressure means cloudy and warmer conditions.If it falls between 1009–1022 hPa Rising or steady pressure means present conditions will continue.Slowly falling pressure means little change in the weather.Rapidly falling pressure means that rain is likely, or snow if it is cold enough.If the reading is under (1009 hPaRising or steady pressure indicates clearing and cooler weather.Slowly falling pressure indicates rainRapidly falling pressure indicates a storm is coming.Rising or Fallin g slowlyPressure change of 0.1 to 1 mb in the preceding three hoursRising or FallingPressure change of 1 to 3 mb in the preceding three hoursRising or Falling quicklyPressure change of 3 to 6 mb in the preceding three hoursRising or Falling very rapidlyPressure change of more than 6.0 mb in the preceding three hours */void getForecast(){ //reading is under (1009 hPa //Rising or steady pressure indicates clearing and cooler weather if(seaPressure <1009.00 &&hourDiff>=0 ) { ClearforecastLED();// clear all forecast LEDs before changing digitalWrite( ledChange, HIGH); digitalWrite( ledClear, HIGH); lcd.setCursor(8,2);液晶打印(“”); lcd.setCursor(8,2); lcd.print("Chg Clearing"); } //reading is under (1009 hPa //Slowly falling pressure indicates rain else if(seaPressure <1009.00 &&hourDiff <0 &&hourDiff>=-1.5 ) { ClearforecastLED(); digitalWrite( ledRain, HIGH); digitalWrite( ledThreat, HIGH); lcd.setCursor(8,2); lcd.print(" "); lcd.setCursor(8,2); lcd.print("Rain Threat"); } //reading is under (1009 hPa //Rapidly falling pressure indicates a storm is coming. else if(seaPressure <1009.00 &&hourDiff <-1.5 ) { ClearforecastLED(); digitalWrite( ledStormy, HIGH); digitalWrite( ledThreat, HIGH); lcd.setCursor(8,2); lcd.print(" "); lcd.setCursor(8,2); lcd.print("Storm Threat"); } //1009–1022 hPa //Rising or steady pressure means present conditions will continue. //Slowly falling pressure means little change in the weather. else if(seaPressure>=1009.00 &&seaPressure <=1022.00 &&hourDiff>=-1.5 &&hourDiff <=1.5 ) { ClearforecastLED(); digitalWrite( ledNoChange, HIGH); digitalWrite( ledFair, HIGH); lcd.setCursor(8,2); lcd.print(" "); lcd.setCursor(8 ,2); lcd.print("Fair No Chge"); }//1009–1022 hPa //Rising rapidly //Clearing else if(seaPressure>=1009.00 &&seaPressure <=1022.00 &&hourDiff>1.5 )...This file has been truncated, please download it to see its full contents.

示意图


制造工艺

  1. 无液气压计
  2. 血压计
  3. 灭火器
  4. 压力表
  5. Arduino Spybot
  6. FlickMote
  7. 自制电视 B-Gone
  8. 主时钟
  9. Arduino + ESP 气象箱
  10. 找到我
  11. Arduino Power
  12. Tech-TicTacToe