   pinMode(PIN_UBIQUITI_DISABLE, OUTPUT);                 // prepares Ubiquiti power control pin
   digitalWrite(PIN_UBIQUITI_DISABLE, UBIQUITI_ENABLED);  // turns Ubiquiti on
 
+  // Ubiquiti takes 30 seconds to turn on and Ethernet takes 5; try to make them ready at the same time
+  // This a poor way to accomplish this task; better would be to ping
+  for (int i=0; i<30; i++) {
+    wdt_reset();
+    delay(1000);
+  }
+
   pinMode(PIN_ETH_DISABLE, OUTPUT);                     // prepares ETH power control pin
   digitalWrite(PIN_ETH_DISABLE, ETH_ENABLED);           // turns ETH shield on
+  
+  // ETH takes 5 seconds to be ready to send when turned on
+  // This a poor way to accomplish this task; better would be to ping
+  for (int i=0; i<5; i++) {
+    wdt_reset();
+    delay(1000);
+  }
+  
+  Ethernet.begin(mac, ip, dnsServer, gateway, subnet); // jjj Eth must be initialized after each power up
+
 }
 
 // Turns off power for network components to save power
 void disableEthernet() {
   pinMode(PIN_UBIQUITI_DISABLE, OUTPUT);                  // prepares Ubiquiti power control pin
   digitalWrite(PIN_UBIQUITI_DISABLE, UBIQUITI_DISABLED);  // turns Ubiquiti off
+
+                                             //             Unlike regular boots, the Ethernet shield's SPI pins will be active after a reset because of the Ariadne Bootloader.
+                                             //             When powering down the Ethernet shield, all connected pins must be set to low or preferrably inputs without pullups
+  pinMode(MOSI, INPUT);                      //             prevents leakage through ESD diodes
+  pinMode(MISO, INPUT);                      //             prevents leakage through ESD diodes
+  pinMode(SCK, INPUT);                       //             prevents leakage through ESD diodes
+  pinMode(SS, INPUT);                        //             prevents leakage through ESD diodes
 
   pinMode(PIN_ETH_DISABLE, OUTPUT);                      // prepares ETH power control pin
   digitalWrite(PIN_ETH_DISABLE, ETH_DISABLED);           // turns ETH shield off

 Much of this is based on Mike Grusin's USB Weather Board code: https://www.sparkfun.com/products/10586

 */
const String wxVersion = "L13bB1"; // jjj
const String wxOwner = "-DJ-";
const byte IPgw = 254;    //Marshall must be 254
const byte IPq3 = 243;    //Marshall must be 243
const byte ina219a_HWaddr = 0x40;  //0x40 for everyone but Lance. 0x44 for Lance.
const byte ina219b_HWaddr = 0x41;  //
const byte bme280a_HWaddr = 0x76;  //Default may be 0x77 depending on mfgr
const byte bme280b_HWaddr = 0x77;
const bool disableNTP = false;      //Set to false to allow NTP, but it can cause crashes if it doesn't get a response.
const String startupMessage = "UM Weather Station (ver L13bB1 2017/09/15) starting at ms ";


#include <avr/wdt.h>   // WatchDog Timer. If I hit an endless loop, reset. Kindof. May not reset Ethernet properly.

void wspeedIRQ()
// Activated by the magnet in the anemometer (2 ticks per rotation), attached to input D3
{
    if (millis() - lastWindIRQ > 25) // Ignore switch-bounce glitches less than 10ms (142MPH max reading) after the reed switch closes. 20ms = 74mph max, 25ms = 60mph max
    {
        lastWindIRQ = millis(); //Grab the current time
        windClicks++; //There is 1.492MPH for each click per second.
