In this part we’ll look at the Node-RED flow that controls the Arduino with a 4-Relay Shield attached. As previously mentioned, these relays are used to allow us to remotely reset the All Sky Camera and HiTechAstro Wx STn, which we found had a tendency to hang and wouldn’t reset unless the USB connection was broken and remade. As we would not be in a position to unplug and re-plug the USB connections I came up with a solution. By modified some short USB extension cables and breaking into the +5v line I could then connect to the ‘Normally Closed’ contacts of one of the relays, picking the relay effectively turns off the USB device connected to that cable.
For this solution, we don’t write any code for the Arduino but do load it with Standard Firmata code that comes with the Arduino IDE.
Just open a new sketch, select the StandardFirmata from the Examples and upload to the Arduino.
Firmata is a generic protocol for communicating with microcontrollers from software on a host computer. It is intended to work with any host computer software package.
If not done already we need to go to npm and install the node-red-node-arduino nodes.
Originally I used a Dashboard Switch to select each relay, but it can get confusing when turning on the relay turns off the device attached, so I replaced the Switch with a Button node, pass the message to a Trigger node that will activate for 7 seconds (give the OS time to recognize the USB device has been disconnected), debounce the signal before passing onto the Arduino Output node which connects to the local Arduino and writes to the selected digital pin turning the relevant Relay On.
As there are only a few basic nodes in this flow, here are some snapshots of how each is set-up:
So the above covers the two relays that are used to reset the All Sky Camera and HiTechAsto Wx Stn. The same building blocks are used to control a pair of battery power LED worklights to provide illumination for the Web Cameras we have dotted around the dome and on the mount. After inadvertently leaving the lights on, on one occasion, the batteries needed to be replaced after a single use. So now in addition to having switches control the lights, we also have Buttons to push for preset times on of 1, 3, 7 or 10 minutes, with an option to turn them off early.
Wrapping up for today
Here’s the Node-RED flow for the Relay Shield
[{"id":"f126d47c.2ee7f8","type":"tab","label":"Keyestudio 4Relay Shield","disabled":false,"info":""},{"id":"56ffe7a5.6b85f8","type":"comment","z":"f126d47c.2ee7f8","name":"Arduino with keystudio 4 relay shield on /dev/tty.usbmodem144301","info":"Bob T - 28July2019\n\nKeyestudio 4 card shield to control LED lights, \nHiTechAstroDeluxe weather station and \nZWO ASI120MC All Sky Camera \n\nBosch BME280 and Dallas DS18B20 displays on the Dashboard","x":440,"y":60,"wires":[]},{"id":"2e774dcf.e58aa2","type":"inject","z":"f126d47c.2ee7f8","name":"Off","topic":"","payload":"false","payloadType":"bool","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":125,"y":233,"wires":[["303f7492.3f85ec"]]},{"id":"303f7492.3f85ec","type":"delay","z":"f126d47c.2ee7f8","name":"de-bounce","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"x":310,"y":243,"wires":[["d50e09b8.fb1c18","2749f02d.7190b"]]},{"id":"84dc6735.a3c618","type":"inject","z":"f126d47c.2ee7f8","name":"On","topic":"","payload":"true","payloadType":"bool","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":125,"y":263,"wires":[["303f7492.3f85ec"]]},{"id":"5c5f0bd2.1c2534","type":"inject","z":"f126d47c.2ee7f8","name":"Off","topic":"","payload":"false","payloadType":"bool","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":130,"y":463,"wires":[["f88adc8a.2c784"]]},{"id":"d7751e20.14c83","type":"inject","z":"f126d47c.2ee7f8","name":"On","topic":"","payload":"true","payloadType":"bool","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":130,"y":493,"wires":[["f88adc8a.2c784"]]},{"id":"d59eb4bd.942ae8","type":"inject","z":"f126d47c.2ee7f8","name":"Off","topic":"","payload":"false","payloadType":"bool","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":110,"y":615,"wires":[["2743f87.650a908"]]},{"id":"c1c23f86.91668","type":"inject","z":"f126d47c.2ee7f8","name":"On","topic":"","payload":"true","payloadType":"bool","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":110,"y":645,"wires":[["2743f87.650a908"]]},{"id":"84553f20.8f26c","type":"inject","z":"f126d47c.2ee7f8","name":"Off","topic":"","payload":"false","payloadType":"bool","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":110,"y":840,"wires":[["35bc3b9f.4f8f94"]]},{"id":"39cd3cf9.7a7024","type":"inject","z":"f126d47c.2ee7f8","name":"On","topic":"","payload":"true","payloadType":"bool","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":110,"y":870,"wires":[["35bc3b9f.4f8f94"]]},{"id":"f88adc8a.2c784","type":"delay","z":"f126d47c.2ee7f8","name":"de-bounce","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"x":315,"y":478,"wires":[["f55deca6.8236f","ec02039f.f8b64"]]},{"id":"2743f87.650a908","type":"delay","z":"f126d47c.2ee7f8","name":"de-bounce","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"x":520,"y":630,"wires":[["9f8d9580.1d3348"]]},{"id":"35bc3b9f.4f8f94","type":"delay","z":"f126d47c.2ee7f8","name":"de-bounce","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"x":520,"y":855,"wires":[["b44e31bd.88ac2"]]},{"id":"2749f02d.7190b","type":"debug","z":"f126d47c.2ee7f8","name":"","active":true,"tosidebar":true,"console":true,"tostatus":true,"complete":"payload","x":650,"y":218,"wires":[]},{"id":"ec02039f.f8b64","type":"debug","z":"f126d47c.2ee7f8","name":"","active":true,"tosidebar":true,"console":true,"tostatus":true,"complete":"payload","x":550,"y":428,"wires":[]},{"id":"a5a681c5.89e44","type":"trigger","z":"f126d47c.2ee7f8","op1":"1","op2":"0","op1type":"num","op2type":"str","duration":"7","extend":false,"units":"s","reset":"","bytopic":"all","name":"","x":345,"y":158,"wires":[["d0ab65b2.542c38","303f7492.3f85ec"]]},{"id":"d0ab65b2.542c38","type":"debug","z":"f126d47c.2ee7f8","name":"","active":true,"tosidebar":false,"console":false,"tostatus":true,"complete":"payload","x":640,"y":158,"wires":[]},{"id":"af46adb4.e7a03","type":"inject","z":"f126d47c.2ee7f8","name":"","topic":"","payload":"true","payloadType":"bool","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":125,"y":158,"wires":[["a5a681c5.89e44"]]},{"id":"688bcc2f.63ec14","type":"trigger","z":"f126d47c.2ee7f8","op1":"1","op2":"0","op1type":"str","op2type":"str","duration":"7","extend":false,"units":"s","reset":"","bytopic":"all","name":"","x":315,"y":360,"wires":[["f88adc8a.2c784"]]},{"id":"ab716ad9.cd6008","type":"inject","z":"f126d47c.2ee7f8","name":"","topic":"","payload":"true","payloadType":"bool","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":125,"y":390,"wires":[["688bcc2f.63ec14"]]},{"id":"5a6fb133.d07c7","type":"trigger","z":"f126d47c.2ee7f8","op1":"1","op2":"0","op1type":"str","op2type":"str","duration":"10","extend":false,"units":"min","reset":"false","bytopic":"all","name":"","x":415,"y":1035,"wires":[["35bc3b9f.4f8f94","2743f87.650a908"]]},{"id":"d50e09b8.fb1c18","type":"arduino out","z":"f126d47c.2ee7f8","name":"ZWO ASI120MC USB reset","pin":"7","state":"OUTPUT","arduino":"ae78048.c81a0f8","x":585,"y":285,"wires":[]},{"id":"f55deca6.8236f","type":"arduino out","z":"f126d47c.2ee7f8","name":"HiTechAstro Deluxe Wx Stn reset","pin":"6","state":"OUTPUT","arduino":"ae78048.c81a0f8","x":610,"y":478,"wires":[]},{"id":"9f8d9580.1d3348","type":"arduino out","z":"f126d47c.2ee7f8","name":"West LED lighting","pin":"5","state":"OUTPUT","arduino":"ae78048.c81a0f8","x":705,"y":630,"wires":[]},{"id":"b44e31bd.88ac2","type":"arduino out","z":"f126d47c.2ee7f8","name":"East LED lighting","pin":"4","state":"OUTPUT","arduino":"ae78048.c81a0f8","x":705,"y":855,"wires":[]},{"id":"d111e9f5.d3a008","type":"ui_switch","z":"f126d47c.2ee7f8","name":"Switch Relay4","label":"Switch East LED Lights on","tooltip":"","group":"4486153f.db803c","order":2,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","x":120,"y":930,"wires":[["35bc3b9f.4f8f94"]]},{"id":"1ed486f7.f803b9","type":"ui_switch","z":"f126d47c.2ee7f8","name":"Switch Relay3","label":"Switch West LED Lights on","tooltip":"","group":"4486153f.db803c","order":1,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","x":125,"y":690,"wires":[["2743f87.650a908"]]},{"id":"4cfa9507.32412c","type":"ui_button","z":"f126d47c.2ee7f8","name":"","group":"207b2faf.303c7","order":1,"width":0,"height":0,"passthru":false,"label":"Reset ZWO ASI120MC","tooltip":"Press to reset camera, power will be turned off for 7 seconds","color":"","bgcolor":"","icon":"","payload":"true","payloadType":"bool","topic":"","x":170,"y":113,"wires":[["a5a681c5.89e44"]]},{"id":"334aa4c3.95f1bc","type":"ui_button","z":"f126d47c.2ee7f8","name":"","group":"207b2faf.303c7","order":1,"width":0,"height":0,"passthru":false,"label":"Reset Wx Stn","tooltip":"Press to reset Weather Station, power is removed for 7 seconds","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"","x":140,"y":338,"wires":[["688bcc2f.63ec14"]]},{"id":"dce61d46.cf408","type":"ui_button","z":"f126d47c.2ee7f8","name":"","group":"4486153f.db803c","order":6,"width":0,"height":0,"passthru":false,"label":"White LEDs on 10 min Timer","tooltip":"","color":"","bgcolor":"","icon":"","payload":"true","payloadType":"bool","topic":"","x":155,"y":987,"wires":[["5a6fb133.d07c7"]]},{"id":"1e8859e3.2aa6a6","type":"ui_button","z":"f126d47c.2ee7f8","name":"","group":"4486153f.db803c","order":4,"width":0,"height":0,"passthru":false,"label":"White LEDs on 3 min Timer","tooltip":"","color":"","bgcolor":"","icon":"","payload":"true","payloadType":"bool","topic":"","x":160,"y":780,"wires":[["88932bbe.119258"]]},{"id":"88932bbe.119258","type":"trigger","z":"f126d47c.2ee7f8","op1":"1","op2":"0","op1type":"str","op2type":"str","duration":"3","extend":false,"units":"min","reset":"false","bytopic":"all","name":"","x":415,"y":780,"wires":[["2743f87.650a908","35bc3b9f.4f8f94"]]},{"id":"ab204ac6.07c528","type":"ui_button","z":"f126d47c.2ee7f8","name":"","group":"4486153f.db803c","order":5,"width":0,"height":0,"passthru":false,"label":"White LEDs on 7 min Timer","tooltip":"","color":"","bgcolor":"","icon":"","payload":"true","payloadType":"bool","topic":"","x":150,"y":1035,"wires":[["d37c1fc3.44ece"]]},{"id":"d37c1fc3.44ece","type":"trigger","z":"f126d47c.2ee7f8","op1":"1","op2":"0","op1type":"str","op2type":"str","duration":"7","extend":true,"units":"min","reset":"false","bytopic":"all","name":"","x":415,"y":990,"wires":[["35bc3b9f.4f8f94","2743f87.650a908"]]},{"id":"9ec5abcd.94bff8","type":"ui_button","z":"f126d47c.2ee7f8","name":"","group":"4486153f.db803c","order":3,"width":0,"height":0,"passthru":false,"label":"White LEDs on 1 min Timer","tooltip":"","color":"","bgcolor":"","icon":"","payload":"true","payloadType":"bool","topic":"","x":160,"y":740,"wires":[["871ac8c.880b438"]]},{"id":"871ac8c.880b438","type":"trigger","z":"f126d47c.2ee7f8","op1":"1","op2":"0","op1type":"str","op2type":"str","duration":"1","extend":false,"units":"min","reset":"false","bytopic":"all","name":"","x":415,"y":735,"wires":[["35bc3b9f.4f8f94","2743f87.650a908"]]},{"id":"9b4c5ff.75b30a","type":"ui_button","z":"f126d47c.2ee7f8","name":"","group":"4486153f.db803c","order":6,"width":0,"height":0,"passthru":false,"label":"Turn Off All Lights","tooltip":"","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"","x":120,"y":1080,"wires":[["eb116cf.e91769"]]},{"id":"eb116cf.e91769","type":"trigger","z":"f126d47c.2ee7f8","op1":"0","op2":"false","op1type":"str","op2type":"bool","duration":"250","extend":false,"units":"ms","reset":"","bytopic":"all","name":"Reset Lights","x":355,"y":1095,"wires":[["d37c1fc3.44ece","5a6fb133.d07c7","88932bbe.119258","871ac8c.880b438","35bc3b9f.4f8f94","2743f87.650a908"]]},{"id":"9fd74bd7.3fd648","type":"ui_button","z":"f126d47c.2ee7f8","name":"","group":"4486153f.db803c","order":7,"width":0,"height":0,"passthru":true,"label":"Don't Push this button","tooltip":"","color":"","bgcolor":"","icon":"","payload":"true","payloadType":"bool","topic":"","x":250,"y":1290,"wires":[["2ed3e3dc.0f6cac"]]},{"id":"2ed3e3dc.0f6cac","type":"trigger","z":"f126d47c.2ee7f8","op1":"true","op2":"false","op1type":"bool","op2type":"bool","duration":"1","extend":false,"units":"s","reset":"","bytopic":"all","name":"","x":435,"y":1290,"wires":[["8af19751.a0fec8"]]},{"id":"ffabd20f.040af","type":"inject","z":"f126d47c.2ee7f8","name":"","topic":"","payload":"true","payloadType":"bool","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":80,"y":1290,"wires":[["9fd74bd7.3fd648"]]},{"id":"8af19751.a0fec8","type":"arduino out","z":"f126d47c.2ee7f8","name":"","pin":"13","state":"OUTPUT","arduino":"ae78048.c81a0f8","x":590,"y":1290,"wires":[]},{"id":"ae78048.c81a0f8","type":"arduino-board","z":"","device":"COM16"},{"id":"4486153f.db803c","type":"ui_group","z":"f126d47c.2ee7f8","name":"IMT3 - Lights","tab":"a9e9728d.77c83","order":6,"disp":true,"width":"6","collapse":true},{"id":"207b2faf.303c7","type":"ui_group","z":"","name":"Reset Controls","tab":"a9e9728d.77c83","order":7,"disp":true,"width":"6","collapse":true},{"id":"a9e9728d.77c83","type":"ui_tab","z":"f126d47c.2ee7f8","name":"IMT3","icon":"dashboard","order":2,"disabled":false,"hidden":false}]
I chose to run Node-RED locally on my Windows 10 laptop so my first step was to download and install a supported prerequisite version of Node.js which will also include npm (Node Package Manager).
npm is the worlds largest Software Registry containing over 800,000 code packages. It is free to use and Open-source developers use npm to share their software.
npm includes a CLI (Command Line Client) that we will use to download and install software.
Having installed Node.js open Windows PowerShell to execute the npm cli command to install Node-RED
npm install -g --unsafe-perm node-red
The command installs Node-RED as a global module along with its dependencies.
Once installed as a global module we can use the node-red command to start Node-RED in a terminal. Ctrl-C or closing the terminal window will stop Node-RED.
You can then access the Node-RED editor by pointing your browser at http://localhost:1880/
To access the Node-RED Dashboard point your browser at http://localhost:1881/
By default, Projects are disabled 🙁 , so brush up on your Vi skills* as we need to go and edit settings.js file located in the .node-red directory. *other editors are available.
Just remember to press escape key, colon, w q bang when done! … now where did I drag that up from, I hadn’t used Vi in years!
After an initial foray into Node-RED, I realised I would need to use Projects within Node-RED. A pre-req for this is Git. With that installed I was good to create my first Project.
I was surprised how quickly I was able get some meaningful results and was soon using npm to add nodes from the Node-RED library for the Dashboard, Arduino and much more. It wasn’t long before I had my first Dashboard displaying the output of the BME280 sensor which looked like the following:
An early comment from our dear friend Mil Dave asked “What’s the Dew Point“? … thanks Dave !
Google to the rescue, however the Dewpoint calculation formulae found on the web look pretty scary. Fortunately a search of the Node-RED library found a flow with a dewpoint function defined that I was able to adapt to my flow. A snapshot of the flow follows as it is now beginning to take shape and looks like this:
The green debug nodes are useful to follow the message as they progress through the flow, the debug output can be displayed in the debug window, the system console or as node status appearing just below the debug node
The data from the Arduino arrives on the Serial node which is configured for the com port the Arduino is connected to. I’ve found it easier to determine the relevant com port from the Arduino IDE rather than via control panel and device manager. Also the ‘Get board info’ from the IDE has prove very useful when running Node-RED on MAC OS.
Double clicking any node will open up an Edit window to let you configure each node
Connected to the Serial node is a Split Node. This splits the incoming message into a sequence of messages and is setup to split the message when it finds a comma.
The message is passed to the next node which is a function node which contains some Javascript to give a variable name to each of the values received from the Arduino.
The next Function node Splits these seven values and presents them on a separate output of the node which can then be connected to individual Dashboard Gauges.
var msgS1C = {payload: (msg.payload.S1C).toFixed(2)};
var msgS1F = {payload: (msg.payload.S1F).toFixed(2)};
var msgS2C = {payload: (msg.payload.S2C).toFixed(2)};
var msgS2F = {payload: (msg.payload.S2F).toFixed(2)};
var msgBT = {payload: (msg.payload.BT-1.4).toFixed(1)};
var msgBH = {payload: (msg.payload.BH).toFixed(1)};
var msgBP = {payload: (msg.payload.BP).toFixed(0)};
return [msgS1C, msgS1F, msgS2C, msgS2F, msgBT, msgBH, msgBP];
Having split these values out, the Temperature and Humidity values need to be recombined by the Join node so they can be passed to the Dew Point function node.
var newMsg = {};
var parts = msg.payload.split(",");
var Th = parseFloat(parts[0]);
var Hu = parseFloat(parts[1]);
var temp = -1.0*Th; es = 6.112*Math.exp(-1.0*17.67*temp/(243.5 - temp)); ed = Hu/100.0*es; eln = Math.log(ed/6.112); td = -243.5*eln/(eln -17.67);
var Dp = td.toFixed(1);
newMsg = {payload: Dp,
topic: "DewPoint"};
return newMsg;
The DewPoint is now passed to a Dashboard Gauge node and displayed. The Dashboard currently looks like this:
In Pt.3 we’ll take a look at the flow that controls the Arduino with the 4-Relay Shield that allows us to remotely reset the All Sky Camera, HiTechAstro Wx Stn and control a pair of LED lights to illuminate the rig so we can use ManyCam to monitor the web cams installed in the observatory.
The following is the current Node-RED flow running on the IMT3 MAC Mini
IMT3 Environmental Monitoring Pt.1 Bob Trevan – Aug2019
When Dave, Mark and I first started planning what equipment we were going to install in IMT3 we started with a block diagram of what we thought we were going to install so we could determine the number of USB ports we would need and the power requirements. This soon morphed into much more as we started adding kit to the project.
Although the Observatory is install in the UK and not Spain as was originally planned, we decided we would still need a fair bit of monitoring to allow remote sensing of the local conditions. In particular making sure it was safe to open the shutter for a remote observing session
During AstroFest in Feb 2019 we bought a HiTechAstro Deluxe Weather Station which can be used as an ASCOM safety device to autonomously close the Dome Shutter if rain or cloud is detected. Although we were lead to believe it would directly interface with the Pulsar Dome Controller, this was not the case and required a simple interface consisting of a SPST Relay to control the shutter. Once the Relay is picked the shutter closes and will stay closed until the operator manually resets the state of the relay via the weather station software. The software has a number of options to configure to determine when to close the shutter
Although the Shutter itself has a battery pack that has sufficient capacity to close the shutter in the event of a power outage we decided to add an APC UPS with PowerChute software so provide AC power resilience to critical components. The shutter battery is wirelessly charged when the dome is parked at the end of each observing session.
In addition to the Cloud and Rain sensor, we also have a Sky Quality Meter and All Sky camera mounted on the same pole. The cable run to the pole from the panel inside the dome to which we were mounting various components … MAC Mini, 10-port USB HUB, Power Bricks, etc … is about 10m. The cabling provided with the Weather Station was somewhat shorter than this which meant having to extend it with the challenges of making the external connections water tight.
The HiTechAstro Wx Stn is also a Cloud Sensor utilizing an IR sensor to measure the Sky Temperature and a Dallas DS18B20 to measure Ambient Temperature. The waterproof probe is attached to the underside of the mounting bracket.
For monitoring the Dome Internal conditions I started looking at what we could achieve using an Arduino (*1) with various sensors. Currently we have two Arduinos installed, the first utilizes an Arduino UNO R3 with a Bosch BME280 (*2) Temperature, Humidity and Pressure Sensor and a pair of Dallas DS18B20 (*3) temperature probes for monitoring the internal temperatures of the enclosures housing the MAC Mini and Intel NUC (*4) (more on the NUC later). The current version of code running on this Arduino is provided at the end of this part of the blog.
A second Arduino has a 4-relay shield attached. The relays are used to control two 380 lumens LED lights inside the dome and after modifying a couple of short USB extension leads, breaking into the +5v line, the remaining 2 relays are used to reset the All Sky Camera and HiTechAstro Deluxe Wx Stn, when the need arises (which is all too frequently). This Arduino is programmed to run Standard Firmata code allowing Node-RED to communicate via the serial port and control the relays.
*1 Arduino is an open-source electronics platform based on easy-to-use hardware and software. Arduino boards are able to read inputs – light on a sensor, a finger on a button, or a Twitter message – and turn it into an output – activating a motor, turning on an LED, publishing something online.
The Arduino integrated development environment (IDE) is a cross-platform application (for Windows, macOS, Linux) that is written in the programming language Java, C, C++. It is used to write and upload programs to Arduino compatible boards. User-written code only requires two basic functions, for starting the sketch and the main program loop. For more info see https://en.wikipedia.org/wiki/Arduino_IDE
*2 Bosch BME280 The BME280 is an integrated environmental sensor developed specifically for mobile applications where size and low power consumption are key design constraints. The unit combines individual high linearity, high accuracy sensors for pressure, humidity and temperature in an 8-pin metal-lid 2.5 x 2.5 x 0.93 mm³ LGA package, designed for low current consumption (3.6 μA @1Hz), long term stability and high EMC robustness.
*3 Dallas DS18B20 The DS18B20-PAR digital thermometer provides 9 to 12–bit centigrade temperature measurements and has an alarm function with nonvolatile user-programmable upper and lower trigger points. The DS18B20-PAR communicates over a 1-Wire bus, which by definition requires only one data line (and ground) for communication with a central microprocessor. It has an operating temperature range of –55°C to +100°C and is accurate to ±0.5°C over a range of –10°C to +85°C.
*4 Next Unit of Computing (NUC) is a line of small-form-factor barebone computer kits designed by Intel. The NUC motherboard measures 4 × 4 inches (10.16 × 10.16 cm)
The Bosch BME280 Sensor uses the I2C bus and the Dallas DS18B20 probes use a One-Wire interface. Each of the DS18B20 has a unique internal 64-bit address created during the manufacturing process, so you can just keep adding as many as you need with relative ease.
Currently, every 20 seconds, the Arduino spits out 7 values separated by commas and terminated with a line feed, these are:
DS18B20 Ext sensor Temperatue in °C
DS18B20 Ext sensor Temperature in °F
DS18B20 Int sensor Temperature in °C
DS18B20 Int sensor Temperature in °F
BME280 sensor Temperature in °C
BME280 sensor Humidity in %
BME280 sensor Pressure in mPa
e.g. 27.0000,80.6000,26.0000,78.8000,28.53,43.53,1008.28
Mark also donated a HiTechAstro Hub to the project which is used to control DC power to the Cameras, Focuser, Filter Wheels and potentially Dew Heaters, but with three rigs mounted on the SB Paramount ME-II we were quickly using all available USB Ports and Switched DC power ports available.
After several ‘Hangs’ of the NUC due the to the software packages tested with the All Sky Camera, we added a MAC mini to run the environment applications, leaving the Intel NUC to run the Main Applications to control the mount and Cameras. The Sky X, Sequence Generator Pro etc…
So we now have a number of PC / MAC applications, controlling and displaying various functions of IMT3. But how do we display the Arduino data ?
Working for IBM, Dave had been exposed to Node-RED. Originally developed by IBM, Node-RED is a flow based development tool for visual programming for wiring together hardware devices, APIs and online services as part of the Internet of Things.
Node-RED provides a web browser-based flow editor, which can be used to create Javascript fuctions. The runtime is built on Node.js. The flows created in Node-RED are stored using JSON. Since version 0.14 MQTT nodes can make properly configured TLS connections.
In 2016, IBM contributed Node-RED as an open source JS Foundation project.
One of the Node-RED projects is a dashboard UI for Node-RED, and this is how the Arduino sensor data is displayed, along with the flow that controls the 4 relays on the Arduino Relay Shield.
We have a new vocabulary to learn; IoT, MQTT, node.js, Node-RED, JSON, Arduino, Sketch, Flow and new languages to learn C, C++, Javascript and we haven’t even mentioned the BBC MicroBit or Raspbery Pi and Python 🙂
I’ll describe the Node-RED flows I currently have working and the Dashboard in Pt. 2.
Arduino Code:
/********************************************************************
* Arduino code used for monitoring the Internal Ambient Temperature,
* Humidity and Air Pressure of IMT3 Observatory using a Bosch BME280 sensor
* and two Dallas DS18B20 temperature probes to measure the temperatures of
* the MAC Mini and Intel NUC enclosures.
*
* I have commented out alot of the lines used during development, but left
* them in to help comment the code.
*
* Currently, every 20 seconds, the Arduino spits out 7 values separated by
* commas and terminated with a line feed, these are:
*
* DS18B20 Ext sensor Temperatue in °C
* DS18B20 Ext sensor Temperature in °F
* DS18B20 Int sensor Temperature in °C
* DS18B20 Int sensor Temperature in °F
*
* BME280 sensor Temperature in °C
* BME280 sensor Humidity in %
* BME280 sensor Pressure in mPa
*
* e.g. 27.0000,80.6000,26.0000,78.8000,28.53,43.53,1008.28
*
* The above will be displayed as Gauges on a Node-RED Dashboard.
*
* Bob Trevan August 2019
*******************************************************************/
/******************************************************************
This is a library for the BME280 humidity, temperature & pressure sensor
Designed specifically to work with the Adafruit BME280 Breakout
----> http://www.adafruit.com/products/2650
These sensors use I2C or SPI to communicate, 2 or 4 pins are required
to interface. The device's I2C address is either 0x76 or 0x77.
Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing products from Adafruit!
Written by Limor Fried & Kevin Townsend for Adafruit Industries.
BSD license, all text above must be included in any redistribution
*******************************************************************/
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define BME_SCK 13
#define BME_MISO 12
#define BME_MOSI 11
#define BME_CS 10
Adafruit_BME280 bme; // I2C
char buffer[60];
// Onewire Reference and assign it to pin 5 on the Arduino
OneWire oneWire(5);
// declare as sensor reference by passing oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
// declare the device addresses
//Device 1: 0x28, 0x41, 0x0F, 0x84, 0x1F, 0x13, 0x01, 0x16
//Device 2: 0x28, 0x89, 0x25, 0x6E, 0x1F, 0x13, 0x01, 0x3F
//Device 3: 0x28, 0xAD, 0x43, 0xE2, 0x1B, 0x13, 0x01, 0x8D
//Device 4: 0x28, 0x0B, 0xA9, 0x63, 0x1F, 0x13, 0x01, 0xCC
//Device 5: 0x28, 0x52, 0xDA, 0x71, 0x1F, 0x13, 0x01, 0x68
//Device 6: 0x28, 0xAA, 0xBD, 0x68, 0x3C, 0x14, 0x01, 0x4E
// Select the pair of sensor used with this Arduino, these addresses have previously been read with a separate piece of Arduino code.
DeviceAddress ExtSensor = {0x28, 0xAA, 0xBD, 0x68, 0x3C, 0x14, 0x01, 0x4E};
DeviceAddress IntSensor = {0x28, 0x52, 0xDA, 0x71, 0x1F, 0x13, 0x01, 0x68};
// Variables to hold the temperatures
float ExtC; // originally had one sensor hanging out of my study window
float IntC; // and a second sensor by my desk.
void setup() {
Serial.begin(9600);
// Serial.println(F("BME280 test"));
bool status;
status = bme.begin(0x76); // I2C Address
if (!status) {
Serial.println("Could not find a valid BME280 sensor, check wiring!");
while (1);
}
// Serial.println("-- Default Test --");
Serial.println();
// set the resolution to 9 bit - Valid values are 9, 10, or 11 bit.
sensors.setResolution(ExtSensor, 9);
// confirm that we set that resolution by asking the DS18B20 to repeat it back
//Serial.print("Exterior Sensor Resolution: ");
//Serial.println(sensors.getResolution(ExtSensor), DEC);
//Serial.println();
// set the resolution to 9 bit - Valid values are 9, 10, or 11 bit.
sensors.setResolution(IntSensor, 9);
// confirm that we set that resolution by asking the DS18B20 to repeat it back
//Serial.print("Interior Sensor Resolution: ");
//Serial.println(sensors.getResolution(IntSensor), DEC);
//Serial.println();
}
void loop() {
// Tell the Ext sensor to Measure and Remember the Temperature it Measured
sensors.requestTemperaturesByAddress(ExtSensor); // Send the command to get temperatures
// Get the temperature that you told the sensor to measure
ExtC = sensors.getTempC(ExtSensor);
//Serial.print("Exterior Sensor: ");
//Serial.print("Temp C: ");
Serial.print(ExtC,4); // The four just increases the resolution that is printed
Serial.print(",");
//Serial.print(" Temp F: ");
// The Dallas Temperature Control Libray has a conversion function... we'll use it
Serial.print(DallasTemperature::toFahrenheit(ExtC),4);
Serial.print(",");
// Tell the INT sensor to Measure and Remember the Temperature it Measured sensors.requestTemperaturesByAddress(IntSensor); // Send the command to get temperatures
// Get the temperature that you told the sensor to measure
IntC = sensors.getTempC(IntSensor);
//Serial.print("Interior Sensor: ");
//Serial.print("Temp C: ");
Serial.print(IntC,4); // The four just increases the resolution that is printed
Serial.print(",");
//Serial.print(" Temp F: ");
// The Dallas Temperature Control Libray has a conversion function... we'll use it
Serial.print(DallasTemperature::toFahrenheit(IntC),4);
Serial.print(",");
//Serial.println("\n");
printTemp();
printHum();
printPa();
delay(20000);
}
void printTemp() {
dtostrf(getTemp(),1,2,buffer);
// Serial.print("Temperature = ");
Serial.print(buffer);
Serial.print(",");
// Serial.println(" *C");
}
void printHum() {
dtostrf(getHum(),1,2,buffer);
// Serial.print("Humidity = ");
Serial.print(buffer);
Serial.print(",");
// Serial.println(" %");
}
void printPa() {
dtostrf(getPa(),1,2,buffer);
// Serial.print("Pressure = ");
Serial.println(buffer);
// Serial.println(" hPa");
}
double getTemp(void) {
double t;
t = bme.readTemperature();
return (t);
}
double getHum(void) {
double h;
h = bme.readHumidity();
return (h);
}
double getPa(void) {
double p;
p = (bme.readPressure() / 100.0F);
return (p);
}
After a full day of all three geeks making more changes to the observatory, I setup my travel scope, Esprit 120 to get some more time logged before taking it on any serious holiday.
Before starting I thought I would record, compute and apply a Periodic Error Correction (PEC) model to the MyT mount similar to doing the one on the MEII earlier. Recording it was fairly straightforward using TheSkyX (TSX), connecting to my camera and then continuously recording the output to a log which you then read in and apply. Even though the log looked pretty terrible a periodic curve was able to be computed and looked a good fit and represented a peak to peak error of +/- 0.5 arcsecs.
Connecting the camera to PHD2 though was somewhat of a challenge, I managed to guide in DEC but the RA was wildly out even though I tried a few different settings for the aggressiveness and Hysteresis which is the previous adjustment percentage to apply as well.
When trying to image with this sort of guide graph from PHD2 the resulting image is trailed. Note the greenness of the image is due to the bayer matrix array of the camera being RGGB and thus 50% of the light is in the green and would be corrected later. The picture below is a zoomed in portion of that image.
So instead I moved to TSX to see if it would guide any better, knowing full well that PHD2 should be able to do this if I could get the right settings. In TSX I took the default values and then choose a guide star and started guiding. The output is fairly similar to PHD2 in the graph and immediately the RA error again could be seen and the resulting trailing of the image taken with EZCAP on the Mac apparent.
At this point I changed the settings for the guiding in TSX noting that the calibration was really quick, almost too quick, with a single move of the scope in either axis which is not enough. So I changed the calibration distance for both axis from 100 pixels to 200 pixels, I also changed the Minimum and Maximum move figures from 0.01 arcsecs and 10 arcsecs to 1 and 2 arcsecs respectively. Finally I added a delay after correct of 2 seconds.
I then started guiding again to look at the results. The new set of data was promising with the RA axis having a lot less correction needed and the scatter graph (to the right) being a tighter set of points which is good and requiring less correction.
Well that was enough tonight and I was pleased with a bit more work being completed on the scope so as the clouds rolled in I packed up and went to bed.
GingerGeek round tonight to align his guide scope, focus it and make sure guiding works. The first thing we had to do though was unplug my camera and then plug his into the Mount Hub Pro due the fuse problem from the last session when it melted through the fuse holder, that will be fixed later this weekend.
Next we slewed to Vega as seen above and took a quick image to see how far out the Esprit 120 is compared to where the OS12″ is pointing so that we can adjust it later.
So it would seem focusing was a bit more of a challenge than we thought. The first thing is we bought an adapter for the guide scope (aka the finder that came with the Esprit 120) but it did not provide enough back focus for the camera. We had a look round the adapters in the dome and found a nose extension for the Lodestar, however it was not a c-mount end to it so we landed up duck taping it on tonight until GingerGeek can bring round his adapter.
The next challenge was not seeing any stars in the lodestar, after what seemed like a long while we came to the conclusion that the picture we were looking at on the screen in PHD2 was not the camera we thought, it was instead the one from the OS12″ which at this point was not pointing through the slit.
After looking through the settings on PHD2 we found a new setting we had not seen before, which seemed to be because we have multiple ASCOM cameras connected.
The symbol is a double arrow and when clicked a drop down list of 4 Starlight Xpress cameras appeared, so we chose the 4th one which was one of the two Lodestars and that worked.
I then adjusted the guide scope in its two ring holders and aligned close to Vega which we had slewed to. Now the guide scope was spot on and the main scope ever so slightly off. This will be solved when we either shim the scope to align with the OS12″ or when we add/change the way in which it is connected to the losmandy mounting plate.
By 12:40am we had the focus sorted for the guide scope and we moved back in doors to connect back to the 2 cameras for this evening, lodestar and main imaging camera and then the Lakeside focuser to start an autofocus run on the main camera.
At 1:20am we were still trying to focus as we had not setup the autofocus routing for the Esprit 120 before, the OS12″ is now fine but this was a new challenge. GingerGeek spend an appreciable amount of time changing the step size and other settings in SGPro to effect the focus routine. Finally autofocus did a great job and we landed up at a focus point of 6225 for the Luminance filter. However there was an amount of backlash and this caused the focus point to not be the same in a one direction. GingerGeek needs to find out where he wrote down the figure we measured for backlash so we can add in.
Next we slewed to the star near the Elephant Trunk, SAO 33570 and changed the filter to Ha. GingerGeek then started an auto focus run for this filter. As it was now late we were missing setting simple things such as the exposure time increase from 1s to 15s needed to actually register any stars to focus on.
Once focused (ish) as we are tired now, we started a short test image run of 10mins subs for the Ha. GingerGeek showed me the Big Status window which is a much nicer interface to your image progress.
We then had a problem with guiding, there were inconsistent rates between the RA and DEC axis. This caused trailing of stars so we stopped the guiding, however the next image although still out of focus showed promise especially given we were not guiding.
So whilst the wind is blowing a gale and branches have come down off of 300 year old oaks where I live, the weather decided to ease as we went into the evening. There were still gusts of high wind but nothing really to be too concerned about for the dome.
Due to more changes on the mount and the polar alignment changes I needed to do a new TPoint run. I first tried to complete a recalibration run that would add additional data, however after a 30 point run the pointing got worse to the point where I was not landing up on the object but several fields of view. So I bit the bullet and deleted the recalibration data and the original model and started again.
It took me about 1.5 hours to run 30 points on the East side of the mount and another 1.5 hours to run the next 30 on the West. I was happy with the results and I turned on some new Terms as I went through. As you select the term you can see the resulting change to the position of the telescope. So rightly or wrongly I used this process a few times when the pointing was either not improving or it just needed to improve a little.
I also created a Supermodel of the data and once again enabled Protrack. I then went to my usual target of the Elephant Trunk to try and get use to pointing to the right object and then imaging it from SGPro. I decided the easiest thing was to use The SkyX to move to the object as I knew I wanted to be centred on SAO 33570 a star in the trunk. I did this and with my new pointing capability since this evenings TPointing, the scope landed up pointing at pretty much the right area. So instead of Sync and Solve I left it at this location for tonight.
The Polar Alignment report produced by TPoint on this new 60 point model showed very little error in either RA or DEC which is a testament to the long hours I put in drift aligning the mount.
At 2:04 am I then tried to cool the camera but it was non responsive……..this threw me for a while then I remembered the other evening having this same problem which probably meant the camera power was not on.I went into the dome to find that was the case and the reason once again was the fuse on the Mount Hub Pro had melted. I cut this off and put a chocky block in for this evening to bypass the fuse, but I did unplug everything else from the mount hub pro whilst there was no fuse there.
Whilst doing this I was reintroduced to nature with a Hornet the size of my thumb bouncing around in the dome. After quickly removing myself from the dome I cam back armed with an insecticide and sprayed the offending hornet. It kealed over and died quickly.
Next I focused and this worked very well, a nice V curve on the Luminance and then I switched to Ha for the imaging, This would be slightly out but I need to find a strong HA source of stars to be able to focus with Ha.
Once again I ran the Image Sequencer to see if this would work given I had made some changes suggested by my good friend Mil Dave to the guider settings in PHD2 and SGPro. However once again I was foiled with some new error messages, I am either getting use to this or possibly very fed up, SGPro may be a great piece of software from a functionality perspective, but it is complex, unintuitive and a pain. The error complained about the PHD2 profile ‘OS 12 Lodestar Guider’ is not valid.
This is indeed my profile and is valid so not sure about this, another thing to investigate when I am not so tired. The follow on message was Could not start the autoguider and connect to the equipment so aborting. This is to be expected.
So I went back to Frame and Focus and too a single 5min shot, guiding on a good star that was in the FoV of the Lodestar off-axis guider. I took a 10min image and then a 20min image.
Looking at the TPoint model there was a nice improvement for where I started with a with an RMS, Root Mean Square of 100 so when pointing the object I am targeting will be within 100 arc seconds of the centre of the CMOS chip, so 1.7 arc minutes, whereas now it is leas than 1 arc minutes out at 57.9.
I then went back to SGPro to try and fix this error as I don’t like giving up. I changed more settings within SGPRo and PHD2 around the error size for the guider to settle, however SGPro was still waiting for PHD to report it had settled even though it was now guiding.
Error message
I turned off both the Settle At and the Settle Auto Guider check boxes. This then allowed me to bypass the whole settling thing which wis is really not that important to me as I manually setup guiding first and now the sequence has started at last!
Turning off settling guider connection
Finally the guider looks very smooth and the only thing now stopping me from taking some more images is the fact it is 4:28am and I am very tired and it is getting light. So I will disconnect and shut down until the next clear night at a weekend. All in all a very productive night.
Configuring the guider to work with DirectGuide was tonights job, it was so important I have created a separate blog for it. That took the majority of this session before I really did need to go to bed for work tomorrow.
Once setup and now having the ability to reliably guide without the need for an ST-4 cable, I went to take a quick photo again to test the stability of the system. The importance of DirectGuide is worth labouring here as given we have 3 scopes to guide from, there is only 1 ST-4 port. We did not want to keep plugging in and unplugging the different cables, more did we want to build a bespoke connector for all 3, so DirectGuiding is really the only way this would work.
Once complete I once again tried to slew to the exact area for the Elephant Trunk, this has been problematic due to not quite getting sync and solve working, it works sometimes, and locating a star that I can reliably use. I have noted now that HD 205850 in Sky Safari and SAO 33570 in the SkyX represent the pair of stars in the main section of the trunk. I also took another frame nearby to label for future reference.
SAO 33570 centre of Elephant Trunk and SAO 33573 end of the TrunkNearby star pattern SAO 33626
Unfortunately Sync and solve failed and landed up moving the scope to the wrong area, hence I missed the object when trying a longer exposure with the Ha filter. I need to reliably get sync and solve working to be able to use SGPro else I will have to go back to The Sky X that I have used before for image capture which I would prefer not to do given the flexibility of SGPro.
So I landed up pointing at a star UCAC4 739:73701 which was an offset frame from where I needed to be, the purple oblong representing the FoV of where I should have been and the UCAC star showing where I landed up.
Pointing at the wrong object
SGPro did error as mentioned during Sync and Solve as can be seen in the screen grab below. I will talk with GingerGeek to resolve.
So I used to be able to guide on the Paramount ME without the need for an ST-4 guider cable. This is achieved through information being shared about the position of the star to PHD2 and it then sending commands to the relays on the Paramount ME, however I had yet to be able to get this working with the Paramount ME II and using SGPro as the host program.
So for a short period on the evening of 5th August 2019 I ventured out to complete the setup and get the guider working.
As information is key I had spent time re-reading pieces of the Paramount User Manual, The Sky X Manual and the PHD2 Manual, the later having partial information needed to setup, another piece of information was in The Sky X Manual.
So what did I do? Well DirectGuide is a bit like Pulse guiding that is supported on other mounts, however for the Paramount ME II pulse guiding is NOT supported. So you need to configure and setup for Direct Guide, but where?
Looking at the Connect Equipment window in PHD2 you are presented with 3 options, How to connect the camera, how to connect the mount and a 3rd option around how to connect an Aux mount. It is important to understand when to use that 3rd option around Aux mount as that is what can cause confusion when trying to get Direct Guiding to work.
Aux Mount should only be chosen if you are using an ST-4 cable, if you are not then this option should remain set to None. If you inadvertently select ASCOM Telescope Driver for The Sky within this box the mount will not behave correctly. So leave it set to None!
Configuring Camera and Mount ONLY
Camera needs to be set for the camera of choice, for me my trusty Starlight Xpress Lodestar is selected. For the Mount I selected ASCOM Telescope Driver for The Sky. Next you need to configure the Mount by clicking on the spanner and screwdriver icon next to the option.
Under here you can configure The Sky Controller Driver Setup, selecting The Sky version, X Pro for me and various options for the mount itself. The key checkbox is Use DirectGuide. This menu of options is from the ASCOM Chooser and you should select any settings you wish to enable. Mine can be seen below.
ASCOM Chooser for Mount and DirectGuide setting
I quickly configured the Camera also and below are the settings that work well.
SX Lodestar Camera Configuration
On connecting to both the camera and mount, selecting a guide star and calibrating the guider it is apparent that I have configured the setup correctly. All is now well with the guiding and it produces a smooth chart with tonights seeing as can be seen after several dips produced by cloud at the begging of the guider graph.
An unexpected clear spell this evening, I was sitting out on the patio looking at the clouds clearing and so setup the dome to perform the Periodic Error Correction (PEC) analysis for the mount.
To perform this I needed to unplug the hand controller for the MEII, unplug the ST4 guider cable, turn off a bunch of settings within the autoguider software with The SKY X (TSX) and also turn off TPoint.
I then connected the ZWO ASI1600MM to TSX rather than SGPro. This was so that I could record the log needed for the PEC through the autoguider add on software which records in a format that the PEC software requires. The challenge again was that I could not get the ZWO camera to connect in TSX. I just kept getting error 200. Searching TSX forum I finally found the issue and downloaded the latest driver from ZWO but through the link from Software Bisque. To install I needed to log in as Admin.
So I started to record the star movement without performing any guiding. Once done I imported the log file Autoguider.010.log into the PEC portion of TSX.
I then performed a fit so that you could see the sinusoidal waves before I then fitted the correction to it. A quick look using PHD2 Drift Alignment to see what the drift now was, was very promising with a sinusoidal wave over 10-15 minutes.
Final fitted curveModified CurveSinusoidal Drift Alignment check
I then went off and tried to image unguided to see if it made a difference, it had, I recorded a 10min unguided image through the 12″ 2.5m focal length scope with no trailing of Altair.
10min Unguided Altair exposure
I then attempted to slew and take an image of the Elephant Trunk in Ha again, however I was foiled by not only the cloud moving in but also not being able to get past the message Guider Settling. I need to talk through with GingerGeek to see why that is. Meanwhile bedtime for Mr Shave-Wall.
Another evening commissioning the observatory, so tonight was about further refinement of the polar alignment. The main thing was to drift align with PHD again, but this time I would follow the instructions more carefully.
First I had to find a star near the celestial equator which was easier said than done. I little research showed me how to turn on the celestial equator line in The Sky X (TSX), which was essentially a database entry you enable that draws the line across the sphere of the sky using multiple points. The celestial equator is such a line running from East to West passing through the Meridian at an altitude of zero degrees. There were 3 databases to enable in TSX to create the visual effect.
Celestial Equator
I then selected a star on this imaginary line and near the Meridian, the reason for this is that it would display the most movement and thus magnify the error of miss polar alignment.
Star near celestial equator and meridian
Next I performed an autofocus using the Luminance filter this worked well.
Auto Focus
Rasalhauge was the star I choose for drift aligning the first part, a 5 second image within Frame and Focus in SGPro showed it spot on in the middle of the chip once I did a Slew and Solve.
Slew and Solved
Now I needed to find a guide star nearby and place in the Lodestar FoV. This is routinely easy to do with the FoV displays I have placed on TSX.
The first thing to measure was the azimuth polar error and ignoring the RA line ALWAYS, I followed the Dec line and saw it was out by -1.14 and 75px) I adjusted the thruster knobs on the MEII to move the star to the outset edge of the purple circle showing the error. It is a 50/50 guess if you go the right way with the thrusters.
Polar Error in Azimuth
I then drifted again and of course realised I had indeed gone the wrong way as can be seen by the steeper DEC red line and the much larger purple circle.
Larger circle larger error
The graph on PHD2 can start to look fairly flat, so if you want to review the finer data underlying the straight line you can adjust the scale on the axis.
Changing the scale
After getting the line fairly straight I then went on to drift align for the error in altitude. This time selecting a star in the West and near the celestial equator I chose Unukalhai in Serpens Caput.
Star location
Once again I watched the DEC line only and ignored the RA, the DEC line this time reflecting the error in altitude. I then adjusted the mount using the altitude adjustment spanner moving the star again to the outside of the purple circle and then retested, finally getting the error down to a suitably small number. It was now 3am some 5 hours after I started!
Much better DEC line
With now great polar alignment I thought I would attempt an image so wanted to slew to the Elephant Trunk again, IC1396. I performed a slew then plate solved. Of course the centre off the Elephant Trunk is actually the centre of the open cluster which IC1396 represents. I then moved manually to where I knew the nebula to be.
Elephant Trunk Location
Unfortunately at this point I found that guiding, as despite unguided exposures now being a very real possibility, was not working, I could guide East and West but not North and South. I tried multiple settings but by 4am gave up and called it a night. The following day I would test during daylight and realise there was a setting that needed changing in PHD within the profile itself and upon correcting this guiding would then work the following evening.