This is the code with the changes you suggested. Now polling and performing actions in the loop() function instead of in the ISR function… I will try this in a little bit… I am far away from the photon… At this point I am planning on switching to mills technique instead of the ISR.
The code that runs the wifi and connect code is in the performReportDuties function near the bottom of the code.
#include "LEDControl.h"
#include "SparkFunMAX17043/SparkFunMAX17043.h"
#include "SparkFun_Photon_Weather_Shield_Library/SparkFun_Photon_Weather_Shield_Library.h"
#include "math.h"
#define PIN_SOLARNRG A2
#define PIN_POWERALERT_ISR D6
#define version "2.0a"
//WX STUFF
Weather sensor;
float humidity = 0;
float tempc = 0;
float tempf = 0;
float dewtf = 0;
float dewtc = 0;
float pascals = 0;
float baroTempc = 0;
float baroInches = 0;
float altimeter = 0;
//OPTIONS
const int pulseLEDEvery = 30;
const int pulseLEDDuration = 2;
const int reportToCloudEvery = 30;
const int lowPowerAlert = 30;
//STATION SETUP
const int station_elevation_m = 1638;
unsigned long int pulseSeconds=0;
unsigned long int seconds=0;
//Battery Shield
float voltage = 0.0;
float soc = 0.0;
bool alert = false;
float solarNrg = 0.0;
float solarNrgRaw = 0.0;
Timer heartTimer(1000, heartBeat);
void heartBeat() {
if (seconds>=UINT_MAX) {seconds=0;}
seconds++;
pulseSeconds++;
}
//DUTY METHODS
void publishBatteryEvents()
{
String msg = String::format("{ \"SOLNRG\":%f, \"VTS\":%f, \"SOC\":%f, \"LOWP\":%d}", solarNrg, voltage, soc, alert);
Particle.publish("POWSTAT", msg);
}
void publishWeatherEvents()
{
String msg = String::format("{ \"TEMP\":%f, \"DEW\":%f, \"PASC\":%f, \"ALT\":%f, \"HUM\":%f}", tempc, dewtc, pascals, altimeter, humidity);
Particle.publish("WXSTAT", msg);
}
// SHIELDS >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>
//BATTERY-POWER
void readBattery()
{
lipo.wake();
delay(300);
voltage = lipo.getVoltage();
soc = lipo.getSOC();
alert = lipo.getAlert(true);
solarNrgRaw = ((analogRead(PIN_SOLARNRG) * 3.0)/4095);
solarNrg = (100 / 3) * solarNrgRaw;
}
//WEATHER
void readWeather()
{
humidity = sensor.getRH();
float rawTempc = sensor.getTemp();
tempf = sensor.getTemp();
baroTempc = sensor.readBaroTemp();
pascals = sensor.readPressure();
tempc = (rawTempc+baroTempc)/2;
tempf = (tempc * 9)/5 + 32;
baroInches = pascals * 0.0002953;
dewtc = dewPoint(tempc, humidity);
dewtf = (dewtc * 9.0)/ 5.0 + 32.0;
altimeter = altimeterSetting(pascals);
}
double dewPoint(double celsius, double humidity)
{
// (1) Saturation Vapor Pressure = ESGG(T)
double RATIO = 373.15 / (273.15 + celsius);
double RHS = -7.90298 * (RATIO - 1);
RHS += 5.02808 * log10(RATIO);
RHS += -1.3816e-7 * (pow(10, (11.344 * (1 - 1/RATIO ))) - 1) ;
RHS += 8.1328e-3 * (pow(10, (-3.49149 * (RATIO - 1))) - 1) ;
RHS += log10(1013.246);
// factor -3 is to adjust units - Vapor Pressure SVP * humidity
double VP = pow(10, RHS - 3) * humidity;
// (2) DEWPOINT = F(Vapor Pressure)
double T = log(VP/0.61078); // temp var
return (241.88 * T) / (17.558 - T);
}
float altimeterSetting(float pascalsIn)
{
float pressure = pascalsIn;
pressure /= 100; //pressure is now in millibars
float part1 = pressure - 0.3; //Part 1 of formula
const float part2 = 8.42288 / 100000.0;
float part3 = pow((pressure - 0.3), 0.190284);
float part4 = (float)station_elevation_m / part3;
float part5 = (1.0 + (part2 * part4));
float part6 = pow(part5, (1.0/0.190284));
float altimeter_setting_pressure_mb = part1 * part6; //Output is now in adjusted millibars
float baroin = altimeter_setting_pressure_mb * 0.02953;
return baroin;
}
// >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>
// PHOTON METHODS
void setup()
{
pinMode(PIN_SOLARNRG, INPUT);
pinMode(PIN_POWERALERT_ISR, INPUT_PULLUP);
Time.zone(-5);
Serial.begin(9600);
//BatteryShield
lipo.begin();
lipo.quickStart();
lipo.setThreshold(lowPowerAlert);
//WeatherShield
sensor.begin();
sensor.setModeBarometer();
sensor.setOversampleRate(100);
sensor.enableEventFlags();
RGB.control(true);
String bootStatusString;
String ip = WiFi.localIP();
Serial.println("*************************");
Serial.println(" WXMAN");
Serial.print("Version: ");
Serial.println(version);
Serial.println("By Lobo:Labs 2015");
Serial.println("System Ready......");
Serial.println("*************************");
bootStatusString = String::format("{\"VER\": \"%s\", \"RSSI\": %d, \"SSID\":\"%s\", \"IP\":\"%s\"}", version, WiFi.RSSI(), WiFi.SSID(), ip.c_str());
Serial.println(bootStatusString);
//waitUntil(Particle.connected);
Particle.publish("BOOT", bootStatusString);
readBattery();
readWeather();
performReportDuties();
heartTimer.start();
}
void performReportDuties() {
setLED(WHITE);
Particle.connect();
if (waitFor(Particle.connected, 60000)) {
setLED(BLUE);
publishBatteryEvents();
publishWeatherEvents();
setLED(OFF);
delay(200);
Wifi.off();
} else {
Serial.println("[Cloud] Connection Timed Out. Resetting device");
System.reset();
}
}
void timedEvents() {
if (pulseSeconds==pulseLEDEvery) { setLED(GREEN); }
if (pulseSeconds>=pulseLEDEvery+pulseLEDDuration) { setLED(OFF); pulseSeconds=0; }
if (seconds % 2 == 0) { //Read Values every 2 seconds.
readBattery();
readWeather();
}
if (seconds % reportToCloudEvery == 0) {
performReportDuties();
}
}
void loop() {
timedEvents();
}