{"id":2844,"date":"2021-09-09T12:34:19","date_gmt":"2021-09-09T19:34:19","guid":{"rendered":"https:\/\/www.donluc.com\/?p=2844"},"modified":"2021-09-09T12:34:19","modified_gmt":"2021-09-09T19:34:19","slug":"project-19-time-neopixel-stick-8-mk11","status":"publish","type":"post","link":"https:\/\/www.donluc.com\/?p=2844","title":{"rendered":"Project #19: Time &#8211; NeoPixel Stick &#8211; 8 &#8211; Mk11"},"content":{"rendered":"<div style=\"width: 720px;\" class=\"wp-video\"><video class=\"wp-video-shortcode\" id=\"video-2844-1\" width=\"720\" height=\"480\" preload=\"metadata\" controls=\"controls\"><source type=\"video\/mp4\" src=\"https:\/\/www.donluc.com\/wp-content\/uploads\/2021\/09\/DL2109Mk02W.mp4?_=1\" \/><a href=\"https:\/\/www.donluc.com\/wp-content\/uploads\/2021\/09\/DL2109Mk02W.mp4\">https:\/\/www.donluc.com\/wp-content\/uploads\/2021\/09\/DL2109Mk02W.mp4<\/a><\/video><\/div>\n<p>&#8212;&#8212;<\/p>\n<p>#DonLucElectronics #DonLuc #Time #EMF #IMU #NeoPixel #RTC #Display #Adalogger #MicroSD #GPSReceiver #CCS811 #BME280 #Arduino #ESP32 #Project #Programming #Electronics #Microcontrollers #Consultant #VideoBlog<\/p>\n<p>&#8212;&#8212;<\/p>\n<p><a href=\"https:\/\/www.donluc.com\/wp-content\/uploads\/2021\/09\/DL2109Mk02a.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.donluc.com\/wp-content\/uploads\/2021\/09\/DL2109Mk02a.png\" alt=\"NeoPixel Stick\" width=\"720\" height=\"647\" class=\"alignnone size-full wp-image-2846\" srcset=\"https:\/\/www.donluc.com\/wp-content\/uploads\/2021\/09\/DL2109Mk02a.png 720w, https:\/\/www.donluc.com\/wp-content\/uploads\/2021\/09\/DL2109Mk02a-300x270.png 300w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><\/a><\/p>\n<p>&#8212;&#8212;<\/p>\n<p><a href=\"https:\/\/www.donluc.com\/wp-content\/uploads\/2021\/09\/DL2109Mk02b.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.donluc.com\/wp-content\/uploads\/2021\/09\/DL2109Mk02b.png\" alt=\"NeoPixel Stick\" width=\"720\" height=\"480\" class=\"alignnone size-full wp-image-2847\" srcset=\"https:\/\/www.donluc.com\/wp-content\/uploads\/2021\/09\/DL2109Mk02b.png 720w, https:\/\/www.donluc.com\/wp-content\/uploads\/2021\/09\/DL2109Mk02b-300x200.png 300w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><\/a><\/p>\n<p>&#8212;&#8212;<\/p>\n<p><a href=\"https:\/\/www.donluc.com\/wp-content\/uploads\/2021\/09\/DL2109Mk02c.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.donluc.com\/wp-content\/uploads\/2021\/09\/DL2109Mk02c.png\" alt=\"NeoPixel Stick\" width=\"720\" height=\"480\" class=\"alignnone size-full wp-image-2848\" srcset=\"https:\/\/www.donluc.com\/wp-content\/uploads\/2021\/09\/DL2109Mk02c.png 720w, https:\/\/www.donluc.com\/wp-content\/uploads\/2021\/09\/DL2109Mk02c-300x200.png 300w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><\/a><\/p>\n<p>&#8212;&#8212;<\/p>\n<p><a href=\"https:\/\/www.donluc.com\/wp-content\/uploads\/2021\/09\/DL2109Mk02d.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.donluc.com\/wp-content\/uploads\/2021\/09\/DL2109Mk02d.png\" alt=\"NeoPixel Stick\" width=\"720\" height=\"480\" class=\"alignnone size-full wp-image-2849\" srcset=\"https:\/\/www.donluc.com\/wp-content\/uploads\/2021\/09\/DL2109Mk02d.png 720w, https:\/\/www.donluc.com\/wp-content\/uploads\/2021\/09\/DL2109Mk02d-300x200.png 300w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><\/a><\/p>\n<p>&#8212;&#8212;<\/p>\n<p><strong>Pololu Adjustable Step-Up Voltage Regulator U1V11A<\/strong><\/p>\n<p>This compact U1V11A switching step-up voltage regulator efficiently boosts input voltages as low as 0.5 V to an adjustable output voltage between 2 V and 5.25 V. Unlike most boost regulators, the U1V11A offers a true shutdown option that turns off power to the load, and it automatically switches to a linear down-regulation mode when the input voltage exceeds the output. The pins have a 0.1 inch spacing, making this board compatible with standard solderless breadboards.<\/p>\n<p><strong>NeoPixel Stick &#8211; 8 x 5050 RGB LED<\/strong><\/p>\n<p>Make your own little LED strip arrangement with this stick of NeoPixel LEDs. We crammed 8 of the tiny 5050 (5mm x 5mm) smart RGB LEDs onto a PCB with mounting holes and a chainable design. Use only one microcontroller pin to control as many as you can chain together! Each LED is addressable as the driver chip is inside the LED. Each one has ~18mA constant current drive so the color will be very consistent even if the voltage varies, and no external choke resistors are required making the design slim. Power the whole thing with 5VDC.<\/p>\n<p><strong>DL2109Mk02<\/strong><\/p>\n<p>1 x SparkFun Thing Plus &#8211; ESP32 WROOM<br \/>\n1 x Adafruit SHARP Memory Display<br \/>\n1 x Adalogger FeatherWing &#8211; RTC + SD<br \/>\n1 x SparkFun Environmental Combo CCS811\/BME280 (Qwiic)<br \/>\n1 x Pololu MinIMU-9<br \/>\n1 x Telescopic Antenna SMA &#8211; 300 MHz to 1.1 GHz (ANT700)<br \/>\n1 x SMA Connector<br \/>\n1 x NeoPixel Stick &#8211; 8 x 5050 RGB LED<br \/>\n1 x Pololu Adjustable Step-Up Voltage Regulator U1V11A<br \/>\n1 x CR1220 3V Lithium Coin Cell Battery<br \/>\n1 x 32Gb microSD Card<br \/>\n1 x LED Green<br \/>\n1 x Rocker Switch &#8211; SPST (Round)<br \/>\n1 x Terminal Block Breakout FeatherWing<br \/>\n1 x Lithium Ion Battery &#8211; 850mAh<br \/>\n1 x GPS Receiver &#8211; GP-20U7<br \/>\n1 x Rotary Switch &#8211; 10 Position<br \/>\n1 x SparkFun Rotary Switch \u2013 10 Position<br \/>\n1 x Black Knob<br \/>\n2 x Spring Terminals &#8211; PCB Mount (6-Pin)<br \/>\n2 x Screw Terminals 5mm Pitch (2-Pin)<br \/>\n2 x Breadboard Solderable<br \/>\n12 x 1K Ohm<br \/>\n1 x 3.3m Ohm<br \/>\n1 x FeatherWing Proto<br \/>\n1 x Acrylic Orange 5.75 inches x 3.75 inches x 1\/8 inch<br \/>\n1 x Acrylic Black 5.75 inches x 3.75 inches x 1\/8 inch<br \/>\n54 x Screw &#8211; 4-40<br \/>\n19 x Standoff &#8211; Metal 4-40 &#8211; 3\/8&#8243;<br \/>\n8 x Standoff &#8211; Metal 4-40 &#8211; 1&#8243;<br \/>\n1 x SparkFun Cerberus USB Cable<\/p>\n<p><strong>SparkFun Thing Plus &#8211; ESP32 WROOM<\/strong><\/p>\n<p>NEO &#8211; Digital 15<br \/>\nSCK &#8211; Digital 13<br \/>\nMSI &#8211; Digital 12<br \/>\nSS0 &#8211; Digital 27<br \/>\nGRX &#8211; Digital 16<br \/>\nGTX &#8211; Digital 17<br \/>\nSDA &#8211; Digital 23<br \/>\nSDL &#8211; Digital 22<br \/>\nSCK &#8211; Digital 5<br \/>\nMSO &#8211; Digital 19<br \/>\nMSI &#8211; Digital 18<br \/>\nSS1 &#8211; Digital 33<br \/>\nLEG &#8211; Digital 21<br \/>\nSW0 &#8211; Digital 32<br \/>\nROT &#8211; Analog A0<br \/>\nEMF &#8211; Analog A1<br \/>\nVIN &#8211; +3.3V<br \/>\nGND &#8211; GND<\/p>\n<p>&#8212;&#8212;<\/p>\n<p><strong>DL2109Mk02p.ino<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"arduino\" data-enlighter-title=\"\">\r\n\/* \r\n***** Don Luc Electronics \u00a9 *****\r\nSoftware Version Information\r\nProject #19: Time - NeoPixel Stick - 8 - Mk11\r\n09-02\r\nDL2109Mk02p.ino\r\n1 x SparkFun Thing Plus - ESP32 WROOM\r\n1 x Adafruit SHARP Memory Display\r\n1 x Adalogger FeatherWing - RTC + SD\r\n1 x SparkFun Environmental Combo CCS811\/BME280 (Qwiic)\r\n1 x Pololu MinIMU-9\r\n1 x Telescopic Antenna SMA - 300 MHz to 1.1 GHz (ANT700)\r\n1 x SMA Connector\r\n1 x NeoPixel Stick - 8 x 5050 RGB LED\r\n1 x Pololu Adjustable Step-Up Voltage Regulator U1V11A\r\n1 x CR1220 3V Lithium Coin Cell Battery\r\n1 x 32Gb microSD Card\r\n1 x LED Green\r\n1 x Rocker Switch - SPST (Round)\r\n1 x Terminal Block Breakout FeatherWing\r\n1 x Lithium Ion Battery - 850mAh\r\n1 x GPS Receiver - GP-20U7\r\n1 x Rotary Switch - 10 Position\r\n1 x SparkFun Rotary Switch \u2013 10 Position\r\n1 x Black Knob\r\n2 x Spring Terminals - PCB Mount (6-Pin)\r\n2 x Screw Terminals 5mm Pitch (2-Pin)\r\n2 x Breadboard Solderable\r\n12 x 1K Ohm\r\n1 x 3.3m Ohm\r\n1 x FeatherWing Proto\r\n1 x Acrylic Orange 5.75 inches x 3.75 inches x 1\/8 inch\r\n1 x Acrylic Black 5.75 inches x 3.75 inches x 1\/8 inch\r\n54 x Screw - 4-40\r\n19 x Standoff - Metal 4-40 - 3\/8&quot;\r\n8 x Standoff - Metal 4-40 - 1&quot;\r\n1 x SparkFun Cerberus USB Cable\r\n*\/\r\n\r\n\/\/ Include the Library Code\r\n\/\/ EEPROM Library to Read and Write EEPROM with Unique ID for Unit\r\n#include &quot;EEPROM.h&quot;\r\n\/\/ Wire\r\n#include &lt;Wire.h&gt;\r\n\/\/ SHARP Memory Display\r\n#include &lt;Adafruit_SharpMem.h&gt;\r\n#include &lt;Adafruit_GFX.h&gt;\r\n\/\/ Date and time RTC\r\n#include &quot;RTClib.h&quot;\r\n\/\/ GPS Receiver\r\n#include &lt;TinyGPS++.h&gt;\r\n\/\/ ESP32 Hardware Serial\r\n#include &lt;HardwareSerial.h&gt;\r\n\/\/ SD Card\r\n#include &quot;FS.h&quot;\r\n#include &quot;SD.h&quot;\r\n#include &quot;SPI.h&quot;\r\n\/\/ SparkFun CCS811 - eCO2 &amp; tVOC\r\n#include &lt;SparkFunCCS811.h&gt;\r\n\/\/ SparkFun BME280 - Humidity, Temperature, Altitude and Barometric Pressure\r\n#include &lt;SparkFunBME280.h&gt;\r\n\/\/ 9DoF IMU\r\n\/\/ STMicroelectronics LSM6DS33\r\n#include &lt;LSM6.h&gt;\r\n\/\/ STMicroelectronics LIS3MDL\r\n#include &lt;LIS3MDL.h&gt;\r\n\/\/ NeoPixels\r\n#include &lt;Adafruit_NeoPixel.h&gt;\r\n\r\n\/\/ SHARP Memory Display\r\n#define SHARP_SCK  13\r\n#define SHARP_MOSI 12\r\n#define SHARP_SS   27\r\n\/\/ Set the size of the display here, e.g. 144x168!\r\nAdafruit_SharpMem display(SHARP_SCK, SHARP_MOSI, SHARP_SS, 144, 168);\r\n\/\/ The currently-available SHARP Memory Display (144x168 pixels)\r\n\/\/ requires &gt; 4K of microcontroller RAM; it WILL NOT WORK on Arduino Uno\r\n\/\/ or other &lt;4K &quot;classic&quot; devices.\r\n#define BLACK 0\r\n#define WHITE 1\r\n\r\n\/\/ Date and Time\r\n\/\/ PCF8523 Precision RTC \r\nRTC_PCF8523 rtc;\r\n\/\/ Date\r\nString dateRTC = &quot;&quot;;\r\n\/\/ Time\r\nString timeRTC = &quot;&quot;;\r\n\r\n\/\/ ESP32 HardwareSerial\r\nHardwareSerial tGPS(2);\r\n\r\n\/\/ GPS Receiver\r\n#define gpsRXPIN 16\r\n\/\/ This one is unused and doesnt have a conection\r\n#define gpsTXPIN 17\r\n\/\/ The TinyGPS++ object\r\nTinyGPSPlus gps;\r\n\/\/ Latitude\r\nfloat TargetLat;\r\n\/\/ Longitude\r\nfloat TargetLon;\r\n\/\/ GPS Date, Time, Speed, Altitude\r\n\/\/ GPS Date\r\nString TargetDat;\r\n\/\/ GPS Time\r\nString TargetTim;\r\n\/\/ GPS Speeds M\/S\r\nString TargetSMS;\r\n\/\/ GPS Speeds Km\/h\r\nString TargetSKH;\r\n\/\/ GPS Altitude Meters\r\nString TargetALT;\r\n\/\/ GPS Status\r\nString GPSSt = &quot;&quot;;\r\n\r\n\/\/ Rotary Switch - 10 Position\r\n\/\/ Number 1 =&gt; 10\r\nint iRotNum = A0;\r\n\/\/ iRotVal - Value \r\nint iRotVal = 0;\r\n\/\/ Number\r\nint z = 0;\r\n\r\n\/\/ MicroSD Card\r\nconst int chipSelect = 33;\r\nString zzzzzz = &quot;&quot;;\r\n\r\n\/\/ LED Green\r\nint iLEDGreen = 21;\r\n\r\n\/\/ Rocker Switch - SPST (Round)\r\nint iSS1 = 32;\r\n\/\/ State\r\nint iSS1State = 0;\r\n\r\n\/\/ SparkFun CCS811 - eCO2 &amp; tVOC\r\n\/\/ Default I2C Address\r\n#define CCS811_ADDR 0x5B \r\nCCS811 myCCS811(CCS811_ADDR);\r\n\/\/ eCO2\r\nfloat CCS811CO2 = 0;\r\n\/\/ TVOC\r\nfloat CCS811TVOC = 0;\r\n\r\n\/\/ SparkFun BME280 - Temperature, Humidity, Altitude and Barometric Pressure\r\nBME280 myBME280;\r\n\/\/ Temperature Celsius\r\nfloat BMEtempC = 0;\r\n\/\/ Humidity\r\nfloat BMEhumid = 0;\r\n\/\/ Altitude Meters\r\nfloat BMEaltitudeM = 0;\r\n\/\/ Barometric Pressure\r\nfloat BMEpressure = 0;\r\n\r\n\/\/ 9DoF IMU\r\n\/\/ STMicroelectronics LSM6DS33\r\nLSM6 imu;\r\n\/\/ \/\/ Accelerometer and Gyroscopes\r\n\/\/ Accelerometer\r\nint imuAX;\r\nint imuAY;\r\nint imuAZ;\r\n\/\/ Gyroscopes\r\nint imuGX;\r\nint imuGY;\r\nint imuGZ;\r\n\/\/ STMicroelectronics LIS3MDL\r\nLIS3MDL mag;\r\n\/\/ Magnetometer\r\nint magX;\r\nint magY;\r\nint magZ;\r\n\r\n\/\/ NeoPixels\r\n\/\/ On digital pin 15\r\n#define PIN 15\r\n\/\/ NeoPixels NUMPIXELS = 8\r\n#define NUMPIXELS 8\r\n\/\/ Pixels\r\nAdafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);\r\n\/\/ Red\r\nint red = 0;\r\n\/\/ Green\r\nint green = 0;\r\n\/\/ Blue\r\nint blue = 0;\r\n\/\/ Neopix\r\nint iNeo = 0;\r\n\/\/ Value\r\nint zz = 0;\r\n\r\n\/\/ EMF Meter (Single Axis)\r\nint iEMF = A1;\r\n\/\/ Raise this number to increase data smoothing\r\n#define NUMREADINGS 15\r\n\/\/ Raise this number to decrease sensitivity (up to 1023 max)\r\nint senseLimit = 15;\r\n\/\/ EMF Value\r\nint val = 0;\r\n\/\/ Readings from the analog input\r\nint readings[ NUMREADINGS ];\r\n\/\/ Index of the current reading\r\nint indexEMF = 0;\r\n\/\/ Running total\r\nint totalEMF = 0;\r\n\/\/ Final average of the probe reading\r\nint averageEMF = 0;\r\n\/\/ Display EMF\r\nint iEMFDis = 0;\r\nint iEMFRect = 0;\r\n\r\n\/\/ Software Version Information\r\n\/\/ EEPROM Unique ID Information\r\n#define EEPROM_SIZE 64\r\nString uid = &quot;&quot;;\r\n\/\/ Version\r\nString sver = &quot;19-11&quot;;\r\n\r\nvoid loop()\r\n{\r\n     \r\n  \/\/ Dates and Time\r\n  isRTC();\r\n\r\n  \/\/ isGPS\r\n  isGPS();\r\n\r\n  \/\/ SparkFun BME280 - Temperature, Humidity, Altitude and Barometric Pressure\r\n  isBME280();\r\n\r\n  \/\/ SparkFun CCS811 - eCO2 &amp; tVOC\r\n  isCCS811();\r\n\r\n  \/\/ Accelerometer and Gyroscopes\r\n  isIMU();\r\n\r\n  \/\/ Magnetometer\r\n  isMag();\r\n\r\n  \/\/ EMF Meter (Single Axis)\r\n  isEMF();\r\n\r\n  \/\/ Rotary Switch\r\n  isRot();\r\n\r\n  \/\/ Slide Switch\r\n  \/\/ Read the state of the iSS1 value\r\n  iSS1State = digitalRead(iSS1);\r\n  \r\n  \/\/ If it is the Slide Switch State is HIGH\r\n  if (iSS1State == HIGH) {\r\n\r\n    \/\/ iLEDGreen HIGH\r\n    digitalWrite(iLEDGreen,  HIGH );\r\n    \r\n    \/\/ MicroSD Card\r\n    isSD();\r\n\r\n  } else {\r\n\r\n    \/\/ iLEDGreen LOW\r\n    digitalWrite(iLEDGreen,  LOW );\r\n  \r\n  }\r\n\r\n  delay( 1000 );\r\n \r\n}\r\n<\/pre>\n<p><strong>getAccelGyro.ino<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"arduino\" data-enlighter-title=\"\">\r\n\/\/ Accelerometer and Gyroscopes\r\n\/\/ Setup IMU\r\nvoid setupIMU() {\r\n\r\n  \/\/ Setup IMU\r\n  imu.init();\r\n  \/\/ Default\r\n  imu.enableDefault();\r\n  \r\n}\r\n\/\/ Accelerometer and Gyroscopes\r\nvoid isIMU() {\r\n\r\n  \/\/ Accelerometer and Gyroscopes\r\n  imu.read();\r\n  \/\/ Accelerometer x, y, z\r\n  imuAX = imu.a.x;\r\n  imuAY = imu.a.y;\r\n  imuAZ = imu.a.z;\r\n  \/\/ Gyroscopes x, y, z\r\n  imuGX = imu.g.x;\r\n  imuGY = imu.g.y;\r\n  imuGZ = imu.g.z;\r\n\r\n}\r\n<\/pre>\n<p><strong>getBME280.ino<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"arduino\" data-enlighter-title=\"\">\r\n\/\/ SparkFun BME280 - Temperature, Humidity, Altitude and Barometric Pressure\r\n\/\/ isBME280 - Temperature, Humidity, Altitude and Barometric Pressure\r\nvoid isBME280(){\r\n\r\n  \/\/ Temperature Celsius\r\n  BMEtempC = myBME280.readTempC();\r\n  \/\/ Humidity\r\n  BMEhumid = myBME280.readFloatHumidity();\r\n  \/\/ Altitude Meters\r\n  BMEaltitudeM = (myBME280.readFloatAltitudeMeters(), 2);\r\n  \/\/ Barometric Pressure\r\n  BMEpressure = myBME280.readFloatPressure();\r\n  \r\n}\r\n<\/pre>\n<p><strong>getCCS811.ino<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"arduino\" data-enlighter-title=\"\">\r\n\/\/ CCS811 - eCO2 &amp; tVOC\r\n\/\/ isCCS811 - eCO2 &amp; tVOC\r\nvoid isCCS811(){\r\n\r\n  \/\/ This sends the temperature &amp; humidity data to the CCS811\r\n  myCCS811.setEnvironmentalData(BMEhumid, BMEtempC);\r\n\r\n  \/\/ Calling this function updates the global tVOC and eCO2 variables\r\n  myCCS811.readAlgorithmResults();\r\n\r\n  \/\/ eCO2 Concentration\r\n  CCS811CO2 = myCCS811.getCO2();\r\n  \r\n  \/\/ tVOC Concentration\r\n  CCS811TVOC = myCCS811.getTVOC();\r\n  \r\n}\r\n<\/pre>\n<p><strong>getDisplay.ino<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"arduino\" data-enlighter-title=\"\">\r\n\/\/ SHARP Memory Display\r\n\/\/ SHARP Memory Display - UID\r\nvoid isDisplayUID() {\r\n\r\n    \/\/ Text Display \r\n    \/\/ Clear Display\r\n    display.clearDisplay();\r\n    display.setRotation(4);\r\n    display.setTextSize(3);\r\n    display.setTextColor(BLACK);\r\n    \/\/ Don Luc Electronics\r\n    display.setCursor(0,10);\r\n    display.println( &quot;Don Luc&quot; );\r\n    display.setTextSize(2);\r\n    display.setCursor(0,40);\r\n    display.println( &quot;Electronics&quot; );\r\n    \/\/ Version\r\n    \/\/display.setTextSize(3);\r\n    display.setCursor(0,70);\r\n    display.println( &quot;Version&quot; );\r\n    \/\/display.setTextSize(2);\r\n    display.setCursor(0,95);   \r\n    display.println( sver );\r\n    \/\/ EEPROM\r\n    display.setCursor(0,120);\r\n    display.println( &quot;EEPROM&quot; );\r\n    display.setCursor(0,140);   \r\n    display.println( uid );\r\n    \/\/ Refresh\r\n    display.refresh();\r\n    delay( 100 );\r\n    \r\n}\r\n\/\/ Display Date\r\nvoid isDisplayDate() {\r\n\r\n    \/\/ Text Display Date\r\n    \/\/ Clear Display\r\n    display.clearDisplay();\r\n    display.setRotation(4);\r\n    display.setTextSize(2);\r\n    display.setTextColor(BLACK);\r\n    \/\/ Date\r\n    display.setCursor(0,5);\r\n    display.println( &quot;Date&quot; );\r\n    display.setCursor(0,30);\r\n    display.println( dateRTC );\r\n    \/\/ Time\r\n    display.setCursor(0,55);\r\n    display.println( &quot;Time&quot; );\r\n    display.setCursor(0,75);\r\n    display.println( timeRTC );\r\n    \/\/ Refresh\r\n    display.refresh();\r\n    delay( 100 );\r\n\r\n}\r\n\/\/ Display GPS\r\nvoid isDisplayGPS() {\r\n\r\n    \/\/ Text Display Date\r\n    \/\/ Clear Display\r\n    display.clearDisplay();\r\n    display.setRotation(4);\r\n    display.setTextSize(2);\r\n    display.setTextColor(BLACK);\r\n    \/\/ GPS Status\r\n    display.setCursor(0,5);\r\n    display.print( &quot;GPS: &quot; );\r\n    display.println( GPSSt );\r\n    \/\/ Target Latitude\r\n    display.setCursor(0,25);\r\n    display.println( &quot;Latitude&quot; );\r\n    display.setCursor(0,45);\r\n    display.println( TargetLat );\r\n    \/\/ Target Longitude\r\n    display.setCursor(0,65);\r\n    display.println( &quot;Longitude&quot; );\r\n    display.setCursor(0,90);\r\n    display.println( TargetLon );\r\n    \/\/ Refresh\r\n    display.refresh();\r\n    delay( 100 );\r\n\r\n}\r\n\/\/ GPS Date, Time, Speed, Altitude\r\nvoid isDisplayGPSDate() {\r\n\r\n    \/\/ Text Display Date\r\n    \/\/ Clear Display\r\n    display.clearDisplay();\r\n    display.setRotation(4);\r\n    display.setTextSize(2);\r\n    display.setTextColor(BLACK);\r\n    \/\/ GPS\r\n    display.setCursor(0,5);\r\n    display.println( &quot;GPS&quot; );\r\n    \/\/ Date\r\n    display.setCursor(0,30);\r\n    display.println( TargetDat );\r\n    \/\/ Time\r\n    display.setCursor(0,55);\r\n    display.println( TargetTim );\r\n    \/\/ Speed\r\n    display.setCursor(0,75);\r\n    display.print( &quot;M\/S: &quot; );\r\n    display.println( TargetSMS );\r\n    display.setCursor(0,95);\r\n    display.print( &quot;Km\/h: &quot; );\r\n    display.println( TargetSKH );\r\n    display.setCursor(0,115);\r\n    display.print( &quot;Alt: &quot; );\r\n    display.println( TargetALT );\r\n    \/\/ Refresh\r\n    display.refresh();\r\n    delay( 100 );\r\n\r\n}\r\n\/\/ Display SparkFun BME280 - Temperature, Humidity, Altitude and Barometric Pressure\r\nvoid isDisplayBME280() {\r\n\r\n     \/\/ Text Display BME280\r\n    \/\/ Clear Display\r\n    display.clearDisplay();\r\n    display.setRotation(4);\r\n    display.setTextSize(2);\r\n    display.setTextColor(BLACK);\r\n    \/\/ Temperature Celsius\r\n    display.setCursor(0,5);\r\n    display.println( &quot;Temperature&quot; );\r\n    display.setCursor(0,25);\r\n    display.print( BMEtempC );\r\n    display.println( &quot; C&quot; );\r\n    \/\/ Humidity\r\n    display.setCursor(0,45);\r\n    display.println( &quot;Humidity&quot; );\r\n    display.setCursor(0,65);\r\n    display.print( BMEhumid );\r\n    display.println( &quot;%&quot; );\r\n    \/\/ Altitude Meters\r\n    display.setCursor(0,85);\r\n    display.println( &quot;Altitude M&quot; );\r\n    display.setCursor(0,105);\r\n    display.print( BMEaltitudeM );\r\n    display.println( &quot; m&quot; );\r\n    \/\/ Pressure\r\n    display.setCursor(0,125);    \r\n    display.println( &quot;Barometric&quot; );\r\n    display.setCursor(0,145);\r\n    display.print( BMEpressure );\r\n    display.println( &quot;Pa&quot; );\r\n    \/\/ Refresh\r\n    display.refresh();\r\n    delay( 100 );\r\n\r\n}\r\n\/\/ Display CCS811 - eCO2 &amp; tVOC\r\nvoid isDisplayCCS811() {\r\n\r\n    \/\/ Text Display CCS811\r\n    \/\/ Clear Display\r\n    display.clearDisplay();\r\n    display.setRotation(4);\r\n    display.setTextSize(2);\r\n    display.setTextColor(BLACK);\r\n    \/\/ eCO2 Concentration\r\n    display.setCursor(0,5);\r\n    display.println( &quot;eCO2&quot; );\r\n    display.setCursor(0,25);\r\n    display.print( CCS811CO2 );\r\n    display.println( &quot; ppm&quot; );\r\n    \/\/ tVOC Concentration\r\n    display.setCursor(0,55);\r\n    display.println( &quot;tVOC&quot; );\r\n    display.setCursor(0,75);\r\n    display.print( CCS811TVOC );\r\n    display.println( &quot; ppb&quot; );\r\n    \/\/ Refresh\r\n    display.refresh();\r\n    delay( 100 );\r\n\r\n}\r\n\/\/ Display Accelerometer and Gyroscopes\r\nvoid isDisplayAccGyr() {\r\n\r\n    \/\/ Text Display Accelerometer and Gyroscopes\r\n    \/\/ Clear Display\r\n    display.clearDisplay();\r\n    display.setRotation(4);\r\n    display.setTextSize(2);\r\n    display.setTextColor(BLACK);\r\n    \/\/ Accelerometer\r\n    display.setCursor(0,5);\r\n    display.println( &quot;Accelero&quot; );\r\n    display.setCursor(0,25);\r\n    display.print( &quot;X: &quot; );\r\n    display.println( imuAX );\r\n    display.setCursor(0,45);\r\n    display.print( &quot;Y: &quot; );\r\n    display.println( imuAY );\r\n    display.setCursor(0,65);\r\n    display.print( &quot;Z: &quot; );\r\n    display.println( imuAZ );\r\n    display.setCursor(0,85);\r\n    display.println( &quot;Gyro&quot; );\r\n    display.setCursor(0,105);\r\n    display.print( &quot;X: &quot; );\r\n    display.println( imuGX );\r\n    display.setCursor(0,125);\r\n    display.print( &quot;Y: &quot; );\r\n    display.println( imuGY );\r\n    display.setCursor(0,145);\r\n    display.print( &quot;Z: &quot; );\r\n    display.println( imuGZ );\r\n    \/\/ Refresh\r\n    display.refresh();\r\n    delay( 100 );\r\n      \r\n}\r\n\/\/ Display Magnetometer\r\nvoid isDisplayMag() {\r\n\r\n    \/\/ Text Display Magnetometer\r\n    \/\/ Clear Display\r\n    display.clearDisplay();\r\n    display.setRotation(4);\r\n    display.setTextSize(2);\r\n    display.setTextColor(BLACK);\r\n    \/\/ Magnetometer\r\n    display.setCursor(0,5);\r\n    display.println( &quot;Magnetometer&quot; );\r\n    display.setCursor(0,25);\r\n    display.print( &quot;X: &quot; );\r\n    display.println( magX );\r\n    display.setCursor(0,45);\r\n    display.print( &quot;Y: &quot; );\r\n    display.println( magY );\r\n    display.setCursor(0,65);\r\n    display.print( &quot;Z: &quot; );\r\n    display.println( magZ );\r\n    \/\/ Refresh\r\n    display.refresh();\r\n    delay( 100 );\r\n      \r\n}\r\n\/\/ EMF Meter (Single Axis)\r\nvoid isDisplayEMF() {\r\n\r\n    \/\/ Text Display EMF Meter\r\n    \/\/ Clear Display\r\n    display.clearDisplay();\r\n    display.setRotation(4);\r\n    display.setTextSize(2);\r\n    display.setTextColor(BLACK);\r\n    \/\/ EMF Meter\r\n    display.setCursor(0,10);\r\n    display.println( &quot;EMF Meter&quot; );\r\n    display.setCursor(0,30);\r\n    display.print( &quot;EMF: &quot; );\r\n    display.println( iEMFDis );\r\n    display.setTextSize(1);\r\n    display.println( &quot;0  1 2 3 4 5 6 7 8 9  10&quot; );\r\n    display.setCursor(0,70);\r\n    display.drawRect(0, 70, iEMFRect , display.height(), BLACK);\r\n    display.fillRect(0, 70, iEMFRect , display.height(), BLACK);\r\n    \/\/ Refresh\r\n    display.refresh();\r\n    delay( 100 );\r\n\r\n}\r\n\/\/ Display Z\r\nvoid isDisplayZ() {\r\n    \/\/ Text Display Z\r\n    \/\/ Clear Display\r\n    display.clearDisplay();\r\n    display.setRotation(4);\r\n    display.setTextSize(3);\r\n    display.setTextColor(BLACK);\r\n    \/\/ Z\r\n    display.setCursor(0,10);\r\n    display.print( &quot;Z: &quot; );\r\n    display.println( z );\r\n    \/\/ Refresh\r\n    display.refresh();\r\n    delay( 100 );\r\n}\r\n<\/pre>\n<p><strong>getEEPROM.ino<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"arduino\" data-enlighter-title=\"\">\r\n\/\/ EEPROM\r\n\/\/ isUID EEPROM Unique ID\r\nvoid isUID()\r\n{\r\n  \r\n  \/\/ Is Unit ID\r\n  uid = &quot;&quot;;\r\n  for (int x = 0; x &lt; 5; x++)\r\n  {\r\n    uid = uid + char(EEPROM.read(x));\r\n  }\r\n  \r\n}\r\n<\/pre>\n<p><strong>getEMF.ino<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"arduino\" data-enlighter-title=\"\">\r\n\/\/ EMF Meter (Single Axis)\r\n\/\/ EMF Meter\r\nvoid isEMF() {\r\n\r\n  isNUMPIXELSoff();\r\n\r\n  \/\/ Probe EMF Meter\r\n  for (int i = 0; i &lt; NUMREADINGS; i++){\r\n\r\n    \/\/ Readings\r\n    readings[ i ] = analogRead( iEMF );\r\n    \/\/ Average\r\n    averageEMF += readings[i];\r\n    \r\n  }\r\n\r\n  \/\/ Calculate the average\r\n  val = averageEMF \/ NUMREADINGS;\r\n  \r\n  \/\/ If the reading isn&#039;t zero, proceed\r\n  if( val &gt;= 1 ){\r\n\r\n    \/\/ Turn any reading higher than the senseLimit value into the senseLimit value\r\n    val = constrain( val, 1, senseLimit );\r\n    \/\/ Remap the constrained value within a 1 to 1023 range\r\n    val = map( val, 1, senseLimit, 1, 1023 );\r\n    \r\n    \/\/ Subtract the last reading\r\n    totalEMF -= readings[ indexEMF ];\r\n    \/\/ Read from the sensor\r\n    readings[ indexEMF ] = val;\r\n    \/\/ Add the reading to the total\r\n    totalEMF += readings[ indexEMF ];\r\n    \/\/ Advance to the next index\r\n    indexEMF = ( indexEMF + 1 );\r\n\r\n    \/\/ If the average is over 50 ...\r\n    if (averageEMF &gt; 50){\r\n\r\n      zz = 0;\r\n      isNUMPIXELS();\r\n      \r\n    }\r\n    \r\n    \/\/ If the average is over 250 ...\r\n    if (averageEMF &gt; 250){\r\n\r\n      zz = 1;\r\n      isNUMPIXELS();\r\n      \r\n    }\r\n\r\n    \/\/ If the average is over 350 ...\r\n    if (averageEMF &gt; 350){\r\n\r\n      zz = 2;\r\n      isNUMPIXELS();\r\n      \r\n    }\r\n\r\n    \/\/ If the average is over 500 ...\r\n    if (averageEMF &gt; 500){\r\n\r\n      zz = 3;\r\n      isNUMPIXELS();\r\n      \r\n    }\r\n\r\n    \/\/ If the average is over 650 ...\r\n    if (averageEMF &gt; 650){\r\n\r\n      zz = 4;\r\n      isNUMPIXELS();\r\n      \r\n    }\r\n\r\n    \/\/ If the average is over 750 ...\r\n    if (averageEMF &gt; 750){\r\n\r\n      zz = 5;\r\n      isNUMPIXELS();\r\n      \r\n    }\r\n\r\n    \/\/ If the average is over 850 ...\r\n    if (averageEMF &gt; 850){\r\n\r\n      zz = 6;\r\n      isNUMPIXELS();\r\n      \r\n    }\r\n\r\n    \/\/ If the average is over 950 ...\r\n    if (averageEMF &gt; 950){\r\n\r\n      zz = 7;\r\n      isNUMPIXELS();\r\n      \r\n    }\r\n\r\n    iEMFDis = averageEMF;\r\n    iEMFRect = map( averageEMF, 1, 1023, 1, 144 );\r\n    \r\n    \/\/ Average\r\n    averageEMF = 0;\r\n    \r\n  }\r\n  else\r\n  {\r\n\r\n    \/\/ Average\r\n    averageEMF = 0;\r\n    \r\n  }\r\n  \r\n}\r\n<\/pre>\n<p><strong>getGPS.ino<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"arduino\" data-enlighter-title=\"\">\r\n\/\/ GPS Receiver\r\n\/\/ Setup GPS\r\nvoid setupGPS() {\r\n\r\n  \/\/ Setup GPS\r\n  tGPS.begin(  9600 , SERIAL_8N1 , gpsRXPIN , gpsTXPIN );\r\n  \r\n}\r\n\/\/ isGPS\r\nvoid isGPS(){\r\n\r\n  \/\/ Receives NEMA data from GPS receiver\r\n  \/\/ This sketch displays information every time a new sentence is correctly encoded\r\n  while ( tGPS.available() &gt; 0)\r\n    \r\n    if (gps.encode( tGPS.read() ))\r\n    {\r\n     \r\n       \/\/ GPS Vector Pointer Target\r\n       displayInfo();\r\n       \/\/ GPS Date, Time, Speed, Altitude\r\n       displayDTS();\r\n       \r\n    }\r\n  \r\n  if (millis() &gt; 5000 &amp;&amp; gps.charsProcessed() &lt; 10)\r\n  {\r\n   \r\n     while(true);\r\n    \r\n  }\r\n\r\n}\r\n\/\/ GPS Vector Pointer Target\r\nvoid displayInfo(){\r\n\r\n  \/\/ Location\r\n  if (gps.location.isValid())\r\n  {\r\n    \r\n     \/\/ Latitude\r\n     TargetLat = gps.location.lat();\r\n     \/\/ Longitude\r\n     TargetLon = gps.location.lng();\r\n     \/\/ GPS Status 2\r\n     GPSSt = &quot;Yes&quot;;\r\n    \r\n  }\r\n  else\r\n  {\r\n\r\n     \/\/ GPS Status 0\r\n     GPSSt = &quot;No&quot;;\r\n    \r\n  }\r\n\r\n}\r\n\/\/ GPS Date, Time, Speed, Altitude\r\nvoid displayDTS(){\r\n\r\n  \/\/ Date\r\n  TargetDat = &quot;&quot;; \r\n  if (gps.date.isValid())\r\n  {\r\n    \r\n     \/\/ Date\r\n     \/\/ Year\r\n     TargetDat += String(gps.date.year(), DEC);\r\n     TargetDat += &quot;\/&quot;;\r\n     \/\/ Month\r\n     TargetDat += String(gps.date.month(), DEC);\r\n     TargetDat += &quot;\/&quot;;\r\n     \/\/ Day\r\n     TargetDat += String(gps.date.day(), DEC);\r\n    \r\n  }\r\n\r\n  \/\/ Time\r\n  TargetTim = &quot;&quot;;\r\n  if (gps.time.isValid())\r\n  {\r\n    \r\n     \/\/ Time\r\n     \/\/ Hour\r\n     TargetTim += String(gps.time.hour(), DEC);\r\n     TargetTim += &quot;:&quot;;\r\n     \/\/ Minute\r\n     TargetTim += String(gps.time.minute(), DEC);\r\n     TargetTim += &quot;:&quot;;\r\n     \/\/ Secound\r\n     TargetTim += String(gps.time.second(), DEC);\r\n    \r\n  }\r\n\r\n  \/\/ Speed\r\n  TargetSMS = &quot;&quot;;\r\n  TargetSKH = &quot;&quot;;\r\n  if (gps.speed.isValid())\r\n  {\r\n    \r\n     \/\/ Speed\r\n     \/\/ M\/S\r\n     int x = gps.speed.mps();\r\n     TargetSMS = String( x, DEC);\r\n     \/\/ Km\/h\r\n     int y = gps.speed.kmph();\r\n     TargetSKH = String( y, DEC);\r\n\r\n  }\r\n\r\n  \/\/ Altitude\r\n  TargetALT = &quot;&quot;;\r\n  if (gps.altitude.isValid())\r\n  {\r\n    \r\n     \/\/ Altitude\r\n     \/\/ Meters\r\n     int z = gps.altitude.meters();\r\n     TargetALT = String( z, DEC);\r\n\r\n  }\r\n  \r\n}\r\n<\/pre>\n<p><strong>getMagnetometer.ino<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"arduino\" data-enlighter-title=\"\">\r\n\/\/ Magnetometer\r\n\/\/ Setup Magnetometer\r\nvoid setupMag() {\r\n\r\n  \/\/ Setup Magnetometer\r\n  mag.init();\r\n  \/\/ Default\r\n  mag.enableDefault();\r\n  \r\n}\r\n\/\/ Magnetometer\r\nvoid isMag() {\r\n\r\n  \/\/ Magnetometer\r\n  mag.read();\r\n  \/\/ Magnetometer x, y, z\r\n  magX = mag.m.x;\r\n  magY = mag.m.y;\r\n  magZ = mag.m.z;\r\n  \r\n}\r\n<\/pre>\n<p><strong>getNeopix.ino<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"arduino\" data-enlighter-title=\"\">\r\n\/\/ NeoPixels\r\n\/\/ Neopix\r\nvoid isNeopix() \r\n{ \r\n\r\n    \/\/ Pixels\r\n    pixels.setBrightness( 150 );\r\n    \/\/ Pixels color takes RGB values, from 0,0,0 up to 255,255,255\r\n    pixels.setPixelColor( iNeo, pixels.Color(red,green,blue) ); \r\n    \/\/ This sends the updated pixel color to the hardware\r\n    pixels.show(); \r\n    \/\/ Delay for a period of time (in milliseconds)\r\n    delay(50);     \r\n  \r\n}\r\n\/\/ isNUMPIXELS\r\nvoid isNUMPIXELS()\r\n{\r\n\r\n  \/\/ Neopix Value\r\n  switch ( zz ) {  \r\n    case 0:\r\n      \/\/ NeoPixels\r\n      \/\/ Green\r\n      \/\/ Red\r\n      red = 0;\r\n      \/\/ Green\r\n      green = 255;\r\n      \/\/ Blue\r\n      blue = 0;\r\n      \/\/ Neopix\r\n      iNeo = 0;      \r\n      isNeopix();\r\n      break;  \r\n    case 1:\r\n      \/\/ NeoPixels\r\n      \/\/ Green\r\n      \/\/ Red\r\n      red = 0;\r\n      \/\/ Green\r\n      green = 255;\r\n      \/\/ Blue\r\n      blue = 0;\r\n      \/\/ Neopix\r\n      iNeo = 1;      \r\n      isNeopix();\r\n      break;\r\n    case 2:\r\n      \/\/ NeoPixels\r\n      \/\/ Green\r\n      \/\/ Red\r\n      red = 0;\r\n      \/\/ Green\r\n      green = 255;\r\n      \/\/ Blue\r\n      blue = 0;\r\n      \/\/ Neopix\r\n      iNeo = 2;      \r\n      isNeopix();\r\n      break;\r\n    case 3:\r\n      \/\/ NeoPixels\r\n      \/\/ Yellow\r\n      \/\/ Red\r\n      red = 255;\r\n      \/\/ Green\r\n      green = 255;\r\n      \/\/ Blue\r\n      blue = 0;\r\n      \/\/ Neopix\r\n      iNeo = 3;      \r\n      isNeopix();\r\n      break;\r\n    case 4:\r\n      \/\/ NeoPixels\r\n      \/\/ Yellow\r\n      \/\/ Red\r\n      red = 255;\r\n      \/\/ Green\r\n      green = 255;\r\n      \/\/ Blue\r\n      blue = 0;\r\n      \/\/ Neopix\r\n      iNeo = 4;      \r\n      isNeopix();\r\n      break;\r\n    case 5:\r\n      \/\/ NeoPixels\r\n      \/\/ Yellow\r\n      \/\/ Red\r\n      red = 255;\r\n      \/\/ Green\r\n      green = 255;\r\n      \/\/ Blue\r\n      blue = 0;\r\n      \/\/ Neopix\r\n      iNeo = 5;      \r\n      isNeopix();\r\n      break;\r\n    case 6:\r\n      \/\/ NeoPixels\r\n      \/\/ Yellow\r\n      \/\/ Red\r\n      red = 255;\r\n      \/\/ Green\r\n      green = 255;\r\n      \/\/ Blue\r\n      blue = 0;\r\n      \/\/ Neopix\r\n      iNeo = 6;      \r\n      isNeopix();    \r\n      break;\r\n    case 7:\r\n      \/\/ NeoPixels\r\n      \/\/ Red\r\n      \/\/ Red\r\n      red = 255;\r\n      \/\/ Green\r\n      green = 0;\r\n      \/\/ Blue\r\n      blue = 0;\r\n      \/\/ Neopix\r\n      iNeo = 7;      \r\n      isNeopix();     \r\n      break;\r\n  }\r\n  \r\n}\r\n\/\/ isNUMPIXELSoff\r\nvoid isNUMPIXELSoff()\r\n{\r\n\r\n   \/\/ Black Off\r\n   \/\/ NeoPixels\r\n   for(int y=0; y &lt; NUMPIXELS; y++)\r\n   { \r\n      red = 0;                                 \/\/ Red\r\n      green = 0;                               \/\/ Green\r\n      blue = 0;                                \/\/ Blue\r\n      iNeo = y;                                \/\/ Neopix  \r\n      isNeopix();    \r\n   }\r\n   \r\n}\r\n<\/pre>\n<p><strong>getRTC.ino<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"arduino\" data-enlighter-title=\"\">\r\n\/\/ Date &amp; Time\r\n\/\/ PCF8523 Precision RTC\r\nvoid setupRTC() {\r\n\r\n  \/\/ Date &amp; Time\r\n  \/\/ pcf8523 Precision RTC   \r\n  if (! rtc.begin()) {\r\n    while (1);\r\n  }  \r\n  \r\n  if (! rtc.initialized()) {\r\n    \r\n    \/\/ Following line sets the RTC to the date &amp; time this sketch was compiled\r\n    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));\r\n    \/\/ This line sets the RTC with an explicit date &amp; time, for example to set\r\n    \/\/ January 21, 2014 at 3am you would call:\r\n    \/\/ rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));\r\n    \/\/ rtc.adjust(DateTime(2021, 8, 18, 8, 48, 0));\r\n    \r\n  }\r\n  \r\n}\r\n\/\/ Date and Time RTC PCF8523\r\nvoid isRTC () {\r\n\r\n  \/\/ Date and Time\r\n  dateRTC = &quot;&quot;;\r\n  timeRTC = &quot;&quot;;\r\n  DateTime now = rtc.now();\r\n  \r\n  \/\/ Date\r\n  \/\/ Year\r\n  dateRTC = now.year(), DEC; \r\n  dateRTC = dateRTC + &quot;\/&quot;;\r\n  \/\/ Month\r\n  dateRTC = dateRTC + now.month(), DEC;\r\n  dateRTC = dateRTC + &quot;\/&quot;;\r\n  \/\/ Day\r\n  dateRTC = dateRTC + now.day(), DEC;\r\n  \r\n  \/\/ Time\r\n  \/\/ Hour\r\n  timeRTC = now.hour(), DEC;\r\n  timeRTC = timeRTC + &quot;:&quot;;\r\n  \/\/ Minute\r\n  timeRTC = timeRTC + now.minute(), DEC;\r\n  timeRTC = timeRTC + &quot;:&quot;;\r\n  \/\/ Second\r\n  timeRTC = timeRTC + now.second(), DEC;\r\n  \r\n}\r\n<\/pre>\n<p><strong>getRot.ino<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"arduino\" data-enlighter-title=\"\">\r\n\/\/ Rotary Switch\r\n\/\/ isRot - iRotVal - Value\r\nvoid isRot() {\r\n  \r\n  \/\/ Rotary Switch\r\n  z = analogRead( iRotNum );\r\n  \r\n  \/\/ Rotary Switch - 10 Position\r\n  \/\/ Number 1 =&gt; 10\r\n  if ( z &gt;= 3600 ) {\r\n\r\n    \/\/ Z\r\n    iRotVal = 10;\r\n    \r\n  } else if ( z &gt;= 3200 ) {\r\n\r\n    \/\/ Z\r\n    iRotVal = 9;\r\n    \r\n  } else if ( z &gt;= 2700 ) {\r\n\r\n    \/\/ Z\r\n    iRotVal = 8;\r\n    \r\n  } else if ( z &gt;= 2400 ) {\r\n\r\n    \/\/ Z\r\n    iRotVal = 7;\r\n    \r\n  } else if ( z &gt;= 2000 ) {\r\n\r\n    \/\/ Z\r\n    iRotVal = 6;\r\n    \r\n  } else if ( z &gt;= 1600 ) {\r\n\r\n    \/\/ Z\r\n    iRotVal = 5;\r\n    \r\n  } else if ( z &gt;= 1200 ) {\r\n\r\n    \/\/ Z\r\n    iRotVal = 4;\r\n    \r\n  } else if ( z &gt;= 900 ) {\r\n\r\n    \/\/ Z\r\n    iRotVal = 3;\r\n    \r\n  } else if ( z &gt;= 500 ) {\r\n\r\n    \/\/ Z\r\n    iRotVal = 2;\r\n    \r\n  } else {\r\n\r\n    \/\/ Z\r\n    iRotVal = 1;\r\n    \r\n  }\r\n\r\n  \/\/ Range Value\r\n  switch ( iRotVal ) {\r\n    case 1:\r\n\r\n      \/\/ Display Date, Time\r\n      isDisplayDate();\r\n       \r\n      break;\r\n    case 2:\r\n\r\n      \/\/ Display GPS\r\n      isDisplayGPS();\r\n         \r\n      break;\r\n    case 3:\r\n\r\n      \/\/ GPS Date, Time, Speed, Altitude\r\n      \/\/isDisplayGPSDate();\r\n      \r\n      break;  \r\n    case 4:\r\n      \r\n      \/\/ GPS Display Date, Time, Speed\r\n      isDisplayGPSDate();\r\n      \r\n      break;\r\n    case 5:\r\n      \r\n      \/\/ Display SparkFun BME280 - Temperature, Humidity, Altitude and Barometric Pressure\r\n      isDisplayBME280();\r\n      \r\n      break;\r\n    case 6:\r\n      \r\n      \/\/ Display CCS811 - eCO2 &amp; tVOC\r\n      isDisplayCCS811();\r\n      \r\n      break;       \r\n    case 7:\r\n\r\n      \/\/ Accelerometer and Gyroscopes\r\n      isDisplayAccGyr();\r\n      \r\n      break; \r\n    case 8:\r\n         \r\n      \/\/ Display Magnetometer\r\n      isDisplayMag();\r\n      \r\n      break; \r\n    case 9:\r\n      \r\n      \/\/ EMF Meter (Single Axis)\r\n      isDisplayEMF();\r\n      \r\n      break;\r\n    case 10:\r\n\r\n      \/\/ Display UID\r\n      isDisplayUID();\r\n      \r\n      break;\r\n  }\r\n  \r\n}\r\n<\/pre>\n<p><strong>getSD.ino<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"arduino\" data-enlighter-title=\"\">\r\n\/\/ MicroSD Card\r\n\/\/ MicroSD Setup\r\nvoid setupSD() {\r\n\r\n    \/\/ MicroSD Card\r\n    pinMode( chipSelect , OUTPUT );\r\n    if(!SD.begin( chipSelect )){\r\n        ;  \r\n        return;\r\n    }\r\n    \r\n    uint8_t cardType = SD.cardType();\r\n\r\n    \/\/ CARD NONE\r\n    if(cardType == CARD_NONE){\r\n        ; \r\n        return;\r\n    }\r\n\r\n    \/\/ SD Card Type\r\n    if(cardType == CARD_MMC){\r\n        ; \r\n    } else if(cardType == CARD_SD){\r\n        ; \r\n    } else if(cardType == CARD_SDHC){\r\n        ; \r\n    } else {\r\n        ; \r\n    } \r\n\r\n    \/\/ Size\r\n    uint64_t cardSize = SD.cardSize() \/ (1024 * 1024);\r\n \r\n}\r\n\/\/ MicroSD Card\r\nvoid isSD() {\r\n\r\n  zzzzzz = &quot;&quot;;\r\n\r\n  \/\/ EEPROM Unique ID|Version|Date|Time|GPS Status|Target Latitude|Target Longitude|GPS Date|GPS Time|GPS Speed M\/S|GPS Speed Km\/h|GPS Altitude\r\n  \/\/|Temperature Celsius|Humidity|Altitude Meters|Barometric Pressure|eCO2 Concentration|tVOC Concentration|Accelerometer X|Accelerometer Y|Accelerometer Z|\r\n  \/\/Gyroscopes X|Gyroscopes Y|Gyroscopes Z|Magnetometer X|Magnetometer Y|Magnetometer Z|EMF|\\r\r\n  zzzzzz = uid + &quot;|&quot; + sver + &quot;|&quot; + dateRTC + &quot;|&quot; + timeRTC + &quot;|&quot; + GPSSt + &quot;|&quot; + TargetLat + &quot;|&quot; + TargetLon + &quot;|&quot; + TargetDat + &quot;|&quot; + TargetTim + &quot;|&quot; + \r\n  TargetSMS + &quot;|&quot; + TargetSKH + &quot;|&quot; + TargetALT  + &quot;|&quot; + BMEtempC + &quot;|&quot; + BMEhumid + &quot;|&quot; + BMEaltitudeM + &quot;|&quot; + BMEpressure + &quot;|&quot; + CCS811CO2 + &quot;|&quot; \r\n  + CCS811TVOC + &quot;|&quot; + imuAX + &quot;|&quot; + imuAY + &quot;|&quot; + imuAZ + &quot;|&quot; + imuGX + &quot;|&quot; + imuGY + &quot;|&quot; + imuGZ + &quot;|&quot; + magX + &quot;|&quot; + magY + &quot;|&quot; + magZ + &quot;|&quot; + iEMFDis + &quot;|\\r&quot;;\r\n\r\n  \/\/ msg + 1\r\n  char msg[zzzzzz.length() + 1];\r\n\r\n  zzzzzz.toCharArray(msg, zzzzzz.length() + 1);\r\n\r\n  \/\/ Append File\r\n  appendFile(SD, &quot;\/espdata.txt&quot;, msg );\r\n  \r\n}\r\n\/\/ List Dir\r\nvoid listDir(fs::FS &amp;fs, const char * dirname, uint8_t levels){\r\n    \r\n    \/\/ List Dir\r\n    dirname;\r\n    \r\n    File root = fs.open(dirname);\r\n    \r\n    if(!root){\r\n        return;\r\n    }\r\n    \r\n    if(!root.isDirectory()){\r\n        return;\r\n    }\r\n\r\n    File file = root.openNextFile();\r\n    \r\n    while(file){\r\n        if(file.isDirectory()){\r\n            file.name();\r\n            if(levels){\r\n                listDir(fs, file.name(), levels -1);\r\n            }\r\n        } else {\r\n            file.name();\r\n            file.size();\r\n        }\r\n        file = root.openNextFile();\r\n    }\r\n    \r\n}\r\n\/\/ Write File\r\nvoid writeFile(fs::FS &amp;fs, const char * path, const char * message){\r\n    \r\n    \/\/ Write File\r\n    path;\r\n    \r\n    File file = fs.open(path, FILE_WRITE);\r\n    \r\n    if(!file){\r\n        return;\r\n    }\r\n    \r\n    if(file.print(message)){\r\n        ;  \r\n    } else {\r\n        ;  \r\n    }\r\n    \r\n    file.close();\r\n    \r\n}\r\n\/\/ Append File\r\nvoid appendFile(fs::FS &amp;fs, const char * path, const char * message){\r\n    \r\n    \/\/ Append File\r\n    path;\r\n    \r\n    File file = fs.open(path, FILE_APPEND);\r\n    \r\n    if(!file){\r\n        return;\r\n    }\r\n    \r\n    if(file.print(message)){\r\n        ;  \r\n    } else {\r\n        ;  \r\n    }\r\n    \r\n    file.close();\r\n    \r\n}\r\n<\/pre>\n<p>setup.ino<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"arduino\" data-enlighter-title=\"\">\r\n\/\/ Setup\r\nvoid setup()\r\n{\r\n  \r\n  \/\/ EEPROM Size\r\n  EEPROM.begin(EEPROM_SIZE);\r\n  \r\n  \/\/ EEPROM Unique ID\r\n  isUID();\r\n  \r\n  \/\/ NeoPixels\r\n  \/\/ This initializes the NeoPixel library\r\n  pixels.begin();\r\n  \r\n  \/\/ GPS Receiver\r\n  \/\/ Setup GPS\r\n  setupGPS();\r\n\r\n  \/\/ Set up I2C bus\r\n  Wire.begin();\r\n\r\n  \/\/ SparkFun BME280 - Temperature, Humidity, Altitude and Barometric Pressure\r\n  myBME280.begin();\r\n  \r\n  \/\/ CCS811 - eCO2 &amp; tVOC\r\n  myCCS811.begin();\r\n  \r\n  \/\/ SHARP Display Start &amp; Clear the Display\r\n  display.begin();\r\n  \/\/ Clear Display\r\n  display.clearDisplay();\r\n\r\n  \/\/ Date &amp; Time RTC\r\n  \/\/ PCF8523 Precision RTC\r\n  isDisplayUID();\r\n  \r\n  \/\/ Setup RTC\r\n  setupRTC();\r\n\r\n  \/\/MicroSD Card\r\n  setupSD();\r\n\r\n  \/\/ Setup IMU\r\n  setupIMU();\r\n\r\n  \/\/ Setup Magnetometer\r\n  setupMag();\r\n\r\n  \/\/ NeoPixels\r\n  \/\/ isNUMPIXELS Off\r\n  isNUMPIXELSoff();\r\n\r\n  \/\/ Initialize the LED Green\r\n  pinMode(iLEDGreen, OUTPUT);\r\n\r\n  \/\/ Slide Switch\r\n  pinMode(iSS1, INPUT);\r\n\r\n  delay( 5000 );\r\n  \r\n}\r\n<\/pre>\n<p>&#8212;&#8212;<\/p>\n<p><strong>People can contact us:<\/strong> https:\/\/www.donluc.com\/?page_id=1927<\/p>\n<p><strong>Technology Experience<\/strong><\/p>\n<ul>\n<li>Single-Board Microcontrollers (PIC, Arduino, Raspberry Pi,Espressif, etc&#8230;)<\/li>\n<li>IoT<\/li>\n<li>Robotics<\/li>\n<li>Research &#038; Development (R &#038; D)<\/li>\n<li>Desktop Applications (Windows, OSX, Linux, Multi-OS, Multi-Tier, etc&#8230;)<\/li>\n<li>Mobile Applications (Android, iOS, Blackberry, Windows Mobile, Windows CE, etc&#8230;)<\/li>\n<li>Web Applications (LAMP, Scripting, Java, ASP, ASP.NET, RoR, Wakanda, etc&#8230;)<\/li>\n<li>Social Media Programming &#038; Integration (Facebook, Twitter, YouTube, Pinterest, etc&#8230;)<\/li>\n<li>Content Management Systems (WordPress, Drupal, Joomla, Moodle, etc&#8230;)<\/li>\n<li>Bulletin Boards (phpBB, SMF, Vanilla, jobberBase, etc&#8230;)<\/li>\n<li>eCommerce (WooCommerce, OSCommerce, ZenCart, PayPal Shopping Cart, etc&#8230;)<\/li>\n<\/ul>\n<p><strong>Instructor<\/strong><\/p>\n<ul>\n<li>PIC Microcontrollers<\/li>\n<li>Arduino<\/li>\n<li>Raspberry Pi<\/li>\n<li>Espressif<\/li>\n<li>Robotics<\/li>\n<li>DOS, Windows, OSX, Linux, iOS, Android, Multi-OS<\/li>\n<li>Linux-Apache-PHP-MySQL<\/li>\n<\/ul>\n<p><strong>Follow Us<\/strong><\/p>\n<p><strong>J. Luc Paquin \u2013 Curriculum Vitae &#8211; 2021 English &#038; Espa\u00f1ol<\/strong><br \/>\nhttps:\/\/www.jlpconsultants.com\/CV\/LucPaquinCVEngMk2021c.pdf<br \/>\nhttps:\/\/www.jlpconsultants.com\/CV\/LucPaquinCVEspMk2021c.pdf<\/p>\n<p><strong>Web:<\/strong> https:\/\/www.donluc.com\/<br \/>\n<strong>Web:<\/strong> https:\/\/www.jlpconsultants.com\/<br \/>\n<strong>Web:<\/strong> https:\/\/www.donluc.com\/DLE\/<br \/>\n<strong>Web:<\/strong> https:\/\/www.donluc.com\/DLHackster\/<br \/>\n<strong>Web:<\/strong> https:\/\/www.hackster.io\/neosteam-labs<br \/>\n<strong>Web:<\/strong> https:\/\/zoom.us\/<br \/>\n<strong>Patreon:<\/strong> https:\/\/www.patreon.com\/DonLucElectronics<br \/>\n<strong>Facebook:<\/strong> https:\/\/www.facebook.com\/neosteam.labs.9\/<br \/>\n<strong>YouTube:<\/strong> https:\/\/www.youtube.com\/channel\/UC5eRjrGn1CqkkGfZy0jxEdA<br \/>\n<strong>Twitter:<\/strong> https:\/\/twitter.com\/labs_steam<br \/>\n<strong>Pinterest:<\/strong> https:\/\/www.pinterest.com\/NeoSteamLabs\/<br \/>\n<strong>Instagram:<\/strong> https:\/\/www.instagram.com\/neosteamlabs\/<\/p>\n<p><strong>Don Luc<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>&#8212;&#8212; #DonLucElectronics #DonLuc #Time #EMF #IMU #NeoPixel #RTC #Display #Adalogger #MicroSD #GPSReceiver #CCS811 #BME280 #Arduino #ESP32 #Project #Programming #Electronics #Microcontrollers #Consultant #VideoBlog &#8212;&#8212; &#8212;&#8212; &#8212;&#8212; &#8212;&#8212; &#8212;&#8212; Pololu Adjustable Step-Up Voltage Regulator U1V11A This compact U1V11A switching step-up voltage regulator efficiently boosts input voltages as low as 0.5 V to an adjustable output voltage between &#8230; <a title=\"Project #19: Time &#8211; NeoPixel Stick &#8211; 8 &#8211; Mk11\" class=\"read-more\" href=\"https:\/\/www.donluc.com\/?p=2844\" aria-label=\"Read more about Project #19: Time &#8211; NeoPixel Stick &#8211; 8 &#8211; Mk11\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[166,47,49,38,80,59,5,138,46,82,10,43],"tags":[86,6,92,102,4,87,19,91,83,85,89,24,147,103,9,84,27,109,33,34],"class_list":["post-2844","post","type-post","status-publish","format-standard","hentry","category-time","category-adafruit","category-consultant","category-digitalelectronics","category-esp32","category-fritzing","category-microcontrollers","category-patreon","category-pololu","category-program-esp32","category-projects","category-sparkfun","tag-adafruit","tag-arduino","tag-battery","tag-components","tag-consultant","tag-display","tag-electronics","tag-emf-meter","tag-esp32","tag-fritzing","tag-gps-receiver","tag-microcontroller","tag-neopixel-stick","tag-pololu","tag-programming","tag-programming-esp32","tag-projects-2","tag-sparkfun","tag-technology","tag-video-blog"],"_links":{"self":[{"href":"https:\/\/www.donluc.com\/index.php?rest_route=\/wp\/v2\/posts\/2844","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.donluc.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.donluc.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.donluc.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.donluc.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2844"}],"version-history":[{"count":2,"href":"https:\/\/www.donluc.com\/index.php?rest_route=\/wp\/v2\/posts\/2844\/revisions"}],"predecessor-version":[{"id":4419,"href":"https:\/\/www.donluc.com\/index.php?rest_route=\/wp\/v2\/posts\/2844\/revisions\/4419"}],"wp:attachment":[{"href":"https:\/\/www.donluc.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2844"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.donluc.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2844"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.donluc.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2844"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}