Project tutorial
Arduino Barometer

Arduino Barometer © CC BY-NC

Arduino Stepper Motor Barometer with additional displays for last 3 & 6 hour pressure changes.

  • 3,487 views
  • 10 comments
  • 22 respects

Components and supplies

About this project

Using an Arduino UNO and Nano to display Air Pressure on a 12" (300m) analogue display using 3 stepper motors.

There is a choice to 2 dial designs modern and classic.

Air Pressure in hPa (Hectopascal) is displayed on the large main dial and is updated every 10 minutes.

There are 2 secondary dials, one shows the last 6 hour pressure change and the other shows the last 3 hour pressure change.

The 3 hour dial has an increased resolution of 0.5 hPa as this is used for weather forecasting. There are LEDs to show when extended range is in use on all three displays and also LEDs to indicate the weather forecast off the 3 hour display.

Inside the case two 20x4 LCD screens show info from each of the microprocessors.

The main air pressure display and 6 hour display are controlled by a RTC. This clock also provides a 1 hour pulse for the 3 hour display.

Step 1: Comparison to a Conventional Analogue Barometer

Most analogue barometers pic. 2 just use the air pressure as an indication to predict the weather and you have to remember to set the movable pointer and note the time it was set to see air pressure change.

The weather is simply written around the dial and read off from the pointer. Forecasting is a little bit more complicated that as you have to use the 2nd pointer and make note of any change over a 3 hour period. You will have to memories the combinations of current pressure and rising/falling pressure to get your forecast.

My Barometer continuously monitors the the pressure change over a 3 hour and 6 hour period and displays these readings on 2 seperate dials.

pic.1 shows my barometer's range of weather predictions.

pic.3 shows a close up of the weathr prediction LEDs. The weather prediction is based on the last 3 hour air pressure change.

Step 2: Barometer Demo Predicting a Storm

This time-lapse animation shows how the Barometer hands and forecast LEDs react to a comming storm.

Step 3: Extended Range Dials

All three dial have extended ranges. This allows larger displayed resolution on the dials for normal weather. In extreme weather conditions the dials switch to extended range.

The animation pic1. shows how the LEDs light when extended range is in operation. The Red LED shows when the reading is +5 and above. You would then read the Red scale lettering. The Green LED shows when the reading is -5 and below. You would then read the Green scale lettering. If the reading goes beyond the extended range eg on this dial above +9 or -9 both LEDs will light to show this- see next section.

Pressure readings Over Extended RangePic.2 If the pressure reading is over the extended range + or - then both LEDs will light to warn you that extreme readings or changes have taken place. The dials will actually still show the readings eg on the 3 hour dial if the reading was -10 then the dial would point to 0 with both LEDs lit. If the 3 hour reading was -11 then the dial would point to -1 with both LEDs lit. You just add 10 to the reading.

In the animation below the 3 hour pressure difference is starts at 0 and the pressure difference is going down. At -5 hPa the green LED lights to indicate negative extended range is in use. The pressure change keeps dropping until it reaches -10hPa. This is now over the extended range so the Red LED also lights. The pressure then drops again to -11hPa and both LEDs remain lit. The pressure change starts decreasing to -10 hPa and again this is still over the extended range so both LEDs remain lit. Once the pressure change drops to below -10 the Red LED will go out showing extended range is again in use.

I set the extended range into the dials after checking weather extreems in the UK and while I expected the 3 hour and 6 hour extended ranges to be used I did not think the extended range would ever be used on the main Barometer display.

Pic.3 While prototyping the barometer in Jan 2020 there was a record high reading of 1050hPa is the South of England my main barometer went into the extended range with the pointer on the red 1050 and the red high range LED lit.

Step 4: LCD Information Displays

3 Hour

Pic.1 & 2 This display shows the 3 hour readings and information on the 3 hour dial. It also shows the weather forecast based on the current and last 3 hour reading.

6 Hour

Pic. 3 & 4 This display shows the main barometer dial readings and also the 6 hour readings.

Step 5: Predicting the Weather

The weather forecast on my barometer uses 8 LEDs.

Using the current air pressure and rate of change over the last 3 hours the weather is predicted on the LEDs.

Animation 1 shows the various combination of forecast LED combinations.

I have visited a number of weather sites and have gathered the following info on predicting the weather with a barometer.

Predicting the Weather With the Barometer

More 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 hPa

Rising or steady pressure indicates clearing and cooler weather.Slowly falling pressure indicates rainRapidly falling pressure indicates a storm is coming.

Using the info above my barometer applies the following logic to predict the weather.

Logic is applied in the sequence below with the resulting LEDs lit.

Pic.2 Air pressure <1009 hPa

Rising or steady pressure indicates clearing and cooler weather

Air Pressure <1009.00 and 3 hour change >= 0

Pic.3 Air Pressure <1009 hPa

Slowly falling pressure indicates rain

Air Pressure <1009.00 and 3 hour change <0 and 3 hour change >= -1.5

Pic.4 Air Pressure <1009 hPa

Rapidly falling pressure indicates a storm is coming.

Air Pressure <1009.00 and 3 hour change < -1.5

Pic.5 Air Pressure is between 1009 and 1022 hPa

Rising or steady pressure means present conditions will continue.

Slowly falling pressure means little change in the weather.

Air Pressure >= 1009.00 and Air Pressure <= 1022.00 and 3 hour change >= -1.5 and 3 hour change <= 1.5

Pic.6 Air Pressure is between 1009 and 1022 hPa

Air Pressure rising rapidly means weather is clearing

Air Pressure >= 1009.00 and Air Pressure <= 1022.00 and 3 hour change > 1.5

Pic.7 Air Pressure is between 1009 and 1022 hPa

Rapidly falling pressure means that rain is likely, or snow if it is cold enough.

Air Pressure >= 1009.00 and Air Pressure <= 1022.00 and 3 hour change < -1.5

Pic.8 Air Pressure over 1022 hPa

Rising or steady pressure means dry weather.

Air Pressure > 1022.00 and 3 hour change >= 0

Pic.9 Air Pressure over 1022 hPa

Slowly falling pressure means fair weather.

Air Pressure > 1022.00 and 3 hour change < 0 and 3 hour change >= -1.5

Pic.10 Air Pressure over 1022 hPa

Rapidly falling pressure means change

Air Pressure > 1022.00 && 3 hour change < -1.5

Step 6: Barometer Startup

On initial power up an LED test is performed.

Once complete the hands will step to their initial settings ready to be calibrated.

Step 7: Initial Start-up Settings RTC

Pic.1 On initial power up the barometer will need to be setup using the controls on the Vero Board.

RTC

Pic.2 The RTC will need to be set to the correct time.I set it to UTC and don't bother changing to summer time. Before adjusting the time make note of the "Disp" value in this case -5. This is the value of the 6 hour hand and will be needed later in the setup. Slide the "Select Setting Enable" switch to the On position. The display will not change.

Pic.3 Slowly turn the "Select Setting" Knob clockwise and the 2nd row of the main LCD display will change.

Stop when the display shows "RTC Hour Retard" If you want to retard the RTC hours press the red "change setting" button. A single click will step the hours backwards. Multiple clicks will step back the number of clicks pressed but will take a second to update the RTC.

Pic.4 Turning the "Select Setting" Knob further will change the display to "RTC Hour Advance"

If you want to advance the RTC hours press the red "change setting" button. A single click will step the hours forwards. Multiple clicks will step forward the number of clicks pressed but will take a second to update the RTC.

Pic.5 Turning the "Select Setting" Knob further will change the display to "RTC Min Retard"

If you want to retard the RTC mins press the red "change setting" button. A single click will step the mins backwards. Multiple clicks will step back the number of clicks pressed but will take a second to update the RTC.

Pic.6 Turning the "Select Setting" Knob further will change the display to "RTC Min Advance"

If you want to advance the RTC mins press the red "change setting" button. A single click will step the mins forwards. Multiple clicks will step forwards the number of clicks pressed but will take a second to update the RTC.

Pic.7 Once you have completed the RTC setting or any other setting return the "Select Setting" Knob fully anti clockwise until the display shows "Off"

Slide the "Select Setting Enable" switch to the Off position.

Note. The seconds can be synchronized to 30 seconds at any time by pressing the black "Reset to 30 seconds" button.The time will now be remembered on the RTC if the power is turned off.

Step 8: Initial Start-up Settings 6 Hour Hand

Setting the 6 hour hand

Pic.1 Once the RTC is set the barometer and 6 hour air pressure hands need to be set.

Slide the "Select Setting Enable" switch to the On position. The display will not change.

Slowly turn the "Select Setting" Knob clockwise until "6Hr Baro Inch Retard" is displayed.

On very first power up the 6 hour hand will need calibrating to the nearest digit.

If the nearest digit is behind the hand press the red "change setting" button. A single click will inch the hand backwards step by step. Holding the button will inch the hand backward repeatedly. Once the hand is exactly on a digit release the button.

Pic.2 If the nearest digit in front of the hand or if you have inch retarded the hand using the above too much turn the "Select Setting" Knob clockwise until "6Hr Baro Inch Advn" is displayed.

Press the red "change setting" button. A single click will inch the hand forwards step by step. Holding the button will inch the hand forward repeatedly. Once the hand is exactly on a digit release the button.

Pic.3 Once the 6 hour hand has been set exactly on a digit the hour hand need to be set to the correct value.

Before adjusting the RTC you made a note of this number -5.

Pic.4 If the 6 hour display hand is too advanced.

Turn the "Select Setting" Knob clockwise until "6Hr Baro Retard" is displayed. Press and release the red "change setting" button. This sill step the 6 hour hand backward 1 whole unit. Stop when the 6 hour hand reaches your noted number.

Pic.5 If the 6 hour display hand is retarded.

Turn the "Select Setting" Knob clockwise until "6Hr Baro Advance" is displayed. Press and release the red "change setting" button. This sill step the 6 hour hand forward 1 whole unit. Stop when the 6 hour hand reaches your noted number.

Pic.6 Note the 6 hour display will take 8 hours to display correctly as it will need to store readings in memory over that period of time.

You can always add the previous air pressure readings into the code before loading is you require the 6 hour display to function from startup.

The code converts the hours to a H number as displayed above H = 6.In the code line 128 H6 will mean put the current hour reading under hour6 the previous reading in hour7 the reading before that in hour0 etc

int hour0 = 1015;

int hour1 = 1016

;int hour2 = 1015;

int hour3 = 1016;

int hour4 = 1016

;int hour5 = 1016;

int hour6 = 1012;

int hour7 = 1013;

You should be able to get your local readings off the internet.

I setup a page from my weather station so I could check this while constructing the barometer.

Click this link to see the hourly changes in Kenley Surrey UK.

Step 9: Initial Start-up Settings Main Barometer Hand

Setting the main barometer hand

Pic.1 Now the 6 hour display is correct the main barometer hand will need to be set to the rounded sea level pressure on the 3rd row down on the main LCD.

On very first power up the main barometer hand will need calibrating to the nearest digit. Turn the "Select Setting" Knob clockwise until "Baro Inch Retard" is displayed.

If the nearest digit is behind the hand press the red "change setting" button. A single click will inch the hand backwards step by step. Holding the button will inch the hand backward repeatedly. Once the hand is exactly on a digit release the button.

Pic.2 If the nearest digit in front of the hand or if you have inch retarded the hand using the above too much turn the "Select Setting" Knob clockwise until "Baro Inch Advn" is displayed.

Press the red "change setting" button.

A single click will inch the hand forwards step by step. Holding the button will inch the hand forward repeatedly.Once the hand is exactly on a digit release the button.

Pic.3 If the main barometer hand is too advanced.

Turn the "Select Setting" Knob clockwise until "Barometer Retard" is displayed.

Press and release the red "change setting" button.

This will step the main barometer hand backward 1 whole unit. Stop when the hour hand reaches your indicated rounded sea level pressure.

Pic.4 If the main barometer hand is retarded compared to the your indicated rounded sea level pressure.

Turn the "Select Setting" Knob clockwise until "Barometer Advance" is displayed.

Press and release the red "change setting" button.

This will step the main barometer hand forward 1 whole unit. Stop when the hand reaches your indicated rounded sea level pressure.

Step 10: Initial Start-up Settings 3 Hour Hand

Setting the 3 hour hand.

Oic.1 Adjustment of the 3 hour hand is by the four buttons Green, White, Blue and Yellow on the Vero board.

On initial power up the the 3 hour hand will need to be calibrated to the nearest unit or half unit.

Pic.2 If the 3 hour hand nearest unit value is in advance of the 3 hour hand press the Yellow "Slow Bwd" button to inch the hand backwards. Keeping the button pressed will repeatedly inch the hand backwards.

If the 3 hour hand nearest unit value is behind the 3 hour hand press the Blue "Slow Fwd" button to inch the hand forwards. Keeping the button pressed will repeatedly inch the hand forwards.

Once the 3 hour hand is exactly on a unit/half unit the hand can be set to the value "D" on the 3 hour LCD display.

If in the hand is in advance of the value "D" press the White "3Hr Step Bwd" button to step the 3 hour hand in half units backwards.

If in the hand is in less than the value "D" press the Green "3Hr Step Fwd" button to step the 3 hour hand in half units forwards.

Note the 3 hour display will take 4 hours to display correctly as it will need to store readings in memory over that period of time.

You can always add the previous air pressure readings into the code before loading is you require the forecast and 3 hour display to function from startup.

3 hour display code at line 124

float hour0 is current hour

float hour1 is previous hour etc etc

float hour0 = 1036.00;

float hour1 = 1036.00;

float hour2 = 1036.00;

float hour3 = 1036.00;

float hour4 = 1036.00;

You should be able to get your local readings off the internet.

Step 11: Modules/Components

Modules

Where possible this project uses prebuilt modules to save construction and design time.

Microprocessors

This project uses 2 microprocessors an Atmega 328(UNO) pic.1 and an Arduino Nano pic.2. I have used this combination as I had already had a 328 built from another project and due to limited space on the Vero Board added the Nano as well.

Power

The Barometer uses around 65mA and this will increase a little as each motor steps for a fraction of a second every 10mins to and hour

AMS117 pic.3

The module on this project is 3.3v and is used to power the BMP180 module.

The The AMS1117 series of adjustable and fixed voltage regulators are designed to provide up to1A output current and to operatedown to 1V input-to-output differential. The dropout voltage of the device is guaranteed maximum 1.3V, decreasing at lower load currents.On-chip trimming adjusts the reference voltage to 1.5%. Current limit is set to minimize the stress under overload conditions on both the regulator and power source circuitry. The module on this project is 3.3v and is used to power the BMP180 module.

LM2596 Buck DC to DC Converter 3.0-40V to 1.5-35V pic.4This module converts the 12v input to 5v

BMP180 Pressure Sensor Module 2 off pic.5The BMP180 Breakout is a barometric pressure sensor with an I2C ("Wire") interface.Barometric pressure sensors measure the absolute pressure of the air around them. This pressure varies with both the weather and altitude. Depending on how you interpret the data, you can monitor changes in the weather, measure altitude, or any other tasks that require an accurate pressure reading.

Connect the +, -, CL, and DA pins to your Arduino.

CL goes to SCL and DA goes to SDA.

IMPORTANT: Connect the power pins (+ and -) ONLY to a 3.3V supply. Larger voltages will permanently damage the part.Note that because I2C uses open drain drivers, it is safe to connect the I2C pins (DA and CL) to an I2C port on a 5V microprocessor.

RTC real time clock pic.6

This brometer uses a DS3231 AT24C32 I2C Precision Real Time Clock Module.

This module is used mainly for timing but also supplies time stamps on the LCD display. Time is set to UTC and is not changed for summertime.The module comes supplied with a Lithium-Ion rechargeable battery see diagram above. I use a non rechargeable battery so have removed resistor R5 from the module see RTC Modification section for details.

Stepper Motors 3 offThe barometer uses 3 Nema 17 Stepper Motors 1A, 13N.cm Holding Torque, 4-Lead, 1.8° I used 1.8° motors as the steps fit exactly into 360° 200 times. You can use Nema 8 motors if you wish but don't use 28BYJ-48-5V motors as they don't have the required 1.8° step angle.

The 1.8° step angle is required as it divides exactly in 360° for my barometer dials.

LCD Displays 2 off

I have used 2 20x4 LCD displays one for the Barometer, clock and 6 hour display and the other for the 3 hour display and forecast.

Step 12: Modules/Components A4988 Stepper Motor Driver

A4988 microstepping bipolar stepper motor driver 3 off

Important read this section carefully

My Barometer is set to 1/16th step rotation and the code is adjusted accordingly.

A4988 microstepping bipolar stepper motor driver pic.1 with and pic.2 without heatsink

This breakout board for Allegro’s A4988 microstepping bipolar stepper motor driver features adjustable current limiting, over-current and over-temperature protection, and five different microstep resolutions (down to 1/16-step).

It operates from 8 V to 35 V and can deliver up to approximately 1 A per phase without a heat sink or forced air flow (it is rated for 2 A per coil with sufficient additional cooling).

Here are some of the driver’s key features:Simple step and direction control interface Five different step resolutions: full-step, half-step, quarter-step, eighth-step, and sixteenth-step Adjustable current control lets you set the maximum current output with a potentiometer, which lets you use voltages above your stepper motor’s rated voltage to achieve higher step rates Intelligent chopping control that automatically selects the correct current decay mode (fast decay or slow decay) Over-temperature thermal shutdown, under-voltage lockout, and crossover-current protection Short-to-ground and shorted-load protection

Power connectionsThe driver requires a logic supply voltage (3 – 5.5 V) to be connected across the VDD and GND pins and a motor supply voltage (8 – 35 V) to be connected across VMOT and GND. These supplies should have appropriate decoupling capacitors close to the board, and they should be capable of delivering the expected currents (peaks up to 4 A for the motor supply).

Warning: This carrier board uses low-ESR ceramic capacitors, which makes it susceptible to destructive LC voltage spikes, especially when using power leads longer than a few inches. Under the right conditions, these spikes can exceed the 35 V maximum voltage rating for the A4988 and permanently damage the board, even when the motor supply voltage is as low as 12 V. One way to protect the driver from such spikes is to put a large (at least 47 µF) electrolytic capacitor across motor power (VMOT) and ground somewhere close to the board.

Motor connections

Four, six, and eight-wire stepper motors can be driven by the A4988 if they are properly connected. Warning: Connecting or disconnecting a stepper motor while the driver is powered can destroy the driver. (More generally, rewiring anything while it is powered is asking for trouble.)

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 LImitingBefore 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.

Pic. 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

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.

Code

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 365
v5 remove unwamted step elements
v6 convert to diff display on 6 hr motor
v8 modified hour change formula 1486
v9 sleep
v10 chnged high/low for EN control 
v11 chenge calc for hour change 1380
v12 added calcCurrentDisp (); to calc current time from line 1384
v13 removed 30 sec sync
v14 air pressure extremes LEDs
v15 add hour diff hour calc etc to row 1 when not on settings
v16 adding 16th steps
v17 error
v18 change min pulse to hour pulse on the hour + 1min
v19 check enable and sleeps
v20 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 -19
v21 same as 20 with serial print removed
v23 notes added LCD display info added to startup 
*/
#include <SFE_BMP180.h> //SFE_BMP180 pressure sensor
#include <Wire.h>
#include <SPI.h>
#include <LiquidCrystal_I2C.h>

// ######## 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 used for LCD connections:
//                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_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 decimal
byte decToBcd(byte val)
{
  return( (val/10*16) + (val%10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return( (val/16*10) + (val%16) );
}




// Include the AccelStepper library:
#include <AccelStepper.h>

// 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 motor
AccelStepper stepper2 = AccelStepper(motorInterfaceType, stepPin2, dirPin2);// 6 hour motor


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 = 4; // allows adjustment of barometer
// int test = 0; // test mode 0 off 1 is on

char 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 seconds
int 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 pot
int settingVal = 0; // Analogue value 0-1023
int LCDstop = 0; // stops settings on LCD display refreshing until they change
int hourPulse = 13; //min pulse for seconds display was 14
int adjustLock = 0; // turns off adjust lock
int 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 step
int currentDisplay = 0; //current 6hour change reading
int hour0 = 1013; // you can set last 8 hours pressure here or leave at 0 and the
int hour1 = 1014; // readings will catch up over the next 8 hours
int 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 Test
digitalWrite(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.print("  ");
    lcd.setCursor(0,1);
    lcd.print("H");
    lcd.print(hourcalc);

   lcd.setCursor(2,1);
    lcd.print("      ");
    lcd.setCursor(2,1);
   lcd.print("Old");
   lcd.print(currentDisplay);

   lcd.setCursor(13,1);
   lcd.print("       ");
   lcd.setCursor(13,1);
   lcd.print("Disp");
   lcd.print(hourDiff);

   

//disable motors on startup
digitalWrite(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 mins

adjustLock = 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);
    lcd.print("  ");

  
 //   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 motor
if (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.print("  ");
    lcd.setCursor(0,1);
    lcd.print("H");
    lcd.print(hourcalc);

   lcd.setCursor(2,1);
    lcd.print("      ");
    lcd.setCursor(2,1);
   lcd.print("Old");
   lcd.print(currentDisplay);

   lcd.setCursor(13,1);
   lcd.print("       ");
   lcd.setCursor(13,1);
   lcd.print("Disp");
   lcd.print(hourDiff);
 

   
   

   
  }
 }


    
  }




 // Set Clock/Motors###################################################################################################
//gets advance retard settings from pot
void 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.print("                    ");
     lcd.setCursor(0,1);
    lcd.print("Barometer Advance");
    LCDstop=1;
    
    
  }


 if ( settingVal >= 85 && settingVal < 170 && LCDstop==1)
  {
    
     lcd.setCursor(0,1);
     lcd.print("                    ");
     lcd.setCursor(0,1);
    lcd.print("Barometer Retard");
    LCDstop=0;
  }

  if ( settingVal >= 170 && settingVal < 255  && LCDstop==0 )
  {
    
     lcd.setCursor(0,1);
     lcd.print("                    ");
     lcd.setCursor(0,1);
    lcd.print("Baro Inch Advance");
    LCDstop=1;
  }

   if ( settingVal >= 255 && settingVal < 340 && LCDstop==1 )
  {
   
    lcd.setCursor(0,1);
     lcd.print("                    ");
     lcd.setCursor(0,1);
    lcd.print("Baro Inch Retard");
    LCDstop=0;
  }

    if ( settingVal >= 340 && settingVal < 425 && LCDstop==0 )
  {

     lcd.setCursor(0,1);
     lcd.print("                    ");
     lcd.setCursor(0,1);
    lcd.print("6Hr Baro Advance");
    LCDstop=1;
  }

   if ( settingVal >= 425 && settingVal < 510 && LCDstop==1 )
  {
   lcd.setCursor(0,1);
     lcd.print("                    ");
     lcd.setCursor(0,1);
    lcd.print("6Hr Baro Retard");

    LCDstop=0;
  }

  if ( settingVal >= 510 && settingVal < 595 && LCDstop==0 )
  {
    lcd.setCursor(0,1);
     lcd.print("                    ");
     lcd.setCursor(0,1);
    lcd.print("6Hr Baro Inch Advn");

    LCDstop=1;
  }

  if ( settingVal >= 595 && settingVal < 690 && LCDstop==1 )
  {
   lcd.setCursor(0,1);
     lcd.print("                    ");
     lcd.setCursor(0,1);
    lcd.print("6Hr Baro Inch Retard");

    LCDstop=0;
  }

  if ( settingVal >= 690 && settingVal < 765 && LCDstop==0)
  {
   lcd.setCursor(0,1);
     lcd.print("                    ");
     lcd.setCursor(0,1);
    lcd.print("RTC Min Advance");
  
    LCDstop=1;
  }

  if ( settingVal >= 765 && settingVal < 850 && LCDstop==1 )
  {

  lcd.setCursor(0,1);
     lcd.print("                    ");
     lcd.setCursor(0,1);
    lcd.print("RTC Min Retard");
    LCDstop=0;
  }

   if ( settingVal >= 850 && settingVal < 900 && LCDstop==0 )
  {

    lcd.setCursor(0,1);
     lcd.print("                    ");
     lcd.setCursor(0,1);
    lcd.print("RTC Hour Advance");
    
    LCDstop=1;
  }

  if ( settingVal >= 900 && settingVal < 970 && LCDstop==1 )
  {
  lcd.setCursor(0,1);
     lcd.print("                    ");
     lcd.setCursor(0,1);
    lcd.print("RTC Hour Retard");

    LCDstop=0;
  }

 if ( settingVal >= 970 && settingVal < 1025 && LCDstop==0 )
  {
  lcd.setCursor(0,1);
     lcd.print("                    ");
     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 LEDs
v5 add forcast LEDs and calc
v6 sorted enable and sleep order
v7 remove adjust on and test replace it with Clearing and threatening LEDs PIN 12 and 13 
v8 add dac driver-deleted
v9 added LCD
v10 added weather forecast usingLEDs 
v12 LEds test added
v13 add 1 dp point to 3 hour display
v14 void 1026 add slow set buttons
v18 voided 
v19last reading not included in number of steps
v20 change led test order
v20a serial.print removed indicated by // serial removed
v21 as 20a identical to v20 that includes serial print

*/
#include <SFE_BMP180.h> //SFE_BMP180 pressure sensor
#include <SPI.h>
#include <LiquidCrystal_I2C.h>


// ######## 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,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_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 decimal
byte decToBcd(byte val)
{
  return( (val/10*16) + (val%10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return( (val/16*10) + (val%16) );
}


// Include the AccelStepper library:
#include <AccelStepper.h>

// 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 on

char 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-1023
int LCDstop = 0; // stops settings on LCD display refreshing until they change
int hourPulse = 3; //hour pulse from main Barometer Arduino
int adjustLock = 0; // turns off adjust lock
int 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 value
int hourStep = 0; //the amount of 3 hour to step
int  hourStepdigit1 = 0; // gets the 1st digit from hourstep
int  hourStepdigit2 = 0; // gets the 2nd digit from hourstep
int stepTotal = 0; // tptal amount of steps for 3 hour motor
int  hourChangeNeg = 0;// if hour change is -ve this stores the value to chenge stepTotal later
float currentDisplay = 0.50; //current 3hour change reading
float hour0 = 1036.00; // you can set last 3 hours pressure here or leave at 0 and the
float hour1 = 1036.00; // readings will catch up over the next 4 hours
float hour2 = 1036.00;
float hour3 = 1036.00;
float hour4 = 1036.00;

//check readings https://www.meteoplug.com/cgi-bin/meteochart.cgi?draw=a3aeaaa1acbdf9f1fcfed4fedbc2c094c0d6d6d1d2c5edcebbfee9ffeff1fbf9
int 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 LED
int hour3HighLED = 4;//Red high range LED
int ledStormy = 8;
int ledRain = 7;
int ledChange = 6;
int ledFair = 2;
int ledDry = 13;
int ledClear = 12;
int ledThreat = 17;
int ledNoChange = 16;

//Test
int 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 Test
delay (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);

 lcd.clear();
 
 getPressure ();// gets all pressure readings
 showLCD(); // load display to LCD
 getForecast(); //get forcast and set LEDs for weather
 
//disable motors on startup
digitalWrite(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/backwards
maninchFwdBwd= 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 motor
if (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 LEDs

if(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);
      lcd.print("           ");
    // 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 Barometer
More 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 hPa

Rising or steady pressure indicates clearing and cooler weather.
Slowly falling pressure indicates rain
Rapidly falling pressure indicates a storm is coming.



Rising or Falling slowly

Pressure change of 0.1 to 1 mb in the preceding three hours

Rising or Falling

Pressure change of 1 to 3 mb in the preceding three hours

Rising or Falling quickly

Pressure change of 3 to 6 mb in the preceding three hours

Rising or Falling very rapidly

Pressure 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.print("            ");
    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.

Schematics

Schematic
Schematic04 pdb0ac1exd

Comments

Similar projects you might like

Barometer with Analog Scale (Ammeter)

Project tutorial by Mirko Pavleski

  • 1,724 views
  • 0 comments
  • 7 respects

eDOT - Arduino Based Precision Clock and Weather Station

Project tutorial by antiElectron

  • 15,075 views
  • 6 comments
  • 36 respects

iShield Weather Station

Project tutorial by Victor Carreño

  • 8,690 views
  • 0 comments
  • 17 respects

Sensing the Comfort Level of Atmosphere using HUMIDEX

Project tutorial by somenjana

  • 2,839 views
  • 2 comments
  • 3 respects

How to read temperature and humidity on Blynk with DHT11

Project tutorial by Tech with Matthew

  • 21,566 views
  • 5 comments
  • 20 respects

Interfacing Nokia 5110 LCD with Arduino

by Aqib

  • 17,488 views
  • 3 comments
  • 10 respects
Add projectSign up / Login