have you considered a slightly simpler approach like this (uncompiled, untested):
// This #include statement was automatically added by the Particle IDE.
#include "DS18B20/Particle-OneWire.h"
#include "DS18B20/DS18B20.h"
// Globals
DS18B20 ds18b20 = DS18B20(D2); //Sets Pin D2 for Water Temp Sensor
int LED = D7; // pin for LED
int PIR = D3; //pin for PIR motion sensor
float pubTemp;
double celsius;
double fahrenheit;
const int Metric_Publish_Rate = 30000;
const int DS18B20_SAMPLE_INTERVAL = 2500;
unsigned long metricPublishTime = 0;
unsigned long tempSampleTime = 0;
volatile bool isrFlag = false;
int dsAttempts = 0;
Timer ledTimer(1000, blink_led);
// class Alarm {
// public:
// Alarm() {
// Particle.function("alarm", &Alarm::alarm, this);
// }
//
// int status;
//
// int alarm(String command) {
// if(command == "reset"){
// status = 0;
// }
// if(command == "panic"){
// status = 1;
// }
// else {
// status = -1;
// }
// return status;
// }
// };
void setup()
{
Time.zone(-5);
Particle.syncTime();
Particle.variable("tempCelsius", &celsius, DOUBLE);
Particle.variable("tempFahrenheit", &fahrenheit, DOUBLE);
pinMode(LED, OUTPUT); // Use for a simple test of the led on or off by subscribing to a topical called led
pinMode(PIR, INPUT_PULLUP); // Initialize pin as input with an internal pull-up resistor
ledTimer.start();
attachInterrupt(PIR, motion_detected, RISING);
Serial.begin(9600);
}
void loop()
{
if (millis() - tempSampleTime > DS18B20_SAMPLE_INTERVAL)
{
getTemp();
tempSampleTime = millis();
}
if (millis() - metricPublishTime > Metric_Publish_Rate)
{
Serial.println("Publishing now.");
publishData();
metricPublishTime = millis();
}
if (isrFlag)
{
Particle.publish("photon/motion/detected", "1");
isrFlag = false;
}
}
void blink_led()
{
digitalWrite(LED, !digitalRead(LED));
}
void motion_detected()
{
isrFlag = true;
}
//void resetAlarm()
//{
// Alarm alarm;
// alarm.status = 0;
//}
//void raiseAlarm()
//{
// Particle.publish("photon/motion/detected", "1");
// resetAlarm();
//}
void publishData()
{
if(!ds18b20.crcCheck()){
return;
}
Particle.publish("photon/temperature/celsius", String(celsius));
Particle.publish("photon/temperature/fahrenheit", String(fahrenheit));
}
void getTemp()
{
if(!ds18b20.search()){
ds18b20.resetsearch();
celsius = ds18b20.getTemperature();
Serial.println(celsius);
while (!ds18b20.crcCheck() && dsAttempts < 4){
Serial.println("Caught bad value.");
dsAttempts++;
Serial.print("Attempts to Read: ");
Serial.println(dsAttempts);
if (dsAttempts == 3){
delay(1000);
}
ds18b20.resetsearch();
celsius = ds18b20.getTemperature();
continue;
}
dsAttempts = 0;
fahrenheit = ds18b20.convertToFahrenheit(celsius);
Serial.println(fahrenheit);
}
}